/*====================================================================*\
FILE : TestFeats.c
PURPOSE : Smoke test for all Toolkit ProFeature functions
HISTORY..
DATE AUTHOR MODIFICATIONS
25 Jan 96 Alistair $$1 First version.
21 Feb 96 Michael $$2 Added "prodev_menu.h"
22 Apr 96 Michael $$3 Changed header scheme
27 May 96 Amin $$4 ProFeatureTypekeyGet-->ProAppfeatureTypeGet
26 Aug 96 H-01-05 Xuekai $$5 Modify due to change to ProMdl
16 Sep 96 H-01-09 Xuekai $$6 Modify due to change in ProFeature.h
18 Sep 96 H-01-09 Xuekai $$7 include "ProModelitem.h"
24-Sep-96 H-01-10 Xuekai $$8 Pro[Surface, Curve]=>Opaque
01-Oct-96 H-01-11 Xuekai $$9 ProSelection=>Opaque
04-Oct-96 H-01-11+ mgs $$10 ProSelect changes
21-Oct-96 H-01-14 Steve $$11 Added feat create,redef,treeinfo
04-Oct-96 H-01-14 amin $$12 included prographics.h
29-Oct-96 H-01-15 amin $$13 Changed order of ProSelect()
12-Nov-96 H-01-16 amin $$14 Removed ProFeatdef.h
17-Dec-96 H-01-21 mgs $$15 Removed AppFeatureTypeGet() call
19-Jan-97 H-01-21 Alexey $$16 Added items 'Resume'&'Feat Status' to TkFeats
21-Jan-97 H-01-24 Jerry $$17 Conflict avoidance: changed Feats menu item to -Feats
22-Sep-97 H-03-23 Pavel $$18 Fixed bugs, added Reorder, Readonly,
Insert mode, etc.
24-Sep-97 H-03-24 Pavel $$19 Removed Status Set, Create, Redefine
Added Group. Feat Info copied from
TestFeatCreate.c
03-Oct-97 H-03-24 Alexey $$20 Undo last changes to run ptr_mfg_1
17-Oct-97 H-03-27 Pavel $$21 Replaced Visit functions by UtilCollect
31-Oct-97 H-03-29 Pavel $$22 Used PreFilter function,
removed FeatstatusSet
25-Nov-97 H-03-31 Pavel $$23 Added ProSolidFailedFeatsList
12-Dec-97 H-03-32 Alexey $$24 Fix arguments in ProSolidFailedFeatsList
12-Feb-98 H-03-39 Pavel $$25 Test for ProLocalGroupCreate &
Pattern Info
30-Nov-98 I-01-27 Alexey $$26 Correct TEST_CALL_REPORTs. Fix problem
with ProGeomitemVisit in the
ProTestFeatureAct
02-Jun-99 I-03-11 mka $$27 Delete unused variable
08-Sep-99 I-03-20 aab $$28 Added test of ProSolidFailedFeatsList
under Resolve Feat menu.
18-Aug-2000 J-01-16 shirish $$29 Fix for Reordering of supressed features
in ProUtilFeatByNumberGet
10-Sep-2002 J-03-33 JCN $$30 Handle fill patterns elem tree error.
19-Jan-2004 K-01-22 SMK $$31 Log for ProUtilSection{FromFeat/Info}Get
01-May-07 L-01-31 VSA $$32 Making library calls unicode aware
01-Dec-08 L-03-21 SMB $$33 Updated to remove warnings
31-Dec-08 L-03-22 rkumbhare $$34 Updated to replace depricated API
14-Jan-09 L-03-24 smeher $$35 New menu button for section creation
02-Feb-09 L-03-25 SM
B $$36 Added ProTestPatternCreate
05-May-09 L-03-31 SRV $$37 Removed compiler(c++) warnings
\*====================================================================*/
/*--------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*--------------------------------------------------------------------*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*--------------------------------------------------------------------*\
Application includes
\*--------------------------------------------------------------------*/
#include "TestError.h"
#include "TestFiletypes.h"
#include "UtilColor.h"
#include "UtilFiles.h"
#include "UtilFeats.h"
#include "UtilMessage.h"
#include "UtilTypes.h"
#include "UtilCollect.h"
#include "UtilVisit.h"
#include "TestFeattree.h"
#include "TestSect.h"
#include "UtilMenu.h"
#include "UtilTree.h"
#include
#include "TestFeat.h"
#include "TestFeattype.h"
#include "UtilTypes.h"
/*--------------------------------------------------------------------*\
Application macros
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application data types
\*--------------------------------------------------------------------*/
#define FEAT_LIST 1
#define FEAT_INFO 2
#define MODEL_INFO 3
#define DELETE 1
#define SUPPRESS 2
#define RESUME 3
#define USER_SELECT 0
#define USER_FEAT_NUM 1
#define USER_ALL_FEAT 2
#define USER_CLEAN 3
#define USER_ACTIVATE 0
#define USER_CANCEL 1
#define USER_BEFORE 0
#define USER_AFTER 1
typedef struct testfeatdata
{
unsigned int action; /* Bit map of FEAT_... */
void *data;
} ProTestFeatData;
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
static int feature_number = 0;
/*====================================================================*\
FUNCTION : ProTestFailedFeatList()
PURPOSE : Action for failed feat list
\*====================================================================*/
ProError ProTestFailedFeatList ()
{
ProError status;
ProMdl model;
int *failed_feats, i, failed_feats_num;
FILE *fp;
char fname[PRO_NAME_SIZE] = "failed_feats.txt";
ProPath w_fname;
ProMdlType type;
ProSelection *sel;
ProModelitem model_item;
int n_sel;
status = ProMdlCurrentGet (&model);
TEST_CALL_REPORT( "ProModelCurrentGet()", "ProTestFailedFeatList()",
status, status != PRO_TK_NO_ERROR );
status = ProMdlTypeGet (model, &type);
TEST_CALL_REPORT( "ProMdlTypeGet()", "ProTestFailedFeatList()",
status, status != PRO_TK_NO_ERROR );
if (type == PRO_MDL_ASSEMBLY)
{
ProUtilMsgPrint("feat","TEST Select solid");
status = ProSelect((char*)"feature", 1, NULL,
NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect()", "ProTestFailedFeatList()", status,
status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR || n_sel < 1)
return PRO_TK_NO_ERROR;
status = ProSelectionModelitemGet (sel[0], &model_item);
TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestFailedFeatList()", status,
status != PRO_TK_NO_ERROR);
model = model_item.owner;
}
status = ProArrayAlloc (0, sizeof (int), 1, (ProArray*)&failed_feats);
TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestFailedFeatList()",
status, status != PRO_TK_NO_ERROR );
status = ProSolidFailedFeatsList ((ProSolid)model, &failed_feats);
TEST_CALL_REPORT( "ProSolidFailedFeatsList()", "ProTestFailedFeatList()",
status, status != PRO_TK_NO_ERROR &&
status != PRO_TK_E_NOT_FOUND);
if (status == PRO_TK_NO_ERROR)
{
fp = PTApplsUnicodeFopen (fname, "w");
if (fp != NULL)
{
ProTKFprintf (fp, "Failed features was found\n");
ProTKFprintf (fp, "Num\t\tID\n");
}
status = ProArraySizeGet (failed_feats, &failed_feats_num);
TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestFailedFeatList()",
status, status != PRO_TK_NO_ERROR );
for (i = 0; i < failed_feats_num; i++)
{
if (fp != NULL)
ProTKFprintf (fp, "%d\t\t%d\n", i, failed_feats[i]);
}
status = ProArrayFree ((ProArray*)&failed_feats);
TEST_CALL_REPORT( "ProArrayFree()", "ProTestFailedFeatList()",
status, status != PRO_TK_NO_ERROR );
if (fp != NULL)
fclose (fp);
}
ProStringToWstring (w_fname, fname);
ProInfoWindowDisplay (w_fname, NULL, NULL);
return PRO_TK_NO_ERROR;
}
/*====================================================================*\
FUNCTION : ProUtilResolveFeatMenu()
PURPOSE : Add button to resolve feat menu
\*====================================================================*/
ProError ProUtilResolveFeatMenu ()
{
int menu_id;
ProError err;
err = ProMenuFileRegister((char*)"RESOLVE FEAT",(char*)"reslvft.mnu", &menu_id);
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProUtilResolveFeatMenu()",
err, err != PRO_TK_NO_ERROR );
err = ProMenuAuxfileRegister((char*)"RESOLVE FEAT",(char*)"reslvft.aux", &menu_id);
TEST_CALL_REPORT( "ProMenuAuxfileRegister()", "ProUtilResolveFeatMenu()",
err, err != PRO_TK_NO_ERROR );
err = ProMenubuttonActionSet((char*)"RESOLVE FEAT",(char*)"-FailedFeatsList",
(ProMenubuttonAction)ProTestFailedFeatList, NULL, 0);
TEST_CALL_REPORT( "ProMenubuttonActionSet()", "ProUtilResolveFeatMenu()",
err, err != PRO_TK_NO_ERROR );
return PRO_TK_NO_ERROR;
}
/*====================================================================*\
FUNCTION : ProTestGeomitemAct()
PURPOSE : Action function for visiting geometry items
\*====================================================================*/
ProError ProTestGeomitemAct(
ProGeomitem *item,
ProError instatus,
ProAppData appdata)
{
FILE *fp;
char item_type[PRO_NAME_SIZE];
fp = (FILE*)((ProTestFeatData*)appdata)->data;
/*--------------------------------------------------------------------*\
Report the type and id
\*--------------------------------------------------------------------*/
ProUtilObjtypeStr(item->type, item_type);
ProTKFprintf(fp," %-15s %2d\n", item_type, item->id);
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestFeatureGeom()
PURPOSE : Function for reporting feature geometry items
\*====================================================================*/
int ProTestFeatureGeom(
ProModelitem *feature,
FILE *fp)
{
ProError status;
ProTestFeatData appdata;
ProGeomitem *geomitems;
int geomitems_num, i;
appdata.data = fp;
ProTKFprintf(fp, "Geometry items..\n");
status = ProUtilCollectFeatureGeomitems (feature, PRO_TYPE_UNUSED, &geomitems);
if (status == PRO_TK_NO_ERROR)
{
status = ProArraySizeGet ((ProArray)geomitems, &geomitems_num);
TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestFeatureGeom()",
status, status != PRO_TK_NO_ERROR );
for (i = 0; i < geomitems_num; i++)
{
status = ProTestGeomitemAct (&geomitems[i],
PRO_TK_NO_ERROR, (ProAppData)&appdata);
}
status = ProArrayFree ((ProArray*)&geomitems);
TEST_CALL_REPORT( "ProArrayFree()", "ProTestFeatureGeom()",
status, status != PRO_TK_NO_ERROR );
}
return (0);
}
/*====================================================================*\
FUNCTION : ProTestFeatureAct()
PURPOSE : Generalized action function for visiting features
\*====================================================================*/
ProError ProTestFeatureAct(
ProModelitem *feature,
ProError instatus,
ProAppData appdata)
{
int action;
FILE *fp;
ProFeattype ftype;
char ftype_str[PRO_NAME_SIZE];
ProError status;
ProBoolean visible, geomchk, read_on;
ProFeatStatus stat;
/*--------------------------------------------------------------------*\
Get the action type and file pointer.
\*--------------------------------------------------------------------*/
action = ((ProTestFeatData*)appdata)->action;
fp = (FILE*)((ProTestFeatData*)appdata)->data;
feature_number++;
/*--------------------------------------------------------------------*\
Get the feature type
\*--------------------------------------------------------------------*/
status = ProFeatureTypeGet(feature, &ftype);
TEST_CALL_REPORT("ProFeatureTypeGet()", "ProTestFeatureAct()",
status, status != PRO_TK_NO_ERROR);
ProUtilFeattypeStr(ftype, ftype_str);
/*--------------------------------------------------------------------*\
Get the feature visibility
\*--------------------------------------------------------------------*/
status = ProFeatureVisibilityGet(feature, &visible);
TEST_CALL_REPORT("ProFeatureVisibilityGet()", "ProTestFeatureAct()",
status, status != PRO_TK_NO_ERROR);
status = ProFeatureHasGeomchks(feature, &geomchk);
TEST_CALL_REPORT("ProFeatureHasGeomchks()", "ProTestFeatureAct()",
status, status != PRO_TK_NO_ERROR);
status = ProFeatureIsReadonly(feature, &read_on);
TEST_CALL_REPORT("ProFeatureIsReadonly()", "ProTestFeatureAct()",
status, status != PRO_TK_NO_ERROR);
if(action == FEAT_LIST)
{
/*--------------------------------------------------------------------*\
Report the feature id, type and visibility as a list entry
\*--------------------------------------------------------------------*/
ProTKFprintf(fp, "%-6d%-6d%-20s%-10s%-15s%-10s\n",
feature_number, feature->id, ftype_str,
visible == PRO_B_TRUE ? "" : "INTERNAL",
geomchk == PRO_B_TRUE ? "Has geom cheks" : "",
read_on == PRO_B_TRUE ? "Yes" : ""
);
return(PRO_TK_NO_ERROR);
}
else
{
/*--------------------------------------------------------------------*\
Report the feature id and type as a header
\*--------------------------------------------------------------------*/
ProTKFprintf(fp,"--------------------------------------\n");
if(visible == PRO_B_TRUE)
ProTKFprintf(fp,"USER FEATURE %-d\n", feature_number);
else
ProTKFprintf(fp,"INTERNAL FEATURE %-d\n", feature_number);
ProTKFprintf(fp,"INTERNAL ID %-d\n", feature->id);
ProTKFprintf(fp,"TYPE %s\n", ftype_str);
/*--------------------------------------------------------------------*\
Report everything else we know about the feature
\*--------------------------------------------------------------------*/
ProUtilFeatureDump(feature, fp);
/*--------------------------------------------------------------------*\
Report feature geometry
\*--------------------------------------------------------------------*/
status = ProFeatureStatusGet(feature, &stat);
TEST_CALL_REPORT("ProFeatureStatusGet()", "ProTestFeatureAct()",
status, status != PRO_TK_NO_ERROR);
if ((ftype!=PRO_FEAT_COMPONENT)&&
((stat==PRO_FEAT_ACTIVE)||
(stat==PRO_FEAT_UNREGENERATED)||
(stat==PRO_FEAT_INACTIVE)))
ProTestFeatureGeom(feature, fp);
}
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestFeatCreate
PURPOSE : Top-level function for creating specific feature types
\*====================================================================*/
int ProTestFeatCreate(
ProMdl model,
int dummy )
{
ProError status;
int menu_id;
int action;
ProFeattype feat_type;
ProError ProTestDtmpln();
ProError SketchFeatureCreate();
ProMenuFileRegister( (char*)"FEAT TYPE", (char*)"tkfeattype.mnu", &menu_id );
status = ProMenubuttonActionSet((char*)"FEAT TYPE",(char*)"-Dtm Plane",
(ProMenubuttonAction)ProUtilAssign,
(ProAppData)&feat_type, PRO_FEAT_DATUM );
status = ProMenubuttonActionSet( (char*)"FEAT TYPE", (char*)"-Protrusion",
(ProMenubuttonAction)ProUtilAssign,
(ProAppData)&feat_type, PRO_FEAT_PROTRUSION );
status = ProMenubuttonActionSet( (char*)"FEAT TYPE", (char*)"-3D Section",
(ProMenubuttonAction)ProUtilAssign,
(ProAppData)&feat_type, PRO_3DSECTION );
status = ProMenubuttonActionSet( (char*)"FEAT TYPE", (char*)"FEAT TYPE",
(ProMenubuttonAction)ProMenuHold, NULL, 0 );
status = ProMenuCreate( PROMENUTYPE_MAIN, (char*)"FEAT TYPE", &menu_id );
if( status == PRO_TK_NO_ERROR )
{
ProMenuProcess( (char*)"FEATURE CREATION", &action );
}
/* Call to specific feature creation function */
switch( feat_type )
{
case PRO_FEAT_DATUM:
ProTestDtmpln();
break;
case PRO_FEAT_PROTRUSION:
ProTestFeatureExtrudeCreate(NULL);
break;
case PRO_3DSECTION:
SketchFeatureCreate();
break;
}
return 0;
}
ProError ProTestPatternCreate()
{
int menu_id, action;
ProError status;
status = ProMenuFileRegister((char*)"PATTERN CREATE",(char*)"tkpatterncreate.mnu", &menu_id);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenuFileRegister", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet((char*)"PATTERN CREATE",(char*)"-Axis Pattern",
(ProMenubuttonAction)ProTestAxisPattern, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet((char*)"PATTERN CREATE",(char*)"-Curve Pattern",
(ProMenubuttonAction)ProTestCurvePattern, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet((char*)"PATTERN CREATE",(char*)"-General Pattern",
(ProMenubuttonAction)ProTestGeneralPattern, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = Pro
MenubuttonActionSet((char*)"PATTERN CREATE",(char*)"-Direction Pattern",
(ProMenubuttonAction)ProTestDirectionPattern, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet((char*)"PATTERN CREATE",(char*)"-Fill Pattern",
(ProMenubuttonAction)ProTestFillPattern, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet((char*)"PATTERN CREATE",(char*)"-Point Pattern",
(ProMenubuttonAction)ProTestPointPattern, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet((char*)"PATTERN CREATE",(char*)"-Table Pattern",
(ProMenubuttonAction)ProTestTablePattern, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet((char*)"PATTERN CREATE",(char*)"-Done Return",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet((char*)"PATTERN CREATE",(char*)"PATTERN CREATE",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenubuttonActionSet", status, status != PRO_TK_NO_ERROR );
status = ProMenuPush();
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenuPush", status, status != PRO_TK_NO_ERROR );
status = ProMenuCreate(PROMENUTYPE_MAIN, (char*)"PATTERN CREATE", &menu_id);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenuCreate", status, status != PRO_TK_NO_ERROR );
status = ProMenuProcess((char*)"PATTERN CREATE", &action);
TEST_CALL_REPORT( "ProTestPatternCreate", "ProMenuProcess", status, status != PRO_TK_NO_ERROR );
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestFeatureInfo()
PURPOSE : List features in current model.
\*====================================================================*/
int ProTestFeatureInfo(
ProMdl *p_model,
int action)
{
ProError status;
ProTestFeatData appdata;
ProSelection *sel;
int n_sel, cont=1;
char fname[PRO_NAME_SIZE];
wchar_t w_fname[PRO_NAME_SIZE];
FILE *fp;
ProFeature feature;
ProInfoWindowLocation win_location = { 0.0, 0.0 };
ProInfoWindowSize win_size = { 25, 70 };
ProFeature *features;
int features_num, i;
int *failed_feats, failed_feats_num;
/*--------------------------------------------------------------------*\
Get the name of the output file
\*--------------------------------------------------------------------*/
ProTestQcrName(p_model, (char*)FEATURES, fname);
a
ppdata.action = action;
feature_number = 0;
if(action == FEAT_INFO)
{
/*--------------------------------------------------------------------*\
Visit selected features
\*--------------------------------------------------------------------*/
ProUtilMsgPrint("feat","TEST Select feature");
while(cont)
{
fp = PTApplsUnicodeFopen(fname, "w");
appdata.data = fp;
/*--------------------------------------------------------------------*\
Select a feature
\*--------------------------------------------------------------------*/
status = ProSelect((char*)"feature", 1, NULL,
NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect()", "ProTestFeatureInfo()", status,
status != PRO_TK_NO_ERROR);
if(status != PRO_TK_NO_ERROR || n_sel < 1)
break;
/*--------------------------------------------------------------------*\
Get the information
\*--------------------------------------------------------------------*/
status = ProSelectionModelitemGet(sel[0], (ProFeature *)&feature);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR);
ProTestFeatureAct(&feature, PRO_TK_NO_ERROR, &appdata);
fclose(fp);
status = ProInfoWindowDisplay( ProStringToWstring(w_fname, fname),
&win_location, &win_size );
TEST_CALL_REPORT( "ProInfoWindowDisplay()", "ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR );
}
}
else
{
fp = PTApplsUnicodeFopen(fname, "w");
appdata.data = fp;
if(action == FEAT_LIST)
ProTKFprintf(fp,"Num ID Type\n\n");
/*--------------------------------------------------------------------*\
Visit all the features
\*--------------------------------------------------------------------*/
status = ProArrayAlloc (0, sizeof (int), 1, (ProArray*)&failed_feats);
TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR );
status = ProSolidFailedFeatsList ((ProSolid)(*p_model), &failed_feats);
TEST_CALL_REPORT( "ProSolidFailedFeatsList()", "ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR &&
status != PRO_TK_E_NOT_FOUND);
if (status == PRO_TK_NO_ERROR)
{
ProTKFprintf (fp, "Failed features was found\n");
status = ProArraySizeGet (failed_feats, &failed_feats_num);
TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR );
for (i = 0; i < failed_feats_num; i++)
{
ProTKFprintf (fp,"%d %d\n", i, failed_feats[i]);
}
status = ProArrayFree ((ProArray*)&failed_feats);
TEST_CALL_REPORT( "ProArrayFree()", "ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR );
}
status = ProUtilCollectSolidFeatures ((ProSolid)*p_model, &features);
if (status == PRO_TK_NO_ERROR)
{
status = ProArraySizeGet ((ProArray)features, &features_num);
TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR );
for (i = 0; i < features_num; i++)
{
status = ProTestFeatureAct (&features[i],
PRO_TK_NO_ERROR, (ProAppData)&appdata);
}
status = ProArrayFree ((ProArray*)&features);
TEST_CALL_REPORT( "ProArrayFree()", "ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR );
}
fclose(fp);
status = ProInfoWindowDisplay( ProStringToWstring(w_fname, fname),
&win_location, &win_size );
TEST_CALL_REPORT( "ProInfoWindowDisplay()", "ProTestFeatureInfo()",
status, status != PRO_TK_NO_ERROR );
}
return(0);
}
/*====================================================================*\
FUNCTION : ProTestFeatureSectionInfo()
PURPOSE : Info about feature sections
\*====================================================================*/
int ProTestFeatureSectionInfo()
{
FILE *fp;
ProSection section;
ProError err;
ProPath w_path;
err = ProUtilSectionFromFeatGet(§ion);
if (err != PRO_TK_NO_ERROR)
return(-1);
TEST_CALL_REPORT("ProUtilSectionFromFeatGet()",
"ProTestFeatSectionInfo()", err, err != PRO_TK_NO_ERROR );
fp = PTApplsUnicodeFopen("section.inf", "w");
ProStringToWstring(w_path, (char*)"section.inf");
err = ProUtilSectionInfoGet(fp, section);
TEST_CALL_REPORT("ProUtilSectionInfoGet()",
"ProTestFeatSectionInfo()", err, err != PRO_TK_NO_ERROR );
err = ProSectionFree(§ion);
TEST_CALL_REPORT("ProSectionFree()",
"ProTestFeatSectionInfo()", err, err != PRO_TK_NO_ERROR );
fclose(fp);
err = ProInfoWindowDisplay(w_path, NULL, NULL);
TEST_CALL_REPORT( "ProInfoWindowDisplay()",
"ProTestFeatSectionInfo()", err, err != PRO_TK_NO_ERROR );
return (0);
}
/*====================================================================*\
FUNCTION : ProTestFeatureKill()
PURPOSE : Commands "Feature Delete" and "Suppress"
\*====================================================================*/
int ProTestFeatureKill(
ProMdl *model,
int action)
{
ProError status;
int n_sel, n_children, c;
ProFeatureDeleteOptions delete_opts;
ProSelection *sel;
ProPatternStatus pstatus;
ProFeature children;
int *children_ids, cont=1;
ProSelection show;
ProFeature feature;
ProAsmcomppath comp_path;
int flag_yesorno;
/*--------------------------------------------------------------------*\
Ask the user to select features
\*--------------------------------------------------------------------*/
ProUtilMsgPrint("feat","TEST Select feature");
while(cont)
{
status = ProSelect((char*)"feature", 1, NULL,
NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect()", "ProTestFeatureKill()", status,
status != PRO_TK_NO_ERROR);
if(status != PRO_TK_NO_ERROR || n_sel < 1)
break;
/*--------------------------------------------------------------------*\
Check that the selected feature is not a pattern member
\*--------------------------------------------------------------------*/
status = ProSelectionModelitemGet(sel[0], (ProFeature *)&feature);
TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
status = ProFeatureParamsDisplay( sel[0], PRO_ALL_PARAMS );
TEST_CALL_REPORT("ProFeatureParamsDisplay()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR && status != PRO_TK_E_NOT_FOUND);
status = ProFeaturePatternStatusGet(&feature, &pstatus);
TEST_CALL_REPORT("ProFeaturePatternStatusGet()",
"ProTestFeatureKill()", status, status != PRO_TK_NO_ERROR);
if (pstatus != PRO_PATTERN_NONE)
{
ProUtilMsgPrint("feat",
"TEST That feature belongs to a pattern");
continue;
}
/*--------------------------------------------------------------------*\
Get the list of children of the selected feature
\*--------------------------------------------------------------------*/
status = ProFeatureChildrenGet(&feature, &children_ids, &n_children);
TEST_CALL_REPORT("ProFeatureChildrenGet()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
/*--------------------------------------------------------------------*\
Highlight them in blue
\*--------------------------------------------------------------------*/
status = ProSelectionAsmcomppathGet(sel[0], &comp_path);
TEST_CALL_REPORT("ProSelectionAsmcomppathGet()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
for(c=0; c
status = ProFeatureInit((ProSolid)feature.owner, children_ids[c], &children);
TEST_CALL_REPORT("ProFeatureInit()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
status = ProSelectionAlloc(&comp_path, &children, &show);
TEST_CALL_REPORT("ProSelectionAlloc()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
status = ProSelectionHighlight(show, MEDIUM_BLUE);
TEST_CALL_REPORT("ProSelectionHighlight()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
}
/*--------------------------------------------------------------------*\
Ask for confirmation to delete/suppress the children
\*--------------------------------------------------------------------*/
delete_opts = PRO_FEAT_DELETE_CLIP;
if(n_children > 0)
{
ProUtilMsgPrint("feat",
"TEST Do you want to %0s the features in blue too? [yes] : ",
action == DELETE ? "delete" : "suppress");
flag_yesorno = ProUtilYesnoGet((char*)"yes");
if(flag_yesorno != 1)
{
delete_opts = P
RO_FEAT_DELETE_NO_OPTS;
}
}
if(action == DELETE)
{
status = ProFeatureDelete((ProSolid)feature.owner, &feature.id,
1, &delete_opts, 1);
TEST_CALL_REPORT("ProFeatureDelete()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowRepaint(-1);
TEST_CALL_REPORT("ProWindowRepaint()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
}
else
{
status = ProFeatureSuppress((ProSolid)feature.owner,
&feature.id, 1, &delete_opts, 1);
TEST_CALL_REPORT("ProFeatureSuppress()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowRepaint(-1);
TEST_CALL_REPORT("ProWindowRepaint()", "ProTestFeatureKill()",
status, status != PRO_TK_NO_ERROR);
}
}
status = ProTreetoolRefresh(*model);
TEST_CALL_REPORT("ProTreetoolRefresh()",
"ProTestFeatureKill()", status, status != PRO_TK_NO_ERROR);
return(0);
}
/*====================================================================*\
FUNCTION : proTestFeatureResume()
PURPOSE : Command "Resume"
\*====================================================================*/
int ProTestFeatureResume( ProSolid* p_solid)
{
ProError status;
int* p_feat_id_array;
ProFeatStatus* p_status_array;
int n_features;
int n_suppressed;
int i;
ProFeature feature;
ProBoolean is_incomplete;
ProFeatureResumeOptions resume_options;
/* Allocate ID and status arrays */
status = ProArrayAlloc( 0, sizeof(int), 1, (ProArray *)&p_feat_id_array );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
status = ProArrayAlloc( 0, sizeof(ProFeatStatus), 1, (ProArray *)&p_status_array );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return -1;
/* Get a list of features of the specified solid and their statuses */
status = ProSolidFeatstatusGet( *p_solid, &p_feat_id_array, &p_status_array,
&n_features );
TEST_CALL_REPORT( "ProSolidFeatstatusGet()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return -1;
for( i=n_features-1, n_suppressed=0; i>=0; i-- )
{
/* Get a handle to the feature */
status = ProFeatureInit( *p_solid, p_feat_id_array[i], &feature );
TEST_CALL_REPORT( "ProFeatureInit()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
/* Is feature complete? */
is_incomplete = PRO_B_FALSE;
status = ProFeatureIsIncomplete( &feature, &is_incomplete );
TEST_CALL_REPORT( "ProFeatureIsIncomplete()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
/* Remove incomplete feature from the array */
if( is_incomplete == PRO_B_TRUE ||
p_status
_array[i] != PRO_FEAT_SUPPRESSED)
{
status = ProArrayObjectRemove( (ProArray *)&p_feat_id_array, i, 1 );
TEST_CALL_REPORT( "ProArrayObjectRemove()",
"ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
}
else
n_suppressed++;
}
/* Resume suppressed features */
resume_options = PRO_FEAT_RESUME_INCLUDE_PARENTS;
status = ProFeatureResume( *p_solid, p_feat_id_array, n_suppressed,
&resume_options, 1 );
TEST_CALL_REPORT( "ProFeatureResume()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
/* Refresh win */
status = ProWindowRepaint(-1);
TEST_CALL_REPORT("ProWindowRepaint()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR);
status = ProTreetoolRefresh((ProMdl)*p_solid);
TEST_CALL_REPORT("ProTreetoolRefresh()",
"ProTestFeatureResume()", status, status != PRO_TK_NO_ERROR);
/* Free pre-allocated */
status = ProArrayFree( (ProArray *)&p_feat_id_array );
TEST_CALL_REPORT( "ProArrayFree()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&p_status_array );
TEST_CALL_REPORT( "ProArrayFree()", "ProTestFeatureResume()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return -1;
return 0;
}
/*====================================================================*\
FUNCTION : ProUtilFeatByNumberInit()
PURPOSE : Set Read Only status for feature
\*====================================================================*/
ProError ProUtilFeatByNumberInit(
ProSolid solid,
int feature_num,
ProFeature *p_feature)
{
ProError err, status = PRO_TK_GENERAL_ERROR;
int *p_feat_id_array, n_features;
ProFeatStatus *p_status_array;
int feature_count;
int actual_feat_number = 0;
ProBoolean feature_found = PRO_B_FALSE;
/* Allocate ID and err arrays */
err = ProArrayAlloc( 0, sizeof(int), 1, (ProArray *)&p_feat_id_array );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProUtilFeatByNumberInit()",
err, err != PRO_TK_NO_ERROR);
if( err != PRO_TK_NO_ERROR )
return (PRO_TK_GENERAL_ERROR);
err = ProArrayAlloc( 0, sizeof(ProFeatStatus), 1,
(ProArray *)&p_status_array );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProUtilFeatByNumberInit()",
err, err != PRO_TK_NO_ERROR);
if( err != PRO_TK_NO_ERROR )
return (PRO_TK_GENERAL_ERROR);
/* Get a list of features of the specified solid and their erres */
err = ProSolidFeatstatusGet(solid, &p_feat_id_array, &p_status_array,
&n_features );
TEST_CALL_REPORT( "ProSolidFeatstatusGet()", "ProUtilFeatByNumberInit()",
err, err != PRO_TK_NO_ERROR );
/* feature_num--; */
if (err == PRO_TK_NO_ERROR && ( n_features > (feature_num-1) ) )
{
for ( feature_count = 0; feature_count < n_features; feature_count++ )
{
if ( p_status_
array[feature_count] == PRO_FEAT_ACTIVE ) actual_feat_number++;
if ( actual_feat_number == feature_num )
{
feature_found = PRO_B_TRUE;
break;
}
}
if ( feature_found )
{
status = ProFeatureInit(solid, p_feat_id_array[feature_count],p_feature);
err = ProArrayFree((ProArray*)&p_feat_id_array );
TEST_CALL_REPORT( "ProArrayFree()", "ProUtilFeatByNumberInit()",
err, err != PRO_TK_NO_ERROR);
err = ProArrayFree((ProArray*)&p_status_array );
TEST_CALL_REPORT( "ProArrayFree()", "ProUtilFeatByNumberInit()",
err, err != PRO_TK_NO_ERROR);
return ( status );
/* Returns for a successful call from here */
}
else
{
return PRO_TK_E_NOT_FOUND;
/* Includes the cases for
1.The input value of the feature_number being greater than the number of
ACTIVE features available in the model , but less than the max id
*/
}
}
else
{
return PRO_TK_BAD_CONTEXT;
/* Includes the cases for
1.Non-successful call to ProSolidFeatstatusGet and
2.The input value of the feature number being greater than the number of id's collected
*/
}
}
/*====================================================================*\
FUNCTION : ProUtilSolidLastFeatGet()
PURPOSE : Set Read Only status for feature
\*====================================================================*/
ProError ProUtilSolidLastFeatGet(
ProSolid solid,
int *last_feature)
{
ProError err, status;
int *p_feat_id_array, n_features;
ProFeatStatus *p_status_array;
/* Allocate ID and err arrays */
err = ProArrayAlloc( 0, sizeof(int), 1, (ProArray *)&p_feat_id_array );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProUtilSolidLastFeatGet()",
err, err != PRO_TK_NO_ERROR);
if( err != PRO_TK_NO_ERROR )
return (PRO_TK_GENERAL_ERROR);
err = ProArrayAlloc( 0, sizeof(ProFeatStatus), 1,
(ProArray *)&p_status_array );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProUtilSolidLastFeatGet()",
err, err != PRO_TK_NO_ERROR);
if( err != PRO_TK_NO_ERROR )
return (PRO_TK_GENERAL_ERROR);
/* Get a list of features of the specified solid and their erres */
err = ProSolidFeatstatusGet(solid, &p_feat_id_array, &p_status_array,
&n_features );
TEST_CALL_REPORT( "ProSolidFeatstatusGet()", "ProUtilSolidLastFeatGet()",
err, err != PRO_TK_NO_ERROR );
status = err;
err = ProArrayFree((ProArray*)&p_feat_id_array );
TEST_CALL_REPORT( "ProArrayFree()", "ProUtilSolidLastFeatGet()",
err, err != PRO_TK_NO_ERROR);
err = ProArrayFree((ProArray*)&p_status_array );
TEST_CALL_REPORT( "ProArrayFree()", "ProUtilSolidLastFeatGet()",
err, err != PRO_TK_NO_ERROR);
if (status == PRO_TK_NO_ERROR)
last_feature[0] = n_features;
else
l
ast_feature[0] = 0;
return(status);
}
/*====================================================================*\
FUNCTION : ProTestFeatureReadOnlySet()
PURPOSE : Set Read Only status for feature
\*====================================================================*/
int ProTestFeatureReadOnlySet(
ProSolid *p_solid,
int option)
{
ProError err;
ProSelection *sel;
int n_sel, max_feat, irange[2], i, ok=0;
ProFeature feature;
switch(option)
{
case USER_SELECT:
ProUtilMsgPrint("feat","TEST Select feature");
err = ProSelect((char*)"feature", 1, NULL, NULL, NULL, NULL, &sel, &n_sel);
if (err != PRO_TK_NO_ERROR || n_sel != 1)
break;
err = ProSelectionModelitemGet(sel[0], (ProFeature *)&feature);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProTestFeatureReadOnlySet()", err, err != PRO_TK_NO_ERROR);
ok = 1;
break;
case USER_FEAT_NUM:
err = ProUtilSolidLastFeatGet(p_solid[0], &max_feat);
if (err != PRO_TK_NO_ERROR || max_feat <=0)
break;
ProUtilMsgPrint("feat",
"TEST Enter feature regeneration number (1 - %0d) [QUIT]:",
&max_feat);
irange[0] = 1;
irange[1] = max_feat;
err = ProMessageIntegerRead(irange, &i);
if (err != PRO_TK_NO_ERROR)
break;
err = ProUtilFeatByNumberInit(p_solid[0], i, &feature);
if (err != PRO_TK_NO_ERROR)
break;
ok = 1;
break;
case USER_ALL_FEAT:
err = ProUtilSolidLastFeatGet(p_solid[0], &max_feat);
if (err != PRO_TK_NO_ERROR || max_feat <=0)
break;
err = ProUtilFeatByNumberInit(p_solid[0], max_feat, &feature);
if (err != PRO_TK_NO_ERROR)
break;
ok = 1;
break;
case USER_CLEAN:
err = ProFeatureReadonlyUnset(p_solid[0]);
TEST_CALL_REPORT("ProFeatureReadonlyUnset()",
"ProTestFeatureReadOnlySet()", err, err != PRO_TK_NO_ERROR);
ProUtilMsgPrint("feat", "TEST Read-only setting has been cleaned.");
ok = 2;
break;
default:
ProTKPrintf("Error: ProTestFeatureReadOnlySet unknown action\n");
break;
}
if (ok == 1)
{
err = ProFeatureReadonlySet(&feature);
TEST_CALL_REPORT("ProFeatureReadonlySet()",
"ProTestFeatureReadOnlySet()", err, err != PRO_TK_NO_ERROR);
ProUtilMsgPrint("feat",
"TEST Features up to and feat ID %0d are now read only.",
&feature.id);
}
if (ok > 0)
{
err = ProMenuDelete();
TEST_CALL_REPORT("ProMenuDelete()",
"ProTestFeatureReadOnlySet()", err, err != PRO_TK_NO_ERROR);
}
return(0);
}
/*====================================================================*\
FUNCTION : ProTestFeatureReadOnly()
PURPOSE : Show tkR-only feat menu
\*====================================================================*/
int ProTestFeatureReadOnly(ProSolid *p_solid)
{
ProError status;
int menu_id, action;
status = ProMenuFileRegister((char*)
"tkR-only feat", (char*)"tkronlyfeat.mnu", &menu_id);
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestFeatureReadOnly()",
status, status != PRO_TK_NO_ERROR );
ProMenubuttonActionSet((char*)"tkR-only feat", (char*)"Select",
(ProMenubuttonAction)ProTestFeatureReadOnlySet,
p_solid, USER_SELECT);
ProMenubuttonActionSet((char*)"tkR-only feat", (char*)"Feat Num",
(ProMenubuttonAction)ProTestFeatureReadOnlySet,
p_solid, USER_FEAT_NUM);
ProMenubuttonActionSet((char*)"tkR-only feat", (char*)"All Feat",
(ProMenubuttonAction)ProTestFeatureReadOnlySet,
p_solid, USER_ALL_FEAT);
ProMenubuttonActionSet((char*)"tkR-only feat", (char*)"Clean",
(ProMenubuttonAction)ProTestFeatureReadOnlySet,
p_solid, USER_CLEAN);
ProMenubuttonActionSet((char*)"tkR-only feat", (char*)"Done/Return",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
ProMenubuttonActionSet((char*)"tkR-only feat", (char*)"tkR-only feat",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
ProMenuPush();
ProMenuCreate(PROMENUTYPE_MAIN, (char*)"tkR-only feat", &menu_id);
status = ProMenuCommandPush((char*)"Select");
TEST_CALL_REPORT( "ProMenuCommandPush()", "ProTestFeatureReadOnly()",
status, status != PRO_TK_NO_ERROR );
ProMenuProcess((char*)"tkR-only feat", &action);
ProMenuPop();
return (0);
}
/*====================================================================*\
FUNCTION : ProTestFeatureInsertModeSet
PURPOSE : Set/Cancel Insert mode
\*====================================================================*/
int ProTestFeatureInsertModeSet(
ProSolid *p_solid,
int option)
{
ProError err;
ProSelection *sel;
int n_sel, max_feat, feat_num, ok = 0;
ProBoolean resume;
ProFeature feature;
switch (option)
{
case USER_ACTIVATE:
do
{
ProUtilMsgPrint("feat", "Test Select a feature to insert after.");
err = ProSelect((char*)"feature", 1, NULL, NULL, NULL, NULL, &sel, &n_sel);
if (err != PRO_TK_NO_ERROR || n_sel != 1)
break;
err = ProSelectionModelitemGet(sel[0], (ProFeature *)&feature);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProTestFeatureInsertModeSet()", err, err != PRO_TK_NO_ERROR);
err = ProUtilSolidLastFeatGet(p_solid[0], &max_feat);
if (err != PRO_TK_NO_ERROR || max_feat <=0)
break;
err = ProFeatureNumberGet(&feature, &feat_num);
TEST_CALL_REPORT("ProFeatureNumberGet()",
"ProTestFeatureInsertModeSet()", err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR)
break;
if (feat_num == max_feat)
{
ProUtilMsgPrint("feat", "Test Can not select last feature.");
continue;
}
err = ProFeatureInsertModeActivate(&feature);
TEST_CALL_REPORT("ProFeatureInsertModeActivate()",
"ProTestFeatureInsertModeSet()", err, err != PRO_TK_NO_ERROR);
ok = 1;
} while (ok ==0);
break
;
case USER_CANCEL:
ProUtilMsgPrint("feat", "TEST Resume features that were "
"suppressed when activating insert mode? [Y]:");
resume = (ProBoolean)ProUtilYesnoGet((char*)"yes");
err = ProInsertModeCancel(p_solid[0], resume);
TEST_CALL_REPORT("ProInsertModeCancel()",
"ProTestFeatureInsertModeSet()", err, err != PRO_TK_NO_ERROR);
ProUtilMsgPrint("feat", "TEST Insert mode has been canceled.");
ok = 1;
break;
}
if (ok == 1)
{
err = ProTreetoolRefresh((ProMdl)*p_solid);
TEST_CALL_REPORT("ProTreetoolRefresh()",
"ProTestFeatureInsertModeSet()", err, err != PRO_TK_NO_ERROR);
ProMenuDelete();
}
return (0);
}
/*====================================================================*\
FUNCTION : ProTestFeatureInsertMode
PURPOSE : Show TkIns Mode Menu
\*====================================================================*/
int ProTestFeatureInsertMode(
ProSolid *p_solid)
{
ProError status;
int menu_id, action;
ProBoolean bool_flag;
status = ProMenuFileRegister((char*)"tkinsert mode", (char*)"tkinsertmode.mnu", &menu_id);
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestFeatureInsertMode()",
status, status != PRO_TK_NO_ERROR );
ProMenubuttonActionSet((char*)"tkinsert mode", (char*)"Activate",
(ProMenubuttonAction)ProTestFeatureInsertModeSet,
p_solid, USER_ACTIVATE);
ProMenubuttonActionSet((char*)"tkinsert mode", (char*)"Cancel",
(ProMenubuttonAction)ProTestFeatureInsertModeSet,
p_solid, USER_CANCEL);
ProMenubuttonActionSet((char*)"tkinsert mode", (char*)"Return",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
ProMenubuttonActionSet((char*)"tkinsert mode", (char*)"tkinsert mode",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
status = ProInsertModeIsActive(p_solid[0], &bool_flag);
TEST_CALL_REPORT( "ProInsertModeIsActive()", "ProTestFeatureInsertMode()",
status, status != PRO_TK_NO_ERROR );
ProMenuPush();
ProMenuCreate(PROMENUTYPE_MAIN, (char*)"tkinsert mode", &menu_id);
if (bool_flag == PRO_B_FALSE)
{
status = ProMenubuttonActivate((char*)"tkinsert mode", (char*)"Activate");
TEST_CALL_REPORT("ProMenubuttonActivate()",
"ProTestFeatureInsertMode()", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonDeactivate((char*)"tkinsert mode", (char*)"Cancel");
TEST_CALL_REPORT("ProMenubuttonDeactivate()",
"ProTestFeatureInsertMode()", status, status != PRO_TK_NO_ERROR );
}
else
{
status = ProMenubuttonActivate((char*)"tkinsert mode", (char*)"Cancel");
TEST_CALL_REPORT("ProMenubuttonActivate()",
"ProTestFeatureInsertMode()", status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonDeactivate((char*)"tkinsert mode", (char*)"Activate");
TEST_CALL_REPORT("ProMenubuttonDeactivate()",
"ProTestFeatureInsertMode()", status, status != PRO_TK_NO_ERROR );
}
ProMenuProcess(
(char*)"tkinsert mode", &action);
ProMenuPop();
return (0);
}
/*====================================================================*\
FUNCTION : ProUtilSortedIntArrayObjectAdd
PURPOSE : Add int value to sorted array of int
\*====================================================================*/
ProError ProUtilSortedIntArrayObjectAdd(
int **p_array,
int new_value)
{
ProError err;
int i, size;
err = ProArraySizeGet((ProArray)p_array[0], &size);
TEST_CALL_REPORT("ProArraySizeGet()",
"ProUtilSortedIntArrayObjectAdd()", err, err != PRO_TK_NO_ERROR );
for (i=0; i
if (i>=size || new_value
err = ProArrayObjectAdd((ProArray*)p_array, i, 1, &new_value);
TEST_CALL_REPORT("ProArrayObjectAdd()",
"ProUtilSortedIntArrayObjectAdd()", err, err != PRO_TK_NO_ERROR );
}
return (err);
}
/*====================================================================*\
FUNCTION : ProUtilReorderPreFilter
PURPOSE : filter function to reorder feats
\*====================================================================*/
ProError ProUtilReorderPreFilter(
ProSelection sel,
Pro3dPnt pnt,
ProMatrix trans,
char *option,
int level,
ProAppData appdata)
{
ProSolid *p_solid = (ProSolid*)appdata;
ProName w_name;
ProError err;
ProModelitem modelitem;
TEST_CALL_REPORT("ProSelectionPreFilter()",
"ProUtilReorderPreFilter()", PRO_TK_NO_ERROR, 0);
err = ProSelectionModelitemGet(sel, &modelitem);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProUtilReorderPreFilter()", err, err != PRO_TK_NO_ERROR );
if (modelitem.owner != (ProMdl)p_solid[0])
{
err = ProMdlNameGet(modelitem.owner, w_name);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProUtilReorderPreFilter()", err, err != PRO_TK_NO_ERROR );
ProUtilMsgPrint("feat", "Test Select from %0w please.", w_name);
return (PRO_TK_CONTINUE);
}
return (PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestFeatureReorder
PURPOSE : Reorder features
\*====================================================================*/
int ProTestFeatureReorder(
ProSolid *p_solid)
{
ProError err;
int *feat_arr = NULL, n_sel, stop = 0, i, ok=0;
int feat_num, *p_feat_id_array = NULL;
ProSelection *sel;
ProModelitem modelitem;
ProSelFunctions filter;
ProFeatStatus *p_status_array = NULL;
ProUtilMsgPrint("feat", "Test Select features to reorder. Multiple features"
" must be in consecutive order.");
memset(&filter, '\0', sizeof(filter));
filter.pre_filter = (ProSelectionPreFilter)ProUtilReorderPreFilter;
filter.app_data = (ProAppData)p_solid;
do
{
err = ProSelect((char*)"feature", -1, NULL, &filter, NULL, NULL, &sel, &n_sel)
;
if (err != PRO_TK_NO_ERROR)
break;
/* Sort features array by number */
ProArrayAlloc(0, sizeof(int), 1, (ProArray*)&feat_arr);
for (i=0; i
err = ProSelectionModelitemGet(sel[i], &modelitem);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
err = ProFeatureNumberGet((ProFeature*)&modelitem, &feat_num);
if (err != PRO_TK_NO_ERROR)
continue;
ProUtilSortedIntArrayObjectAdd(&feat_arr, feat_num);
}
ProUtilMsgPrint("feat", "Test Select a feature to insert after.");
err = ProSelect((char*)"feature", 1, NULL, &filter, NULL, NULL, &sel, &n_sel);
if (err != PRO_TK_NO_ERROR || n_sel != 1)
break;
err = ProSelectionModelitemGet(sel[0], &modelitem);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
err = ProFeatureNumberGet((ProFeature*)&modelitem, &feat_num);
if (err != PRO_TK_NO_ERROR)
break;
feat_num++;
ProArraySizeGet((ProArray)feat_arr, &n_sel);
/* Show possibility to reorder features in two modes */
err = ProArrayAlloc( 0, sizeof(int), 1, (ProArray *)&p_feat_id_array );
TEST_CALL_REPORT("ProArrayAlloc()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR)
break;
for (i=0; i
err = ProUtilFeatByNumberInit(p_solid[0], feat_arr[i],
(ProFeature*)&modelitem);
TEST_CALL_REPORT("ProUtilFeatByNumberInit()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
ProArrayObjectAdd((ProArray*)&p_feat_id_array, PRO_VALUE_UNUSED,
1, &modelitem.id);
}
err = ProFeatureReorder(p_solid[0], p_feat_id_array, n_sel, feat_num);
TEST_CALL_REPORT("ProFeatureReorder()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR)
break;
ok =1;
} while (stop);
if (feat_arr != NULL)
{
err = ProArrayFree((ProArray*)&feat_arr);
TEST_CALL_REPORT( "ProArrayFree()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
}
if (p_feat_id_array != NULL)
{
err = ProArrayFree((ProArray*)&p_feat_id_array);
TEST_CALL_REPORT( "ProArrayFree()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
}
if (p_status_array != NULL)
{
err = ProArrayFree((ProArray*)&p_status_array);
TEST_CALL_REPORT( "ProArrayFree()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
}
if (ok == 1)
{
err = ProTreetoolRefresh((ProMdl)*p_solid);
TEST_CALL_REPORT("ProTreetoolRefresh()",
"ProTestFeatureReorder()", err, err != PRO_TK_NO_ERROR);
}
return (0);
}
/*====================================================================*\
FUNCTION : ProTestFeatTreeInfoGet
PURPOSE : The main function for getting the feature tree definition
\*==================
==================================================*/
int ProTestFeatTreeInfoGet()
{
ProError err;
ProFeature feature;
ProElement elemtree;
ProSelection *p_sel;
int n_sel;
ProUtilMsgPrint("feat", "TEST Select feature");
err = ProSelect((char*)"feature", 1, NULL, NULL, NULL, NULL, &p_sel, &n_sel);
if (err != PRO_TK_NO_ERROR)
return (0);
err = ProSelectionModelitemGet(p_sel[0], (ProModelitem *)&feature);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProTestFeatTreeInfoGet", err , err != PRO_TK_NO_ERROR);
err = ProFeatureElemtreeExtract(&feature, NULL, PRO_FEAT_EXTRACT_NO_OPTS, &elemtree );
TEST_CALL_REPORT("ProFeatureElemtreeExtract()","ProTestFeatTreeInfoGet",
err , err != PRO_TK_NO_ERROR);
if(err == PRO_TK_INVALID_TYPE)
ProUtilMsgPrint("gen","TEST %0s",
"Elem Tree isn't supported for this feature");
else if(err != PRO_TK_NO_ERROR)
ProUtilMsgPrint("gen","TEST %0s","Error getting the elem tree");
else
ProUtilShowTreeInInfo(elemtree);
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestLocalGroupCreate
PURPOSE : Function to test local group
\*====================================================================*/
int ProTestLocalGroupCreate(
ProSolid *p_solid)
{
ProError err;
ProName w_name;
int *feat_arr = NULL, n_sel, stop = 0, i, *p_feat_id_array, feat_num;
ProSelection *sel;
ProModelitem modelitem;
ProGroup group;
ProUtilMsgPrint("feat", "Test Enter group name [QUIT]:");
if (ProMessageStringRead(PRO_NAME_SIZE, w_name) != PRO_TK_NO_ERROR)
return (-1);
ProUtilMsgPrint("feat", "Test Select features to form a group.");
do
{
err = ProSelect((char*)"feature", -1, NULL, NULL, NULL, NULL, &sel, &n_sel);
if (err != PRO_TK_NO_ERROR)
break;
/* Sort features array by number */
ProArrayAlloc(0, sizeof(int), 1, (ProArray*)&feat_arr);
for (i=0; i
err = ProSelectionModelitemGet(sel[i], &modelitem);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProTestLocalGroupCreate()", err, err != PRO_TK_NO_ERROR);
err = ProFeatureNumberGet((ProFeature*)&modelitem, &feat_num);
if (err != PRO_TK_NO_ERROR)
continue;
ProUtilSortedIntArrayObjectAdd(&feat_arr, feat_num);
}
err = ProArraySizeGet((ProArray)feat_arr, &n_sel);
TEST_CALL_REPORT("ProArraySizeGet()",
"ProTestLocalGroupCreate()", err, err != PRO_TK_NO_ERROR);
err = ProArrayAlloc( 0, sizeof(int), 1, (ProArray *)&p_feat_id_array );
TEST_CALL_REPORT("ProArrayAlloc()",
"ProTestLocalGroupCreate()", err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR)
break;
for (i=0; i
err = ProUtilFeatByNumberInit(p_solid[0], feat_arr[i],
(ProFeature*)
&modelitem);
ProArrayObjectAdd((ProArray*)&p_feat_id_array, PRO_VALUE_UNUSED,
1, &modelitem.id);
}
err = ProLocalGroupCreate((ProSolid)modelitem.owner, p_feat_id_array, n_sel, w_name,
&group);
TEST_CALL_REPORT("ProLocalGroupCreate()",
"ProTestLocalGroupCreate()", err, err != PRO_TK_NO_ERROR);
err = ProArrayFree((ProArray*)&feat_arr);
TEST_CALL_REPORT("ProArrayFree()",
"ProTestLocalGroupCreate()", err, err != PRO_TK_NO_ERROR);
err = ProArrayFree((ProArray*)&p_feat_id_array);
TEST_CALL_REPORT("ProArrayFree()",
"ProTestLocalGroupCreate()", err, err != PRO_TK_NO_ERROR);
} while (stop);
err = ProTreetoolRefresh(modelitem.owner);
TEST_CALL_REPORT("ProTreetoolRefresh()",
"ProTestLocalGroupCreate()", err, err != PRO_TK_NO_ERROR);
ProMenuDelete();
return (0);
}
/*====================================================================*\
FUNCTION : ProUtilFeatPatternClass
PURPOSE : Return the pattern class the feature belongs to
\*====================================================================*/
ProError ProUtilFeatPatternClass(
ProFeature *feature,
ProPatternClass *pat_class)
{
ProGrppatternStatus grpat_status;
ProPatternStatus pat_status;
ProError err;
err = ProFeaturePatternStatusGet(feature, &pat_status);
TEST_CALL_REPORT("ProFeaturePatternStatusGet()",
"ProUtilFeatPatternClass()", err , err != PRO_TK_NO_ERROR);
err = ProFeatureGrppatternStatusGet(feature, &grpat_status);
TEST_CALL_REPORT("ProFeatureGrppatternStatusGet()",
"ProUtilFeatPatternClass()", err , err != PRO_TK_NO_ERROR);
if (pat_status == PRO_PATTERN_LEADER || pat_status == PRO_PATTERN_MEMBER)
{
if (grpat_status == PRO_GRP_PATTERN_LEADER ||
grpat_status == PRO_GRP_PATTERN_MEMBER)
{
/* Both Patterns Possible */
err = ProMenuFileRegister((char*)"tkpat type", (char*)"tkpattype.mnu", NULL);
err = ProMenubuttonActionSet((char*)"tkpat type", (char*)"Pattern",
(ProMenubuttonAction)ProUtilMenubuttonDeleteWithStatus, NULL, PRO_FEAT_PATTERN);
err = ProMenubuttonActionSet((char*)"tkpat type", (char*)"Group Pattern",
(ProMenubuttonAction)ProUtilMenubuttonDeleteWithStatus, NULL, PRO_GROUP_PATTERN);
err = ProMenubuttonActionSet((char*)"tkpat type", (char*)"tkpat type",
(ProMenubuttonAction)ProMenuHold, NULL, 0);
err = ProMenuCreate(PROMENUTYPE_MAIN, (char*)"tkpattype", NULL);
err = ProMenuProcess((char*)"tkpattype", (int*)pat_class);
}
else
pat_class[0] = PRO_FEAT_PATTERN;
}
else
{
if (grpat_status == PRO_GRP_PATTERN_LEADER ||
grpat_status == PRO_GRP_PATTERN_MEMBER)
pat_class[0] = PRO_GROUP_PATTERN;
else
return (PRO_TK_E_NOT_FOUND);
}
return (PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestPattern
PURPOSE : Functi