/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*--------------------------------------------------------------------*\ Pro/TOOLKIT includes \*--------------------------------------------------------------------*/ #include <ProToolkit.h> #include <ProMdl.h> #include <ProFeature.h> #include <ProFeatType.h> #include <ProArray.h> #include <ProMenu.h> #include <ProMessage.h> #include <ProGraphic.h> #include <ProSimprep.h> #include <ProUtil.h> /*--------------------------------------------------------------------*\ Application includes \*--------------------------------------------------------------------*/ #include "TestError.h" #include "UtilMessage.h" #include "TestRule.h" /*--------------------------------------------------------------------*\ Macros \*--------------------------------------------------------------------*/ #define SIZE_GREATER 1 #define SIZE_LESS 2 #define SIZE_ABSOLUTE 3 #define SIZE_RELATIVE 4 #define SIZE_QUIT 5 #define SIZE_DONE 6 /*--------------------------------------------------------------------*\ Data types \*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*\ Application global/external data \*--------------------------------------------------------------------*/ static ProSolid solid; /*---------------------------------------------------------------------*\ Functions declaration \*---------------------------------------------------------------------*/ int ProTestRuleSizeDataInit( ProRuleSize*, int ); /*---------------------------------------------------------------------*\ Function: ProTestRules() Purpose: Create and run TkRules menu to init the structure ProRule. The use this structure to get a list of components. Returns: 0 - success; -1 - error. Now ignored. \*---------------------------------------------------------------------*/ int ProTestRules( AsmcomppathList* p_list ) { #ifndef PT_PRODUCTS_BUILD ProError status; int menu_id; /* The identifier of the created menu */ int menu_action; ProRule rule; rule.type = PRO_RULE_NONE; /* Init AsmcomppathList */ p_list->p_comp_path_list = NULL; p_list->size = 0; /* Get current model */ status = ProMdlCurrentGet( (ProMdl *)&solid ); TEST_CALL_REPORT( "ProMdlCurrentGet()", "ProTestRules()", status, status != PRO_TK_NO_ERROR ); /* Load menu from file */ status = ProMenuFileRegister((char *) "TkRules",(char *) "tkrule.mnu", &menu_id ); TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestRules()", status, status != PRO_TK_NO_ERROR ); /* Define menu buttons */ ProMenubuttonActionSet( (char *)"TkRules", (char *)"Use Name", (ProMenubuttonAction)ProTestRuleInitName, &rule, 0 ); ProMenubuttonActionSet( (char *)"TkRules", (char *)"Use Expr", (ProMenubuttonAction)ProTestRuleInitExpr, &rule, 0 ); ProMenubuttonActionSet( (char *)"TkRules", (char *)"Use Zone", (ProMenubuttonAction)ProTestRuleInitZone, &rule, 0 ); ProMenubuttonActionSet((char *) "TkRules", (char *)"Use Dist", (ProMenubuttonAction)ProTestRuleInitDist, &rule, 0 ); ProMenubuttonActionSet( (char *)"TkRules", (char *)"Use Size", (ProMenubuttonAction)ProTestRuleInitSize, &rule, 0 ); ProMenubuttonActionSet( (char *)"TkRules",(char *) "Use Rep", (ProMenubuttonAction)ProTestRuleInitRep, NULL, 0 ); ProMenubuttonActionSet( (char *)"TkRules",(char *) "Done/Return", (ProMenubuttonAction)ProMenuDelete, NULL,0 ); ProMenubuttonActionSet((char *) "TkRules", (char *)"TkRules", (ProMenubuttonAction)ProMenuDelete, NULL, 0 ); /* Run menu */ status = ProMenuCreate( PROMENUTYPE_MAIN, (char *)"TkRules", &menu_id ); TEST_CALL_REPORT( "ProMenuCreate()", "ProTestRules()", status, status != PRO_TK_NO_ERROR ); if( status == PRO_TK_NO_ERROR ) { status = ProMenuProcess((char *) "TkRules", &menu_action ); TEST_CALL_REPORT( "ProMenuProcess()", "ProTestRules()", status, status != PRO_TK_NO_ERROR ); } if( rule.type == PRO_RULE_NONE ) return -1; status = ProRuleEval( solid, &rule, &(p_list->p_comp_path_list), &(p_list->size) ); TEST_CALL_REPORT( "ProRuleEval()", "ProTestRules()", status, status != PRO_TK_NO_ERROR ); /* if( status != PRO_TK_NO_ERROR ) return -1; */ #endif /* #ifndef PT_PRODUCTS_BUILD */ return 0; } #ifndef PT_PRODUCTS_BUILD /*---------------------------------------------------------------------*\ Function: ProTestRuleInitName() Purpose: On-buton function. Init a rule by name. Returns: 0 - success; -1 - error. Now ignored. \*---------------------------------------------------------------------*/ int ProTestRuleInitName( ProRule* p_rule, int int_dummy ) { ProError status; ProName w_name; /* Get name wildcard */ ProUtilMsgPrint( "gen", "TEST %0s", "Enter name wildcard: " ); if( !ProUtilStringGet( w_name, NULL, PRO_NAME_SIZE ) ) return -1; status = ProRuleInitName( w_name, p_rule ); TEST_CALL_REPORT( "ProRuleInitName()", "ProTestRuleInitName()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) p_rule->type = PRO_RULE_NONE; return 0; } /*---------------------------------------------------------------------*\ Function: ProTestRuleInitExpr() Purpose: On-buton function. Init a rule by expression. Returns: 0 - success; -1 - error. Now ignored. \*---------------------------------------------------------------------*/ int ProTestRuleInitExpr( ProRule* p_rule, int int_dummy ) { ProError status; ProLine w_expression; ProExpression expressions; /* Allocate ProExpression object as array of ProLines */ status = ProArrayAlloc( 0, sizeof(ProLine), 1, (ProArray*)&expressions ); TEST_CALL_REPORT( "ProArrayAlloc", "ProTestRuleInitExpression()", status, status != PRO_TK_NO_ERROR ); do { ProUtilMsgPrint( "gen", "TEST %0s", "Enter expression: " ); status = ProMessageStringRead( PRO_LINE_SIZE, w_expression ); TEST_CALL_REPORT( "ProMessageStringRead()", "ProTestRuleInitExpression()", status, status != PRO_TK_NO_ERROR ); /* If user enters empty line stop prompting and evaluate expr */ if( status == PRO_TK_GENERAL_ERROR ) { status = PRO_TK_NO_ERROR; break; } if( status == PRO_TK_NO_ERROR ) { status = ProArrayObjectAdd( (ProArray*)&expressions, PRO_VALUE_UNUSED, 1, w_expression ); TEST_CALL_REPORT( "ProArrayObjectAdd", "ProTestRuleInitExpression()", status,status!=PRO_TK_NO_ERROR); } } while( status == PRO_TK_NO_ERROR ); if( status == PRO_TK_NO_ERROR ) { status = ProRuleInitExpr( expressions, p_rule ); TEST_CALL_REPORT( "ProRuleInitExpression()", "ProTestRuleInitExpression()", status, status != PRO_TK_NO_ERROR ); } if( status != PRO_TK_NO_ERROR ) p_rule->type = PRO_RULE_NONE; return 0; } /*---------------------------------------------------------------------*\ Function: ProTestRuleInitZone() Purpose: On-buton function. Init a rule by zone. Returns: 0 - success; -1 - error. Now ignored. \*---------------------------------------------------------------------*/ int ProTestRuleInitZone( ProRule* p_rule, int int_dummy ) { ProError status; ProSelection* p_selection; int n_selected; ProModelitem model_item; ProFeattype feat_type; ProUtilMsgPrint( "gen", "TEST %0s", "Select zone" ); /* Select a modelitem */ status = ProSelect( (char *)"feature", 1, NULL, NULL, NULL, NULL, &p_selection, &n_selected ); TEST_CALL_REPORT( "ProSelect()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); if( (status != PRO_TK_NO_ERROR) || (n_selected < 1) ) return -1; /* Get the feature item from a selection object */ status = ProSelectionModelitemGet( p_selection[0], &model_item ); TEST_CALL_REPORT( "ProSelectionModelitemGet()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); if( (status != PRO_TK_NO_ERROR) || (model_item.type != PRO_FEATURE) ) return -1; /* Retrieve the type of the specified feature */ status = ProFeatureTypeGet( &model_item, &feat_type ); TEST_CALL_REPORT( "ProFeatureTypeGet()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); if( (status != PRO_TK_NO_ERROR) || (feat_type != PRO_FEAT_ZONE) ) return -1; status = ProRuleInitZone( &model_item, p_rule ); TEST_CALL_REPORT( "ProRuleInitZone()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) p_rule->type = PRO_RULE_NONE; return 0; } /*---------------------------------------------------------------------*\ Function: ProTestRuleInitDist() Purpose: On-buton function. Init a rule by distance. Returns: 0 - success; -1 - error. Now ignored. \*---------------------------------------------------------------------*/ int ProTestRuleInitDist( ProRule* p_rule, int int_dummy ) { ProError status; ProRuleDist rule_distance; ProSelection *p_selection; int n_selected; ProAsmcomppath comp_path; ProMatrix transformation; p_rule->type = PRO_RULE_NONE; /* Pick the center point by mouse */ ProUtilMsgPrint( "gen", "TEST %0s", "Specify point, vertex or csys to evaluate distance from" ); status = ProSelect( (char *)"point,csys", 1, NULL, NULL, NULL, NULL, &p_selection, &n_selected ); TEST_CALL_REPORT( "ProSelect()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); if( (status != PRO_TK_NO_ERROR) || (n_selected < 1) ) return -1; status = ProSelectionPoint3dGet( p_selection[0], rule_distance.center ); TEST_CALL_REPORT( "ProSelectionPoint3dGet()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); status = ProSelectionAsmcomppathGet( p_selection[0], &comp_path ); TEST_CALL_REPORT( "ProSelectionAsmcomppathGet()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); status = ProAsmcomppathTrfGet( &comp_path, PRO_B_TRUE, transformation ); TEST_CALL_REPORT( "ProAsmcomppathTrfGet()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); status = ProVectorTrfEval( rule_distance.center, transformation, rule_distance.center ); TEST_CALL_REPORT( "ProVectorTrfEval()", "ProTestRuleInitZone()", status, status != PRO_TK_NO_ERROR ); /* Get distance */ ProUtilMsgPrint( "gen", "TEST %0s", "Enter distance: " ); if( !ProUtilDoubleGet( NULL, NULL, &(rule_distance.distance) ) ) return -1; status = ProRuleInitDist( &rule_distance, p_rule ); TEST_CALL_REPORT( "ProRuleInitDist()", "ProTestRuleInitDist()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) p_rule->type = PRO_RULE_NONE; return 0; } /*---------------------------------------------------------------------*\ Function: ProTestRuleInitSize() Purpose: On-buton function. Init a rule by size. Returns: 0 - success; -1 - error. Now ignored. \*---------------------------------------------------------------------*/ int ProTestRuleInitSize( ProRule* p_rule, int int_dummy ) { ProError status; int menu_id; /* The identifier of the created menu */ int menu_action = SIZE_QUIT; ProRuleSize rule_size; char *p_menus[] = { "Set Size", "Set Size2", "DONE QUIT", "" }; double range[ 2 ]; double *p_range; double value; /*---------------------*\ Define Set Size \*---------------------*/ status = ProMenuFileRegister( (char *)"Set Size", (char *)"tkrulesz.mnu", &menu_id ); TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); ProMenubuttonActionSet( (char *)"Set Size", (char *)"Absolute", (ProMenubuttonAction)ProTestRuleSizeDataInit, &rule_size, SIZE_ABSOLUTE ); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); ProMenubuttonActionSet( (char *)"Set Size", (char *)"Relative", (ProMenubuttonAction)ProTestRuleSizeDataInit, &rule_size, SIZE_RELATIVE ); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); ProMenubuttonActionSet( (char *)"Set Size", (char *)"Set Size", (ProMenubuttonAction)ProMenuHold, NULL, 0 ); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); /*---------------------*\ Define Set Size2 \*---------------------*/ status = ProMenuFileRegister( (char *)"Set Size2",(char *) "tkrulesz2.mnu", &menu_id ); TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); ProMenubuttonActionSet( (char *)"Set Size2",(char *) "Greater Than", (ProMenubuttonAction)ProTestRuleSizeDataInit, &rule_size, SIZE_GREATER ); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); ProMenubuttonActionSet((char *) "Set Size2", (char *)"Less Than", (ProMenubuttonAction)ProTestRuleSizeDataInit, &rule_size, SIZE_LESS ); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); ProMenubuttonActionSet( (char *)"Set Size2", (char *)"Set Size2", (ProMenubuttonAction)ProMenuHold, NULL, 0 ); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); /*---------------------*\ Define DONE QUIT \*---------------------*/ status = ProMenuFileRegister( (char *)"DONE QUIT",(char *)"tkdonequit.mnu", &menu_id ); TEST_CALL_REPORT("ProMenuFileRegister()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); status = ProMenubuttonActionSet((char *)"DONE QUIT",(char *)"-Done", (ProMenubuttonAction)ProTestRuleSizeDataInit, &rule_size, SIZE_DONE ); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); status = ProMenubuttonActionSet((char *)"DONE QUIT",(char *)"-Quit", (ProMenubuttonAction)ProTestRuleSizeDataInit, &rule_size, SIZE_QUIT ); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); status = ProMenubuttonActionSet((char *)"DONE QUIT",(char *)"DONE QUIT", (ProMenubuttonAction)ProMenuHold,NULL,0); TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestRuleInitSize", status , status != PRO_TK_NO_ERROR); /* Run menu */ status = ProCompoundmenuCreate( p_menus, &menu_id ); TEST_CALL_REPORT( "ProMenuCompoundCreate()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); if( status == PRO_TK_NO_ERROR ) { menu_action = SIZE_QUIT; status = ProMenuProcess( (char *)"Set Size", &menu_action ); TEST_CALL_REPORT( "ProMenuProcess()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); } if( menu_action == SIZE_DONE ) { if( rule_size.absolute == PRO_B_FALSE ) { range[0] = 0.0; range[1] = 1.0; p_range = range; } else p_range = NULL; /* Get value */ ProUtilMsgPrint( "gen", "TEST %0s", "Enter value: " ); status = ProMessageDoubleRead( p_range, &value ); TEST_CALL_REPORT( "ProMessageDoubleRead()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); if( status == PRO_TK_NO_ERROR ) { rule_size.value = value; status = ProRuleInitSize( &rule_size, p_rule ); TEST_CALL_REPORT( "ProRuleInitSize()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); } } else status = PRO_TK_USER_ABORT; if( status != PRO_TK_NO_ERROR ) p_rule->type = PRO_RULE_NONE; return 0; } /*---------------------------------------------------------------------*\ Function: ProTestRuleSizeDataInit() Purpose: On-buton function. Init the structure ProRuleSize. Returns: 0 - success; -1 - error. Now ignored. \*---------------------------------------------------------------------*/ int ProTestRuleSizeDataInit( ProRuleSize* p_rule_size, int option ) { ProError status; switch( option ) { case SIZE_ABSOLUTE: p_rule_size->absolute = PRO_B_TRUE; break; case SIZE_RELATIVE: p_rule_size->absolute = PRO_B_FALSE; break; case SIZE_GREATER: p_rule_size->greater = PRO_B_TRUE; break; case SIZE_LESS: p_rule_size->greater = PRO_B_FALSE; break; case SIZE_QUIT: status = ProMenuDelete(); TEST_CALL_REPORT( "ProMenuDelete()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); status = ProMenuDelete(); TEST_CALL_REPORT( "ProMenuDelete()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); status = ProMenuDeleteWithStatus( SIZE_QUIT ); TEST_CALL_REPORT( "ProMenuDeleteWithStatus()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); break; case SIZE_DONE: status = ProMenuDelete(); TEST_CALL_REPORT( "ProMenuDelete()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); status = ProMenuDelete(); TEST_CALL_REPORT( "ProMenuDelete()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); status = ProMenuDeleteWithStatus( SIZE_DONE ); TEST_CALL_REPORT( "ProMenuDeleteWithStatus()", "ProTestRuleInitSize()", status, status != PRO_TK_NO_ERROR ); break; default: break; } return 0; } /*---------------------------------------------------------------------*\ Function: ProTestRuleInitSize() Purpose: On-buton function. Init a rule by simp rep. Returns: 0 - success; -1 - error. Now ignored. \*---------------------------------------------------------------------*/ int ProTestRuleInitRep( ProRule* p_rule, int int_dummy ) { ProError status; ProSimprep simp_rep; /* Select simp rep in the current model (model handle is inited in ProTestRules() ) */ status = ProSimprepSelect( solid, &simp_rep ); TEST_CALL_REPORT( "ProSimprepSelect()", "ProTestRuleInitRep()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) return -1; status = ProRuleInitRep( &simp_rep, p_rule ); TEST_CALL_REPORT( "ProRuleInitRep()", "ProTestRuleInitRep()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) p_rule->type = PRO_RULE_NONE; return 0; } /*---------------------------------------------------------------------*\ Function: ProSelectWithRules() Purpose: On-buton function. Returns: PRO_TK_NO_ERROR - Selection was made or user hit "Done". PRO_TK_USER_ABORT - User hit "Quit". PRO_TK_PICK_ABOVE - Selection was interrupted by a user's pick on any button from above menus. \*---------------------------------------------------------------------*/ ProError ProSelectWithRules( char option[], int max_count, ProSelection *p_in_sel, /* Ignored */ ProSelFunctions *sel_func, /* Ignored */ ProSelectionEnv sel_env, /* Ignored */ ProSelAppAction appl_act_data, /* Ignored */ ProSelection **p_sel_array, int *p_n_sels ) { ProError status; AsmcomppathList comp_path_list; ProMdl model; ProModelitem model_item; int i; /* Init AsmcomppathList */ comp_path_list.p_comp_path_list = NULL; comp_path_list.size = 0; if( ProTestRules( &comp_path_list ) == -1 ) return PRO_TK_USER_ABORT; if( comp_path_list.size < 1 ) return PRO_TK_USER_ABORT; status = ProArrayAlloc( comp_path_list.size, sizeof(ProSelection), 1, (ProArray*)p_sel_array ); TEST_CALL_REPORT( "ProArrayAlloc()", "ProSelectWithRules()", status, status != PRO_TK_NO_ERROR ); *p_n_sels = 0; for( i=0; i<comp_path_list.size; i++, (*p_n_sels)++ ) { status = ProAsmcomppathMdlGet( &(comp_path_list.p_comp_path_list[i] ), &model ); TEST_CALL_REPORT( "ProAsmcomppathMdlGet()", "ProSelectWithRules()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) return PRO_TK_USER_ABORT; status = ProMdlToModelitem( model, &model_item ); TEST_CALL_REPORT( "ProMdlToModelitem()", "ProSelectWithRules()", status, status != PRO_TK_NO_ERROR ); status = ProSelectionAlloc( &(comp_path_list.p_comp_path_list[i]), &model_item, (*p_sel_array) + i ); TEST_CALL_REPORT( "ProSelectionAlloc()", "ProSelectWithRules()", status, status != PRO_TK_NO_ERROR); status = ProSelectionHighlight( (*p_sel_array)[i], PRO_COLOR_ERROR ); TEST_CALL_REPORT( "ProSelectionHighlight()", "ProSelectWithRules()", status, status == PRO_TK_COMM_ERROR); } return PRO_TK_NO_ERROR; } #endif /* #ifndef PT_PRODUCTS_BUILD */