/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*--------------------------------------------------------------------*\ Pro/TOOLKIT includes \*--------------------------------------------------------------------*/ #include <ProObjects.h> #include <ProPart.h> #include <ProUtil.h> #include <ProMaterial.h> #include <ProMenu.h> #include <ProWstring.h> #include <ProMessage.h> #include <ProTKRunTime.h> /*--------------------------------------------------------------------*\ Application includes \*--------------------------------------------------------------------*/ #include "TestError.h" #include "UtilMessage.h" #include "UtilString.h" /*--------------------------------------------------------------------*\ Macros \*--------------------------------------------------------------------*/ #define USER_ADD 0 #define USER_DELETE 1 #define USER_ASSIGN 2 #define USER_DENSITY 3 #define USER_READ 4 #define USER_WRITE 5 /*--------------------------------------------------------------------*\ Application global/external data \*--------------------------------------------------------------------*/ static struct pro_material_props def_props = { 29e6, /*yonug_modulus*/ 0.27, /*poisson_ratio*/ 11e6, 0.00879, /*mass_density*/ 6.78, 32.0, /*tharm_exp_ref_temp*/ 0.01, 36000.0, /*stress_lim_tension*/ 36000.0, 36000.0, /*stress_lim_shear*/ 0.0, 1.0, /*emisisivity*/ 1.0, 1.0, /*hardness*/ {0}, 0.0, /*init_bend_y_factor*/ {0} }; /*=============================================================*\ Function: ProTestPartMaterial() Purpose: Get/Set the part material name \*=============================================================*/ int ProTestPartMaterial( ProMdl* part) { int ProTestMaterialAction(); int menu_id, action; ProMenuFileRegister((char*)"TkMaterial",(char*)"tkmaterial.mnu", NULL); ProMenubuttonActionSet((char*)"TkMaterial",(char*)"TkMaterial", (ProMenubuttonAction)ProMenuDelete, NULL, 0); ProMenubuttonActionSet((char*)"TkMaterial",(char*)"-Done/Return", (ProMenubuttonAction)ProMenuDelete, NULL, 0); ProMenubuttonActionSet((char*)"TkMaterial",(char*)"-Add", (ProMenubuttonAction)ProTestMaterialAction, part, USER_ADD); ProMenubuttonActionSet((char*)"TkMaterial",(char*)"-Delete", (ProMenubuttonAction)ProTestMaterialAction, part, USER_DELETE); ProMenubuttonActionSet((char*)"TkMaterial",(char*)"-Assign", (ProMenubuttonAction)ProTestMaterialAction, part, USER_ASSIGN); ProMenubuttonActionSet((char*)"TkMaterial",(char*)"-Density", (ProMenubuttonAction)ProTestMaterialAction, part, USER_DENSITY); ProMenubuttonActionSet((char*)"TkMaterial",(char*)"-Read", (ProMenubuttonAction)ProTestMaterialAction, part, USER_READ); ProMenubuttonActionSet((char*)"TkMaterial",(char*)"-Write", (ProMenubuttonAction)ProTestMaterialAction, part, USER_WRITE); ProMenuCreate(PROMENUTYPE_MAIN, (char*)"TkMaterial", &menu_id); ProMenuProcess((char*)"TkMaterial", &action); return 0; } /*=============================================================*\ Function: ProUtilSelectMaterial() Purpose: select one material from part \*=============================================================*/ ProError ProUtilSelectMaterial(ProSolid *part, ProMaterial *material) { ProError status, st; ProName * p_name, w_name; wchar_t empty = 0, **w_sel; ProWstring *w_array, p_empty; int i, n_lines, n_sel; status = ProArrayAlloc(0, sizeof(ProName), 1, (ProArray*) &p_name); TEST_CALL_REPORT("ProArrayAlloc()", "ProUtilSelectMaterial()", status,status != PRO_TK_NO_ERROR); status = ProPartMaterialsGet(*part, &p_name); TEST_CALL_REPORT("ProPartMaterialsGet()", "ProUtilSelectMaterial()", status,status != PRO_TK_NO_ERROR); if (status != PRO_TK_NO_ERROR) { ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", (char*)"Unable select material"); } else { status = ProArrayAlloc(0, sizeof(ProWstring), 1, (ProArray*)&w_array); TEST_CALL_REPORT("ProArrayAlloc()", "ProUtilSelectMaterial()", status,status != PRO_TK_NO_ERROR); status = ProArraySizeGet((ProArray)p_name, &n_lines); TEST_CALL_REPORT("ProArraySizeGet()", "ProUtilSelectMaterial()", status,status != PRO_TK_NO_ERROR); for (i=0; i<n_lines; i++) { p_empty = p_name[i]; status = ProWstringArrayObjectAdd(&w_array, PRO_VALUE_UNUSED, 1, (ProWstring*)&p_empty); TEST_CALL_REPORT("ProWstringArrayObjectAdd()", "ProUtilSelectMaterial()", status, status != PRO_TK_NO_ERROR); } status = ProWstringArraySizeSet(&w_array, n_lines + 1); TEST_CALL_REPORT("ProWstringArraySizeSet()", "ProUtilSelectMaterial()", status, status != PRO_TK_NO_ERROR); p_empty = ∅ w_array[n_lines] = p_empty; ProStringToWstring(w_name, (char*)"Materials"); ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", (char*)"Select material"); st = ProMenuStringsSelect(w_name, w_array, 1, NULL, &w_sel, &n_sel); status = ProWstringArrayObjectRemove(&w_array, n_lines, 1); TEST_CALL_REPORT("ProWstringArrayObjectRemove()", "ProUtilSelectMaterial()", status, status != PRO_TK_NO_ERROR); status = ProWstringArrayFree(&w_array); TEST_CALL_REPORT("ProWstringArrayFree()", "ProUtilSelectMaterial()", status, status != PRO_TK_NO_ERROR); if (st == PRO_TK_NO_ERROR) { ProUtilWstrcpy(material->matl_name, w_sel[0]); material->part = *part; } status = st; } st = ProArrayFree((ProArray*)&p_name); TEST_CALL_REPORT("ProArrayFree()", "ProUtilSelectMaterial()", status, status != PRO_TK_NO_ERROR); return (status); } /*=============================================================*\ Function: ProTestMaterialAction() Purpose: all material actions \*=============================================================*/ int ProTestMaterialAction(ProSolid *part, int action) { static int current_get, data_get, current_set; ProMaterial material; ProName w_name; ProError status; ProMaterialdata mat_data; ProCharLine line; double drange[2] = {1e-3, 1e10}, dens; char name[PRO_NAME_SIZE]; ProMaterialItem matItem; ProParamvalue matValue; ProUnititem matUnits; switch (action) { case USER_ADD: ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", (char*)"Enter new material name:"); status = ProMessageStringRead(PRO_NAME_SIZE, w_name); if (status == PRO_TK_NO_ERROR) { status = ProMaterialCreate(*part, w_name, &def_props, &material); TEST_CALL_REPORT("ProMaterialCreate()", "ProTestMaterialAction()", status, status != PRO_TK_NO_ERROR); if (status == PRO_TK_NO_ERROR) ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", "Material created successfully"); } break; case USER_DELETE: status = ProUtilSelectMaterial(part, &material); if (status == PRO_TK_NO_ERROR) { status = ProMaterialDelete(&material); TEST_CALL_REPORT("ProMaterialDelete()", "ProTestMaterialAction()", status, status != PRO_TK_NO_ERROR); if (status == PRO_TK_NO_ERROR) ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", "Material removed successfully"); } break; case USER_ASSIGN: status = ProUtilSelectMaterial(part, &material); if (status != PRO_TK_NO_ERROR) break; if ((current_set++) & 1) { status = ProMaterialCurrentSet(&material); TEST_CALL_REPORT("ProMaterialCurrentSet()", "ProTestMaterialAction()",status,status != PRO_TK_NO_ERROR); if (status == PRO_TK_NO_ERROR) ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", "Material assigned successfully"); } break; case USER_DENSITY: if ((current_get++) & 1) { status = ProMaterialCurrentGet(*part, &material); TEST_CALL_REPORT("ProMaterialCurrentGet()", "ProTestMaterialAction()",status,status != PRO_TK_NO_ERROR); status = ProModelitemByNameInit(*part,PRO_RP_MATERIAL,material.matl_name,&matItem); TEST_CALL_REPORT( "ProModelitemByNameInit()", "ProTestMaterialAction()",status, status != PRO_TK_NO_ERROR); status = ProMaterialPropertyGet(&matItem,PRO_MATPROP_MASS_DENSITY, &matValue,&matUnits); TEST_CALL_REPORT( "ProMaterialPropertyGet()", "ProTestMaterialAction()",status, status != PRO_TK_NO_ERROR); } ProTKSprintf(line, (char*)"Enter new density value [%.3f]:",matValue.value.d_val); ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", line); status = ProMessageDoubleRead(drange, &dens); if (status == PRO_TK_NO_ERROR) matValue.value.d_val = dens; status = ProMaterialPropertySet(&matItem,PRO_MATPROP_MASS_DENSITY, &matValue,&matUnits); TEST_CALL_REPORT( "ProMaterialPropertySet()", "ProTestMaterialAction()",status, status != PRO_TK_NO_ERROR); break; case USER_READ: ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", (char*)"Enter material name:"); status = ProMessageStringRead(PRO_NAME_SIZE, w_name); if (status != PRO_TK_NO_ERROR) break; status = ProMaterialfileRead(*part, w_name); TEST_CALL_REPORT("ProMaterialfileRead()", "ProTestMaterialAction()",status,status != PRO_TK_NO_ERROR); break; case USER_WRITE: status = ProUtilSelectMaterial(part, &material); if (status != PRO_TK_NO_ERROR) break; ProUtilMsgPrint((char*)"gen",(char*)"TEST %0s",(char*)"Enter file name to store material:"); status = ProMessageStringRead(PRO_NAME_SIZE, w_name); ProWstringToString(name, w_name); if (strchr(name, '.') == NULL) ProUtilstrcat(name, ".mat"); ProStringToWstring(w_name, name); status = ProMaterialfileWrite(&material, w_name); TEST_CALL_REPORT("ProMaterialfileWrite()", "ProTestMaterialAction()",status,status != PRO_TK_NO_ERROR); if (status == PRO_TK_NO_ERROR) ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", "Material file stored successfilly"); break; default: ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", (char*)"Error!!"); break; } return (0); }