/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*-------------------------- Pro/Toolkit includes ---------------------------*/
#include <ProToolkit.h>
#include <ProMdl.h>
#include <ProSolid.h>
#include <ProCsys.h>
#include <ProDtlnote.h>
#include <ProDtlattach.h>
/*-------------------------- Application includes ---------------------------*/
#include <TestError.h>
/*---------------------------Function Prototypes-----------------------------*/
ProError UserPickPosition ();
void UserFreeNoteSetup();
/*****************************************************************************\
Function : UserNoteCreate()
Purpose : Create a drawing note
\*****************************************************************************/
ProError UserNoteCreate()
{
ProError status;
ProMdl p_draw;
ProDtlnote note;
ProCharLine text;
wchar_t **w_text = NULL;
ProPoint3d pos;
ProSelection *leaders;
int n_leaders;
ProFileName WMSGFIL = { 'm','s','g','_','u','g','d','w','g','.','t','x','t','\0' };
int nTxt = 0;
ProView noteView=NULL;
int ii = 0;
/*------------------------------------------------------------*\
Get the current model
\*------------------------------------------------------------*/
status = ProMdlCurrentGet(&p_draw);
ERROR_CHECK("UserNoteCreate", "ProMdlCurrentGet", status);
if (status != PRO_TK_NO_ERROR) return(status);
/*----------------------------------------------------------*\
Ask the user for the note position.
\*----------------------------------------------------------*/
status = UserPickPosition(WMSGFIL, "Pick the position of the new note.", pos);
ERROR_CHECK("UserNoteCreate", "UserPickPosition", status);
if (status != PRO_TK_NO_ERROR) return(status);
/*----------------------------------------------------------*\
Ask the user to enter multiple texts.
Each note line will contain two texts with alternate text styles.
\*----------------------------------------------------------*/
while (1)
{
ProLine buffer;
wchar_t* ptr = 0;
status = ProMessageDisplay(WMSGFIL, "USER %0s",
"Enter note text [QUIT] : ");
ERROR_CHECK("UserNoteCreate", "ProMessageDisplay", status);
status = ProMessageStringRead(PRO_LINE_SIZE, buffer);
ERROR_CHECK("UserNoteCreate", "ProMessageStringRead", status);
if (status != PRO_TK_NO_ERROR)
break;
if (w_text == NULL)
ProArrayAlloc(0, sizeof(wchar_t*), 1, (ProArray*)&w_text);
ProArrayObjectAdd((ProArray*)&w_text, PRO_VALUE_UNUSED, 1, &ptr);
ProArrayAlloc(PRO_LINE_SIZE, sizeof(wchar_t), 1, (ProArray*)&w_text[nTxt]);
ProWstringCopy(buffer, w_text[nTxt], PRO_VALUE_UNUSED);
nTxt++;
}
if (w_text == NULL)
return PRO_TK_BAD_INPUTS;
/*----------------------------------------------------------*\
Ask the user to pick the leader points (edges of models in
drawing views).
\*----------------------------------------------------------*/
status = ProMessageDisplay(WMSGFIL, "USER %0s", "Select leader points");
ERROR_CHECK("UserNoteCreate","ProMessageDisplay",status);
ProSelect ("edge", -1, NULL, NULL, NULL, NULL, &leaders, &n_leaders);
if (n_leaders > 0)
ProSelectionViewGet(leaders[0], ¬eView);
/*----------------------------------------------------------*\
Add the note to the drawing.
\*----------------------------------------------------------*/
UserFreeNoteSetup ( p_draw, pos, w_text, n_leaders, leaders,noteView, ¬e );
status = ProAnnotationShow(¬e,NULL, noteView);
ERROR_CHECK("UserNoteCreate","ProAnnotationShow",status);
if (status != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR);
status = ProDrawingtreeRefresh(p_draw, PRO_VALUE_UNUSED);
for (ii = 0; ii < nTxt; ii++)
{
ProArrayFree((ProArray*)&w_text[ii]);
}
ProArrayFree((ProArray*)&w_text);
return(PRO_TK_NO_ERROR);
}
/*===============================================================*\
Function that gives the default text height for the
specified drawing
\*===============================================================*/
ProError UserTextHeightScale (ProMdl p_draw, double * height)
{
int cur_sheet;
ProName w_size;
ProMatrix matrix;
ProError err;
/*----------------------------------------------------------*\
Scale text height
\*----------------------------------------------------------*/
err = ProDrawingCurrentSheetGet(p_draw, &cur_sheet);
err = ProDrawingSheetTrfGet(p_draw, cur_sheet, w_size, matrix);
ERROR_CHECK("UserTextDefaultHeight","ProDrawingSheetTrfGet", err);
if (PRO_TK_NO_ERROR != err) return (PRO_TK_GENERAL_ERROR);
*height /= matrix[0][0]; /* for unit conversion */
return (PRO_TK_NO_ERROR);
}
ProTextStyle UserCreateTextStyle(wchar_t* font, double height, double width, double slant, double thickness)
{
ProError err;
ProTextStyle style;
int fontid = -1;
err = ProTextStyleAlloc(&style);
if (font != NULL)
err = ProTextStyleFontSet(style, font);
err = ProTextStyleHeightSet(style, height);
err = ProTextStyleWidthSet(style, width);
err = ProTextStyleSlantAngleSet(style, slant);
err = ProTextStyleThicknessSet(style, thickness);
return style;
}
/*===============================================================*\
Function that sets up the C structure for a free note with
parametric leaders
\*===============================================================*/
void UserFreeNoteSetup(
ProMdl p_draw,
ProVector pos,
wchar_t** texts,
int n_leaders,
ProSelection *attach_geom,
ProView noteView,
ProDtlnote *p_note)
{
ProDtlnotedata notedata;
ProDtlnoteline dtl_line;
ProDtlnotetext dtl_text;
ProLine wtext;
double height;
ProColor color;
ProDtlattach attachment, *leaders;
ProError err = PRO_TK_NO_ERROR;
int l;
int n_txts = 0,ii=0,jj=0;
ProTextStyle style1, style2,style3;
ProDtlnoteline* lines=0;
int nLines = 0;
/*----------------------------------------------------------*\
Claim and initialize the note record.
\*----------------------------------------------------------*/
ProDtlnotedataAlloc(p_draw, ¬edata);
ProArraySizeGet((ProArray)texts, &n_txts);
if (n_txts < 1)
return;
/*----------------------------------------------------------*\
Create two text style object for alternate texts in line.
\*----------------------------------------------------------*/
height = -1.0;
style1 = UserCreateTextStyle(L"cgomg", height, 0.8, 0, 0.8);
height = 0.19;
err = UserTextHeightScale(p_draw, &height);
style2 = UserCreateTextStyle(NULL, height, 0.2, 15, 0.2);
for (ii = 0, jj = 0; ii < n_txts; ii++, jj++)
{
if (jj % 2 == 0)
ProDtlnotelineAlloc(&dtl_line);
/*----------------------------------------------------------*\
Add a two text record to the text line.
\*----------------------------------------------------------*/
ProDtlnotetextAlloc(&dtl_text);
/*----------------------------------------------------------*\
Set up the alternate text with different text style.
\*----------------------------------------------------------*/
if (jj % 2 == 0)
err = ProDtlnotetextStyleSet(dtl_text, style1);
else
err = ProDtlnotetextStyleSet(dtl_text, style2);
err = ProDtlnotetextStringSet (dtl_text, texts[ii]);
err = ProDtlnotelineTextAdd(dtl_line, dtl_text);
if (jj % 2 != 0 || n_txts == 1)
err = ProDtlnotedataLineAdd(notedata, dtl_line);
}
/*----------------------------------------------------------*\
Set the entire note to be the default color for text.
\*----------------------------------------------------------*/
err = ProTextStyleAlloc(&style3);
color.method = PRO_COLOR_METHOD_TYPE;
color.value.type = PRO_COLOR_LETTER;
err = ProTextStyleColorSetWithDef(style3, &color);
err = ProDtlnotedataTextStyleSet(notedata, style3);
/*----------------------------------------------------------*\
Set the attachment to be FREE at the specified screen
coordinates. Associate it with leader selection view.
\*----------------------------------------------------------*/
err = ProDtlattachAlloc(PRO_DTLATTACHTYPE_FREE, noteView, pos, NULL, &attachment);
err = ProDtlnotedataAttachmentSet(notedata, attachment);
/*----------------------------------------------------------*\
Copy the selected leader points as PARAMETRIC leaders.
\*----------------------------------------------------------*/
err = ProArrayAlloc (n_leaders, sizeof (ProDtlattach), 1, (ProArray*)&leaders);
for (l = 0; l < n_leaders; l++)
{
err = ProDtlattachAlloc(PRO_DTLATTACHTYPE_PARAMETRIC, NULL, NULL, attach_geom[l], &leaders[l]);
}
err = ProDtlnotedataLeadersSet(notedata, leaders);
for (l = 0; l < n_leaders; l++)
err = ProDtlattachFree (leaders[l]);
err = ProArrayFree ((ProArray*)&leaders);
err = ProDtlnoteCreate(p_draw, NULL, notedata, p_note);
err = ProDtlnotedataFree(notedata);
ProTextStyleFree(&style1);
ProTextStyleFree(&style2);
ProTextStyleFree(&style3);
}