/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ #include <ProToolkit.h> #include <ProDtlsymdef.h> int UsrSymdefLineAdd(); int UsrSymdefNoteAdd(); /*====================================================================*\ FUNCTION : UsrBoxSymdefCreate() PURPOSE : To create a symbol definition with the specified name, containing a box and a note with the specified text \*====================================================================*/ int UsrBoxSymdefCreate( ProDrawing drawing, ProCharName name, ProCharLine text) { ProDtlsymdefdata sdata; ProPath path; ProVector origin, e1, e2; ProDtlsymdefattach attach; ProDtlsymdef symdef; double defheight; ProName w_size; ProMatrix matrix; int cur_sheet; ProError err; /*--------------------------------------------------------------------*\ Allocate symbol definition description data \*--------------------------------------------------------------------*/ ProDtlsymdefdataAlloc(drawing, &sdata); /*--------------------------------------------------------------------*\ Set the name of the symbol \*--------------------------------------------------------------------*/ ProStringToWstring(path, name); ProDtlsymdefdataPathSet(sdata, path); /*--------------------------------------------------------------------*\ Set the height type \*--------------------------------------------------------------------*/ ProDtlsymdefdataHeighttypeSet(sdata, PRODTLSYMDEFHGHTTYPE_FIXED); /*--------------------------------------------------------------------*\ Set a FREE attachment at the origin of the symbol \*--------------------------------------------------------------------*/ memset(origin, '\0', sizeof(ProVector)); ProDtlsymdefattachAlloc(PROSYMDEFATTACHTYPE_FREE, 0, 0.0, origin, &attach); ProDtlsymdefdataAttachAdd(sdata, attach); ProDtlsymdefattachFree(attach); /*--------------------------------------------------------------------*\ Create the empty symbol, and free the description \*--------------------------------------------------------------------*/ if(ProDtlsymdefCreate(drawing, sdata, &symdef) != PRO_TK_NO_ERROR) return(0); ProDtlsymdefdataFree(sdata); /*--------------------------------------------------------------------*\ Calculate the default text height for the drawing \*--------------------------------------------------------------------*/ err = ProSolidDefaulttextheightGet ((ProSolid)drawing, &defheight); err = ProDrawingCurrentSheetGet(drawing, &cur_sheet); err = ProDrawingSheetTrfGet(drawing, cur_sheet, w_size, matrix); defheight /= matrix[0][0]; /*--------------------------------------------------------------------*\ Create four lines to form a box, twice the default text height, around the origin \*--------------------------------------------------------------------*/ e1[0] = -defheight; e1[1] = -defheight; e1[2] = 0.0; e2[0] = defheight; e2[1] = -defheight; e2[2] = 0.0; UsrSymdefLineAdd(&symdef, e1, e2, PRO_COLOR_ERROR); memcpy(e1, e2, sizeof(ProVector)); e2[1]=defheight; UsrSymdefLineAdd(&symdef, e1, e2, PRO_COLOR_ERROR); memcpy(e1, e2, sizeof(ProVector)); e2[0]=-defheight; UsrSymdefLineAdd(&symdef, e1, e2, PRO_COLOR_ERROR); memcpy(e1, e2, sizeof(ProVector)); e2[1]=-defheight; UsrSymdefLineAdd(&symdef, e1, e2, PRO_COLOR_ERROR); /*--------------------------------------------------------------------*\ Add a note with the specified text at the origin \*--------------------------------------------------------------------*/ origin[1] -= defheight / 2.0; UsrSymdefNoteAdd(&symdef, text, origin); return(1); } /*====================================================================*\ FUNCTION : UsrSymdefNoteAdd() PURPOSE : To add a note with the specified text and location to a symbol definition. \*====================================================================*/ int UsrSymdefNoteAdd ( ProDtlsymdef *symdef, ProCharLine ntext, ProVector pos) { ProDtlnotetext text; ProName font; ProDtlnoteline line; ProModelitem modelitem; ProName wname; ProCharName name; ProLine wstr; ProCharLine str; ProDtlnotedata ndata; ProView view; ProDtlattach attach, leader; ProDtlnote note; ProTextStyle style1,style2; ProColor color; /*--------------------------------------------------------------------*\ Allocate a text item, set value and style. \*--------------------------------------------------------------------*/ ProDtlnotetextAlloc(&text); style1 = UserCreateTextStyle(L"cgomg", -1.0, 0.8, 0.0, 0.0); ProStringToWstring(wstr, ntext); ProDtlnotetextStringSet(text, wstr); ProDtlnotetextStyleSet(text, style1); /*--------------------------------------------------------------------*\ Allocate a new text line, and add the text item to it \*--------------------------------------------------------------------*/ ProDtlnotelineAlloc(&line); ProDtlnotelineTextAdd(line, text); /*--------------------------------------------------------------------*\ Allocate a note description, and add the line to it. Apply style to whole note. \*--------------------------------------------------------------------*/ ProDtlnotedataAlloc(symdef->owner, &ndata); ProDtlnotedataLineAdd(ndata, line); ProTextStyleAlloc(&style2); color.method = PRO_COLOR_METHOD_TYPE; color.value.type = PRO_COLOR_HIGHLITE; ProTextStyleColorSetWithDef(style2, &color); ProTextStyleJustificationSet(style2, PRO_TEXT_HRZJUST_CENTER); ProTextStyleVertJustificationSet(style2, PRO_VERTJUST_MIDDLE); ProDtlnotedataTextStyleSet(ndata, style2); /*--------------------------------------------------------------------*\ Set the attachment of the note itself \*--------------------------------------------------------------------*/ ProDtlattachAlloc(PRO_DTLATTACHTYPE_FREE, NULL, pos, NULL, &attach); ProDtlnotedataAttachmentSet(ndata, attach); /*--------------------------------------------------------------------*\ Create the note \*--------------------------------------------------------------------*/ ProDtlnoteCreate(symdef->owner, symdef, ndata, ¬e); /*--------------------------------------------------------------------*\ Free the memory for the note description \*--------------------------------------------------------------------*/ ProDtlnotedataFree(ndata); ProTextStyleFree(&style1); ProTextStyleFree(&style2); return(1); } /*====================================================================*\ FUNCTION : UsrSymdefLineAdd() PURPOSE : Utility to add a line entity to a symbol definition \*====================================================================*/ int UsrSymdefLineAdd( ProDtlsymdef *symdef, ProVector start, ProVector end, ProColortype color) { ProDtlentity entity; ProDtlentitydata edata; ProCurvedata *curve; ProColor entity_color; /*--------------------------------------------------------------------*\ Allocate data for the draft entity \*--------------------------------------------------------------------*/ ProDtlentitydataAlloc(symdef->owner, &edata); /*--------------------------------------------------------------------*\ Allocate and initialize a curve description \*--------------------------------------------------------------------*/ ProCurvedataAlloc(&curve); ProLinedataInit(start, end, curve); /*--------------------------------------------------------------------*\ Use the curve description to set the entity data curve \*--------------------------------------------------------------------*/ ProDtlentitydataCurveSet(edata, curve); /*--------------------------------------------------------------------*\ Set the color to the specified Pro/ENGINEER predefined color \*--------------------------------------------------------------------*/ entity_color.method = PRO_COLOR_METHOD_TYPE; entity_color.value.type = color; ProDtlentitydataColorSet(edata, &entity_color); /*--------------------------------------------------------------------*\ Create the entity \*--------------------------------------------------------------------*/ ProDtlentityCreate(symdef->owner, symdef, edata, &entity); /*--------------------------------------------------------------------*\ Release the entity data memory \*--------------------------------------------------------------------*/ ProDtlentitydataFree(edata); return(1); } int UsrBoxSymdefCreateWrapper () { ProError err; ProName input_name; ProCharName name; ProLine input_line; ProCharLine line; ProDrawing drawing; ProMdlType mdl_type; ProFileName msgfil; ProStringToWstring (msgfil, "msg_ugdrawing.txt"); err = ProMdlCurrentGet ((ProMdl*)&drawing); if (err != PRO_TK_NO_ERROR) return (err); err = ProMdlTypeGet ((ProMdl)drawing, &mdl_type); if (mdl_type != PRO_MDL_DRAWING) return (PRO_TK_INVALID_TYPE); ProMessageDisplay (msgfil, "USER Enter symbol definition name"); err = ProMessageStringRead (PRO_NAME_SIZE, input_name); if (err != PRO_TK_NO_ERROR) return (err); ProWstringToString (name, input_name); ProMessageDisplay (msgfil, "USER Enter symbol definition text line"); err = ProMessageStringRead (PRO_LINE_SIZE, input_line); if (err != PRO_TK_NO_ERROR) return (err); ProWstringToString (line, input_line); return (UsrBoxSymdefCreate (drawing, name, line)); }