Examples
This section provides short examples of populated
setApiParametersTemplate()
and starting()
functions,
along with the dialog boxes that are created.
- In the apiGuiTestPlugin Parameter Editor dialog box, add
a custom particle temperature as a Body
Force.
void CApiTestParticleBodyForce::setApiParametersTemplate() const { auto* apiManager = getApiManager(); auto* pluginParamaterManager = apiManager->getParameterManager(); pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_PARTICLE); pluginParamaterManager->addDoubleValue(-273.15, "My Special Temperature", NApi::eTemperature); pluginParamaterManager->endGroup(); }
bool CApiTestParticleBodyForce::starting( int numThreads, char guiPath[NApi::GUI_FILE_MAX_LENGTH]) { auto* apiManager = getApiManager(); auto* pluginParamaterManager = apiManager->getParameterManager(); pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_PARTICLE); double specialTemperature = pluginParamaterManager->getDoubleValue("My Special Temperature"); pluginParamaterManager->endGroup(); return true; }
- Add a custom mass for all Particle-Particle
contacts.
void CApiContactModel::setApiParametersTemplate() const { auto* apiManager = getApiManager(); auto* pluginParamaterManager = apiManager->getParameterManager(); pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_PARTICLE); pluginParamaterManager->addDoubleValue(5.972E24, "My Special Mass", NApi::eMass); pluginParamaterManager->endGroup(); }
bool CApiContactModel::starting( int numThreads, char guiPath[NApi::GUI_FILE_MAX_LENGTH]) { auto* apiManager = getApiManager(); auto* pluginParamaterManager = apiManager->getParameterManager(); pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_PARTICLE); double specialMass = pluginParamaterManager->getDoubleValue("My Special Mass"); pluginParamaterManager->endGroup(); return true; }
- Add a custom checkbox for enabling the output of a print statement using a Body
Force.
void CApiTestParticleBodyForce::setApiParametersTemplate() const { auto* apiManager = getApiManager(); auto* pluginParamaterManager = apiManager->getParameterManager(); pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_BODY_FORCE); pluginParamaterManager->addBoolValue(false, "True or false?"); pluginParamaterManager->endGroup(); }
bool CApiTestParticleBodyForce::starting( int numThreads, char guiPath[NApi::GUI_FILE_MAX_LENGTH]) { auto* apiManager = getApiManager(); auto* pluginParamaterManager = apiManager->getParameterManager(); pluginParamaterManager->openGroup(NPluginParamsGroupNames::PARTICLE_BODY_FORCE); m_myBoolean = pluginParamaterManager->getBoolValue("True or false?"); pluginParamaterManager->endGroup(); return true; }
ECalculateResult CApiTestParticleBodyForce::externalForce(int threadID, const NExternalForceTypes::STimeStepData& timeStepData, const NExternalForceTypes::SParticle& particle, NApiCore::ICustomPropertyDataApi_1_0* particleCustomProperties, NApiCore::ICustomPropertyDataApi_1_0* simulationCustomProperties, NExternalForceTypes::SResults& results) { if (m_myBoolean) { std::printf("Checkbox is ticked"); } return eSuccess; }
- Add a custom force for Particle-Geometry contacts, defined as a Material
Interaction.
- Open the Particle-Geometry group, and then open the materials Interactions Group.
- Within that group, define a parameter called 'force' as
follows:
pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY); pluginParamaterManager->startGroup(NPluginParamsGroupNames::LIST_INTERACTIONS); pluginParamaterManager->startGroup(NPluginParamsGroupNames::LIST_TEMPLATE); pluginParamaterManager->addDoubleValue(98.0, "Force", NApi::eForce, 0.0, 1000.0); pluginParamaterManager->endGroup(); pluginParamaterManager->endGroup(); pluginParamaterManager->endGroup();
In this example, the minimum (0.0) and maximum (1000.0) values are defined.
- Define a force for each material pair as follows:
- To access force values in the code, iterate over all material pairs as
follows:
pluginParamaterManager->openGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY); pluginParamaterManager->openGroup(NPluginParamsGroupNames::LIST_INTERACTIONS); size_t count = pluginParamaterManager->getGroupCount(); for (int i = 0; i < count; i++) { CSimpleString materialName1; CSimpleString materialName2; pluginParamaterManager->openInteractionGroup(i, materialName1, materialName2); double force = pluginParamaterManager->getDoubleValue("Force"); pluginParamaterManager->endGroup(); printf("The force between %s and %s is %f\n", materialName1.getString(), materialName2.getString(), force); } pluginParamaterManager->endGroup(); pluginParamaterManager->endGroup();
- To define parameters in a table (a table is similar to a group, except that
values are defined in
columns):
pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY); pluginParamaterManager->startTable("Tabulated Parameters"); pluginParamaterManager->addTableBoolColumnHeader(true, "Enabled"); pluginParamaterManager->addTableDoubleColumnHeader(1000, "Density", NApi::eDensity); pluginParamaterManager->addTableDoubleColumnHeader(100.0, "Temperature", NApi::eTemperature); pluginParamaterManager->addTableDoubleColumnHeader(1000.0e3, "Pressure", NApi::ePressure); pluginParamaterManager->endTable(); pluginParamaterManager->endGroup();
You can add as many rows as desired.- Access the parameters by iterating over rows as
follows:
pluginParamaterManager->openGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY); pluginParamaterManager->openTable("Tabulated Parameters"); for (int i = 0; i < pluginParamaterManager->getTableRowCount(); i++) { pluginParamaterManager->openTableRow(i); double dense = pluginParamaterManager->getDoubleValue("Density"); printf("Density of row %i is %f \n", i, dense); pluginParamaterManager->endTableRow(); } pluginParamaterManager->endTable(); pluginParamaterManager->endGroup();
- Define a set of default rows.
pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY); pluginParamaterManager->startTable("Tabulated Parameters"); pluginParamaterManager->addTableBoolColumnHeader(true, "Enabled"); pluginParamaterManager->addTableDoubleColumnHeader(1000, "Density", NApi::eDensity); pluginParamaterManager->addTableDoubleColumnHeader(100.0, "Temperature", NApi::eTemperature); pluginParamaterManager->addTableDoubleColumnHeader(1000.0e3, "Pressure", NApi::ePressure); pluginParamaterManager->startTableRow(); pluginParamaterManager->addBoolValue(false, "Enabled"); pluginParamaterManager->addDoubleValue(42, "Density"); pluginParamaterManager->addDoubleValue(42, "Temperature"); pluginParamaterManager->addDoubleValue(42, "Pressure"); pluginParamaterManager->endTableRow(); pluginParamaterManager->endTable(); pluginParamaterManager->endGroup();
Note: In this case, you can still edit the values of those rows but you cannot remove the rows. Therefore, a minimum number of rows is enforced.The row is now editable, but the icon is disabled.
- Access the parameters by iterating over rows as
follows: