/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*--------------------------------------------------------------------*\
Pro/Toolkit includes
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProMdl.h>
#include <ProGeomitemdata.h>
#include <ProMechanica.h>
#include <ProMechConstraint.h>
#include <ProMechLoad.h>
#include <ProMechMaterialOrient.h>
#include <ProMechMass.h>
#include <ProMechValue.h>
#include <ProModelitem.h>
#include <ProUtil.h>
#include <ProWstring.h>
#include <ProTKRunTime.h>
#include <math.h>
#include <ProMechLoadset.h>
/*--------------------------------------------------------------------*\
Application includes
\*--------------------------------------------------------------------*/
#include <PTMechExamples.h>
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
static ProError status;
/*=============================================================*\
FUNCTION: PTMechExGeomReferenceCreate
PURPOSE: This fn is used to get the geom reference.
\*=============================================================*/
ProError PTMechExGeomReferenceCreate (PTMechExGeomRef* reference , ProMechGeomref *geom_ref)
{
ProMechGeomref geomref_entity;
status = ProMechgeomrefAlloc (&geomref_entity);
PT_TEST_LOG_SUCC ("ProMechgeomrefAlloc");
/*--------------------------------------------------------------------*\
Set the geomref type, subtype,id and asmcomppath
\*--------------------------------------------------------------------*/
status = ProMechgeomrefTypeSet (geomref_entity, reference->type);
PT_TEST_LOG_SUCC ("ProMechgeomrefTypeSet");
if (reference->subtype != PRO_VALUE_UNUSED ) /* Only For Ref.: Curve, Edge, Point, Surface */
{
status = ProMechgeomrefSubtypeSet (geomref_entity, reference->subtype);
PT_TEST_LOG_SUCC ("ProMechgeomrefSubtypeSet");
}
if (reference->id != PRO_VALUE_UNUSED) /* For Ref. other than Part */
{
status = ProMechgeomrefIdSet (geomref_entity, reference->id);
PT_TEST_LOG_SUCC ("ProMechgeomrefIdSet");
}
if ( reference->path != NULL) /* Only For Ref. in Assembly */
{
status = ProMechgeomrefPathSet (geomref_entity, reference->path);
PT_TEST_LOG_SUCC ("ProMechgeomrefPathSet");
}
*geom_ref = geomref_entity;
return PRO_TK_NO_ERROR;
}
/*=============================================================================*\
FUNCTION: PTMechExGeomReferenceArrayCreate
PURPOSE:This fn creates a ProArray of ProMechGeomref items and outputs the same.
\*=============================================================================*/
ProError PTMechExGeomReferenceArrayCreate (int num_ents, PTMechExGeomRef* array_refs,
ProMechGeomref **geom_refs)
{
ProMechGeomref *array_geomrefs;
int i;
if ( num_ents == 0 || array_refs == NULL)
return PRO_TK_BAD_INPUTS;
else
{
/*--------------------------------------------------------------------*\
Craeate array of geomref
\*--------------------------------------------------------------------*/
status = ProArrayAlloc ( num_ents, sizeof (ProMechGeomref), 1,
(ProArray *) &array_geomrefs);
PT_TEST_LOG_SUCC ("ProArrayAlloc");
for (i=0; i<num_ents; i++)
{
ProMechGeomref geomref_entity;
status = PTMechExGeomReferenceCreate ( &array_refs[i], &geomref_entity);
PT_TEST_LOG_SUCC ("PTMechExGeomReferenceCreate");
array_geomrefs[i] = geomref_entity;
}
*geom_refs = array_geomrefs;
}
return PRO_TK_NO_ERROR;
}
/*============================================================================
FUNCTION: PTMechExGetMechItemByName
PURPOSE: This fn is used to get the ProMechItem of a specific ProType
from the Mechanica UI.
=============================================================================*/
ProError PTMechExGetMechItemByName (ProSolid solid, ProType type, char* item_name, ProMechItem *item)
{
mechItemData item_data;
ProAppData data;
item_data.item_name = item_name;
item_data.item = item;
/*--------------------------------------------------------------------*\
Visit the solid and collect the names of the items
\*--------------------------------------------------------------------*/
status = ProSolidMechitemVisit ( solid, type, MechItem_ActionFn_name , NULL, &item_data);
PT_TEST_LOG ("ProSolidMechitemVisit", status, (status != PRO_TK_E_FOUND && status != PRO_TK_NO_ERROR));
if (status == PRO_TK_E_FOUND)
{
return PRO_TK_NO_ERROR;
}
else
return PRO_TK_E_NOT_FOUND;
}
/*============================================================================
FUNCTION: MechItem_ActionFn_name
PURPOSE: Visits the mech item and copies the data of mech item
=============================================================================*/
ProError MechItem_ActionFn_name (ProMechItem* item, ProError filter_status, ProAppData app_data)
{
mechItemData *item_data = (mechItemData *)app_data;
ProName item_wname;
char item_name[100];
status = ProMechitemNameGet (item, item_wname);
PT_TEST_LOG_SUCC ("ProMechitemNameGet");
ProWstringToString ( item_name, item_wname);
if (strcmp (item_data->item_name, item_name) == 0)
{
item_data->item->id = item->id;
item_data->item->type = item->type;
item_data->item->owner = item->owner;
return PRO_TK_E_FOUND;
}
return PRO_TK_NO_ERROR;
}
/*============================================================================
FUNCTION: PTMechExMagValueIncrease
PURPOSE: Increase the value 5 times
=============================================================================*/
ProError PTMechExMagValueIncrease(ProLine input_val,ProLine output_val)
{
double mag;
char res[PRO_LINE_SIZE];
wchar_t w_res[PRO_LINE_SIZE];
ProWstringToString(res,input_val);
mag = (double )atof (res);
mag = mag * 5;
ProTKSprintf(res,"%f",mag);
ProStringToWstring(w_res,res);
ProWstringCopy (w_res,output_val, PRO_VALUE_UNUSED);
return PRO_TK_NO_ERROR;
}
/*============================================================================*\
FUNCTION: PTMechExConstraintAddinConstraintset
PURPOSE: Add Constrint to a Constraintset.
\*============================================================================*/
ProError PTMechExConstraintAddinConstraintset (ProMdl part, char *constrset_name,
ProMechItem *constraint)
{
ProMechItem ui_constraint_item;
status = PTMechExGetMechItemByName (part, PRO_SIMULATION_CONSTR_SET,constrset_name,
&ui_constraint_item);
PT_TEST_LOG_SUCC ("PTMechExGetMechItemByName");
status = ProMechconstrConstrsetAssign ( constraint, ui_constraint_item.id, PRO_B_TRUE);
PT_TEST_LOG_SUCC ("ProMechconstrConstrsetAssign");
return status;
}
/*============================================================================*\
FUNCTION: PTMechExConstraintsetNameGet
PURPOSE: Get the constrain set name from the mech item
\*============================================================================*/
ProError PTMechExConstraintsetNameGet (ProMechItem *item, ProCharLine constrset_name)
{
ProName item_proname;
char item_name [PRO_NAME_SIZE];
int num_constrset;
int *array_constrset;
status = ProMechconstrConstrsetsGet ( item, &array_constrset);
PT_TEST_LOG_SUCC ("ProMechconstrConstrsetsGet");
if (status == PRO_TK_NO_ERROR )
{
status = ProArraySizeGet (array_constrset, &num_constrset);
PT_TEST_LOG_SUCC ("ProArraySizeGet");
if (num_constrset > 0)
{
ProMechItem *constrset_item;
ProName constrset_proname;
status = PTMechExGetMechItemNameById (item->owner, PRO_SIMULATION_CONSTR_SET, array_constrset[0],
constrset_proname);
PT_TEST_LOG_SUCC ("PTMechExGetMechItemNameById");
ProWstringToString ( constrset_name, constrset_proname);
}
}
return status;
}
/*============================================================================*\
FUNCTION:PTMechExGetMechItemNameById
PURPOSE: Get the mech item from the id
\*============================================================================*/
ProError PTMechExGetMechItemNameById(ProSolid solid, ProType type, int item_id, ProName constrset_proname)
{
mechItemNameData item_data;
item_data.item_id = item_id;
item_data.item_name = constrset_proname;
status = ProSolidMechitemVisit ( solid, type, MechItem_ActionFn_id , NULL, &item_data);
PT_TEST_LOG ("ProSolidMechitemVisit", status, (status != PRO_TK_E_FOUND && status != PRO_TK_NO_ERROR));
if (status == PRO_TK_E_FOUND)
{
return PRO_TK_NO_ERROR;
}
else
return PRO_TK_E_NOT_FOUND;
}
/*============================================================================*\
FUNCTION:MechItem_ActionFn_id
PURPOSE: Visit the mech item and copy the data
\*============================================================================*/
ProError MechItem_ActionFn_id (ProMechItem* item, ProError filter_status, ProAppData app_data)
{
int item_id;
char item_name[100];
mechItemNameData *item_data;
item_data = (mechItemNameData*) app_data;
item_id = item->id;
if (item_id == item_data->item_id)
{
status = ProMechitemNameGet(item, item_data->item_name);
PT_TEST_LOG_SUCC ("ProMechitemNameGet");
return PRO_TK_E_FOUND;
}
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
FUNCTION : PTMechExComponentsVectoredValueCreate
PURPOSE : To Create the vector value for component
\*=============================================================*/
ProError PTMechExComponentsVectoredValueCreate (int n_vector,
ProMechExpression exp[], ProMechVectoredValue *vector_val)
{
ProMechVectoredValue value;
ProMechDirectionVector dir_vector;
ProMechValue *arr_val, mech_val;
int i;
status = ProMechvectoredvalueAlloc (&value);
PT_TEST_LOG_SUCC ("ProMechvectoredvalueAlloc");
status = ProMechvectoredvalueDirectiontypeSet (value, PRO_MECH_DIRECTION_BY_VECTOR);
PT_TEST_LOG_SUCC ("ProMechvectoredvalueDirectiontypeSet");
status = ProMechdirvectorAlloc (&dir_vector);
PT_TEST_LOG_SUCC ("ProMechdirvectorAlloc");
status = ProArrayAlloc (3, sizeof (ProMechValue), 1, (ProArray *)&arr_val);
PT_TEST_LOG_SUCC ("ProArrayAlloc");
for (i = 0; i < n_vector; i++)
{
status = ProMechvalueAlloc (&mech_val);
PT_TEST_LOG_SUCC ("ProMechvalueAlloc");
status = ProMechvalueValueSet (mech_val, exp[i]);
PT_TEST_LOG_SUCC ("ProMechvalueValueSet");
arr_val[i] = mech_val;
}
status = ProMechdirvectorComponentsSet (dir_vector, arr_val);
PT_TEST_LOG_SUCC ("ProMechdirvectorComponentsSet");
status = ProMechvectoredvalueDirectionvectorSet (value, dir_vector);
PT_TEST_LOG_SUCC ("ProMechvectoredvalueDirectionvectorSet");
*vector_val = value;
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
FUNCTION : PTMechExAddLoadinLoadset
PURPOSE : To add created load in specified loadset.
\*=============================================================*/
ProError PTMechExAddLoadinLoadset (ProMdl mdl, char* name, ProMechItem *m_item)
{
ProMechItem load_item;
status = PTMechExGetMechItemByName ((ProSolid)mdl, PRO_SIMULATION_LOAD_SET, name, &load_item);
PT_TEST_LOG_SUCC ("PTMechExGetMechItemByName");
status = ProMechloadLoadsetAssign (m_item, load_item.id, PRO_B_TRUE);
PT_TEST_LOG_SUCC ("ProMechloadLoadsetAssign");
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
FUNCTION : PTMechExValueByExpressionCreate
PURPOSE : To create mech value for load.
\*=============================================================*/
ProError PTMechExValueByExpressionCreate (ProMechExpression exp, ProMechValue *m_value)
{
ProMechValue m_val;
status = ProMechvalueAlloc (&m_val);
PT_TEST_LOG_SUCC ("ProMechvalueAlloc");
status = ProMechvalueValueSet (m_val, exp);
PT_TEST_LOG_SUCC ("ProMechvalueValueSet");
*m_value = m_val;
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
FUNCTION : PTMechExDirVectorMagnitudeValueCreate
PURPOSE : To create vector.
\*=============================================================*/
ProError PTMechExDirVectorMagnitudeValueCreate (int data, ProMechExpression mech_exp[],
ProMechExpression expr, ProMechVectoredValue *vector)
{
ProMechVectoredValue v_value;
ProMechValue mag_val;
status = PTMechExComponentsVectoredValueCreate (data, mech_exp, &v_value);
PT_TEST_LOG_SUCC ("PTMechExComponentsVectoredValueCreate");
status = PTMechExValueByExpressionCreate (expr, &mag_val);
PT_TEST_LOG_SUCC ("PTMechExValueByExpressionCreate");
status = ProMechvectoredvalueMagnitudeSet (v_value, mag_val);
PT_TEST_LOG_SUCC ("ProMechvectoredvalueMagnitudeSet");
*vector = v_value;
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
FUNCTION : PTMechExLoadsetCreate
PURPOSE : To create loadset for load.
\*=============================================================*/
ProError PTMechExLoadsetCreate (ProSolid model, char* loadset_name)
{
ProMechItem get_item, set_item;
ProName w_loadset_name;
ProStringToWstring (w_loadset_name, loadset_name);
status = PTMechExGetMechItemByName (model, PRO_SIMULATION_LOAD_SET, loadset_name, &get_item);
PT_TEST_LOG ("PTMechExGetMechItemByName", status,
status != PRO_TK_NO_ERROR && status != PRO_TK_E_NOT_FOUND);
if (status == PRO_TK_E_NOT_FOUND)
{
status = ProMechitemCreate (model, PRO_SIMULATION_LOAD_SET, &set_item);
PT_TEST_LOG_SUCC ("ProMechitemCreate");
status = ProMechitemNameSet (&set_item, w_loadset_name);
PT_TEST_LOG_SUCC ("ProMechitemNameSet");
status = ProMechloadsetDescriptionSet (&set_item, L"Loadset for Mechanica Example");
PT_TEST_LOG_SUCC ("ProMechloadsetDescriptionSet");
}
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
FUNCTION : PTMechExDeleteAndPop
PURPOSE : To delete and pop up the menu.
\*=============================================================*/
ProError PTMechExDeleteAndPop()
{
status = ProMenuDeleteWithStatus (0);
PT_TEST_LOG_SUCC ("ProMenuDeleteWithStatus");
status = ProMenuPop();
PT_TEST_LOG_SUCC ("ProMenuPop");
return PRO_TK_NO_ERROR;
}