DECLARE_EXPORT PyObject* savePlan(PyObject* self, PyObject* args) { // Pick up arguments const char *filename = "plan.out"; int ok = PyArg_ParseTuple(args, "s:saveplan", &filename); if (!ok) return NULL; // Free Python interpreter for other threads Py_BEGIN_ALLOW_THREADS // Execute and catch exceptions ofstream textoutput; try { // Open the output file textoutput.open(filename, ios::out); // Write the buffer summary for (Buffer::iterator gbuf = Buffer::begin(); gbuf != Buffer::end(); ++gbuf) { if (!gbuf->getHidden()) for (Buffer::flowplanlist::const_iterator oo=gbuf->getFlowPlans().begin(); oo!=gbuf->getFlowPlans().end(); ++oo) if (oo->getType() == 1 && oo->getQuantity() != 0.0) { textoutput << "BUFFER\t" << *gbuf << '\t' << oo->getDate() << '\t' << oo->getQuantity() << '\t' << oo->getOnhand() << endl; } } // Write the demand summary for (Demand::iterator gdem = Demand::begin(); gdem != Demand::end(); ++gdem) { if (!gdem->getHidden()) { for (Demand::OperationPlan_list::const_iterator pp = gdem->getDelivery().begin(); pp != gdem->getDelivery().end(); ++pp) textoutput << "DEMAND\t" << (*gdem) << '\t' << (*pp)->getDates().getEnd() << '\t' << (*pp)->getQuantity() << endl; } } // Write the resource summary for (Resource::iterator gres = Resource::begin(); gres != Resource::end(); ++gres) { if (!gres->getHidden()) for (Resource::loadplanlist::const_iterator qq=gres->getLoadPlans().begin(); qq!=gres->getLoadPlans().end(); ++qq) if (qq->getType() == 1 && qq->getQuantity() != 0.0) { textoutput << "RESOURCE\t" << *gres << '\t' << qq->getDate() << '\t' << qq->getQuantity() << '\t' << qq->getOnhand() << endl; } } // Write the operationplan summary. for (OperationPlan::iterator rr = OperationPlan::begin(); rr != OperationPlan::end(); ++rr) { if (rr->getOperation()->getHidden()) continue; textoutput << "OPERATION\t" << rr->getOperation() << '\t' << rr->getDates().getStart() << '\t' << rr->getDates().getEnd() << '\t' << rr->getQuantity() << endl; } // Write the problem summary. for (Problem::const_iterator gprob = Problem::begin(); gprob != Problem::end(); ++gprob) { textoutput << "PROBLEM\t" << gprob->getType().type << '\t' << gprob->getDescription() << '\t' << gprob->getDates() << endl; } // Write the constraint summary for (Demand::iterator gdem = Demand::begin(); gdem != Demand::end(); ++gdem) { if (!gdem->getHidden()) { for (Problem::const_iterator i = gdem->getConstraints().begin(); i != gdem->getConstraints().end(); ++i) textoutput << "DEMAND CONSTRAINT\t" << (*gdem) << '\t' << i->getDescription() << '\t' << i->getDates() << '\t' << endl; } } // Close the output file textoutput.close(); } catch (...) { if (textoutput.is_open()) textoutput.close(); Py_BLOCK_THREADS; PythonType::evalException(); return NULL; } Py_END_ALLOW_THREADS // Reclaim Python interpreter return Py_BuildValue(""); }