/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <ProToolkit.h>
#include <ProSelection.h>
#include <ProGeomitem.h>
#include <ProSolid.h>
#include <UtilMath.h>
#include <TestError.h>
/*============================================================================*\
Function: UserOutlineCompute()
Purpose: Display extents of solid in space defined by CSYS
\*============================================================================*/
int UserOutlineCompute()
{
int sel_count;
ProError status;
ProFileName msgfile;
ProSelection *psels=NULL;
ProModelitem csys_feat;
ProGeomitemdata *geom_data=NULL;
ProCsysdata *p_csys=NULL;
ProMdl solid;
Pro3dPnt outline[2];
ProMatrix transf, itranf;
ProSolidOutlExclTypes excludes[] = {PRO_OUTL_EXC_DATUM_PLANE,
PRO_OUTL_EXC_DATUM_POINT,
PRO_OUTL_EXC_DATUM_CSYS};
/*----------------------------------------------------------------------------*\
Request Csys as reference point and orientation to report outline points
\*----------------------------------------------------------------------------*/
ProStringToWstring(msgfile,"msg_ugsolid.txt");
status = ProMessageDisplay(msgfile,"USER Select CSYS as reference point");
ERROR_CHECK("UserOutlineCompute","ProMessageDisplay",status);
if((ProSelect("csys",1,NULL,NULL,NULL,NULL,&psels, &sel_count) !=
PRO_TK_NO_ERROR) || (sel_count < 1))
{
status = ProMessageDisplay(msgfile,"USER Invalid Selection!");
ERROR_CHECK("UserOutlineCompute","ProMessageDisplay(Invalid Selection)",status);
return((int)PRO_TK_GENERAL_ERROR);
}
/*----------------------------------------------------------------------------*\
Retrieve Csys Data
\*----------------------------------------------------------------------------*/
status = ProSelectionModelitemGet(psels[0], &csys_feat);
ERROR_CHECK("UserOutlineCompute","ProSelectionModelitemGet",status);
status = ProGeomitemdataGet(&csys_feat,&geom_data);
ERROR_CHECK("UserOutlineCompute","ProGeomitemdataGet",status);
if(geom_data->obj_type != PRO_CSYS)
{
status = ProMessageDisplay(msgfile,
"USER Invalid Feature Selected as reference point");
ERROR_CHECK("UserOutlineCompute","ProMessageDisplay",status);
return((int)PRO_TK_GENERAL_ERROR);
}
p_csys = geom_data->data.p_csys_data;
ProUtilVectorsToTransf(p_csys->x_vector, p_csys->y_vector, p_csys->z_vector,
p_csys->origin,transf);
ProUtilMatrixInvert(transf, itranf);
status = ProMdlCurrentGet(&solid);
ERROR_CHECK("UserOutlineCompute","ProMdlCurrentGet",status);
status = ProSolidOutlineCompute(solid, transf, excludes, 3, outline);
ERROR_CHECK("UserOutlineCompute","ProSolidOutlineCompute",status);
status = ProMessageDisplay(msgfile,"USER Outline points: (%0f %1f %2f) (%3f %4f %5f)",
&outline[0][0],&outline[0][1],&outline[0][2],
&outline[1][0],&outline[1][1],&outline[1][2]);
ERROR_CHECK("UserOutlineCompute","ProMessageDisplay(Outline points)",status);
return((int)status);
}