Author: eudoxos Date: 2009-07-31 12:53:44 +0200 (Fri, 31 Jul 2009) New Revision: 1908
Modified: trunk/core/MetaBody.cpp trunk/core/MetaBody.hpp trunk/core/Omega.cpp trunk/core/Omega.hpp trunk/core/yade.cpp trunk/gui/qt3/GLViewer.cpp trunk/gui/qt3/QtGUI-python.cpp trunk/pkg/snow/RenderingEngine/Ef1_BshSnowGrain_glDraw.cpp trunk/pkg/snow/RenderingEngine/Ef1_IstSnowLayersContact_glDraw.cpp trunk/py/yadeWrapper/yadeWrapper.cpp trunk/scripts/simple-scene-player.py Log: 1. Add infrastructure for getting temporary filenames in a secure manner to Omega 2. move selectedBOyd to MetaBody; initialize it properly to avoid possible crash. Modified: trunk/core/MetaBody.cpp =================================================================== --- trunk/core/MetaBody.cpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/core/MetaBody.cpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -46,6 +46,7 @@ stopAtVirtTime=0; // not yet implemented either isDynamic=false; dt=1e-8; + selectedBody=-1; // fill default tags struct passwd* pw; Modified: trunk/core/MetaBody.hpp =================================================================== --- trunk/core/MetaBody.hpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/core/MetaBody.hpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -53,6 +53,8 @@ Real stopAtRealTime; bool needsInitializers; + // for GL selection + body_id_t selectedBody; protected : virtual void postProcessAttributes(bool deserializing); REGISTER_ATTRIBUTES(Body, Modified: trunk/core/Omega.cpp =================================================================== --- trunk/core/Omega.cpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/core/Omega.cpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -72,6 +72,23 @@ time_duration Omega::getComputationDuration(){return microsec_clock::local_time()-msStartingSimulationTime-simulationPauseDuration;} +void Omega::initTemps(){ + char dirTemplate[]="/tmp/yade-XXXXXX"; + tmpFileDir=mkdtemp(dirTemplate); + tmpFileCounter=0; +} + +void Omega::cleanupTemps(){ + filesystem::path tmpPath(tmpFileDir); + filesystem::remove_all(tmpPath); +} + +std::string Omega::tmpFilename(){ + if(tmpFileDir.empty()) throw runtime_error("tmpFileDir empty; Omega::initTemps not yet called()?"); + boost::mutex::scoped_lock lock(tmpFileCounterMutex); + return tmpFileDir+lexical_cast<string>(tmpFileCounter++); +} + void Omega::reset(){ //finishSimulationLoop(); joinSimulationLoop(); Modified: trunk/core/Omega.hpp =================================================================== --- trunk/core/Omega.hpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/core/Omega.hpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -88,11 +88,14 @@ map<string,string> memSavedSimulations; + boost::mutex tmpFileCounterMutex; + long tmpFileCounter; + std::string tmpFileDir; + public : shared_ptr<Preferences> preferences; string yadeConfigPath; // FIXME - must be private and more clean string yadeVersionName; // FIXME - public ? - body_id_t selectedBody; // FIXME this is a hack. See GLViewer:86 // problem is that currently there is no way to transmit arguments between UI and GLDraw* methods. @@ -159,6 +162,11 @@ void init(); void timeInit(); + void initTemps(); + void cleanupTemps(); + //! Return unique temporary filename. May be deleted by the user; if not, will be deleted at shutdown. + string tmpFilename(); + void reset(); DECLARE_LOGGER; Modified: trunk/core/yade.cpp =================================================================== --- trunk/core/yade.cpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/core/yade.cpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -261,6 +261,8 @@ Omega::instance().scanPlugins(string(PREFIX "/lib/yade" SUFFIX "/gui" )); Omega::instance().init(); + // make directory for temporaries + Omega::instance().initTemps(); Omega::instance().setSimulationFileName(simulationFileName); //init() resets to ""; // recovery file pattern @@ -289,6 +291,8 @@ // for(int i=0;i<argc; i++)cerr<<"Argument "<<i<<": "<<argv[i]<<endl; int ok = frontEnd->run(argc,argv); + // remove all remaining temporary files + Omega::instance().cleanupTemps(); #ifdef YADE_PYTHON /* pyFinalize crashes with boost:python<=1.35 * http://www.boost.org/libs/python/todo.html#pyfinalize-safety has explanation Modified: trunk/gui/qt3/GLViewer.cpp =================================================================== --- trunk/gui/qt3/GLViewer.cpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/gui/qt3/GLViewer.cpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -191,24 +191,24 @@ string GLViewer::getState(){ QString origStateFileName=stateFileName(); - char tmpnam_str [L_tmpnam]; char* result=tmpnam(tmpnam_str); if(!result) throw runtime_error("Failure getting temporary filename."); - setStateFileName(tmpnam_str); saveStateToFile(); setStateFileName(origStateFileName); - LOG_DEBUG("State saved to temp file "<<tmpnam_str); + string tmpFile=Omega::instance().tmpFilename(); + setStateFileName(tmpFile); saveStateToFile(); setStateFileName(origStateFileName); + LOG_DEBUG("State saved to temp file "<<tmpFile); // read tmp file contents and return it as string // this will replace all whitespace by space (nowlines will disappear, which is what we want) - ifstream in(tmpnam_str); string ret; while(!in.eof()){string ss; in>>ss; ret+=" "+ss;}; in.close(); - boost::filesystem::remove(boost::filesystem::path(tmpnam_str)); + ifstream in(tmpFile.c_str()); string ret; while(!in.eof()){string ss; in>>ss; ret+=" "+ss;}; in.close(); + boost::filesystem::remove(boost::filesystem::path(tmpFile)); return ret; } void GLViewer::setState(string state){ - char tmpnam_str [L_tmpnam]; char* result=tmpnam(tmpnam_str); if(!result) throw runtime_error("Failure getting temporary filename."); - std::ofstream out(tmpnam_str); - if(!out.good()){ LOG_ERROR("Error opening temp file `"<<tmpnam_str<<"', loading aborted."); return; } + string tmpFile=Omega::instance().tmpFilename(); + std::ofstream out(tmpFile.c_str()); + if(!out.good()){ LOG_ERROR("Error opening temp file `"<<tmpFile<<"', loading aborted."); return; } out<<state; out.close(); - LOG_DEBUG("Will load state from temp file "<<tmpnam_str); - QString origStateFileName=stateFileName(); setStateFileName(tmpnam_str); restoreStateFromFile(); setStateFileName(origStateFileName); - boost::filesystem::remove(boost::filesystem::path(tmpnam_str)); + LOG_DEBUG("Will load state from temp file "<<tmpFile); + QString origStateFileName=stateFileName(); setStateFileName(tmpFile); restoreStateFromFile(); setStateFileName(origStateFileName); + boost::filesystem::remove(boost::filesystem::path(tmpFile)); } void GLViewer::keyPressEvent(QKeyEvent *e) @@ -250,7 +250,7 @@ /* letters alphabetically */ else if(e->key()==Qt::Key_C && selectedName() >= 0 && (*(Omega::instance().getRootBody()->bodies)).exists(selectedName())) setSceneCenter(manipulatedFrame()->position()); else if(e->key()==Qt::Key_C && (e->state() & AltButton)){ displayMessage("Median centering"); centerMedianQuartile(); } - else if(e->key()==Qt::Key_D &&(e->state() & AltButton)){ body_id_t id; if((id=Omega::instance().selectedBody)>=0){ const shared_ptr<Body>& b=Body::byId(id); b->isDynamic=!b->isDynamic; LOG_INFO("Body #"<<id<<" now "<<(b->isDynamic?"":"NOT")<<" dynamic"); } } + else if(e->key()==Qt::Key_D &&(e->state() & AltButton)){ body_id_t id; if((id=Omega::instance().getRootBody()->selectedBody)>=0){ const shared_ptr<Body>& b=Body::byId(id); b->isDynamic=!b->isDynamic; LOG_INFO("Body #"<<id<<" now "<<(b->isDynamic?"":"NOT")<<" dynamic"); } } else if(e->key()==Qt::Key_D) {timeDispMask+=1; if(timeDispMask>(TIME_REAL|TIME_VIRT|TIME_ITER))timeDispMask=0; } else if(e->key()==Qt::Key_G) {bool anyDrawn=drawGridXYZ[0]||drawGridXYZ[1]||drawGridXYZ[2]; for(int i=0; i<3; i++)drawGridXYZ[i]=!anyDrawn; } else if (e->key()==Qt::Key_M && selectedName() >= 0){ @@ -439,7 +439,7 @@ if(selection<0){ if(isMoving){ displayMessage("Moving finished"); mouseMovesCamera(); isMoving=false; - Omega::instance().selectedBody = -1; + Omega::instance().getRootBody()->selectedBody = -1; } return; } @@ -457,7 +457,7 @@ Quaternionr& q = Body::byId(selection)->physicalParameters->se3.orientation; Vector3r& v = Body::byId(selection)->physicalParameters->se3.position; manipulatedFrame()->setPositionAndOrientation(qglviewer::Vec(v[0],v[1],v[2]),qglviewer::Quaternion(q[0],q[1],q[2],q[3])); - Omega::instance().selectedBody = selection; + Omega::instance().getRootBody()->selectedBody = selection; #ifdef YADE_PYTHON try{ PyGILState_STATE gstate; Modified: trunk/gui/qt3/QtGUI-python.cpp =================================================================== --- trunk/gui/qt3/QtGUI-python.cpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/gui/qt3/QtGUI-python.cpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -83,7 +83,12 @@ shared_ptr<QtSimulationPlayer> player=ensuredMainWindow()->player; GLSimulationPlayerViewer* glv=player->glSimulationPlayerViewer; string snapBase2(snapBase); - if(snapBase2.empty()){ char tmpnam_str [L_tmpnam]; char* ret=tmpnam(tmpnam_str); if(ret!=tmpnam_str) throw runtime_error("tmpnam failed."); snapBase2=tmpnam_str; LOG_INFO("Using "<<snapBase2<<" as temporary basename for snapshots."); } + if(snapBase2.empty()){ + char tmpl[]="/tmp/yade-player-XXXXXX"; + snapBase2=mkdtemp(tmpl); + snapBase2+="/frame-"; + LOG_INFO("Using "<<snapBase2<<" as temporary basename for snapshots."); + } glv->stride=stride; glv->load(savedSim); // Omega locks rendering here for us glv->saveSnapShots=true; Modified: trunk/pkg/snow/RenderingEngine/Ef1_BshSnowGrain_glDraw.cpp =================================================================== --- trunk/pkg/snow/RenderingEngine/Ef1_BshSnowGrain_glDraw.cpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/pkg/snow/RenderingEngine/Ef1_BshSnowGrain_glDraw.cpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -171,7 +171,7 @@ /* // plot depth tetrahedron of selected surface -// int me = (int)(Omega::instance().selectedBody); +// int me = (int)(Omega::instance().getRootBody()->selectedBody); // if(me > 0 && me < Omega::instance().getRootBody()->bodies->size()) // { // BshSnowGrain* m = dynamic_cast<BshSnowGrain*>((*(Omega::instance().getRootBody()->bodies))[me]->geometricalModel.get()); @@ -224,7 +224,7 @@ // std::vector<Vector3r> me_inside;me_inside.clear(); // std::vector<Vector3r> oth_inside;oth_inside.clear(); - int me = (int)(Omega::instance().selectedBody); + int me = (int)(Omega::instance().getRootBody()->selectedBody); if(me > 0 && me < Omega::instance().getRootBody()->bodies->size()) { BshSnowGrain* m = dynamic_cast<BshSnowGrain*>((*(Omega::instance().getRootBody()->bodies))[me]->geometricalModel.get()); @@ -277,7 +277,7 @@ if(gr->slices[0][0] == m->slices[0][0]) { std::cerr << "got body " << me << "\n"; - int other=(int)(Omega::instance().selectedBody); + int other=(int)(Omega::instance().getRootBody()->selectedBody); if(other > 0 && other < Omega::instance().getRootBody()->bodies->size()) { BshSnowGrain* oth = dynamic_cast<BshSnowGrain*>((*(Omega::instance().getRootBody()->bodies))[other]->geometricalModel.get()); @@ -317,7 +317,7 @@ // check current grain insides //if(!surface) //{ -// int me = (int)(Omega::instance().selectedBody); +// int me = (int)(Omega::instance().getRootBody()->selectedBody); // if(me > 0 && me < Omega::instance().getRootBody()->bodies->size()) // { // BshSnowGrain* m = dynamic_cast<BshSnowGrain*>((*(Omega::instance().getRootBody()->bodies))[me]->geometricalModel.get()); @@ -345,7 +345,7 @@ if(!surface) { // glBegin(GL_POINTS); - int me = (int)(Omega::instance().selectedBody); + int me = (int)(Omega::instance().getRootBody()->selectedBody); if(me > 0 && me < Omega::instance().getRootBody()->bodies->size()) { BshSnowGrain* m = dynamic_cast<BshSnowGrain*>((*(Omega::instance().getRootBody()->bodies))[me]->geometricalModel.get()); Modified: trunk/pkg/snow/RenderingEngine/Ef1_IstSnowLayersContact_glDraw.cpp =================================================================== --- trunk/pkg/snow/RenderingEngine/Ef1_IstSnowLayersContact_glDraw.cpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/pkg/snow/RenderingEngine/Ef1_IstSnowLayersContact_glDraw.cpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -229,7 +229,7 @@ /* - if(!(id1 == (int)(Omega::instance().selectedBody) || id2 == (int)(Omega::instance().selectedBody))) + if(!(id1 == (int)(Omega::instance().getRootBody()->selectedBody) || id2 == (int)(Omega::instance().getRootBody()->selectedBody))) return; assert(Omega::instance().getRootBody()->bodies->exists(id1)); Modified: trunk/py/yadeWrapper/yadeWrapper.cpp =================================================================== --- trunk/py/yadeWrapper/yadeWrapper.cpp 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/py/yadeWrapper/yadeWrapper.cpp 2009-07-31 10:53:44 UTC (rev 1908) @@ -565,7 +565,7 @@ long Interaction_getId2(const shared_ptr<Interaction>& i){ return (long)i->getId2(); } void FileGenerator_generate(const shared_ptr<FileGenerator>& fg, string outFile){ fg->setFileName(outFile); fg->setSerializationLibrary("XMLFormatManager"); bool ret=fg->generateAndSave(); LOG_INFO((ret?"SUCCESS:\n":"FAILURE:\n")<<fg->message); if(ret==false) throw runtime_error("Generator reported error: "+fg->message); }; -void FileGenerator_load(const shared_ptr<FileGenerator>& fg){ char tmpnam_str [L_tmpnam]; char* result=tmpnam(tmpnam_str); if(result!=tmpnam_str) throw runtime_error(__FILE__ ": tmpnam(char*) failed!"); string xml(tmpnam_str+string(".xml.bz2")); LOG_DEBUG("Using temp file "<<xml); FileGenerator_generate(fg,xml); pyOmega().load(xml); } +void FileGenerator_load(const shared_ptr<FileGenerator>& fg){ string xml(Omega::instance().tmpFilename()+".xml.bz2"); LOG_DEBUG("Using temp file "<<xml); FileGenerator_generate(fg,xml); pyOmega().load(xml); } // many thanks to http://markmail.org/message/s4ksg6nfspw2wxwd namespace boost { namespace python { namespace detail { Modified: trunk/scripts/simple-scene-player.py =================================================================== --- trunk/scripts/simple-scene-player.py 2009-07-31 10:07:59 UTC (rev 1907) +++ trunk/scripts/simple-scene-player.py 2009-07-31 10:53:44 UTC (rev 1908) @@ -30,7 +30,7 @@ def setWire(): o=Omega() - for b in o.bodies: b.shape['wire']=True + for b in o.bodies: b.shape['wire']=False # you could have saved the viewer state by using Alt-S in the view... from yade import qt qt.makePlayerVideo('/tmp/player.sqlite','/tmp/player.ogg','/tmp/qglviewerState.xml',stride=10,fps=12,postLoadHook='setWire()') _______________________________________________ Mailing list: https://launchpad.net/~yade-dev Post to : yade-...@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-dev More help : https://help.launchpad.net/ListHelp _______________________________________________ yade-dev mailing list yade-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/yade-dev