Develop a Probe plugin

Provide easy-to-use, extensible software for modeling, simulating, controlling, and analyzing the neuromusculoskeletal system.
POST REPLY
User avatar
Vinh Nguyen
Posts: 21
Joined: Fri Sep 26, 2014 8:53 pm

Develop a Probe plugin

Post by Vinh Nguyen » Wed Apr 04, 2018 1:11 pm

Hello,

I am trying to write a probe plugin which calculates the muscle metabolic cost. My calculation has a small difference compared to the built-in Umberger2010MuscleMetabolicsProbe of OpenSim. I have my set up that works well for the plugin example tutorials. Now, with the same set up, I copy the code from Umberger2010MuscleMetabolicsProbe.h and Umberger2010MuscleMetabolicsProbe.cpp which are in OpenSim source code. Then,

1. Include: #include <string>
#include "osimPluginDLL.h"
#include <OpenSim\Simulation\Model\Probe.h>
#include <OpenSim\Simulation\Model\Model.h>
#include <OpenSim\Common\Object.h>

2. Replace all OSIMSIMULATION_API by OSIMPLUGIN_API

3. In RegisterTypes_osimPlugin.cpp, I have
Object::registerType(Umberger2010MusMetProbeNew() );
Object::registerType(Umberger2010MusMetProbeNew_MetabolicMuscleParameter());
Object::registerType(Umberger2010MusMetProbeNew_MetabolicMuscleParameterSet());

4. I have not implemented my calculation. Just want to test if it works.

When I build the solution, I get the errors:

=================================================================================================
1>------ Rebuild All started: Project: ZERO_CHECK, Configuration: RelWithDebInfo x64 ------
1> Checking Build System
1> CMake does not need to re-run because C:/OpenSimPlugins/Umberger2010MusMetProbe_Act_build/CMakeFiles/generate.stamp is up-to-date.
2>------ Rebuild All started: Project: Libraries - Umberger2010MusMetProbeNew, Configuration: RelWithDebInfo x64 ------
2>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets(392,5): warning MSB8028: The intermediate directory (Umberger2010MusMetProbe_Act.dir\RelWithDebInfo\) contains files shared from another project (Libraries - Umberger2010MusMetProbeAct.vcxproj, Libraries - Umberger2010MusMetProbe_Act.vcxproj). This can lead to incorrect clean and rebuild behavior.
2> Building Custom Rule C:/OpenSimPlugins/Umberger2010MusMetProbe_Act/CMakeLists.txt
2> CMake does not need to re-run because C:\OpenSimPlugins\Umberger2010MusMetProbe_Act_build\CMakeFiles\generate.stamp is up-to-date.
2> RegisterTypes_osimPlugin.cpp
2> Umberger2010MusMetProbeNew.cpp
2> Generating Code...
2> Creating library C:/OpenSimPlugins/Umberger2010MusMetProbe_Act_build/RelWithDebInfo/Umberger2010MusMetProbe_Act.lib and object C:/OpenSimPlugins/Umberger2010MusMetProbe_Act_build/RelWithDebInfo/Umberger2010MusMetProbe_Act.exp
2>RegisterTypes_osimPlugin.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl OpenSim::Probe::Probe(class OpenSim::Probe &&)" (__imp_??0Probe@OpenSim@@QEAA@$$QEAV01@@Z) referenced in function "public: __cdecl OpenSim::Umberger2010MusMetProbeNew::Umberger2010MusMetProbeNew(class OpenSim::Umberger2010MusMetProbeNew &&)" (??0Umberger2010MusMetProbeNew@OpenSim@@QEAA@$$QEAV01@@Z)
2>Umberger2010MusMetProbeNew.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __cdecl OpenSim::Probe::Probe(class OpenSim::Probe &&)" (__imp_??0Probe@OpenSim@@QEAA@$$QEAV01@@Z)
2>RegisterTypes_osimPlugin.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class OpenSim::Probe & __cdecl OpenSim::Probe::operator=(class OpenSim::Probe &&)" (__imp_??4Probe@OpenSim@@QEAAAEAV01@$$QEAV01@@Z) referenced in function "public: class OpenSim::Umberger2010MusMetProbeNew & __cdecl OpenSim::Umberger2010MusMetProbeNew::operator=(class OpenSim::Umberger2010MusMetProbeNew &&)" (??4Umberger2010MusMetProbeNew@OpenSim@@QEAAAEAV01@$$QEAV01@@Z)
2>Umberger2010MusMetProbeNew.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class OpenSim::Probe & __cdecl OpenSim::Probe::operator=(class OpenSim::Probe &&)" (__imp_??4Probe@OpenSim@@QEAAAEAV01@$$QEAV01@@Z)
2>C:\OpenSimPlugins\Umberger2010MusMetProbe_Act_build\RelWithDebInfo\Umberger2010MusMetProbe_Act.dll : fatal error LNK1120: 2 unresolved externals
3>------ Rebuild All started: Project: ALL_BUILD, Configuration: RelWithDebInfo x64 ------
3> Building Custom Rule C:/OpenSimPlugins/Umberger2010MusMetProbe_Act/CMakeLists.txt
3> CMake does not need to re-run because C:\OpenSimPlugins\Umberger2010MusMetProbe_Act_build\CMakeFiles\generate.stamp is up-to-date.
4>------ Skipped Rebuild All: Project: INSTALL, Configuration: RelWithDebInfo x64 ------
4>Project not selected to build for this solution configuration
========== Rebuild All: 2 succeeded, 1 failed, 1 skipped ==========
===================================================================================================

Any help and advise would be great. Thank you in advance.

Vinh

User avatar
Dimitar Stanev
Posts: 1096
Joined: Fri Jan 31, 2014 5:14 am

Re: Develop a Probe plugin

Post by Dimitar Stanev » Mon Apr 09, 2018 11:24 am

You need to define the move constructor and move assignment operator for Umberger2010MusMetProbeNew class, because they were not declared implicitly by the compiler.

Code: Select all

Umberger2010MusMetProbeNew(Umberger2010MusMetProbeNew &&) { ... };
Umberger2010MusMetProbeNew::operator=(Umberger2010MusMetProbeNew &&) {... return *this};
When you registered the new class you called (Object::registerType(Umberger2010MusMetProbeNew());) which creates an rvalue of type Umberger2010MusMetProbeNew and that is why the move operators are required.

User avatar
Vinh Nguyen
Posts: 21
Joined: Fri Sep 26, 2014 8:53 pm

Re: Develop a Probe plugin

Post by Vinh Nguyen » Wed Apr 11, 2018 5:15 pm

Thank you, Dimitar.

I got it worked.

Vinh

POST REPLY