/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*---------------------- Pro/Toolkit Includes ------------------------*/
#include <ProToolkit.h>
#include <ProSurface.h>
#include <ProXsec.h>
#include <ProAsmcomp.h>
#include <ProUtil.h>
#include <PTApplsUnicodeUtils.h>
/*---------------------- Application Includes ------------------------*/
#include <TestError.h>
/*---------------------- Function Prototypes -------------------------*/
void user_List_Xsecs();
void user_member_path ();
ProError user_xsec_contour_visit(ProContour p_contour,
ProError status,
ProAppData app_data)
{
static int n_conts;
FILE *fp = (FILE*)app_data;
ProTKFprintf(fp, " Contour %d\n", n_conts++);
return PRO_TK_NO_ERROR;
}
ProError user_xsec_visit(ProXsec *p_xsec,
ProAppData app_data)
{
ProError status;
FILE *fp = (FILE*)app_data;
ProCharName cname;
ProXsecGeometry *geom_arr;
int n_xsec_items, ii;
char path[200];
ProXsecMdlname p_xsecmdlname;
ProMdlName p_xsec_name;
ProXSectionItem *xsec_item_arr;
ProWstringToString (cname, p_xsec->xsec_name);
ProTKFprintf(fp,"Cross section %s\n", cname);
status = ProXsecRegenerate(p_xsec);
ProWstringCopy(p_xsec->xsec_name, p_xsec_name, PRO_VALUE_UNUSED);
status = ProXsecMdlnameAlloc(p_xsec->solid_owner, p_xsec_name, &p_xsecmdlname);
status = ProXSectionItemsCollect(p_xsecmdlname, NULL, &xsec_item_arr);
if (status != PRO_TK_NO_ERROR)
return (status);
status = ProArraySizeGet((ProArray)xsec_item_arr, &n_xsec_items);
/*-----------------------------------------------------------*\
For each body/component of the cross section
\*-----------------------------------------------------------*/
for (ii = 0; ii < n_xsec_items; ii++)
{
int n_faces;
ProSurface h_face;
double area;
ProAsmcomppath comp_path;
ProType id_type;
int id;
ProGeom geom;
status = ProXSectionItemDataGet(xsec_item_arr[ii], &comp_path, &id_type, &id, &geom);
if (status != PRO_TK_NO_ERROR)
return (status);
/*-----------------------------------------------------------*\
Print the assembly path of the component.
\*-----------------------------------------------------------*/
user_member_path (p_xsec->solid_owner, &comp_path, path);
ProTKFprintf(fp," Component %2d : %s\n", ii, path);
/*-----------------------------------------------------------*\
List the component faces and contours.
\*-----------------------------------------------------------*/
h_face = (ProSurface)geom;
n_faces = 1;
do {
ProSurface next_face;
status = ProSurfaceAreaEval(h_face, &area);
ProTKFprintf(fp, " Face %d, area %f\n", n_faces++, area);
status = ProSurfaceContourVisit(h_face,
(ProSurfaceContourVisitAction)user_xsec_contour_visit,
(ProSurfaceContourFilterAction)NULL, (ProAppData)fp);
status = ProSurfaceNextGet(h_face, &next_face);
h_face = next_face;
} while (h_face != NULL);
}
ProXSectionItemsArrFree( (ProXSectionItem **)&xsec_item_arr );
return status;
}
void user_List_Xsecs()
{
ProCharName filename = {'x','s','e','c','s','.','l','s','t','\0'};
ProFileName wfilename;
ProError status;
ProMdl h_obj;
FILE *fp;
ProStringToWstring(wfilename, filename);
fp = PTApplsUnicodeFopen(filename, "w");
status = ProMdlCurrentGet(&h_obj);
/*-----------------------------------------------------------*\
For each cross section...
\*-----------------------------------------------------------*/
status = ProSolidXsecVisit((ProSolid)h_obj,
(ProSolidXsecVisitAction)user_xsec_visit,
(ProAppData)fp);
ProInfoWindowDisplay(wfilename, NULL, NULL);
}
void user_member_path (h_obj, comp_path, path)
ProMdl h_obj;
ProAsmcomppath *comp_path;
char path[];
{
ProMdl assembly;
char name[PRO_MDLNAME_SIZE], type[PRO_MDLEXTENSION_SIZE],buff[200];
int m;
ProError err;
ProMdlName modelName;
ProMdlExtension modelExtension;
err = ProMdlMdlnameGet((ProMdl)h_obj, modelName);
err = ProMdlExtensionGet((ProMdl)h_obj, modelExtension);
ProWstringToString(name,modelName);
ProWstringToString(type,modelExtension);
strcpy (path, name);
strcat (path, ".");
strcat (path, type);
assembly = h_obj;
for (m = 0; m < comp_path->table_num; m++)
{
ProMdl comp_model;
ProAsmcomp component;
component.type = PRO_FEATURE;
component.id = comp_path->comp_id_table[m];
component.owner = assembly;
err = ProAsmcompMdlGet(&component, &comp_model);
err = ProMdlMdlnameGet((ProMdl)comp_model, modelName);
err = ProMdlExtensionGet((ProMdl)comp_model, modelExtension);
ProTKSprintf(buff, "/%s.%s[%d]",
ProWstringToString (name, modelName),
ProWstringToString (type, modelExtension),
comp_path->comp_id_table[m] );
strcat (path, buff);
}
}