/*
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 "UtilMath.h"
#include "ProMenu.h"
#include "ProUtil.h"
/*---------------------- Application Includes ------------------------*/
#include "TestError.h"
/*---------------------- Function Prototypes -------------------------*/
ProError UserSectionCreateExample();
ProError ProDemoSectCreate();
/*------------------------- Global Data -----------------------------*/
typedef char ProUtilCname[PRO_NAME_SIZE];
/*===========================================================*\
FUNCTION : ProDemoSectCreate()
PURPOSE : Creates a section model whose shape is a
rectangle with a semi-circular "bite" from
the left side.
\*===========================================================*/
ProError ProDemoSectCreate(
double width, /* (In) The rectangle width */
double height, /* (In) The rectangle height */
double bite_radius, /* (In) The radius of the bite */
double bite_height, /* (In) The height of the bite */
ProUtilCname name, /* (In) The sketch name */
ProBoolean alloc, /* (In) mem Alloc specifier */
ProSection *p_section) /* (In/Out) The section handle for the
sketch */
{
ProError status, solve_status;
ProSection section;
ProName wname;
Pro2dArcdef arc;
Pro2dLinedef line;
int bottom_id, right_id, top_id,
left_top_id,left_bottom_id, arc_id;
int width_dim, height_dim, bite_height_dim,
bite_radius_dim;
ProSectionPointType pnt_types[2];
Pro2dPnt point;
int n_errors, e;
ProWSecerror errors;
ProMsg wmsg;
char msg[PRO_PATH_SIZE];
int dims[2];
/*-----------------------------------------------------------*\
Check that the dimensions are possible.
\*-----------------------------------------------------------*/
if (width < EPSM6 || height < EPSM6)
return (-1);
if (bite_height <= bite_radius)
return (-1);
if (bite_height + bite_radius > height)
return (-1);
if (bite_radius >= width)
return (-1);
/*-----------------------------------------------------------*\
Allocate the handle for the 2-D section.
\*-----------------------------------------------------------*/
if (alloc == PRO_B_TRUE)
{
status = ProSection2DAlloc (§ion);
}
else
section = *p_section;
/*-----------------------------------------------------------*\
Set the name of the section.
\*-----------------------------------------------------------*/
pro_str_to_wstr (wname, name);
status = ProSectionNameSet (section, wname);
/*-----------------------------------------------------------*\
Set the epsilon value.
\*-----------------------------------------------------------*/
status = ProSectionEpsilonSet (section, 0.5);
/*-----------------------------------------------------------*\
Add a straight-line entity for the bottom of the rectangle.
\*-----------------------------------------------------------*/
line.type = PRO_2D_LINE;
line.end1[0] = 0.0;
line.end1[1] = 0.0;
line.end2[0] = width + 0.1;
line.end2[1] = 0.0;
status = ProSectionEntityAdd (section,
(Pro2dEntdef*)&line, &bottom_id);
/*-----------------------------------------------------------*\
...right
\*-----------------------------------------------------------*/
line.type = PRO_2D_LINE;
line.end1[0] = width + 0.1;
line.end1[1] = 0.0;
line.end2[0] = width;
line.end2[1] = height;
status = ProSectionEntityAdd (section,
(Pro2dEntdef*)&line, &right_id);
/*-----------------------------------------------------------*\
...top
\*-----------------------------------------------------------*/
line.type = PRO_2D_LINE;
line.end1[0] = width;
line.end1[1] = height;
line.end2[0] = 0.0;
line.end2[1] = height;
status = ProSectionEntityAdd (section, (Pro2dEntdef*)&line,
&top_id);
/*-----------------------------------------------------------*\
...left above the bite
\*-----------------------------------------------------------*/
line.type = PRO_2D_LINE;
line.end1[0] = 0.0;
line.end1[1] = bite_height - bite_radius;
line.end2[0] = 0.0;
line.end2[1] = 0.0;
status = ProSectionEntityAdd (section, (Pro2dEntdef*)&line,
&left_top_id);
/*-----------------------------------------------------------*\
...left below the bite
\*-----------------------------------------------------------*/
line.type = PRO_2D_LINE;
line.end1[0] = 0.0;
line.end1[1] = height;
line.end2[0] = 0.0;
line.end2[1] = bite_height + bite_radius;
status = ProSectionEntityAdd (section, (Pro2dEntdef*)&line,
&left_bottom_id);
/*-----------------------------------------------------------*\
Add an arc entity for the bite itself.
\*-----------------------------------------------------------*/
arc.type = PRO_2D_ARC;
arc.center[0] = 0.0;
arc.center[1] = bite_height;
arc.start_angle = PI * 1.5; /* 270 degrees counterclockwise
from the X axis */
arc.end_angle = PI / 2.0; /* 90 degrees counterclockwise
from the X axis */
arc.radius = bite_radius;
status = ProSectionEntityAdd (section, (Pro2dEntdef*)&arc,
&arc_id);
/*-----------------------------------------------------------*\
Add a dimension for the width (the length of the top
entity).
\*-----------------------------------------------------------*/
point[0] = width/2.0;
point[1] = height + 10.0;
pnt_types[0] = PRO_ENT_WHOLE;
status = ProSecdimCreate (section, &top_id, pnt_types, 1,
PRO_TK_DIM_LINE, point, &width_dim);
/*-----------------------------------------------------------*\
Add a dimension for the height (the length of the
right entity).
\*-----------------------------------------------------------*/
point[0] = width + 1.0;
point[1] = height/2.0;
pnt_types[0] = PRO_ENT_WHOLE;
status = ProSecdimCreate (section, &right_id, pnt_types, 1,
PRO_TK_DIM_LINE, point, &height_dim);
/*-----------------------------------------------------------*\
Add a dimension for the height of the bite.
\*-----------------------------------------------------------*/
point[0] = -1.0;
point[1] = bite_height/2.0;
dims[0] = bottom_id;
dims[1] = arc_id;
pnt_types[0] = PRO_ENT_WHOLE;
pnt_types[1] = PRO_ENT_CENTER;
status = ProSecdimCreate (section, dims, pnt_types, 2,
PRO_TK_DIM_LINE_POINT, point, &bite_height_dim);
/*-----------------------------------------------------------*\
Add a dimension for the radius of the bite.
\*-----------------------------------------------------------*/
point[0] = bite_radius + 1.0;
point[1] = bite_height;
pnt_types[0] = PRO_ENT_WHOLE;
status = ProSecdimCreate (section, &arc_id, pnt_types, 1,
PRO_TK_DIM_RAD, point, &bite_radius_dim);
/*-----------------------------------------------------------*\
Claim memory for the error structure.
\*-----------------------------------------------------------*/
status = ProSecerrorAlloc (&errors);
/*-----------------------------------------------------------*\
Solve the section.
\*-----------------------------------------------------------*/
solve_status = ProSectionSolve (section, &errors);
/*-----------------------------------------------------------*\
If the solve failed, report error messages and exit.
\*-----------------------------------------------------------*/
if (solve_status != PRO_TK_NO_ERROR)
{
status = ProSecerrorCount (&errors, &n_errors);
for (e = 0; e < n_errors; e++)
{
status = ProSecerrorMsgGet (errors, e, wmsg);
ProWstringToString (msg, wmsg);
ProTKPrintf ("Error %d message : %s\n",e, msg);
}
return (-1);
}
status = ProSecerrorFree (&errors);
/*-----------------------------------------------------------*\
Save the section.
\*-----------------------------------------------------------*/
status = ProMdlSave (section);
/*-----------------------------------------------------------*\
Return the section handle
\*-----------------------------------------------------------*/
*p_section = section;
return (0);
}
/*===========================================================*\
FUNCTION : UserSectionCreateExample()
PURPOSE : Invokes the function to create the Section model
\*===========================================================*/
ProError UserSectionCreateExample()
{
ProError status;
double width;
double height;
double bite_radius;
double bite_height;
char *name = "test";
ProBoolean alloc;
char filename[PRO_NAME_SIZE];
ProSection section;
int win_id;
ProMacro wmacro;
char *macro = "#MODE;#SKETCHER;#SEARCH/RETR;#IN SESSION;#TEST.SEC;";
width = 200;
height = 150;
bite_radius = 20;
bite_height = 30;
alloc = PRO_B_TRUE;
status = ProDemoSectCreate( width, height, bite_radius,
bite_height, name, alloc, §ion );
ERROR_CHECK( "UserSectionCreateExample", "ProDemoSectCreate", status );
ProStringToWstring( wmacro, macro );
ProMacroLoad(wmacro);
return ( PRO_TK_NO_ERROR );
}