@@ -386,59 +386,44 @@ loadModel(const string &aToolSetupFileName, ForceSet *rOriginalForceSet )
386
386
" No model file was specified (<model_file> element is empty) in "
387
387
" the Tool's Setup file. Consider passing `false` for the "
388
388
" 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);
392
391
393
392
log_info (" AbstractTool {} loading model {}" , getName (), _modelFile);
394
393
395
- Model *model = 0 ;
394
+ auto model = std::unique_ptr<Model>{new Model{_modelFile}};
395
+ model->finalizeFromProperties ();
396
396
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 ();
405
399
}
406
- _model = model;
407
- IO::chDir (saveWorkingDirectory);
400
+ _model = model.release ();
408
401
}
409
402
410
403
void AbstractTool::
411
404
updateModelForces (Model& model, const string &aToolSetupFileName, ForceSet *rOriginalForceSet )
412
405
{
413
- string saveWorkingDirectory = IO::getCwd ();
414
- string directoryOfSetupFile = IO::getParentDirectory (aToolSetupFileName);
415
- IO::chDir (directoryOfSetupFile);
406
+ auto cwd = IO::CwdChanger::changeToParentOf (aToolSetupFileName);
416
407
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
+ }
435
411
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 );
439
419
}
440
420
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
+ }
442
427
}
443
428
// _____________________________________________________________________________
444
429
/* *
@@ -663,51 +648,44 @@ void AbstractTool::removeExternalLoadsFromModel()
663
648
if (iter!= aNode.element_end ()){
664
649
string fileName=" " ;
665
650
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" );
707
662
}
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);
711
689
}
712
690
}
713
691
}
@@ -817,14 +795,12 @@ std::string AbstractTool::createExternalLoadsFile(const std::string& oldFile,
817
795
{
818
796
bool oldFileValid = !(oldFile==" " || oldFile==" Unassigned" );
819
797
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) {
826
803
if (!ifstream (oldFile.c_str (), ios_base::in).good ()) {
827
- if (getDocument ()) IO::chDir (savedCwd);
828
804
string msg =
829
805
" Object: ERR- Could not open file " + oldFile+ " . It may not exist or you don't have permission to read it." ;
830
806
throw Exception (msg,__FILE__,__LINE__);
@@ -844,7 +820,6 @@ std::string AbstractTool::createExternalLoadsFile(const std::string& oldFile,
844
820
for (int i=0 ; i<9 ; i++){
845
821
indices[i][0 ]= labels.findIndex (forceLabels[i]);
846
822
if (indices[i][0 ]==-1 ){ // Something went wrong, abort here
847
- if (getDocument ()) IO::chDir (savedCwd);
848
823
string msg =
849
824
" Object: ERR- Could not find label " +forceLabels[i]+ " in file " + oldFile+ " . Aborting." ;
850
825
throw Exception (msg,__FILE__,__LINE__);
@@ -868,17 +843,14 @@ std::string AbstractTool::createExternalLoadsFile(const std::string& oldFile,
868
843
_externalLoads.setDataFileName (oldFile);
869
844
std::string newName=oldFile.substr (0 , oldFile.length ()-4 )+" .xml" ;
870
845
_externalLoads.print (newName);
871
- if (getDocument ()) IO::chDir (savedCwd);
872
846
log_cout (" Created ForceSet file {} to apply forces from {}." , newName, oldFile);
873
847
return newName;
874
848
}
875
849
else {
876
- if (getDocument ()) IO::chDir (savedCwd);
877
850
string msg =
878
851
" Object: ERR- Only one body is specified in " + oldFile+ " ." ;
879
852
throw Exception (msg,__FILE__,__LINE__);
880
853
}
881
- if (getDocument ()) IO::chDir (savedCwd);
882
854
}
883
855
884
856
std::string AbstractTool::getTimeString (const time_t & t) const {
0 commit comments