/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ #include "ProToolkit.h" #include "ProMdl.h" #include "ProFeature.h" #include "ProAsmcomppath.h" #include "ProAsmcomp.h" #include "ProMenu.h" #include "ProSelection.h" #include "ProMessage.h" #include "ProGeomitem.h" #include "ProModelitem.h" #include "ProFeatType.h" #include "ProDtmPln.h" #include "ProWstring.h" #include "ProUtil.h" #include "TestError.h" #include "ProSolid.h" int ProDatumPlaneCreate(ProSelection offset_surface, double offset_dist, int dtm_level); int UserDatumRefs(); #define ASSEMBLY 100 #define PART 200 /* =============================================================== *\ Function: UserDatumRefs() Purpose: Obtain reference surface and offset for datum plane creation \* =============================================================== */ int UserDatumRefs() { static wchar_t msgfil[80]; ProError status; ProSelection *ref_surf; int sel_num = -1, level_flag; double offset_value; wchar_t w_level[PRO_TYPE_SIZE]; char level[PRO_TYPE_SIZE]; ProMdl model; ProMdlType p_type; ProStringToWstring(msgfil, "msg_ugdatum.txt"); /* =============================================================== *\ Prompt user for reference surface ... \* =============================================================== */ status = ProMessageDisplay(msgfil, "USER Select a reference surface"); status = ProSelect("surface", 1, NULL, NULL, NULL, NULL, &ref_surf, &sel_num); ERROR_CHECK("ProSelect()", "UserDatumRefs()", status); if(sel_num < 1) return status; /* =============================================================== *\ ... then, offset distance \* =============================================================== */ status = ProMessageDisplay(msgfil, "USER Enter the offset value:"); if ((status = ProMessageDoubleRead(NULL, &offset_value)) != PRO_TK_NO_ERROR) return(status); /* =============================================================== *\ ... finally, level at which datum is to be created (part vs. asm) \* =============================================================== */ status = ProMdlCurrentGet(&model); ERROR_CHECK("ProMdlCurrentGet", "ProDatumPlaneCreate()", status); status = ProMdlTypeGet(model,&p_type); ERROR_CHECK("ProMdlTypeGet", "ProDatumPlaneCreate()", status); if (p_type == PRO_MDL_PART) { level_flag = PART; } else if(p_type == PRO_MDL_ASSEMBLY){ status = ProMessageDisplay(msgfil, "USER Create datum plane at part or assembly level (prt or asm):"); status = ProMessageStringRead(PRO_TYPE_SIZE, w_level); ERROR_CHECK("ProMessageStringRead()", "UserDatumRefs()", status); ProWstringToString(level, w_level); if (!strcmp(level, "prt")) level_flag = PART; else if (!strcmp(level, "asm")) level_flag = ASSEMBLY; else return(status); } else return(status); status = ProDatumPlaneCreate(*ref_surf, offset_value, level_flag); ERROR_CHECK("ProDatumPlaneCreate()", "UserDatumRefs()", status); return(status); } /* =============================================================== *\ Function: ProDatumPlaneCreate() Purpose: Creates a datum plane as an assembly feature at an offset distance from a surface on a part \* =============================================================== */ int ProDatumPlaneCreate(ProSelection offset_surface, double offset_dist, int dtm_level) { ProReference REPDEP_ref1; ProError status; ProElement elem_tree, elem_ftype, elem_consts, elem_offset; ProElement elem_const_type, elem_offset_ref, elem_offset_dist; ProValueData value_data; ProValue value; ProModelitem surf_modelitem, model_modelitem; ProSelection mdl_sel; ProFeature feature; ProErrorlist errors; ProAsmcomppath p_cmp_path; ProFeatureCreateOptions *opts = 0; /* =============================================================== *\ Allocate tree root element \* =============================================================== */ status = ProElementAlloc(PRO_E_FEATURE_TREE, &elem_tree); /* =============================================================== *\ Allocate feature type element; add to tree root. \* =============================================================== */ status = ProElementAlloc(PRO_E_FEATURE_TYPE, &elem_ftype); ProElementIntegerSet(elem_ftype,PRO_FEAT_DATUM); ProElemtreeElementAdd(elem_tree, NULL, elem_ftype); /* =============================================================== *\ Allocate constraints element; add to tree root. \* =============================================================== */ status = ProElementAlloc(PRO_E_DTMPLN_CONSTRAINTS, &elem_consts); ProElemtreeElementAdd(elem_tree, NULL, elem_consts); /* =============================================================== *\ Allocate constraint element; add under constraints element. \* =============================================================== */ status = ProElementAlloc(PRO_E_DTMPLN_CONSTRAINT, &elem_offset); status = ProElemtreeElementAdd(elem_consts, NULL, elem_offset); /* =============================================================== *\ Allocate constraint type element; add under constraint element. \* =============================================================== */ status = ProElementAlloc(PRO_E_DTMPLN_CONSTR_TYPE, &elem_const_type); ProElementIntegerSet(elem_const_type,PRO_DTMPLN_OFFS); status = ProElemtreeElementAdd(elem_offset, NULL, elem_const_type); /* =============================================================== *\ Allocate constraint ref element; add under constraint element. \* =============================================================== */ status = ProElementAlloc(PRO_E_DTMPLN_CONSTR_REF, &elem_offset_ref); ProSelectionToReference( offset_surface,&REPDEP_ref1 ); ProElementReferenceSet(elem_offset_ref,REPDEP_ref1); status = ProElemtreeElementAdd(elem_offset, NULL, elem_offset_ref); /* =============================================================== *\ Allocate ref offset value element; add under constraint element. \* =============================================================== */ status = ProElementAlloc(PRO_E_DTMPLN_CONSTR_REF_OFFSET, &elem_offset_dist); ProElementDecimalsSet( elem_offset_dist,4 ); ProElementDoubleSet(elem_offset_dist,offset_dist); status = ProElemtreeElementAdd(elem_offset, NULL, elem_offset_dist); /* =============================================================== *\ Get assembly component path to part containing offset surface \* =============================================================== */ status = ProSelectionAsmcomppathGet(offset_surface, &p_cmp_path); ERROR_CHECK("ProSelectionAsmcomppathGet", "ProDatumPlaneCreate()", status); switch (dtm_level) { case ASSEMBLY: /* =============================================================== *\ Obtain a ProModelitem handle to the root assembly \* =============================================================== */ status = ProMdlToModelitem(p_cmp_path.owner, &model_modelitem); ERROR_CHECK("ProMdlToModelitem", "ProDatumPlaneCreate()", status); /* =============================================================== *\ Allocate ProSection object for root assembly \* =============================================================== */ status = ProSelectionAlloc(NULL, &model_modelitem, &mdl_sel); ERROR_CHECK("ProSelectionAlloc", "ProDatumPlaneCreate()", status); break; case PART: /* =============================================================== *\ Obtain a ProModelitem handle to selected surface \* =============================================================== */ status = ProSelectionModelitemGet(offset_surface, &surf_modelitem); ERROR_CHECK("ProSelectionModelitemGet", "ProDatumPlaneCreate()", status); /* =============================================================== *\ Obtain a ProModelitem to the owner of the selected surface \* =============================================================== */ status = ProMdlToModelitem(surf_modelitem.owner, &model_modelitem); ERROR_CHECK("ProMdlToModelitem", "ProDatumPlaneCreate()", status); /* =============================================================== *\ Allocate ProSection object for part to which selected surface belongs \* =============================================================== */ status = ProSelectionAlloc(&p_cmp_path, &model_modelitem, &mdl_sel); ERROR_CHECK("ProSelectionAlloc", "ProDatumPlaneCreate()", status); break; default: return(0); } /* =============================================================== *\ Create datum plane \* =============================================================== */ status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts); opts[0]= PRO_FEAT_CR_NO_OPTS; status = ProFeatureWithoptionsCreate(mdl_sel, elem_tree, opts, PRO_REGEN_NO_FLAGS, &feature, &errors); ERROR_CHECK("ProFeatureWithoptionsCreate", "ProDatumPlaneCreate()", status); status = ProArrayFree((ProArray*)&opts); status = ProElementFree(&elem_tree); ERROR_CHECK("ProElementFree", "ProDatumPlaneCreate()", status); status = ProSelectionFree(&mdl_sel); ERROR_CHECK("ProSelectionFree", "ProDatumPlaneCreate()", status); return(status); }