/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*---------------------- Pro/Toolkit Includes ------------------------*/
#include <ProToolkit.h>
#include <ProSection.h>
#include <ProSecdim.h>
#include <ProSecerror.h>
#include <Pro2dEntdef.h>
#include <ProSecdimType.h>
#include <ProMdl.h>
#include <ProMenu.h>
#include <ProUtil.h>
#include <ProMessage.h>
#include <ProArray.h>
#include <ProElement.h>
#include <ProFeature.h>
#include <TestError.h>
#include <ProSolid.h>
#define MSGFILE L##"msg_ug3dsketch.txt"
ProError UserAddSplineDimension();
ProError UserGetFeatureSection(ProFeature* feat, ProSection *section);
ProError UserCreatePoint (double x, double y, ProSection* section);
ProError UserSetFeatureSection(ProFeature* feat, ProSection *section);
/*================================================================*\
FUNCTION : UserAddSplineDimension()
PURPOSE : Adds a sectiond dimension to spline entity
\*================================================================*/
ProError UserAddSplineDimension()
{
ProError status;
wchar_t w_pane_name[PRO_LINE_SIZE];
ProCharName pane_name;
ProMdl model;
ProSelection *sel;
int num_sel;
ProFeature sk_feat;
ProSection feat_section;
int *int_ids, no_of_ids, i;
int no_of_points, irange[2];
int usr_pnt1, usr_pnt2;
Pro2dEntdef *entity_def;
Pro2dSplinedef *spline_def;
Pro2dPointdef *point_def;
ProBoolean spline_found = PRO_B_FALSE;
Pro2dPnt pnt1, pnt2, pnt3;
ProSelection spline_sel, spline_sel2, point_sels[2], point1_sel, point2_sel;
int ent_ids[2], count = 0;
ProSelection* sel_array = NULL, *sel_array2 = NULL;
int constr_id;
ProWSecerror sec_error;
ProSectionPointType point_types[2];
Pro2dPnt place_point;
int sec_dim_id;
status = ProMdlCurrentGet(&model);
ERROR_CHECK("UserAddSplineDimension","ProMdlCurrentGet",status);
if (status != PRO_TK_NO_ERROR)
{
ProMessageDisplay (MSGFILE, "USER Model does not exist or bad context");
return status;
}
status = ProSelect("feature", 1, NULL, NULL, NULL, NULL, &sel, &num_sel);
ERROR_CHECK("UserAddSplineDimension","ProSelect",status);
status = ProSelectionModelitemGet(sel[0], (ProModelitem*)&sk_feat);
ERROR_CHECK("UserAddSplineDimension","ProSelectionModelitemGet",status);
/*================================================================*\
Access the feature's section pointer from its element tree.
\*================================================================*/
status = UserGetFeatureSection(&sk_feat, &feat_section);
ERROR_CHECK("UserAddSplineDimension","UserGetFeatureSection",status);
if (status != PRO_TK_NO_ERROR)
return status;
status = ProSectionEntityIdsGet(feat_section, &int_ids, &no_of_ids);
ERROR_CHECK("UserAddSplineDimension","ProSectionEntityIdsGet",status);
if (status != PRO_TK_NO_ERROR)
return status;
/*================================================================*\
Get the number of interpolation points of the spline entity.
\*================================================================*/
for (i=0 ; i<no_of_ids ; i++)
{
status = ProSectionEntityGet (feat_section, int_ids[i], &entity_def);
ERROR_CHECK("UserAddSplineDimension","ProSectionEntityGet",status);
if (status != PRO_TK_NO_ERROR)
return status;
if(entity_def->type == PRO_2D_SPLINE)
{
spline_found = PRO_B_TRUE;
spline_def = (Pro2dSplinedef *)entity_def;
no_of_points = spline_def->n_points;
break;
}
}
if (!spline_found)
{
status = ProMessageDisplay (MSGFILE,
"USER Feature section does not contain spline");
ERROR_CHECK("UserAddSplineDimension","ProMessageDisplay",status);
return PRO_TK_E_NOT_FOUND;
}
status = ProMessageDisplay (MSGFILE,
"USER Spline has %0d interpolation points", &no_of_points);
ERROR_CHECK("UserAddSplineDimension","ProMessageDisplay",status);
/*================================================================*\
Create a point entity on the first and last interpolation point
of the spline entity.
\*================================================================*/
status = UserCreatePoint (
spline_def->point_arr[0][0],
spline_def->point_arr[0][1],
&feat_section); /* Spline start point */
ERROR_CHECK("UserAddSplineDimension","ProMdlCurrentGet",status);
status = UserCreatePoint (
spline_def->point_arr[no_of_points-1][0],
spline_def->point_arr[no_of_points-1][1],
&feat_section); /* Spline end point */
ERROR_CHECK("UserAddSplineDimension","UserCreatePoint",status);
status = ProSectionEntityIdsGet(feat_section, &int_ids, &no_of_ids);
ERROR_CHECK("UserAddSplineDimension","ProSectionEntityIdsGet",status);
for (i=0 ; i<no_of_ids ; i++)
{
status = ProSectionEntityGet (feat_section, int_ids[i], &entity_def);
ERROR_CHECK("UserAddSplineDimension","ProSectionEntityGet",status);
if (status != PRO_TK_NO_ERROR)
return status;
if(entity_def->type == PRO_2D_SPLINE)
{
spline_def = (Pro2dSplinedef *)entity_def;
pnt1[0] = spline_def->point_arr[0][0];
pnt1[1] = spline_def->point_arr[0][1];
pnt2[0] = spline_def->point_arr[no_of_points-1][0];
pnt2[1] = spline_def->point_arr[no_of_points-1][1];
status = ProSectionEntityGetSelected(feat_section, int_ids[i],
PRO_ENT_START, pnt1, PRO_VALUE_UNUSED, &spline_sel);
ERROR_CHECK("UserAddSplineDimension",
"ProSectionEntityGetSelected",status);
if (status != PRO_TK_NO_ERROR)
return status;
status = ProSectionEntityGetSelected(feat_section, int_ids[i],
PRO_ENT_END, pnt2, PRO_VALUE_UNUSED, &spline_sel2);
ERROR_CHECK("UserAddSplineDimension",
"ProSectionEntityGetSelected",status);
if (status != PRO_TK_NO_ERROR)
return status;
}
if (entity_def->type == PRO_2D_POINT)
{
point_def = (Pro2dPointdef*)entity_def;
pnt3[0] = point_def->pnt[0];
pnt3[1] = point_def->pnt[1];
ent_ids[count] = int_ids[i];
status = ProSectionEntityGetSelected(feat_section, int_ids[i],
PRO_ENT_WHOLE, pnt3, PRO_VALUE_UNUSED,
&(point_sels[count++]));
ERROR_CHECK("UserAddSplineDimension",
"ProSectionEntityGetSelected",status);
if (status != PRO_TK_NO_ERROR)
return status;
}
}
/*================================================================*\
Create "Same point" constraint between the point and spline
entity at the two locations.
\*================================================================*/
status = ProArrayAlloc(0, sizeof(ProSelection), 1, (ProArray*)&sel_array);
ERROR_CHECK("UserAddSplineDimension","ProArrayAlloc",status);
status = ProArrayObjectAdd((ProArray*)&sel_array, PRO_VALUE_UNUSED, 1,
&spline_sel);
ERROR_CHECK("UserAddSplineDimension","ProArrayObjectAdd",status);
status = ProArrayObjectAdd((ProArray*)&sel_array, PRO_VALUE_UNUSED, 1,
&(point_sels[1]));
ERROR_CHECK("UserAddSplineDimension","ProArrayObjectAdd",status);
status = ProSectionConstraintCreate(feat_section, sel_array, 2,
PRO_CONSTRAINT_SAME_POINT, &constr_id);
ERROR_CHECK("UserAddSplineDimension","ProSectionConstraintCreate",status);
if (status != PRO_TK_NO_ERROR)
return status;
status = ProArrayFree((ProArray*)&sel_array);
ERROR_CHECK("UserAddSplineDimension","ProArrayFree",status);
status = ProArrayAlloc(0, sizeof(ProSelection), 1, (ProArray*)&sel_array2);
ERROR_CHECK("UserAddSplineDimension","ProArrayAlloc",status);
status = ProArrayObjectAdd((ProArray*)&sel_array2, PRO_VALUE_UNUSED, 1,
&spline_sel2);
ERROR_CHECK("UserAddSplineDimension","ProArrayObjectAdd",status);
status = ProArrayObjectAdd((ProArray*)&sel_array2, PRO_VALUE_UNUSED, 1,
&(point_sels[0]));
ERROR_CHECK("UserAddSplineDimension","ProArrayObjectAdd",status);
status = ProSectionConstraintCreate(feat_section, sel_array2, 2,
PRO_CONSTRAINT_SAME_POINT, &constr_id);
ERROR_CHECK("UserAddSplineDimension","ProSectionConstraintCreate",status);
if (status != PRO_TK_NO_ERROR)
return status;
status = ProArrayFree((ProArray*)&sel_array2);
ERROR_CHECK("UserAddSplineDimension","ProArrayFree",status);
status = ProSecerrorAlloc(&sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSecerrorAlloc",status);
status = ProSectionSolve(feat_section, &sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSectionSolve",status);
status = ProSecerrorFree(&sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSecerrorFree",status);
/*================================================================*\
Create the section dimension
\*================================================================*/
point_types[0] = PRO_ENT_START;
point_types[1] = PRO_ENT_END;
/*================================================================*\
Create the place point with spline's interpolation point
coordinates to maintain scale for dimension placement.
\*================================================================*/
place_point[0] = pnt1[0];
place_point[1] = pnt2[1];
status = ProSecdimCreate(feat_section, ent_ids, point_types, 2,
PRO_TK_DIM_PNT_PNT_HORIZ, place_point, &sec_dim_id);
ERROR_CHECK("UserAddSplineDimension","ProSecdimCreate",status);
if (status != PRO_TK_NO_ERROR)
return status;
status = ProSecerrorAlloc(&sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSecerrorAlloc",status);
status = ProSectionSolve(feat_section, &sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSectionSolve",status);
status = ProSecerrorFree(&sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSecerrorFree",status);
status = ProSecerrorAlloc(&sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSecerrorAlloc",status);
status = ProSectionRegenerate(feat_section, &sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSectionRegenerate",status);
status = ProSecerrorFree(&sec_error);
ERROR_CHECK("UserAddSplineDimension","ProSecerrorFree",status);
/*================================================================*\
Set the modified section pointer back to feature and redefine it.
\*================================================================*/
status = UserSetFeatureSection(&sk_feat, &feat_section);
ERROR_CHECK("UserAddSplineDimension","UserSetFeatureSection",status);
if (status != PRO_TK_NO_ERROR)
return status;
status = ProMessageDisplay (MSGFILE,
"USER Spline dimension between interpolation points 1 and %0d has been created.", &no_of_points);
ERROR_CHECK("UserAddSplineDimension","ProMessageDisplay",status);
return status;
}
/*================================================================*\
FUNCTION : UserGetFeatureSection()
PURPOSE : Retrieve's the feature's section pointer.
\*================================================================*/
ProError UserGetFeatureSection(ProFeature* feat, ProSection *section)
{
ProError status;
ProElement elem_tree, elem;
ProElempath elem_path;
ProValue val;
ProValueData val_data;
ProElempathItem sketch_path_item[] = {
{PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_SKETCHER}
};
status = ProFeatureElemtreeExtract (feat, NULL,
PRO_FEAT_EXTRACT_NO_OPTS, &elem_tree );
ERROR_CHECK("UserGetFeatureSection","ProFeatureElemtreeExtract",status);
status = ProElempathAlloc(&elem_path);
ERROR_CHECK("UserGetFeatureSection","ProElempathAlloc",status);
status = ProElempathDataSet(elem_path, sketch_path_item, 2);
ERROR_CHECK("UserGetFeatureSection","ProElempathDataSet",status);
status = ProElemtreeElementGet(elem_tree, elem_path, &elem);
ERROR_CHECK("UserGetFeatureSection","ProElemtreeElementGet",status);
status= ProElementSpecialvalueGet(elem, NULL, (ProAppData *) section);
ERROR_CHECK("UserGetFeatureSection"," ProElementSpecialvalueGet ",status);
return status;
}
/*================================================================*\
FUNCTION : UserCreatePoint()
PURPOSE : Creates a section point entity at given coordinates
in provided section.
\*================================================================*/
ProError UserCreatePoint (double x, double y, ProSection* section)
{
ProError status;
Pro2dPointdef point;
ProWSecerror sec_error;
int ent_id = 1;
point.type = PRO_2D_POINT;
point.pnt[0] = x;
point.pnt[1] = y;
status = ProSectionEntityAdd(*section,(Pro2dEntdef *)&point, &ent_id);
ERROR_CHECK("UserCreatePoint","ProSectionEntityAdd",status);
return status;
}
/*================================================================*\
FUNCTION : UserSetFeatureSection()
PURPOSE : Sets the section pointer to given feature and
redefine it.
\*================================================================*/
ProError UserSetFeatureSection(ProFeature* feat, ProSection *section)
{
ProError status;
ProElement elem_tree, elem;
ProElempath elem_path;
ProFeatureCreateOptions *opts = 0;
ProErrorlist err_list;
ProElempathItem sketch_path_item[] = {
{PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_SKETCHER}
};
status = ProFeatureElemtreeExtract (feat, NULL,
PRO_FEAT_EXTRACT_NO_OPTS, &elem_tree );
ERROR_CHECK("UserSetFeatureSection","ProFeatureElemtreeExtract",status);
status = ProElempathAlloc(&elem_path);
ERROR_CHECK("UserSetFeatureSection","ProElempathAlloc",status);
status = ProElempathDataSet(elem_path, sketch_path_item, 2);
ERROR_CHECK("UserSetFeatureSection","ProElempathDataSet",status);
status = ProElemtreeElementGet(elem_tree, elem_path, &elem);
ERROR_CHECK("UserSetFeatureSection","ProElemtreeElementGet",status);
status = ProElementSpecialvalueSet(elem, (ProAppData)*section);
ERROR_CHECK("UserSetFeatureSection","ProElementSpecialvalueSet",status);
status = ProElemtreeElementAdd(elem_tree, elem_path, elem);
ERROR_CHECK("UserSetFeatureSection","ProElemtreeElementAdd",status);
status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions),
1, (ProArray*)&opts);
opts[0]= PRO_FEAT_CR_NO_OPTS;
status = ProFeatureWithoptionsRedefine(NULL, feat, elem_tree,
opts, PRO_REGEN_NO_FLAGS, &err_list);
ERROR_CHECK("UserSetFeatureSection","ProFeatureRedefine",status);
status = ProArrayFree((ProArray*)&opts);
return status;
}