@@ -386,59 +386,44 @@ loadModel(const string &aToolSetupFileName, ForceSet *rOriginalForceSet )
386386 " No model file was specified (<model_file> element is empty) in "
387387 " the Tool's Setup file. Consider passing `false` for the "
388388 " constructor's `aLoadModel` parameter" );
389- string saveWorkingDirectory = IO::getCwd ();
390- string directoryOfSetupFile = IO::getParentDirectory (aToolSetupFileName);
391- IO::chDir (directoryOfSetupFile);
389+
390+ auto cwd = IO::CwdChanger::changeToParentOf (aToolSetupFileName);
392391
393392 log_info (" AbstractTool {} loading model {}" , getName (), _modelFile);
394393
395- Model *model = 0 ;
394+ auto model = std::unique_ptr<Model>{new Model{_modelFile}};
395+ model->finalizeFromProperties ();
396396
397- try {
398- model = new Model (_modelFile);
399- model->finalizeFromProperties ();
400- if (rOriginalForceSet!=NULL )
401- *rOriginalForceSet = model->getForceSet ();
402- } catch (...) { // Properly restore current directory if an exception is thrown
403- IO::chDir (saveWorkingDirectory);
404- throw ;
397+ if (rOriginalForceSet!=NULL ) {
398+ *rOriginalForceSet = model->getForceSet ();
405399 }
406- _model = model;
407- IO::chDir (saveWorkingDirectory);
400+ _model = model.release ();
408401}
409402
410403void AbstractTool::
411404updateModelForces (Model& model, const string &aToolSetupFileName, ForceSet *rOriginalForceSet )
412405{
413- string saveWorkingDirectory = IO::getCwd ();
414- string directoryOfSetupFile = IO::getParentDirectory (aToolSetupFileName);
415- IO::chDir (directoryOfSetupFile);
406+ auto cwd = IO::CwdChanger::changeToParentOf (aToolSetupFileName);
416407
417- try {
418- if (rOriginalForceSet) *rOriginalForceSet = model.getForceSet ();
419-
420- // If replacing force set read in from model file, clear it here
421- if (_replaceForceSet){
422- // Can no longer just remove the model's forces.
423- // If the model is connected, then the model will
424- // maintain a list of subcomponents that refer to garbage.
425- model.cleanup ();
426- model.updForceSet ().setSize (0 );
427- }
428-
429- // Load force set(s)
430- for (int i=0 ;i<_forceSetFiles.getSize ();i++) {
431- log_info (" Adding force object set from {}" , _forceSetFiles[i]);
432- ForceSet *forceSet=new ForceSet (_forceSetFiles[i], true );
433- model.updForceSet ().append (*forceSet);
434- }
408+ if (rOriginalForceSet) {
409+ *rOriginalForceSet = model.getForceSet ();
410+ }
435411
436- } catch (...) {
437- IO::chDir (saveWorkingDirectory);
438- throw ;
412+ // If replacing force set read in from model file, clear it here
413+ if (_replaceForceSet){
414+ // Can no longer just remove the model's forces.
415+ // If the model is connected, then the model will
416+ // maintain a list of subcomponents that refer to garbage.
417+ model.cleanup ();
418+ model.updForceSet ().setSize (0 );
439419 }
440420
441- IO::chDir (saveWorkingDirectory);
421+ // Load force set(s)
422+ for (int i=0 ; i<_forceSetFiles.getSize (); i++) {
423+ log_info (" Adding force object set from {}" , _forceSetFiles[i]);
424+ ForceSet *forceSet=new ForceSet (_forceSetFiles[i], true );
425+ model.updForceSet ().append (*forceSet);
426+ }
442427}
443428// _____________________________________________________________________________
444429/* *
@@ -663,51 +648,44 @@ void AbstractTool::removeExternalLoadsFromModel()
663648 if (iter!= aNode.element_end ()){
664649 string fileName=" " ;
665650 iter->getValueAs (fileName);
666- if (fileName!=" " && fileName != " Unassigned" ){
667- string saveWorkingDirectory = IO::getCwd ();
668- string directoryOfSetupFile = IO::getParentDirectory (getDocumentFileName ());
669- IO::chDir (directoryOfSetupFile);
670- // bool extLoadsFile=false;
671- try {
672- SimTK::Xml::Document doc (fileName);
673- doc.setIndentString (" \t " );
674- Xml::Element root = doc.getRootElement ();
675- if (root.getElementTag ()==" OpenSimDocument" ){
676- // int curVersion = root.getRequiredAttributeValueAs<int>("Version");
677- Xml::element_iterator rootIter (root.element_begin (" ForceSet" ));
678- if (rootIter!=root.element_end ()){
679- rootIter->setElementTag (" ExternalLoads" );
680- }
681- Xml::element_iterator iter (root.element_begin (" ExternalLoads" ));
682- Xml::Element extLoadsElem = *iter;
683-
684- SimTK::Xml::element_iterator kIter = aNode.element_begin (" external_loads_model_kinematics_file" );
685- if (kIter !=aNode.element_end ()){
686- string kinFileName= " " ;
687- kIter ->getValueAs (kinFileName);
688- aNode.removeNode (kIter );
689- // Make sure no node already exist
690- Xml::element_iterator iter2 (extLoadsElem.element_begin (" external_loads_model_kinematics_file" ));
691- if (iter2 == extLoadsElem.element_end ())
692- iter->insertNodeAfter (iter->element_end (), Xml::Element (" external_loads_model_kinematics_file" , kinFileName));
693- else
694- iter2->setValue (kinFileName);
695- }
696- SimTK::Xml::element_iterator fIter = aNode.element_begin (" lowpass_cutoff_frequency_for_load_kinematics" );
697- if (fIter !=aNode.element_end ()){
698- SimTK::String freq;
699- fIter ->getValueAs (freq);
700- Xml::element_iterator iter2 (extLoadsElem.element_begin (" lowpass_cutoff_frequency_for_load_kinematics" ));
701- if (iter2 == extLoadsElem.element_end ())
702- iter->insertNodeAfter (iter->element_end (), Xml::Element (" lowpass_cutoff_frequency_for_load_kinematics" , freq));
703- else
704- iter2->setValue (freq);
705- }
706- doc.writeToFile (fileName);
651+ if (fileName!=" " && fileName != " Unassigned" ) {
652+ auto cwd = IO::CwdChanger::changeToParentOf (getDocumentFileName ());
653+
654+ SimTK::Xml::Document doc (fileName);
655+ doc.setIndentString (" \t " );
656+ Xml::Element root = doc.getRootElement ();
657+ if (root.getElementTag ()==" OpenSimDocument" ){
658+ // int curVersion = root.getRequiredAttributeValueAs<int>("Version");
659+ Xml::element_iterator rootIter (root.element_begin (" ForceSet" ));
660+ if (rootIter!=root.element_end ()){
661+ rootIter->setElementTag (" ExternalLoads" );
707662 }
708- }
709- catch (...){
710- IO::chDir (saveWorkingDirectory);
663+ Xml::element_iterator iter (root.element_begin (" ExternalLoads" ));
664+ Xml::Element extLoadsElem = *iter;
665+
666+ SimTK::Xml::element_iterator kIter = aNode.element_begin (" external_loads_model_kinematics_file" );
667+ if (kIter !=aNode.element_end ()){
668+ string kinFileName= " " ;
669+ kIter ->getValueAs (kinFileName);
670+ aNode.removeNode (kIter );
671+ // Make sure no node already exist
672+ Xml::element_iterator iter2 (extLoadsElem.element_begin (" external_loads_model_kinematics_file" ));
673+ if (iter2 == extLoadsElem.element_end ())
674+ iter->insertNodeAfter (iter->element_end (), Xml::Element (" external_loads_model_kinematics_file" , kinFileName));
675+ else
676+ iter2->setValue (kinFileName);
677+ }
678+ SimTK::Xml::element_iterator fIter = aNode.element_begin (" lowpass_cutoff_frequency_for_load_kinematics" );
679+ if (fIter !=aNode.element_end ()){
680+ SimTK::String freq;
681+ fIter ->getValueAs (freq);
682+ Xml::element_iterator iter2 (extLoadsElem.element_begin (" lowpass_cutoff_frequency_for_load_kinematics" ));
683+ if (iter2 == extLoadsElem.element_end ())
684+ iter->insertNodeAfter (iter->element_end (), Xml::Element (" lowpass_cutoff_frequency_for_load_kinematics" , freq));
685+ else
686+ iter2->setValue (freq);
687+ }
688+ doc.writeToFile (fileName);
711689 }
712690 }
713691 }
@@ -817,14 +795,12 @@ std::string AbstractTool::createExternalLoadsFile(const std::string& oldFile,
817795{
818796 bool oldFileValid = !(oldFile==" " || oldFile==" Unassigned" );
819797
820- std::string savedCwd;
821- if (getDocument ()) {
822- savedCwd = IO::getCwd ();
823- IO::chDir (IO::getParentDirectory (getDocument ()->getFileName ()));
824- }
825- if (oldFileValid){
798+ auto cwd = getDocument () != nullptr
799+ ? IO::CwdChanger::changeToParentOf (getDocument ()->getFileName ())
800+ : IO::CwdChanger::noop ();
801+
802+ if (oldFileValid) {
826803 if (!ifstream (oldFile.c_str (), ios_base::in).good ()) {
827- if (getDocument ()) IO::chDir (savedCwd);
828804 string msg =
829805 " Object: ERR- Could not open file " + oldFile+ " . It may not exist or you don't have permission to read it." ;
830806 throw Exception (msg,__FILE__,__LINE__);
@@ -844,7 +820,6 @@ std::string AbstractTool::createExternalLoadsFile(const std::string& oldFile,
844820 for (int i=0 ; i<9 ; i++){
845821 indices[i][0 ]= labels.findIndex (forceLabels[i]);
846822 if (indices[i][0 ]==-1 ){ // Something went wrong, abort here
847- if (getDocument ()) IO::chDir (savedCwd);
848823 string msg =
849824 " Object: ERR- Could not find label " +forceLabels[i]+ " in file " + oldFile+ " . Aborting." ;
850825 throw Exception (msg,__FILE__,__LINE__);
@@ -868,17 +843,14 @@ std::string AbstractTool::createExternalLoadsFile(const std::string& oldFile,
868843 _externalLoads.setDataFileName (oldFile);
869844 std::string newName=oldFile.substr (0 , oldFile.length ()-4 )+" .xml" ;
870845 _externalLoads.print (newName);
871- if (getDocument ()) IO::chDir (savedCwd);
872846 log_cout (" Created ForceSet file {} to apply forces from {}." , newName, oldFile);
873847 return newName;
874848 }
875849 else {
876- if (getDocument ()) IO::chDir (savedCwd);
877850 string msg =
878851 " Object: ERR- Only one body is specified in " + oldFile+ " ." ;
879852 throw Exception (msg,__FILE__,__LINE__);
880853 }
881- if (getDocument ()) IO::chDir (savedCwd);
882854}
883855
884856std::string AbstractTool::getTimeString (const time_t & t) const {
0 commit comments