/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*--------------------------------------------------------------------*\
Pro/DEVELOP includes
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProMdl.h>
#include <ProMenu.h>
#include <ProSolid.h>
#include <ProXsec.h>
#include <ProSelection.h>
#include <ProSurface.h>
#include <ProUtil.h>
#include <UtilMenu.h>
/*--------------------------------------------------------------------*\
Application includes
\*--------------------------------------------------------------------*/
#include "TestXsec.h"
#include "TestError.h"
#include <UtilMessage.h>
#include <ProMessage.h>
#include <ProQuilt.h>
#include <UtilCollect.h>
#include <PTApplsUnicodeUtils.h>
#include <UtilCollect.h>
#include <ProModelitem.h>
#include <UtilString.h>
#include <ProTKRunTime.h>
/*--------------------------------------------------------------------*\
Application macros
\*--------------------------------------------------------------------*/
#define PRO_TEST_XSEC_MODIFY_DIMVALUES 1
#define PRO_TEST_XSEC_MODIFY_REDEFINE 2
#define PRO_TEST_XSEC_MODIFY_HATCHING 3
#define PRO_TEST_XSEC_MODIFY_NAME 4
/*--------------------------------------------------------------------*\
Application data types
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
/*====================================================================*\
FUNCTION : ProTestXsec
PURPOSE : Menu for section action
\*====================================================================*/
int ProTestXsec (
ProSolid *p_model)
{
int id;
ProError status;
status = ProMenuFileRegister((char*)"TkXsec",(char*)"tkxsec.mnu", &id);
TEST_CALL_REPORT ("ProMenuFileRegister", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkXsec",(char*)"-Create",
(ProMenubuttonAction)ProTestXsecCreate, p_model, 0);
TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkXsec",(char*)"-Delete",
(ProMenubuttonAction)ProTestXsecDelete, p_model, 0);
TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkXsec",(char*)"-Show",
(ProMenubuttonAction)ProTestXsecShow, p_model, 0);
TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkXsec",(char*)"-Erase",
(ProMenubuttonAction)ProTestNotSupported, p_model,0);
TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkXsec",(char*)"-Copy",
(ProMenubuttonAction)ProTestNotSupported, p_model,0);
TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkXsec",(char*)"-Modify",
(ProMenubuttonAction)ProTestXsecModify, p_model,0);
TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkXsec",(char*)"-ListAllParams",
(ProMenubuttonAction)ProTestXsecListAllParams, p_model,0);
TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkXsec",(char*)"TkXsec",
(ProMenubuttonAction)ProMenuDelete, NULL,0);
TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenuCreate(PROMENUTYPE_MAIN,(char*)"TkXsec", &id);
TEST_CALL_REPORT ("ProMenuCreate", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
status = ProMenuProcess((char*)"TkXsec", &id);
TEST_CALL_REPORT ("ProMenuProcess", "ProTestXsecMenu",
status, status != PRO_TK_NO_ERROR);
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestNotSupported
PURPOSE :
\*====================================================================*/
int ProTestNotSupported (ProAppData app_data, int app_int)
{
ProUtilMsgPrint("gen","TEST %0s","Function not supported.");
return (PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestXsecCreate
PURPOSE : Creates a cross section through a datum plane.
\*====================================================================*/
int ProTestXsecCreate (
ProSolid *p_model)
{
int sel_num, plane_id, quilt_id;
ProXsecCutobj xsec_type;
ProSolid solid_owner = *p_model;
ProName w_name;
ProError status;
ProSelection *sel_array = NULL;
ProModelitem model_item;
ProSurface surface;
ProSrftype surface_type;
ProXsec xsec;
ProQuilt quilt;
ProUtilMsgPrint ("gen", "TEST %0s", "Enter name of new cross section:");
if (ProMessageStringRead (PRO_NAME_SIZE, w_name) != PRO_TK_NO_ERROR)
return (PRO_TK_NO_ERROR);
while (1==1)
{
ProUtilMsgPrint ("gen", "TEST %0s", "Select plane through which the cross "
"section will be created");
status = ProSelect ((char*)"datum,surface", 1, NULL, NULL, NULL, NULL,
&sel_array, &sel_num);
TEST_CALL_REPORT ("ProSelect", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
if (status == PRO_TK_USER_ABORT || status == PRO_TK_PICK_ABOVE)
return (PRO_TK_NO_ERROR);
status = ProSelectionModelitemGet (sel_array[0], &model_item);
TEST_CALL_REPORT ("ProSelectionModelItemGet", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
status = ProGeomitemToSurface ((ProGeomitem*)&model_item, &surface);
TEST_CALL_REPORT ("ProGeomitemToSurface", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
status = ProSurfaceTypeGet (surface, &surface_type);
TEST_CALL_REPORT ("ProSurfaceTypeGet", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
if (surface_type == PRO_SRF_PLANE)
{
status = ProSurfaceIdGet (surface, &plane_id);
TEST_CALL_REPORT ("ProSurfaceIdGet","ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
break;
}
ProUtilMsgPrint ("gen", "TEST %0s", "Its not plane surface."
"Try again.");
}
xsec_type = (ProXsecCutobj)ProTestXsecTypeMenu ();
if ((int)xsec_type == -1)
return (PRO_TK_GENERAL_ERROR);
if (xsec_type == PRO_XSECTYPE_QUILTS)
{
ProUtilMsgPrint ("gen", "TEST %0s", "Select quilt for cut.");
status = ProSelect ((char*)"dtmqlt", 1, NULL, NULL, NULL, NULL,
&sel_array, &sel_num);
TEST_CALL_REPORT ("ProSelect", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
if (status == PRO_TK_USER_ABORT || status == PRO_TK_PICK_ABOVE)
return (PRO_TK_NO_ERROR);
status = ProSelectionModelitemGet (sel_array[0], &model_item);
TEST_CALL_REPORT ("ProSelectionModelItemGet", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
status = ProGeomitemToQuilt ((ProGeomitem*)&model_item, &quilt);
TEST_CALL_REPORT ("ProGeomitemToQuild", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
status = ProQuiltIdGet (quilt, &quilt_id);
TEST_CALL_REPORT ("ProQuiltIdGet", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
}
else
quilt_id = -1;
status = ProXsecPlanarWithoptionsCreate (solid_owner, w_name,
plane_id, xsec_type, NULL, quilt_id, 1, PRO_XSEC_MODEL_EXCLUDE, NULL, &xsec );
TEST_CALL_REPORT ("ProXsecPlanarWithoptionsCreate", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
return status;
status = ProXsecDisplay( &xsec);
TEST_CALL_REPORT ("ProXsecDisplay", "ProTestXsecCreate",
status, status != PRO_TK_NO_ERROR);
return (PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProTestXsecTypeMenu
PURPOSE : .
\*====================================================================*/
int ProTestXsecTypeMenu ()
{
int id;
ProUtilMenuButtons buttons[] = {
{"TkXsecType", -1, TEST_CALL_PRO_MENU_DELETE},
{"TypeModel", PRO_XSECTYPE_MODEL, 0},
{"TypeQuilts", PRO_XSECTYPE_QUILTS, 0},
{"TypeModelQuilts", PRO_XSECTYPE_MODELQUILTS, 0},
{"", -1, 0}};
if (ProUtilMenuIntValueSelect( buttons, &id) != PRO_TK_NO_ERROR)
return -1;
return id;
}
/*====================================================================*\
FUNCTION : ProTestXsecDelete
PURPOSE : .
\*====================================================================*/
int ProTestXsecDelete (
ProSolid *p_solid)
{
ProXsec xsec;
ProError status;
status = ProTestXsecSelect (*p_solid, &xsec);
if (status == PRO_TK_NO_ERROR)
{
status = ProXsecDelete(&xsec);
TEST_CALL_REPORT ("ProXsecDelete", "ProTestXsecDelete",
status, status != PRO_TK_NO_ERROR);
return (0);
}
return (-1);
}
/*====================================================================*\
FUNCTION : ProTestXsecShow
PURPOSE : .
\*====================================================================*/
int ProTestXsecShow (
ProSolid *p_solid)
{
ProXsec xsec;
while (ProTestXsecSelect(*p_solid, &xsec) == PRO_TK_NO_ERROR);
return (0);
}
/*====================================================================*\
FUNCTION : ProTestXsecModify
PURPOSE : .
\*====================================================================*/
int ProTestXsecModify (
ProSolid *p_solid)
{
int id;
ProError status;
ProUtilMenuButtons buttons[] = {
{"TkXsecModify", -1, 0},
{"Dim Values", PRO_TEST_XSEC_MODIFY_DIMVALUES,
TEST_CALL_PRO_MENU_ACTIVATE},
{"Redefine", PRO_TEST_XSEC_MODIFY_REDEFINE,
TEST_CALL_PRO_MENU_ACTIVATE},
{"Hatching", PRO_TEST_XSEC_MODIFY_HATCHING,
TEST_CALL_PRO_MENU_ACTIVATE},
{"Name", PRO_TEST_XSEC_MODIFY_NAME,
TEST_CALL_PRO_MENU_ACTIVATE},
{"", -1, 0}};
ProXsec xsec;
ProName w_name;
if (ProUtilMenuIntValueSelect( buttons, &id) != PRO_TK_NO_ERROR)
return 0;
if (ProTestXsecSelect(*p_solid, &xsec) != PRO_TK_NO_ERROR)
return (0);
switch (id)
{
case PRO_TEST_XSEC_MODIFY_DIMVALUES:
ProTestNotSupported (NULL, 0);
break;
case PRO_TEST_XSEC_MODIFY_REDEFINE:
ProTestNotSupported (NULL, 0);
break;
case PRO_TEST_XSEC_MODIFY_HATCHING:
ProTestNotSupported (NULL, 0);
break;
case PRO_TEST_XSEC_MODIFY_NAME:
{
ProUtilMsgPrint ("gen", "TEST %0s", "Enter new name:");
if (ProMessageStringRead (PRO_NAME_SIZE, w_name) != PRO_TK_NO_ERROR)
return (0);
status = ProXsecRename( &xsec, w_name);
TEST_CALL_REPORT ("ProXsecRename", "ProTestXsecModify",
status, status != PRO_TK_NO_ERROR);
}
break;
}
/* bug 1334 */
status = ProXsecRegenerate( &xsec );
TEST_CALL_REPORT ("ProXsecRegenerate", "ProTestXsecModify",
status, status != PRO_TK_NO_ERROR && status != PRO_TK_BAD_INPUTS);
return (0);
}
/*====================================================================*\
FUNCTION : ProTestXsecSelect
PURPOSE : .
\*====================================================================*/
ProError ProTestXsecSelect (
ProSolid solid_owner,
ProXsec *xsec_ptr) /* Out: Selected Xsec, user's memory */
{
int i, array_size;
ProError status;
ProXsec *xsec_array=NULL;
wchar_t **w_menu_buttons;
status = ProMdlCurrentGet ((ProMdl*)&solid_owner);
TEST_CALL_REPORT ("ProMdlCurrentGet", "ProTestXsecSelect",
status, status != PRO_TK_NO_ERROR);
status = ProUtilCollectSolidXsec (solid_owner, &xsec_array);
if (status != PRO_TK_NO_ERROR)
{
ProUtilMsgPrint ("gen", "TEST %0s", "Model don't have cross section:");
return (PRO_TK_E_NOT_FOUND);
}
status = ProArraySizeGet ((ProArray)xsec_array, &array_size);
ProUtilMenuStringsAlloc(&w_menu_buttons);
for (i=0; i<array_size; i++)
ProUtilMenuStringsWstrAdd(&w_menu_buttons, xsec_array[i].xsec_name);
if (ProUtilMenuStringsIntValueSelect((char*)"TkXsecNames", w_menu_buttons, &i)
== PRO_TK_NO_ERROR)
{
xsec_ptr[0] = xsec_array[i];
status = ProXsecDisplay( xsec_ptr);
TEST_CALL_REPORT ("ProXsecDisplay", "ProTestXsecSelect",
status, status != PRO_TK_NO_ERROR);
}
else
i = -1;
ProUtilMenuStringsAlloc(&w_menu_buttons);
status = ProArrayFree ((ProArray*)&xsec_array);
return (i != -1)? PRO_TK_NO_ERROR : PRO_TK_GENERAL_ERROR;
}
/*====================================================================*\
FUNCTION : ProTestXsecListAllParams
PURPOSE : .
\*====================================================================*/
int ProTestXsecListAllParams (
ProSolid *p_solid)
{
int i, j, array_size, n_geom, csys_selected = 0;
FILE *fp = NULL;
char c_name[PRO_NAME_SIZE];
ProError status;
ProName w_name;
ProXsecType xsec_type;
ProXsecGeom *p_xsec_geom;
ProMassProperty xsec_massproperty;
ProSolid solid_owner = *p_solid;
ProXsec *xsec_array=NULL;
status = ProUtilCollectSolidXsec (solid_owner, &xsec_array);
if (status != PRO_TK_NO_ERROR)
{
ProUtilMsgPrint ("gen", "TEST %0s", "Model don't have cross section:");
return (PRO_TK_E_NOT_FOUND);
}
status = ProArraySizeGet ((ProArray)xsec_array, &array_size);
fp = PTApplsUnicodeFopen ("xsec_info.inf", "w");
if (fp != NULL)
{
for (i=0; i<array_size; i++)
{
status = ProXsecTypeGet (&xsec_array[i], &xsec_type);
TEST_CALL_REPORT ("ProXsecTypeGet",
"ProTestXsecListAllParams", status, status != PRO_TK_NO_ERROR);
ProWstringToString (c_name, xsec_array[i].xsec_name);
ProTKFprintf (fp, "Cross section name %s, type %s,",
c_name, (xsec_type.cutter)? "offset" : "planar");
switch (xsec_type.cut_object)
{
case PRO_XSECTYPE_MODEL:
strcpy (c_name, "model");
break;
case PRO_XSECTYPE_QUILTS:
strcpy (c_name, "quilt");
break;
case PRO_XSECTYPE_MODELQUILTS:
strcpy (c_name, "model_and_quilts");
break;
default:
strcpy (c_name, "unknown");
}
ProTKFprintf (fp, " cut object %s.\n", c_name);
status = ProXsecGeometryRetrieve (&xsec_array[i], &p_xsec_geom);
TEST_CALL_REPORT ("ProXsecGeometryRetrieve",
"ProTestXsecListAllParams", status, status != PRO_TK_NO_ERROR);
status = ProArraySizeGet((ProArray)p_xsec_geom, &n_geom);
for (j=0; j<n_geom; j++)
{
ProTKFprintf (fp, "Geometry %d\n", j+1);
ProTKFprintf (fp, "\tMemb id tab %d quilt id %d\n",
p_xsec_geom[j].memb_id_tab,
p_xsec_geom[j].quilt_id);
}
if (xsec_type.cutter != PRO_XSEC_OFFSET &&
xsec_type.cut_object != PRO_XSECTYPE_QUILTS)
{
if (!csys_selected)
{
if (ProTestXsecCsysSelect (solid_owner, w_name) == 0)
w_name[0] = '\0';
csys_selected = 1;
ProWstringToString(c_name, w_name);
}
/* Bug 1337 */
status = ProXsecMassPropertyCompute (&xsec_array[i],
w_name, &xsec_massproperty);
TEST_CALL_REPORT ("ProXsecMassPropertyCompute",
"ProTestXsecListAllParams", status,
status != PRO_TK_NO_ERROR && status != PRO_TK_BAD_INPUTS);
ProTKFprintf(fp, "Mass properties in csys %s\n", c_name);
ProTKFprintf (fp,
"\tSurface area %f; center of gravity (%.5f,%.5f).\n",
xsec_massproperty.surface_area,
xsec_massproperty.center_of_gravity[0],
xsec_massproperty.center_of_gravity[1]);
ProTKFprintf (fp, "\tCoord system in area:\n");
ProTKFprintf (fp, "\t\t%.5f\t%.5f\n",
xsec_massproperty.coor_sys_inertia[0][0],
xsec_massproperty.coor_sys_inertia[0][1]);
ProTKFprintf (fp, "\t\t%.5f\t%.5f\n",
xsec_massproperty.coor_sys_inertia[1][0],
xsec_massproperty.coor_sys_inertia[1][1]);
}
ProTKFprintf (fp, "\n");
}
fclose(fp);
}
status = ProArrayFree ((ProArray*)&xsec_array);
TEST_CALL_REPORT ("ProArrayFree", "ProTestXsecListAllParams",
status, status != PRO_TK_NO_ERROR);
return (0);
}
/*====================================================================*\
FUNCTION : ProTestXsecCsysSelect
PURPOSE : .
\*====================================================================*/
ProError ProTestXsecCsysSelect (
ProSolid solid,
ProName w_csys_name)
{
int i, array_size;
ProError status;
ProCsys *csys_array = NULL;
ProGeomitem geomitem;
wchar_t **w_menu_buttons;
if (ProUtilCollectSolidCsys ( solid, &csys_array) != PRO_TK_NO_ERROR)
return (PRO_TK_E_NOT_FOUND);
status = ProArraySizeGet ((ProArray)csys_array, &array_size);
TEST_CALL_REPORT ("ProArrayFree", "ProArraySizeGet",
status, status != PRO_TK_NO_ERROR);
ProUtilMenuStringsAlloc(&w_menu_buttons);
for (i=0; i<array_size; i++)
{
status = ProCsysToGeomitem (solid, csys_array[i], &geomitem);
TEST_CALL_REPORT ("ProCsysToGeomitem ", "ProTestXsecCsysSelect",
status, status != PRO_TK_NO_ERROR);
status = ProModelitemNameGet ((ProModelitem*)&geomitem, w_csys_name);
TEST_CALL_REPORT ("ProModelitemNameGet", "ProTestXsecCsysSelect",
status, status != PRO_TK_NO_ERROR);
ProUtilMenuStringsWstrAdd(&w_menu_buttons, w_csys_name);
}
status = ProUtilMenuStringsIntValueSelect((char*)"TkCsysNames", w_menu_buttons,
&i);
if ( status == PRO_TK_NO_ERROR)
ProUtilWstrcpy(w_csys_name, w_menu_buttons[i]);
else
{
i = -1;
w_csys_name[0] = (wchar_t)'\0';
}
ProUtilMenuStringsFree(&w_menu_buttons);
status = ProArrayFree ((ProArray*)&csys_array);
return (i != -1)? PRO_TK_NO_ERROR : PRO_TK_GENERAL_ERROR;
}