/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*-------------------------------------------------------------*\
Pro/Toolkit includes
\*-------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProDrawing.h>
#include <ProDtlitem.h>
#include <ProDtlnote.h>
#include <ProDtlsymdef.h>
#include <ProDtlsyminst.h>
#include <ProDtlentity.h>
#include <ProSelection.h>
#include <ProMessage.h>
#include <ProMdl.h>
#include <ProMenu.h>
#include <ProWindows.h>
#include <ProGraphic.h>
/*-------------------------------------------------------------*\
Application includes
\*-------------------------------------------------------------*/
#include "TestError.h"
#include "UtilMessage.h"
#include "UtilString.h"
#include "UtilNames.h"
#include "UtilMenu.h"
#include "UtilMath.h"
#include <ProTKRunTime.h>
/*-------------------------------------------------------------*\
Declaration some functions.
\*-------------------------------------------------------------*/
ProError ProTestSymDefInfo();
ProError ProTestSymDefRetrieve(ProDrawing drawing);
ProError ProTestSymDefCreate(ProDrawing drawing);
ProError ProTestSymDefModify(ProDrawing drawing);
ProError ProTestSymDefDelete(ProDrawing drawing);
ProError ProTestSymDefGet(ProDrawing drawing, ProDtlsymdef *sym_def);
/*=========================================================================*\
Function: ProTestSymDefMenu()
Purpose: Make main menu for symdef test and demo.
Returns: PRO_TK_NO_ERROR if success;
\*=========================================================================*/
int ProTestSymDefMenu(ProDrawing drawing)
{
ProError error;
int menu_id;
/*-------------------------------------------------------------*\
Create main menu for this test
\*-------------------------------------------------------------*/
error = ProMenuFileRegister((char*)"Symdef",(char*)"tksymdef.mnu", &menu_id);
TEST_CALL_REPORT ("ProMenuFileRegister()",
"ProTestSymDefMenu()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"Symdef",(char*)"Info",
(ProMenubuttonAction)ProTestSymDefInfo, NULL, 0);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"ProTestSymDefMenu()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"Symdef",(char*)"Retrieve",
(ProMenubuttonAction)ProTestSymDefRetrieve, drawing, 0);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"ProTestSymDefMenu()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"Symdef",(char*)"Create",
(ProMenubuttonAction)ProTestSymDefCreate, drawing, 0);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"ProTestSymDefMenu()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"Symdef",(char*)"Delete",
(ProMenubuttonAction)ProTestSymDefDelete, drawing, 0);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"ProTestSymDefMenu()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"Symdef",(char*)"Symdef",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"ProTestSymDefMenu()", error, error != PRO_TK_NO_ERROR);
error = ProMenuCreate(PROMENUTYPE_MAIN,(char*) "Symdef", &menu_id);
TEST_CALL_REPORT ("ProMenuCreate()",
"ProTestSymDefMenu()", error, error != PRO_TK_NO_ERROR);
error = ProMenuProcess((char*)"", &menu_id);
TEST_CALL_REPORT ("ProMenuProcess()",
"ProTestSymDefMenu()", error, error != PRO_TK_NO_ERROR);
return (PRO_TK_NO_ERROR);
}
/*=========================================================================*\
Function: ProTestSymDefRetrieve()
Purpose: Retrive symdef from disk.
Returns: PRO_TK_NO_ERROR if success;
\*=========================================================================*/
ProError ProTestSymDefRetrieve(ProDrawing drawing)
{
ProError error;
ProDtlsymdef symdef;
ProLine buff;
int version;
ProCharLine line, str;
ProPath *path_arr, sel_path, def_path;
ProName *path_lab_arr;
ProMdlName w_name;
ProMdlExtension w_type;
/*-------------------------------------------------------------*\
Check input
\*-------------------------------------------------------------*/
if(drawing==NULL)
return(PRO_TK_GENERAL_ERROR);
/*-------------------------------------------------------------*\
Define mask for retrive symdef.
By default symdef retrive from current directory.
\*-------------------------------------------------------------*/
ProStringToWstring(buff,(char*) "*.sym");
ProStringToWstring(def_path,(char*) ".");
/*-------------------------------------------------------------*\
Allocate memory for path data
\*-------------------------------------------------------------*/
error = ProArrayAlloc(0, sizeof(ProPath), 1, (ProArray*)&path_arr);
TEST_CALL_REPORT("ProArrayAlloc()", "ProTestSymDefRetrieve()",
error, error != PRO_TK_NO_ERROR);
error = ProArrayAlloc(0, sizeof(ProPath), 1, (ProArray*)&path_lab_arr);
TEST_CALL_REPORT("ProArrayAlloc()", "ProTestSymDefRetrieve()",
error, error != PRO_TK_NO_ERROR);
/*-------------------------------------------------------------*\
Call OpenFile dialog.
\*-------------------------------------------------------------*/
error = ProFileMdlnameOpen(NULL, buff, path_arr, path_lab_arr,
def_path, NULL, sel_path);
TEST_CALL_REPORT("ProFileMdlnameOpen()", "ProTestSymDefRetrieve()",
error, error != PRO_TK_NO_ERROR);
ProWstringToString(line, sel_path);
if (error == PRO_TK_NO_ERROR)
{
/*-------------------------------------------------------------*\
Call OpenFile dialog.
\*-------------------------------------------------------------*/
error = ProFileMdlnameParse(sel_path, def_path, w_name, w_type, &version);
TEST_CALL_REPORT("ProFileMdlnameParse()", "ProTestSymDefRetrieve()",
error, error != PRO_TK_NO_ERROR);
ProWstringToString(str, sel_path);
/*-------------------------------------------------------------*\
Chect file type
\*-------------------------------------------------------------*/
if(strcmp("sym", ProWstringToString(str, w_type))==0)
{
ProStringToWstring(def_path,(char*)".");
error = ProDrawingDtlsymdefRetrieve(drawing,
def_path, w_name, version, PRO_B_TRUE, &symdef);
TEST_CALL_REPORT("ProDrawingDtlsymdefRetrieve()",
"ProTestSymDefRetrieve()", error, error != PRO_TK_NO_ERROR);
} else ProTKPrintf("Bad inputs: %s, %s \n",str,line);
}
/*-------------------------------------------------------------*\
Free memory and refresh current window
\*-------------------------------------------------------------*/
error = ProArrayFree((ProArray*)&path_arr);
TEST_CALL_REPORT("ProArrayFree()", "ProTestSymDefRetrieve()",
error, error != PRO_TK_NO_ERROR);
error = ProArrayFree((ProArray*)&path_lab_arr);
TEST_CALL_REPORT("ProArrayFree()", "ProTestSymDefRetrieve()",
error, error != PRO_TK_NO_ERROR);
error = ProWindowRepaint(PRO_VALUE_UNUSED);
TEST_CALL_REPORT("ProWindowRepaint()", "ProTestSymDefRetrieve()",
error, error != PRO_TK_NO_ERROR);
return (PRO_TK_NO_ERROR);
}
/*=========================================================================*\
Function: ProTestSymDef_attach_add()
Purpose: Add new attache to symdef
Returns: PRO_TK_NO_ERROR if success;
\*=========================================================================*/
ProError ProTestSymDef_attach_add(ProDrawing drawing, ProDtlsymdef *symdef,
ProDtlsymdefattachType type, int entity_id,
double entity_param, ProVector pos)
{
ProDtlsymdefdata entdata;
ProDtlsymdefattach attach;
ProError error;
/*-------------------------------------------------------------*\
Allocate memory for symdef data.
And setup data for add new attache.
\*-------------------------------------------------------------*/
error = ProDtlsymdefdataAlloc(drawing, &entdata);
TEST_CALL_REPORT ("ProDtlsymdefdataAlloc()",
"ProTestSymDef_attach_add()", error, error != PRO_TK_NO_ERROR);
error = ProDtlsymdefDataGet(symdef, &entdata);
TEST_CALL_REPORT ("ProDtlsymdefDataGet()",
"ProTestSymDef_attach_add()", error, error != PRO_TK_NO_ERROR);
error = ProDtlsymdefattachAlloc(type, entity_id,
entity_param, pos, &attach);
TEST_CALL_REPORT ("ProDtlsymdefattachAlloc()",
"ProTestSymDef_attach_add()", error, error != PRO_TK_NO_ERROR);
error = ProDtlsymdefdataAttachAdd(entdata, attach);
TEST_CALL_REPORT ("ProDtlsymdefdataAttachAdd()",
"ProTestSymDef_attach_add()", error, error != PRO_TK_NO_ERROR);
/*-------------------------------------------------------------*\
Post information to the symdef data and free memory.
\*-------------------------------------------------------------*/
error = ProDtlsymdefModify(symdef, entdata);
TEST_CALL_REPORT ("ProDtlsymdefModify()",
"ProTestSymDef_attach_add()", error, error != PRO_TK_NO_ERROR);
error = ProDtlsymdefattachFree(attach);
TEST_CALL_REPORT ("ProDtlsymdefattachFree()",
"ProTestSymDef_attach_add()", error, error != PRO_TK_NO_ERROR);
error = ProDtlsymdefdataFree(entdata);
TEST_CALL_REPORT ("ProDtlsymdefdataFree()",
"ProTestSymDef_attach_add()", error, error != PRO_TK_NO_ERROR);
return(PRO_TK_NO_ERROR);
}
/*=========================================================================*\
Function: ProTestSymDef_AddItem()
Purpose: Copy entity or note from drawing to the symdef
Returns: PRO_TK_NO_ERROR if success;
out - handle to the new entity or note
\*=========================================================================*/
ProError ProTestSymDef_AddItem(ProDrawing drawing, ProDtlsymdef *symdef,
ProDtlentity *entity, ProDtlentity *out)
{
ProDtlentitydata data;
ProDtlnotedata ndata;
ProColor color;
ProError error;
ProTextStyle nDataTextStyle;
/*-------------------------------------------------------------*\
Check input
\*-------------------------------------------------------------*/
if((symdef==NULL)||(entity==NULL))
return(PRO_TK_GENERAL_ERROR);
/*-------------------------------------------------------------*\
Add only entity or note
\*-------------------------------------------------------------*/
if(((entity->type) == PRO_NOTE)||((entity->type) == PRO_DRAFT_ENTITY))
{
/*-------------------------------------------------------------*\
Add new entity to the symdef
\*-------------------------------------------------------------*/
if((entity->type) == PRO_DRAFT_ENTITY)
{
error = ProDtlentityDataGet (entity, NULL, &data);
TEST_CALL_REPORT("ProDtlentityDataGet()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
if(error!=PRO_TK_NO_ERROR)
return(PRO_TK_GENERAL_ERROR);
/*-------------------------------------------------------------*\
Setup entity color.
\*-------------------------------------------------------------*/
error = ProDtlentitydataColorGet(data, &color);
TEST_CALL_REPORT("ProDtlentitydataColorGet()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
if (color.method == PRO_COLOR_METHOD_DEFAULT)
color.value.type = PRO_COLOR_LETTER;
error = ProDtlentitydataColorSet(data, &color);
TEST_CALL_REPORT("ProDtlentitydataColorSet()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
/*-------------------------------------------------------------*\
Create new entity
\*-------------------------------------------------------------*/
error = ProDtlentityCreate (drawing, symdef, data, out);
TEST_CALL_REPORT("ProDtlentityCreate()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
if(error!=PRO_TK_NO_ERROR)
return(error);
/*-------------------------------------------------------------*\
if entity success create then show it.
\*-------------------------------------------------------------*/
#if 0
error = ProDtlentityShow(out);
TEST_CALL_REPORT("ProDtlentityShow()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
#endif
error = ProDtlentitydataFree( data );
TEST_CALL_REPORT("ProDtlentitydataFree()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
}
else
{
/*-------------------------------------------------------------*\
Add new note to the symdef
\*-------------------------------------------------------------*/
error = ProDtlnoteDataGet((ProDtlnote*)entity, NULL, PRODISPMODE_SYMBOLIC, &ndata);
TEST_CALL_REPORT("ProDtlnoteDataGet()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
if(error!=PRO_TK_NO_ERROR)
return(error);
/*-------------------------------------------------------------*\
Note color setup
\*-------------------------------------------------------------*/
error = ProDtlnotedataTextStyleGet(ndata, &nDataTextStyle);
TEST_CALL_REPORT("ProDtlnotedataTextStyleGet()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
error = ProTextStyleColorGetWithDef(nDataTextStyle, &color);
TEST_CALL_REPORT("ProTextStyleColorGetWithDef()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
if (color.method == PRO_COLOR_METHOD_DEFAULT)
color.value.type = PRO_COLOR_DRAWING;
error = ProTextStyleColorSetWithDef(nDataTextStyle, &color);
TEST_CALL_REPORT("ProTextStyleColorSetWithDef ()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
/*-------------------------------------------------------------*\
Add new note to the symdef
\*-------------------------------------------------------------*/
error = ProDtlnoteCreate(drawing, symdef, ndata, (ProDtlnote*)out);
TEST_CALL_REPORT("ProDtlnoteCreate()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
ProDtlnotedataFree( ndata );
TEST_CALL_REPORT("ProDtlnotedataFree()", "ProTestSymDef_AddItem()",
error, error != PRO_TK_NO_ERROR);
}
return(error);
}
return(PRO_TK_GENERAL_ERROR);
}
/*=========================================================================*\
Function: TestAttachType()
Purpose: Make menu for select symdef attache type
Returns: Attach Type;
\*=========================================================================*/
int TestAttachType()
{
int menu_id, attach_type;
ProError error;
/*-------------------------------------------------------------*\
Make menu for select attache type
\*-------------------------------------------------------------*/
error = ProMenuFileRegister((char*)"AttachType",(char*)"tksymdefatac.mnu", &menu_id);
TEST_CALL_REPORT ("ProMenuFileRegister()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"AttachType",(char*)"Free",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&attach_type, PROSYMDEFATTACHTYPE_FREE);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"AttachType",(char*)"Left Leader",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&attach_type, PROSYMDEFATTACHTYPE_LEFT_LEADER);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"AttachType",(char*)"Right Leader",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&attach_type, PROSYMDEFATTACHTYPE_RIGHT_LEADER);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"AttachType",(char*)"Radial Leader",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&attach_type, PROSYMDEFATTACHTYPE_RADIAL_LEADER);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"AttachType",(char*)"On item",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&attach_type, PROSYMDEFATTACHTYPE_ON_ITEM);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"AttachType",(char*)"Normal",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&attach_type, PROSYMDEFATTACHTYPE_NORM_ITEM);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"AttachType",(char*)"Done",
(ProMenubuttonAction)ProMenuDelete, NULL, 1);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"AttachType",(char*)"AttachType",
(ProMenubuttonAction)ProMenuDelete, NULL, 1);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenuCreate(PROMENUTYPE_MAIN,(char*) "AttachType", &menu_id);
TEST_CALL_REPORT ("ProMenuCreate()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonDeactivate((char*)"AttachType",(char*)"Done");
TEST_CALL_REPORT ("ProMenubuttonDeactivate()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
error = ProMenuProcess((char*)"", &menu_id);
TEST_CALL_REPORT ("ProMenuProcess()",
"TestAttachType()", error, error != PRO_TK_NO_ERROR);
return(attach_type);
}
/*=========================================================================*\
Function: TestHeightType()
Purpose: Make menu for select symdef height type
Returns: Height Type;
\*=========================================================================*/
int TestHeightType()
{
ProError error;
int menu_id, height_type;
/*-------------------------------------------------------------*\
Create menu for select symdef height type
\*-------------------------------------------------------------*/
error = ProMenuFileRegister((char*)"HeightType",(char*)"tksymdefhgh.mnu", &menu_id);
TEST_CALL_REPORT ("ProMenuFileRegister()",
"TestHeightType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"HeightType",(char*)"Fixed",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&height_type, PRODTLSYMDEFHGHTTYPE_FIXED);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestHeightType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"HeightType",(char*)"Variable",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&height_type, PRODTLSYMDEFHGHTTYPE_VARIABLE);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestHeightType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"HeightType",(char*)"Text related",
(ProMenubuttonAction)ProUtilAssign, (ProAppData)&height_type, PRODTLSYMDEFHGHTTYPE_TEXTRELATED);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestHeightType()", error, error != PRO_TK_NO_ERROR);
error = ProMenubuttonActionSet((char*)"HeightType",(char*)"HeightType",
(ProMenubuttonAction)ProMenuDelete, (ProAppData)&height_type, PROSYMDEFATTACHTYPE_FREE);
TEST_CALL_REPORT ("ProMenubuttonActionSet()",
"TestHeightType()", error, error != PRO_TK_NO_ERROR);
error = ProMenuCreate(PROMENUTYPE_MAIN,(char*) "HeightType", &menu_id);
TEST_CALL_REPORT ("ProMenuCreate()",
"TestHeightType()", error, error != PRO_TK_NO_ERROR);
error = ProMenuProcess((char*)"", &menu_id);
TEST_CALL_REPORT ("ProMenuProcess()",
"TestHeightType()", error, error != PRO_TK_NO_ERROR);
return(height_type);
}
/*=========================================================================*\
Function: ProTestSymDefCreate()
Purpose: Create new symdef, copy some notes and entity from current
drawing, user select attache and symdef height type via menu.
Returns: PRO_TK_NO_ERROR if success;
\*=========================================================================*/
ProError ProTestSymDefCreate(ProDrawing drawing)
{
ProError error;
ProDtlsymdef symdef;
ProDtlsymdefdata entdata;
ProDtlentity entity, *newent = NULL, *entitys = NULL, *p_entity;
ProCharLine astr, astr2;
ProPath symname;
int n_sel, n, attach_type, dtype, height_type;
ProPoint3d pos;
ProMouseButton but;
double param;
ProSelection *p_sel;
ProDtlentitydata dtl_entdata;
int flg = 1;
ProCurvedata curve;
ProUvParam uv_param;
ProUtilMsgPrint("gen", "TEST %0s","Symbol name [QUIT] : ");
/*-------------------------------------------------------------*\
Prompt user for input symdef name
\*-------------------------------------------------------------*/
if(ProMessageStringRead(PRO_PATH_SIZE, symname)!=PRO_TK_NO_ERROR)
return(PRO_TK_GENERAL_ERROR);
error = ProDtlsymdefdataAlloc(drawing, &entdata);
TEST_CALL_REPORT("ProDtlsymdefdataAlloc()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
if(error!=PRO_TK_NO_ERROR)
return(PRO_TK_GENERAL_ERROR);
#if 0
/*-------------------------------------------------------------*\
Setup symdef name and create new symdef
\*-------------------------------------------------------------*/
error = ProDtlsymdefdataPathSet(entdata,symname);
TEST_CALL_REPORT("ProDtlsymdefdataPathSet()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
#endif
error = ProDtlsymdefCreate(drawing, entdata, &symdef);
TEST_CALL_REPORT("ProDtlsymdefCreate()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
if(error!=PRO_TK_NO_ERROR)
{
ProUtilMsgPrint("gen", "TEST %0s ", "Can't created symbol definition.");
if(entdata!=NULL)
{
error = ProDtlsymdefdataFree(entdata);
TEST_CALL_REPORT("ProDtlsymdefdataFree()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
}
return(PRO_TK_GENERAL_ERROR);
}
ProTKSprintf(astr," Created symbol definition: %s", ProWstringToString(astr2, symname));
ProUtilMsgPrint("gen", "TEST %0s ", astr);
ProUtilMsgPrint("gen", "TEST %0s","Select items to be in the symbol definition");
/*-------------------------------------------------------------*\
Copy some entity and note from drawing to the symdef.
\*-------------------------------------------------------------*/
ProSelect((char*)"any_note,draft_ent",-1, NULL, NULL, NULL, NULL, &p_sel, &n_sel);
entitys = (ProDtlentity*)calloc(n_sel, sizeof(ProDtlentity));
newent = (ProDtlentity*)calloc(n_sel, sizeof(ProDtlentity));
/*-------------------------------------------------------------*\
For all the selected items, remember the item type and id,
add it to the symbol definition, and remember the id it
has in the symbol.
\*-------------------------------------------------------------*/
for(n=0;n<n_sel;n++)
{
error = ProSelectionModelitemGet(p_sel[n], (ProModelitem *)&entity);
error = ProTestSymDef_AddItem(drawing, &symdef, &entity, &newent[n]);
memcpy(&entitys[n], &entity, sizeof(ProDtlentity));
}
/*-------------------------------------------------------------*\
Get attach type
\*-------------------------------------------------------------*/
attach_type = TestAttachType();
if (attach_type == -1)
attach_type = PROSYMDEFATTACHTYPE_FREE;
switch(attach_type)
{
case PROSYMDEFATTACHTYPE_FREE :
/*-------------------------------------------------------------*\
Just select the (free) origin of the symbol definition
\*-------------------------------------------------------------*/
ProUtilMsgPrint("gen", "TEST %0s","Select symbol origin");
error = ProMousePickGet(PRO_ANY_BUTTON, &but, pos);
TEST_CALL_REPORT ("ProMousePickGet()",
"ProTestSymDef_attach()", error, error != PRO_TK_NO_ERROR);
if(error!=PRO_TK_NO_ERROR)
return(PRO_TK_NO_ERROR);
/*-------------------------------------------------------------*\
Add free attach
\*-------------------------------------------------------------*/
ProTestSymDef_attach_add(drawing, &symdef, (ProDtlsymdefattachType)attach_type, -1, 0.0, pos);
break;
case PROSYMDEFATTACHTYPE_LEFT_LEADER :
case PROSYMDEFATTACHTYPE_RIGHT_LEADER :
case PROSYMDEFATTACHTYPE_ON_ITEM :
case PROSYMDEFATTACHTYPE_NORM_ITEM :
/*-------------------------------------------------------------*\
Select the entity in the sym defn. that represents the
attachment point.
\*-------------------------------------------------------------*/
ProUtilMsgPrint("gen", "TEST %0s","Select attachment point");
while(flg == 1)
{
p_entity = NULL;
if(ProSelect((char*)"draft_ent",1,NULL,NULL,NULL,NULL,&p_sel,&n_sel) < 1)
break;
error = ProSelectionModelitemGet(p_sel[n], &entity);
dtype = entity.type;
for(n=0; n<n_sel; n++)
{
if((entity.id == entitys[n].id)&&(dtype == entitys[n].type))
{
p_entity = &newent[n];
break;
}
}
if(p_entity == NULL)
ProUtilMsgPrint("gen", "TEST %0s","That item is not part of the symbol");
else
break;
}
if(p_entity == NULL)
{
/*-------------------------------------------------------------*\
Define all data for create new attach
\*-------------------------------------------------------------*/
ProSelectionPoint3dGet(p_sel[0], pos);
ProSelectionUvParamGet(p_sel[0], uv_param);
param = uv_param[0];
ProTestSymDef_attach_add(drawing, &symdef, (ProDtlsymdefattachType)attach_type,
p_entity->id, param, pos);
}
break;
case PROSYMDEFATTACHTYPE_RADIAL_LEADER :
/*-------------------------------------------------------------*\
The attachment type if RADIAL, so select a circle
\*-------------------------------------------------------------*/
ProUtilMsgPrint("gen", "TEST %0s","Select circle");
while(flg == 1)
{
p_entity = NULL;
if(ProSelect((char*)"draft_ent",1,NULL,NULL,NULL,NULL,&p_sel,&n_sel) < 1)
{
ProUtilMsgPrint("gen", "TEST %0s","Have't selected entity");
break;
}
error = ProSelectionModelitemGet(p_sel[n], &entity);
dtype = entity.type;
for(n=0;n<n_sel;n++)
{
if((entity.id == entitys[n].id)&&(dtype == entitys[n].type))
{
p_entity = &newent[n];
break;
}
}
if(p_entity == NULL)
ProUtilMsgPrint("gen", "TEST %0s","That item is not part of the symbol");
else
{
ProDtlentityDataGet(&entity, NULL, &dtl_entdata);
ProDtlentitydataCurveGet(dtl_entdata, &curve);
/*-------------------------------------------------------------*\
Check - selected entity must be circle
\*-------------------------------------------------------------*/
if(curve.arc.type == PRO_ENT_ARC &&
curve.arc.start_angle <= EPSM10 &&
curve.arc.end_angle >= (TWOPI - EPSM10))
break;
else
ProUtilMsgPrint("gen", "TEST %0s","That is not a circle");
}
}
if(p_entity!=NULL)
{
/*-------------------------------------------------------------*\
Define all data for create new attach
\*-------------------------------------------------------------*/
ProSelectionPoint3dGet(p_sel[0], pos);
ProSelectionUvParamGet(p_sel[0], uv_param);
param = uv_param[0];
ProTestSymDef_attach_add(drawing, &symdef, (ProDtlsymdefattachType)attach_type,
p_entity->id, param, pos);
}
break;
} /* End of case statement */
error = ProMenubuttonActivate((char*)"AttachType",(char*)"Done");
/*-------------------------------------------------------------*\
Setup ELBOW property for created symdef
\*-------------------------------------------------------------*/
if((attach_type == PROSYMDEFATTACHTYPE_RIGHT_LEADER)||(attach_type == PROSYMDEFATTACHTYPE_LEFT_LEADER))
{
ProUtilMsgPrint("gen", "TEST %0s", "Enable elbow (y/n)");
error = ProDtlsymdefdataElbowSet(entdata, (ProBoolean)ProUtilYesnoGet((char*)"Y"));
TEST_CALL_REPORT("ProDtlsymdefdataElbowSet()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
}
/*-------------------------------------------------------------*\
Select the type of height : FIXED, VARIABLE, or TEXT-RELATED
\*-------------------------------------------------------------*/
height_type = TestHeightType();
if (height_type == -1) height_type = PRODTLSYMDEFHGHTTYPE_FIXED;
error = ProDtlsymdefDataGet(&symdef,&entdata);
TEST_CALL_REPORT("ProDtlsymdefDataGet()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
/*-------------------------------------------------------------*\
If the height type is TEXT_RELATED, select the text
\*-------------------------------------------------------------*/
if(error==PRO_TK_NO_ERROR)
{
if(height_type == PRODTLSYMDEFHGHTTYPE_TEXTRELATED)
{
ProUtilMsgPrint("gen", "TEST %0s","Select textl");
while(flg == 1)
{
p_entity = NULL;
if(ProSelect((char*)"any_note",1,NULL,NULL,NULL,NULL,&p_sel,&n_sel) < 1)
break;
/*-------------------------------------------------------------*\
Check note, selected note must included in to the new symdef
\*-------------------------------------------------------------*/
error = ProSelectionModelitemGet(p_sel[n], &entity);
dtype = entity.type;
for(n=0;n<n_sel;n++)
{
if((entity.id == entitys[n].id)&&(PRO_NOTE == entitys[n].type))
{
p_entity = &newent[n];
break;
}
}
/* for n*/
if(p_entity == NULL)
ProUtilMsgPrint("gen", "TEST %0s","That note is not part of the symbol");
else
break;
}/* while (1) */
if(p_entity!=NULL)
{
/*-------------------------------------------------------------*\
Setup text reference to the first text string in selected note.
\*-------------------------------------------------------------*/
error = ProDtlsymdefdataTextrefSet(entdata, p_entity->id,0,0);
TEST_CALL_REPORT("ProDtlsymdefdataTextrefSet()",
"ProTestSymDefCreate()", error, error != PRO_TK_NO_ERROR);
} else
{
ProUtilMsgPrint("gen", "TEST %0s","Set defaul height type: Fixed");
height_type = PRODTLSYMDEFHGHTTYPE_FIXED;
}
}/* if PRODTLSYMDEFHGHTTYPE_TEXTRELATED */
error = ProDtlsymdefdataHeighttypeSet(entdata, (ProDtlsymdefdataHeighttype)height_type);
TEST_CALL_REPORT("ProDtlsymdefdataHeighttypeSet()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
/*-------------------------------------------------------------*\
Post all chenges to the new symdef
\*-------------------------------------------------------------*/
error = ProDtlsymdefModify(&symdef, entdata);
TEST_CALL_REPORT("ProDtlsymdefModify()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
}/* if PRO_TK_NO_ERROR */
/*-------------------------------------------------------------*\
Free all temporary variables
\*-------------------------------------------------------------*/
if(entdata!=NULL)
{
error = ProDtlsymdefdataFree(entdata);
TEST_CALL_REPORT("ProDtlsymdefdataFree()", "ProTestSymDefCreate()",
error, error != PRO_TK_NO_ERROR);
}
if(entitys!=NULL)
{
free(entitys);
entitys = NULL;
}
if(newent!=NULL)
{
free(newent);
entitys = NULL;
}
return(PRO_TK_NO_ERROR);
}
/*=========================================================================*\
Function: ProTestSymDefDelete()
Purpose: Delete selected symdef from current drawing.
Returns: PRO_TK_NO_ERROR if success;
\*=========================================================================*/
ProError ProTestSymDefDelete(ProDrawing drawing)
{
ProError error;
ProDtlsymdef sym_def;
ProUtilMsgPrint("gen", "TEST %0s", "Not implemented" );
#if 0
ProUtilMsgPrint("gen", "TEST %0s", "Select Symdef for delete.");
/*-------------------------------------------------------------*\
Select symdef for delete.
\*-------------------------------------------------------------*/
error = ProTestSymDefGet (drawing, &sym_def);
if(error!=PRO_TK_NO_ERROR)
return(PRO_TK_GENERAL_ERROR);
ProUtilMsgPrint("gen", "TEST %0s", "Are you sure ? (y/n)");
if (!ProUtilYesnoGet("N"))
return(PRO_TK_NO_ERROR);
/*-------------------------------------------------------------*\
Delete selected symdef.
\*-------------------------------------------------------------*/
error = ProDtlsymdefDelete(&sym_def);
TEST_CALL_REPORT("ProDtlsymdefDelete()",
"ProTestSymDefDelete()", error, error != PRO_TK_NO_ERROR);
if(error==PRO_TK_NO_ERROR)
ProUtilMsgPrint("gen", "TEST %0s", "Symdef success deleted");
else
ProUtilMsgPrint("gen", "TEST %0s", "Error ! ");
#endif
return(PRO_TK_NO_ERROR);
}