/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*====================================================================*\ FILE : PTMechExCopy.c PURPOSE : Test Pro/TOOLKIT functions for Mechanica \*====================================================================*/ /*--------------------------------------------------------------------*\ Pro/Toolkit includes -- include this first \*--------------------------------------------------------------------*/ #include <ProToolkit.h> #include <ProMdl.h> #include <ProMechItem.h> #include <ProMechConstraint.h> #include <ProUtil.h> #include <ProMessage.h> #include <PTMechExamples.h> static ProError status; static ProCharLine msgbuf; static ProFileName msgfile; /*================================================================*\ FUNCTION: PTMechExDispconstrPostfilter PURPOSE: Selection filter to ensure that only displacement constrs are selected \*================================================================*/ static ProError PTMechExDispconstrPostfilter (ProSelection selection, ProAppData app_data) { ProModelitem mech_item; ProMechConstrType constr_type; status = ProSelectionModelitemGet (selection, (ProModelitem*)&mech_item); PT_TEST_LOG_SUCC ("ProSelectionModelitemGet()"); if (mech_item.type != PRO_SIMULATION_CONSTRAINT) return (PRO_TK_CONTINUE); status = ProMechconstrTypeGet (&mech_item, &constr_type); PT_TEST_LOG_SUCC ("ProMechconstrTypeGet()"); /*--------------------------------------------------------------------*\ Check if the selection is of valid type \*--------------------------------------------------------------------*/ if ((constr_type != PRO_MECH_CONSTR_DISPLACEMENT) || ( status != PRO_TK_NO_ERROR)) return (PRO_TK_CONTINUE); return (PRO_TK_NO_ERROR); } /*================================================================*\ FUNCTION: PTMechExConstrCopy PURPOSE: Copies the displacement data from one ref to another \*================================================================*/ ProError PTMechExConstrCopy() { ProSelFunctions sel_funcs; ProMechConstrType constr_type; ProMechDisplacementType type; ProMechDisplacementConstr* trans_datas; ProMechDisplacementConstr* rot_datas; ProMechGeomref csys_data; int i,n_sels; ProSelection* sels; ProMechDisplacementData data; ProLine buffer; char line [PRO_LINE_SIZE]; PTMechExGeomRef *array_refs; ProMechGeomrefType reftype; ProMechGeomrefSubType refsubtype; ProModelitem mech_item,model_item; ProMechItem tk_constraint_item; ProMechGeomref *array_geomrefs; ProMechStatus mech_status; ProCharLine constrset_name; ProMdl constraint_part; sel_funcs.pre_filter = NULL; sel_funcs.post_filter = PTMechExDispconstrPostfilter; sel_funcs.post_selact = NULL; sel_funcs.app_data = NULL; status = ProMdlCurrentGet(&constraint_part); PT_TEST_LOG_SUCC ("ProMdlCurrentGet"); /*--------------------------------------------------------------------*\ Select the displacement constraint to get the data \*--------------------------------------------------------------------*/ status = ProMessageDisplay(msgfile, "PTMechEx Select the displacement constraint"); PT_TEST_LOG_SUCC("ProMessageDisplay()"); while(1) { status =ProSelect ("sim_load", 1, NULL, &sel_funcs, NULL, NULL, &sels, &n_sels); PT_TEST_LOG_SUCC ("ProSelect()"); if( status != PRO_TK_NO_ERROR || n_sels <= 0 ) break; status = ProSelectionModelitemGet (sels[0], &mech_item); PT_TEST_LOG_SUCC ("ProSelectionModelitemGet()"); status = ProModelitemInit (mech_item.owner, mech_item.id, mech_item.type, &mech_item); PT_TEST_LOG_SUCC ("ProModelitemInit()"); /*--------------------------------------------------------------------*\ Get displacement data from the mech item \*--------------------------------------------------------------------*/ status = ProMechconstrDisplacementdataGet (&mech_item, &data); PT_TEST_LOG_SUCC ("ProMechconstrDisplacementdataGet()"); status = ProMechdisplacementdataTypeGet (data, &type); PT_TEST_LOG_SUCC ("ProMechdisplacementdataTypeGet()"); /*--------------------------------------------------------------------*\ Create new mech item \*--------------------------------------------------------------------*/ status = ProMechitemCreate ( (ProSolid) constraint_part, PRO_SIMULATION_CONSTRAINT, &tk_constraint_item); PT_TEST_LOG_SUCC ("ProMechitemCreate"); status = ProMechitemNameSet ( &tk_constraint_item, L"tk_created_constr"); PT_TEST_LOG_SUCC ("ProMechitemNameSet"); /*--------------------------------------------------------------------*\ Select the new references \*--------------------------------------------------------------------*/ status = ProMessageDisplay(msgfile, "PTMechEx Select references"); PT_TEST_LOG_SUCC("ProMessageDisplay"); status = ProSelect("surface,edge,curve,point",-1, NULL, NULL, NULL, NULL, &sels, &n_sels); PT_TEST_LOG_SUCC ("ProSelect()"); if( status != PRO_TK_NO_ERROR || n_sels <= 0 ) break; status =ProArrayAlloc (n_sels,sizeof (PTMechExGeomRef),1, (ProArray *) &array_refs); PT_TEST_LOG_SUCC ("ProArrayAlloc"); /*--------------------------------------------------------------------*\ Poppulate the new references with type/subtype \*--------------------------------------------------------------------*/ for ( i =0 ; i<n_sels; i++) { ProSelectionModelitemGet(sels[i],&model_item); switch (model_item.type) { case PRO_EDGE : reftype = PRO_MECH_EDGE; refsubtype =PRO_MECH_CURVE_NORMAL; break; case PRO_CURVE : reftype = PRO_MECH_CURVE; refsubtype = PRO_MECH_CURVE_NORMAL; break; case PRO_POINT : reftype = PRO_MECH_POINT; refsubtype =PRO_MECH_POINT_SINGLE; break; case PRO_SURFACE : reftype = PRO_MECH_SURFACE; refsubtype = PRO_MECH_SURFACE_NORMAL; break; } array_refs[i].type = reftype; array_refs[i].subtype = refsubtype; array_refs[i].id = model_item.id; array_refs[i].path = NULL; } /*--------------------------------------------------------------------*\ Create array of the geom refs from the array of refs \*--------------------------------------------------------------------*/ status = PTMechExGeomReferenceArrayCreate ( n_sels, array_refs, &array_geomrefs); PT_TEST_LOG_SUCC ("PTMechExGeomReferenceArrayCreate"); /*--------------------------------------------------------------------*\ Set the array of geom ref to the newly created constraint \*--------------------------------------------------------------------*/ status = ProMechconstrReferencesSet (&tk_constraint_item,array_geomrefs); PT_TEST_LOG_SUCC ("ProMechconstrReferencesGet()"); /*--------------------------------------------------------------------*\ Set the displacement data to the newly created constraint \*--------------------------------------------------------------------*/ status = ProMechconstrDisplacementdataSet (&tk_constraint_item,data); PT_TEST_LOG_SUCC ("ProMechconstrDisplacementdataSet"); /*--------------------------------------------------------------------*\ Get the name of the constraint set from where the displacement conatrsint selected \*--------------------------------------------------------------------*/ status = PTMechExConstraintsetNameGet(&mech_item,constrset_name); PT_TEST_LOG_SUCC ("PTMechExConstraintsetNameGet"); /*--------------------------------------------------------------------*\ Add the newly created constraint in to the constrait set \*--------------------------------------------------------------------*/ status = PTMechExConstraintAddinConstraintset (constraint_part,constrset_name, &tk_constraint_item); PT_TEST_LOG_SUCC ("PTMechExConstraintAddinConstraintset"); status = ProMechitemStatusGet (&tk_constraint_item, &mech_status); PT_TEST_LOG_SUCC ("ProMechitemStatusGet"); /*--------------------------------------------------------------------*\ Print Message from the result \*--------------------------------------------------------------------*/ if (mech_status == PRO_MECH_ACTIVE) { status = ProMessageDisplay(msgfile, "PTMechEx New displacement constraint created successfuly"); PT_TEST_LOG_SUCC("ProMessageDisplay()"); } else { status = ProMessageDisplay(msgfile, "PTMechEx New displacement constraint creation failed", msgbuf); PT_TEST_LOG_SUCC("ProMessageDisplay()"); } status = ProMechitemUpdateComplete (&tk_constraint_item); PT_TEST_LOG_SUCC ("ProMechitemUpdateComplete"); } return PRO_TK_NO_ERROR; }