/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*---------------------- Pro/Toolkit Includes ------------------------*/
#include <ProToolkit.h>
#include <ProFeature.h>
#include <ProFeatType.h>
#include <ProGeomitem.h>
#include <ProUtil.h>
/*---------------------- Application Includes ------------------------*/
#include <TestError.h>
/*---------------------- Function Prototypes -------------------------*/
ProError UserHoleSrfDisp();
ProError UserEdgeNeighborsEval(ProGeomitem *p_handle,
ProError status,
ProAppData app_data);
typedef struct uappdata
{
int feature_id;
ProMdl solid;
} UappData;
/*============================================================================*\
Function: UserHoleSrfDisp()
Purpose: Display surfaces adjacent to selected hole
\*============================================================================*/
ProError UserHoleSrfDisp()
{
int n, sel_count, feat_id;
ProFeattype feat_type;
ProError status;
ProFeature feat;
ProFileName msgfile;
ProSelection *psels=NULL;
ProMdl p_solid;
ProModelitem p_surf, p_edge, p_mdl_item;
UappData appdata;
/*----------------------------------------------------------------------------*\
Prompt user for hole selection
\*----------------------------------------------------------------------------*/
ProStringToWstring(msgfile,"msg_uggeom.txt");
ProMessageDisplay(msgfile,"USER Select Hole Feature:");
if((ProSelect("feature",1,NULL,NULL,NULL,NULL,&psels, &sel_count) !=
PRO_TK_NO_ERROR) || (sel_count < 1))
return((int) PRO_TK_GENERAL_ERROR);
status = ProSelectionModelitemGet(psels[0],&p_mdl_item);
ERROR_CHECK( "UserHoleSrfDisp", "ProSelectionModelitemGet", status );
/*----------------------------------------------------------------------------*\
Verify selection of hole feature
\*----------------------------------------------------------------------------*/
status = ProFeatureTypeGet(&p_mdl_item,&feat_type);
ERROR_CHECK( "UserHoleSrfDisp", "ProFeatureTypeGet", status );
if(feat_type != PRO_FEAT_HOLE)
{
ProMessageDisplay(msgfile,"USER Feature is not a hole");
ERROR_CHECK( "UserHoleSrfDisp", "ProMessageDisplay(Feature is not)",status);
return((int) PRO_TK_GENERAL_ERROR);
}
/*----------------------------------------------------------------------------*\
Use UappData structure (cast to ProAppData type)
to pass data between visit function and here
\*----------------------------------------------------------------------------*/
appdata.feature_id = p_mdl_item.id;
status = ProMdlCurrentGet(&(appdata.solid));
ERROR_CHECK( "UserHoleSrfDisp", "ProMdlCurrentGet",status);
status = ProFeatureGeomitemVisit(&p_mdl_item, PRO_EDGE,UserEdgeNeighborsEval,NULL,
(ProAppData) &appdata);
ERROR_CHECK( "UserHoleSrfDisp", "ProFeatureGeomitemVisit",status);
return((int)PRO_TK_NO_ERROR);
}
/*============================================================================*\
Function : UserEdgeNeighborsEval()
Purpose : Evaluate surfaces adjacent to edges by comparing feature id
to feature id of hole
\*============================================================================*/
ProError UserEdgeNeighborsEval(
ProGeomitem *p_edge, /* input from visit function */
ProError status, /* output from filter function */
ProAppData p_inp /* user application data - input in this case */
)
{
int n;
UappData *ud = (UappData *)p_inp;
ProEdge this_edge, next1, next2;
ProSurface surf[2];
ProGeomitem geom_item;
ProSelection selection;
ProFeature feat;
/*----------------------------------------------------------------------------*\
Look at both surfaces attached to this edge and highlight whichever
doesn't belong to this feature.
\*----------------------------------------------------------------------------*/
status = ProGeomitemToEdge(p_edge,&this_edge);
ERROR_CHECK("UserEdgeNeighborsEval","ProGeomitemToEdge",status);
status = ProEdgeNeighborsGet(this_edge,&next1,&next2,&surf[0],&surf[1]);
ERROR_CHECK("UserEdgeNeighborsEval","ProEdgeNeighborsGet",status);
for(n=0; n < 2; n++)
{
status = ProSurfaceToGeomitem(ud->solid,surf[n],&geom_item);
ERROR_CHECK("UserEdgeNeighborsEval","ProSurfaceToGeomitem",status);
status = ProGeomitemFeatureGet(&geom_item,&feat);
ERROR_CHECK("UserEdgeNeighborsEval","ProGeomitemFeatureGet",status);
if(feat.id != ud->feature_id)
{
status = ProSelectionAlloc(NULL,&geom_item,&selection);
ERROR_CHECK("UserEdgeNeighborsEval","ProSelectionAlloc",status);
status = ProSelectionHighlight(selection, PRO_COLOR_HIGHLITE);
ERROR_CHECK("UserEdgeNeighborsEval","ProSelectionHighlight",status);
status = ProSelectionFree(&selection);
ERROR_CHECK("UserEdgeNeighborsEval","ProSelectionFree",status);
}
}
return((int)PRO_TK_NO_ERROR);
}