Skip to content

Commit

Permalink
Undo binding of model getCoordinatesInMultibodyTreeOrder and introduc… (
Browse files Browse the repository at this point in the history
#3656)

* 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
  • Loading branch information
aymanhab committed Jan 10, 2024
1 parent efcdfd3 commit 0a67724
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 4 deletions.
5 changes: 5 additions & 0 deletions Bindings/Python/tests/test_simbody.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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


3 changes: 0 additions & 3 deletions Bindings/simulation.i
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,6 @@ OpenSim::ModelComponentSet<OpenSim::Controller>;
%include <OpenSim/Simulation/Model/ModelVisualPreferences.h>
%include <OpenSim/Simulation/Model/ModelVisualizer.h>
%copyctor OpenSim::Model;
%include <SimTKcommon/internal/ReferencePtr.h>
%template(ReferencePtrCoordinate) SimTK::ReferencePtr<const OpenSim::Coordinate>;
%template(StdVectorReferencePtrCoordinate) std::vector<SimTK::ReferencePtr<const OpenSim::Coordinate>>;
%include <OpenSim/Simulation/Model/Model.h>

%include <OpenSim/Simulation/Model/AbstractPathPoint.h>
Expand Down
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions OpenSim/Simulation/Model/Model.h
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,14 @@ OpenSim_OBJECT_NONTEMPLATE_DEFS(Model, ModelComponent);
std::vector<SimTK::ReferencePtr<const OpenSim::Coordinate>>
getCoordinatesInMultibodyTreeOrder() const;

/** A variant of getCoordinatesInMultibodyTreeOrder that returns names for Scripting users */
SimTK::Array_<std::string> getCoordinateNamesInMultibodyTreeOrder() {
SimTK::Array_<std::string> 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 */
Expand Down
3 changes: 3 additions & 0 deletions OpenSim/Simulation/Test/testAssemblySolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down

0 comments on commit 0a67724

Please sign in to comment.