From 0a677246db60f98aa1dec651347e2eac74b435af Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Wed, 20 Dec 2023 11:12:29 -0800 Subject: [PATCH] =?UTF-8?q?Undo=20binding=20of=20model=20getCoordinatesInM?= =?UTF-8?q?ultibodyTreeOrder=20and=20introduc=E2=80=A6=20(#3656)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Undo binding of model getCoordinatesInMultibodyTreeOrder and introduce getCoordinateNamesInMultibodyTreeOrder for scripting users * Fix dereferencing the ReferencePtr and exercise in test case * Fix compilation warnings/errors on linux and call site to index the SimTKArray * Fix int/size_t mixup that causes compilation errors on linux * Update CHANGELOG.md Use updated function name * Address feedback on PR in test, changelog language --- Bindings/Python/tests/test_simbody.py | 5 +++++ Bindings/simulation.i | 3 --- CHANGELOG.md | 2 +- OpenSim/Simulation/Model/Model.h | 8 ++++++++ OpenSim/Simulation/Test/testAssemblySolver.cpp | 3 +++ 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Bindings/Python/tests/test_simbody.py b/Bindings/Python/tests/test_simbody.py index f6636d9ebd..d03fddd6ce 100644 --- a/Bindings/Python/tests/test_simbody.py +++ b/Bindings/Python/tests/test_simbody.py @@ -205,6 +205,9 @@ def test_SimbodyMatterSubsystem(self): assert (smss.calcSystemMassCenterLocationInGround(s)[2] == model.calcMassCenterPosition(s)[2]) + coordNames = model.getCoordinateNamesInMultibodyTreeOrder(); + print('firstCoord', coordNames.getElt(0)); + J = osim.Matrix() smss.calcSystemJacobian(s, J) # 6 * number of mobilized bodies @@ -248,3 +251,5 @@ def test_SimbodyMatterSubsystem(self): assert residual.size() == s.getNU() for i in range(residual.size()): assert abs(residual[i]) < 1e-10 + + diff --git a/Bindings/simulation.i b/Bindings/simulation.i index 29385e4cbf..906b5d8c64 100644 --- a/Bindings/simulation.i +++ b/Bindings/simulation.i @@ -177,9 +177,6 @@ OpenSim::ModelComponentSet; %include %include %copyctor OpenSim::Model; -%include -%template(ReferencePtrCoordinate) SimTK::ReferencePtr; -%template(StdVectorReferencePtrCoordinate) std::vector>; %include %include diff --git a/CHANGELOG.md b/CHANGELOG.md index 95fbd56d1b..f66afa9849 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and `Blankevoort1991Ligament`, usages of `get_GeometryPath`, `upd_GeometryPath`, - Deleting elements from an `OpenSim::Coordinate` range now throws an exception during `finalizeFromProperties` (previously: it would let you do it, and throw later when `Coordinate::getMinRange()` or `Coordinate::getMaxRange()` were called, #3532) - Added `FunctionBasedPath`, a class for representing paths in `Force`s based on `Function` objects (#3389) -- Fixed bindings to expose the method Model::getCoordinatesInMultibodyTreeOrder to scripting users (#3569) +- Introduced the method `Model::getCoordinateNamesInMultibodyTreeOrder` for convenient access to internal coordinate ordering for scripting users (#3569) - Fixed a bug where constructing a `ModelProcessor` from a `Model` object led to an invalid `Model` - Added `LatinHypercubeDesign`, a class for generating Latin hypercube designs using random and algorithm methods (#3570) - Refactor c3dExport.m file as a Matlab function (#3501), also expose method to allow some operations on tableColumns diff --git a/OpenSim/Simulation/Model/Model.h b/OpenSim/Simulation/Model/Model.h index e2a67e32f8..f70c4d666c 100644 --- a/OpenSim/Simulation/Model/Model.h +++ b/OpenSim/Simulation/Model/Model.h @@ -943,6 +943,14 @@ OpenSim_OBJECT_NONTEMPLATE_DEFS(Model, ModelComponent); std::vector> getCoordinatesInMultibodyTreeOrder() const; + /** A variant of getCoordinatesInMultibodyTreeOrder that returns names for Scripting users */ + SimTK::Array_ getCoordinateNamesInMultibodyTreeOrder() { + SimTK::Array_ namesArray; + auto coords = getCoordinatesInMultibodyTreeOrder(); + for (int i=0; i < (int)coords.size(); ++i) + namesArray.push_back(coords[i]->getName()); + return namesArray; + } /** Get a warning message if any Coordinates have a MotionType that is NOT consistent with its previous user-specified value that existed in Model files prior to OpenSim 4.0 */ diff --git a/OpenSim/Simulation/Test/testAssemblySolver.cpp b/OpenSim/Simulation/Test/testAssemblySolver.cpp index 6624abf2fa..b19b4bb0c7 100644 --- a/OpenSim/Simulation/Test/testAssemblySolver.cpp +++ b/OpenSim/Simulation/Test/testAssemblySolver.cpp @@ -131,7 +131,10 @@ void testAssembleModelWithConstraints(string modelFile) for(int i=0; i< coords.getSize(); i++) { cout << "Coordinate " << coords[i].getName() << " get value = " << coords[i].getValue(state) << endl; } + auto coordsInOrder = model.getCoordinateNamesInMultibodyTreeOrder(); + cout << coordsInOrder << std::endl; + assert(coords.getSize()==coordsInOrder.size()); // Initial coordinates after initial assembly Vector q0 = state.getQ();