/*
Copyright (c) 2019 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;
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 */