/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ #include <ProToolkit.h> #include <ProMfg.h> #include <ProSolid.h> #include <ProSelection.h> #include <ProAsmcomppath.h> #include <ProElement.h> #include <ProElemId.h> #include <ProValue.h> #include <ProFeature.h> #include <ProUtil.h> #include <ProMessage.h> #include <ProTKRunTime.h> #include <ProMfgOptions.h> #include <ProFeatType.h> #include <TestError.h> #include <UtilString.h> #include <UtilTree.h> #include <UtilVisit.h> #include <TestConsts.h> #include <UtilMessage.h> #include <UgMfg.h> extern ProLine msg_fil17; #define MSG_FIL ProStringToWstring(msg_fil17,"msg_ugmfg.txt") typedef struct { ProMfg model; ProSelection workcell; ProBoolean wc_found; ProSelection csys; ProBoolean csys_found; } OperEnts ; /*====================================================================*\ Function : UserOperCsysGeomitemGet Purpose : Get geom item \*====================================================================*/ static ProError UserOperCsysGeomitemGet ( /*--------------------------------------------------------------------*/ ProGeomitem *geomitem, ProError status, ProAppData app_data ) /*--------------------------------------------------------------------*/ { *(ProGeomitem*)app_data = *geomitem; return ( PRO_TK_NO_ERROR ); } /*====================================================================*\ Function : UserOperEnitiesCollect Purpose : Collect worckcell and csys and use them to create an operation \*====================================================================*/ ProError UserOperEnitiesCollect ( /*--------------------------------------------------------------------*/ ProFeature *feature, ProError err, ProAppData entities ) /*--------------------------------------------------------------------*/ { ProError status; ProAsmcomppath path; ProFeattype feat_type; ProWcellType wcell_type; OperEnts *oper_ents = (OperEnts*)entities; ProSelection selection; ProGeomitem csysgeom; int id; status = ProFeatureTypeGet( feature, &feat_type ); ERROR_CHECK( "UserOperEnitiesCollect","ProFeatureTypeGet()",status ); if ( status == PRO_TK_NO_ERROR ) { if ( !oper_ents->wc_found && feat_type == PRO_FEAT_WORKCELL ) { status = ProSelectionAlloc( NULL, feature, &selection ); ERROR_CHECK( "UserOperEnitiesCollect", "ProSelectionAlloc()", status ); ProSelectionCopy( selection, &oper_ents->workcell ); oper_ents->wc_found = PRO_B_TRUE; } else if ( !oper_ents->csys_found && feat_type == PRO_FEAT_CSYS ) { status = ProFeatureGeomitemVisit( feature, PRO_CSYS, UserOperCsysGeomitemGet, NULL, &csysgeom ); ERROR_CHECK( "UserOperEnitiesCollect", "ProFeatureGeomitemVisit()", status ); status = ProSelectionAlloc( NULL, (ProModelitem*)&csysgeom, &selection ); ERROR_CHECK( "UserOperEnitiesCollect", "ProFeatureSelectionCreate()", status); ProSelectionCopy( selection, &oper_ents->csys ); oper_ents->csys_found = PRO_B_TRUE; } } if ( oper_ents->wc_found && oper_ents->csys_found ) return ( PRO_TK_STOP_VISIT ); return ( PRO_TK_NO_ERROR ); } /*====================================================================*\ FUNCTION : UserOperCreate PURPOSE : Top level operation creation function \*====================================================================*/ int UserOperCreate () { ProMdl mfg_model; ProError status; ProSolid mfg_solid; OperEnts entities; ProError UserOperationCreate (); wchar_t feat_name[PRO_NAME_SIZE], def_wname[PRO_NAME_SIZE]; char def_name[] = "DemoOp", str[PRO_LINE_SIZE]; status = ProMdlCurrentGet( &mfg_model ); ERROR_CHECK( "UserOperCreate", "ProMdlCurrentGet", status ); if ( status == PRO_TK_NO_ERROR ) { status = ProMfgSolidGet( (ProMfg)mfg_model, &mfg_solid ); ERROR_CHECK( "UserOperCreate", "ProMfgSolidGet", status ); } if ( status != PRO_TK_NO_ERROR ) return( status ); /*----------------------------------------*\ Search required references \*----------------------------------------*/ entities.wc_found = PRO_B_FALSE; entities.csys_found = PRO_B_FALSE; entities.model = (ProMfg)mfg_model; status = ProSolidFeatVisit( mfg_solid, UserOperEnitiesCollect, NULL, (ProAppData) &entities ); if ( entities.wc_found == PRO_B_TRUE && entities.csys_found == PRO_B_TRUE ) { /*----------------------------------------*\ Create operation \*----------------------------------------*/ ProMessageDisplay( MSG_FIL, "USER Enter operation name: "); ProStringToWstring( def_wname, def_name ); ProUtilStringGet( feat_name, def_wname, PRO_NAME_SIZE); status = UserOperationCreate( (ProMfg)mfg_model, feat_name, entities.workcell, entities.csys ); ERROR_CHECK("UserOperCreate","UserOperationCreate",status); } else { if ( !entities.wc_found ) ProTKFprintf( stderr, "A suitable worckcell was not found\n" ); if ( !entities.csys_found ) ProTKFprintf( stderr, "A suitable coord-sys was not found\n" ); } return ( (int)status ); } /*====================================================================*\ Function : UserOperationCreate Purpose : Create operation using element tree \*====================================================================*/ ProError UserOperationCreate ( /*--------------------------------------------------------------------*/ ProMfg mfg_model, ProName feat_name, ProSelection workcell, ProSelection csys_sel ) /*--------------------------------------------------------------------*/ { ProError err = PRO_TK_NO_ERROR; ProElement oper_elem = NULL; /* Individual element */ ProElement oper_elem_tree = NULL; /* Entire tree */ ProErrorlist errors; ProSolid mfg_solid; ProModelitem modelitem; ProSelection selection; ProFeature oper_feature; ProReference reference; int ii = 0, size = 0; static ElemTable oper_elem_table[] = { { PRO_E_FEATURE_TYPE, PRO_VALUE_TYPE_INT }, { PRO_E_MFG_WCELL_REF, PRO_VALUE_TYPE_SELECTION }, { PRO_E_OPER_CSYS, PRO_VALUE_TYPE_SELECTION }, { PRO_E_STD_FEATURE_NAME, PRO_VALUE_TYPE_WSTRING } }; size = sizeof(oper_elem_table)/ sizeof(ElemTable); err = ProElementAlloc( PRO_E_FEATURE_TREE, &oper_elem_tree ); ERROR_CHECK( "UserOperationCreate","ProElementAlloc()", err ); for ( ii = 0; ii < size; ii++ ) { err = ProElementAlloc( oper_elem_table[ii].elem_type, &oper_elem ); ERROR_CHECK( "UserOperationCreate","ProElementAlloc()", err ); switch ( oper_elem_table[ii].elem_type ) { case PRO_E_FEATURE_TYPE: err = ProElementIntegerSet ( oper_elem, PRO_FEAT_OPERATION ); ERROR_CHECK( "UserOperationCreate"," ProElementIntegerSet",err ); break; case PRO_E_MFG_WCELL_REF: err = ProSelectionToReference( workcell, &reference ); ERROR_CHECK( "UserOperationCreate()", "ProSelectionToReference", err ); err = ProElementReferenceSet( oper_elem, reference ); ERROR_CHECK( "UserOperationCreate()", "ProElementReferenceSet", err ); break; case PRO_E_OPER_CSYS: err = ProSelectionToReference( csys_sel, &reference ); ERROR_CHECK( "UserOperationCreate()", "ProSelectionToReference", err ); err = ProElementReferenceSet( oper_elem, reference ); ERROR_CHECK( "UserOperationCreate()", "ProElementReferenceSet", err ); break; case PRO_E_STD_FEATURE_NAME: err=ProElementWstringSet(oper_elem, feat_name); ERROR_CHECK( "UserOperationCreate()"," ProElementWstringSet" ,err); break; default: ProTKFprintf( stderr, "Error setting element type\n" ); err = PRO_TK_GENERAL_ERROR; ERROR_CHECK( "UserOperationCreate","UserOperationCreate()", err ); break; } err = ProElemtreeElementAdd( oper_elem_tree, NULL, oper_elem ); ERROR_CHECK( "UserOperationCreate", "ProElemtreeElementAdd()", err ); } ProUtilElementtreePrint( oper_elem_tree, PRO_TEST_INFO_WINDOW, NULL ); /*********************************************/ /* Create feature */ /*********************************************/ err = UserMfgModelFeatureCreate( mfg_model, oper_elem_tree, &oper_feature ); ERROR_CHECK( "UserOperationCreate", "UserMfgModelFeatureCreate()", err ); err = ProElementFree( &oper_elem_tree); ERROR_CHECK( "UserOperationCreate", "ProElementFree()", err ); return ( (int)err ); } #undef MSG_FIL