/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ #include <ProToolkit.h> #include <ProDrawing.h> #include <ProDtlitem.h> #include <ProDtlsymdef.h> #include <ProDtlsyminst.h> #include <ProDtlnote.h> #include <ProWindows.h> #include <ProMessage.h> #include <ProMdl.h> #include <ProModelitem.h> #include "TestError.h" #include "UtilMessage.h" #include "UtilString.h" #include "UtilNames.h" #include <ProTKRunTime.h> #include <PTApplsUnicodeUtils.h> #define BOOL_TO_STR(a) (a)?("TRUE"):("FALSE") /*=========================================================================*\ Function: ProTestSymDefInfoAttach() Purpose: Print info about all attache from symdata Returns: PRO_TK_NO_ERROR if success; \*=========================================================================*/ ProError ProTestSymDefInfoAttach(FILE *fp, ProDtlsymdefdata symdata) { ProError error; int n_attache; ProDtlsymdefattach *attaches; double entity_parameter; ProVector location; int entity_id, n; ProCharLine astr; ProDtlsymdefattachType type; /*-------------------------------------------------------------*\ Check data \*-------------------------------------------------------------*/ if((fp==NULL)||(symdata==NULL)) return(PRO_TK_BAD_INPUTS); error = ProDtlsymdefdataAttachGet(symdata, &attaches); TEST_CALL_REPORT ("ProDtlsymdefdataAttachGet()", "ProTestSymDefInfoAttach()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*-------------------------------------------------------------*\ Calculate attaches count \*-------------------------------------------------------------*/ error = ProArraySizeGet((ProArray)attaches, &n_attache); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestSymDefInfoAttach()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) n_attache = 0; ProTKFprintf(fp,"\t\tAttaches count:%d\n", n_attache); if(n_attache>0) for(n=0; n<n_attache; n++) { /*-------------------------------------------------------------*\ Get attaches information from current symdef \*-------------------------------------------------------------*/ error = ProDtlsymdefattachGet(attaches[n], &type, &entity_id, &entity_parameter, location); TEST_CALL_REPORT ("ProDtlsymdefattachGet()", "ProTestSymDefInfoAttach()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) continue; /*-------------------------------------------------------------*\ Print attaches type \*-------------------------------------------------------------*/ switch(type) { case PROSYMDEFATTACHTYPE_FREE : ProTKSprintf(astr,"%s","Free"); break; case PROSYMDEFATTACHTYPE_LEFT_LEADER : ProTKSprintf(astr,"%s","Left Leader"); break; case PROSYMDEFATTACHTYPE_RIGHT_LEADER : ProTKSprintf(astr,"%s","Right Leader"); break; case PROSYMDEFATTACHTYPE_RADIAL_LEADER : ProTKSprintf(astr,"%s","Radial Leader"); break; case PROSYMDEFATTACHTYPE_ON_ITEM : ProTKSprintf(astr,"%s","On item"); break; case PROSYMDEFATTACHTYPE_NORM_ITEM : ProTKSprintf(astr,"%s","Normal item"); break; default: ProTKSprintf(astr,"%s","None"); }/* switch */ /*-------------------------------------------------------------*\ Print attache entity information \*-------------------------------------------------------------*/ if(type != PROSYMDEFATTACHTYPE_FREE) { ProTKFprintf(fp,"\t\t\t[%d] Attache type: %s\n",n, astr); ProTKFprintf(fp,"\t\t\tEntity id: %d \n", entity_id); ProTKFprintf(fp,"\t\t\tParameter: %3.3f\n", entity_parameter); ProTKFprintf(fp,"\t\t\tLocation : (%3.3f, %3.3f, %3.3f)\n", location[0], location[1], location[2]); } }/* for n */ /*-------------------------------------------------------------*\ Free attaches array \*-------------------------------------------------------------*/ if(attaches!=NULL) { error = ProArrayFree((ProArray*)&attaches); TEST_CALL_REPORT ("ProArrayFree()", "ProTestSymDefInfoAttach()", error, error != PRO_TK_NO_ERROR); } return(PRO_TK_NO_ERROR); } /*=========================================================================*\ Function: ProTestSymDefInfoNote() Purpose: Print info about all notes from symdata Returns: PRO_TK_NO_ERROR if success; \*=========================================================================*/ ProError ProTestSymDefInfoNote(FILE *fp, ProDrawing drawing, int sheet, ProDtlsymdef *symbol, ProDtlsymdefdata symdata) { ProError error; ProCharLine astr; ProLine wline; ProDtlnote *notes; int n_notes, note_id, n_line, n_text, k, m, l; ProDtlnotedata notedata; ProDtlnoteline *note_lines; ProDtlnotetext *note_text; /*-------------------------------------------------------------*\ Check input \*-------------------------------------------------------------*/ if((drawing==NULL)||(fp==NULL)||(symbol==NULL)||(symdata==NULL)) return(PRO_TK_BAD_INPUTS); /*-------------------------------------------------------------*\ Collect all notes for current symdef \*-------------------------------------------------------------*/ error = ProDrawingDtlnotesCollect(drawing, symbol, sheet, ¬es); TEST_CALL_REPORT ("ProDrawingDtlnotesCollect()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR && error != PRO_TK_E_NOT_FOUND); if(error!=PRO_TK_NO_ERROR) return(error); /*-------------------------------------------------------------*\ Calculate notes count \*-------------------------------------------------------------*/ error = ProArraySizeGet((ProArray)notes, &n_notes); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) n_notes = 0; /*-------------------------------------------------------------*\ Print info for all notes in current symdef \*-------------------------------------------------------------*/ if(n_notes>0) { ProTKFprintf(fp,"\t\t\t\tNote count: %d\n",n_notes); for(k=0; k<n_notes; k++) { error = ProDtlnoteDataGet(¬es[k], symbol, PRODISPMODE_SYMBOLIC, ¬edata); TEST_CALL_REPORT ("ProDtlnoteDataGet()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR); error = ProDtlnotedataIdGet(notedata, ¬e_id); TEST_CALL_REPORT ("ProDtlnotedataIdGet()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR); /*-------------------------------------------------------------*\ Collect all lines in the current note \*-------------------------------------------------------------*/ error = ProDtlnotedataLinesCollect(notedata, ¬e_lines); TEST_CALL_REPORT ("ProDtlnotedataLinesCollect()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR && error != PRO_TK_E_NOT_FOUND); error = ProArraySizeGet((ProArray)note_lines, &n_line); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR); if(error==PRO_TK_NO_ERROR) { ProTKFprintf(fp,"\t\t\t\t\t[%d] lines count: %d\n",k, n_line); for(l=0;l<n_line; l++) { /*-------------------------------------------------------------*\ Collect all texts in the current line \*-------------------------------------------------------------*/ error = ProDtlnotelineTextsCollect(note_lines[l], ¬e_text); TEST_CALL_REPORT ("ProDtlnotelineTextsCollect()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR && error != PRO_TK_E_NOT_FOUND); error = ProArraySizeGet((ProArray)note_lines, &n_text); if(error==PRO_TK_NO_ERROR) { for(m=0; m<n_text; m++) { /*-------------------------------------------------------------*\ Collect all strings in the current text \*-------------------------------------------------------------*/ if (note_text[m] != NULL) { error = ProDtlnotetextStringGet(note_text[m], wline); TEST_CALL_REPORT ("ProDtlnotetextStringGet()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR); if(error==PRO_TK_NO_ERROR) ProTKFprintf(fp,"\t\t\t\t\t\t%s\n",ProWstringToString(astr, wline)); } } /* for m*/ /*-------------------------------------------------------------*\ Free note_text array \*-------------------------------------------------------------*/ for (m=0; m<n_text; m++) { if (note_text[m] != NULL) { error = ProDtlnotetextFree (note_text[m]); TEST_CALL_REPORT("ProDtlnotetextFree()", "ProTestDtlNoteInfo()", error, error != PRO_TK_NO_ERROR); } } if(note_text!=NULL) { error = ProArrayFree((ProArray*)¬e_text); TEST_CALL_REPORT ("ProArrayFree()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR); } } }/* for l*/ /*-------------------------------------------------------------*\ Free note_lines array \*-------------------------------------------------------------*/ for (l=0;l< n_line; l++) { error = ProDtlnotelineFree (note_lines[l]); TEST_CALL_REPORT("ProDtlnotelineFree()", "ProTestDtlNoteInfo()", error, error != PRO_TK_NO_ERROR); } if(note_lines!=NULL) { error = ProArrayFree((ProArray*)¬e_lines); TEST_CALL_REPORT ("ProArrayFree()", "ProTestSymDefInfoNote()", error, error != PRO_TK_NO_ERROR); } } }/* for k*/ }/* if (n_notes>0) */ /*-------------------------------------------------------------*\ Free notes array \*-------------------------------------------------------------*/ if(notes!=NULL) { error = ProArrayFree((ProArray*)¬es); TEST_CALL_REPORT ("ProArrayFree()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); notes = NULL; } return(PRO_TK_NO_ERROR); } ProError ProTestSymDefInfo() { ProError error; FILE *fp=NULL; ProPath wstr; ProCharLine astr; char file_name[] = "DrwSymDef.info"; ProDrawing drawing; int i, j; int n_symdef, n_sheets; int entity, line, text; int id; ProDtlsymdef *symdefs; ProDtlsymdefdata symdata; ProBoolean elbow, angle_fixed; double height; ProDtlsymdefdataHeighttype type; int current_sheet; /*-------------------------------------------------------------*\ Get handle to the current drawing \*-------------------------------------------------------------*/ error = ProMdlCurrentGet((ProMdl*)&drawing); TEST_CALL_REPORT ("ProMdlCurrentGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*-------------------------------------------------------------*\ Open file for print symdef information \*-------------------------------------------------------------*/ if ((fp = PTApplsUnicodeFopen(file_name, "w")) == NULL) { ProTKPrintf("Cannot open output file\n"); return (PRO_TK_GENERAL_ERROR); } /*-------------------------------------------------------------*\ Get sheets count in the current drawing \*-------------------------------------------------------------*/ error = ProDrawingSheetsCount(drawing, &n_sheets); TEST_CALL_REPORT ("ProDrawingSheetsCount()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); /*-------------------------------------------------------------*\ Store current sheet id \*-------------------------------------------------------------*/ error = ProDrawingCurrentSheetGet( drawing, ¤t_sheet ); TEST_CALL_REPORT ("ProDrawingCurrentSheetGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); ProTKFprintf(fp,"Sheets count: %d\n", n_sheets); for(i=0; i<n_sheets; i++) { error = ProDrawingCurrentSheetSet( drawing, i ); TEST_CALL_REPORT ("ProDrawingCurrentSheetSet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); /*-------------------------------------------------------------*\ Collect all symdefs in the current sheet \*-------------------------------------------------------------*/ error = ProDrawingDtlsymdefsCollect(drawing, &symdefs); TEST_CALL_REPORT ("ProDrawingDtlsymdefsCollect()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) continue; error = ProArraySizeGet((ProArray)symdefs, &n_symdef); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); if((error!=PRO_TK_NO_ERROR)||(n_symdef<=0)) { error = ProArrayFree((ProArray*)&symdefs); TEST_CALL_REPORT ("ProArrayFree()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); continue; } /*-------------------------------------------------------------*\ Print symdef information for all sheets in current drawing \*-------------------------------------------------------------*/ ProTKFprintf(fp,"\tSheet %d, symdef count: %d\n", i, n_symdef); for(j=0; j<n_symdef; j++) { /*-------------------------------------------------------------*\ Get symdef data for current symdef \*-------------------------------------------------------------*/ error = ProDtlsymdefDataGet(&symdefs[j], &symdata); TEST_CALL_REPORT ("ProDtlsymdefDataGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) continue; error = ProDtlsymdefdataIdGet(symdata, &id); TEST_CALL_REPORT ("ProDtlsymdefdataIdGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); ProTKFprintf(fp,"\t\t[%d] Symdef id: %d\n", j, id); #if 0 /*-------------------------------------------------------------*\ Get symdef name \*-------------------------------------------------------------*/ error = ProDtlsymdefdataPathGet(symdata, wstr); TEST_CALL_REPORT ("ProDtlsymdefdataPathGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); #endif ProTKFprintf(fp,"\t\t\tSymdef path: %s\n",ProWstringToString(astr, wstr)); /*-------------------------------------------------------------*\ Get symdef Elbow flag \*-------------------------------------------------------------*/ error = ProDtlsymdefdataElbowGet(symdata, &elbow); TEST_CALL_REPORT ("ProDtlsymdefdataElbowGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); ProTKFprintf(fp,"\t\t\tElbow : %s\n", BOOL_TO_STR(elbow)); /*-------------------------------------------------------------*\ Get symdef text angle property. \*-------------------------------------------------------------*/ error = ProDtlsymdefdataTextangfixedGet(symdata, &angle_fixed); TEST_CALL_REPORT ("ProDtlsymdefdataTextangfixedGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); ProTKFprintf(fp,"\t\t\tText angle fixed: %s\n", BOOL_TO_STR(angle_fixed)); /*-------------------------------------------------------------*\ Get symdef height type. \*-------------------------------------------------------------*/ error = ProDtlsymdefdataHeighttypeGet(symdata, &type); TEST_CALL_REPORT ("ProDtlsymdefdataHeighttypeGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); ProTKFprintf(fp,"\t\t\tHeight type: %s\n", (type==PRODTLSYMDEFHGHTTYPE_FIXED)?("Fixed"): ((type==PRODTLSYMDEFHGHTTYPE_VARIABLE)?("Variable"):("Text related"))); /*-------------------------------------------------------------*\ Get symdef height \*-------------------------------------------------------------*/ error = ProDtlsymdefdataScaledheightGet(symdata,&height); TEST_CALL_REPORT ("ProDtlsymdefdataScaledheightGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); ProTKFprintf(fp,"\t\t\tHeight: %3.3f\n", height); if(type==PRODTLSYMDEFHGHTTYPE_TEXTRELATED) { /*-------------------------------------------------------------*\ Get symdef height type - text related then print information about related note. \*-------------------------------------------------------------*/ error = ProDtlsymdefdataTextrefGet(symdata, &entity, &line, &text); TEST_CALL_REPORT ("ProDtlsymdefdataTextrefGet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); if(error==PRO_TK_NO_ERROR) { ProTKFprintf(fp, "\t\t\tRef text entity id : %d\n", entity); ProTKFprintf(fp, "\t\t\tRef text line : %d\n", line); ProTKFprintf(fp, "\t\t\tRef text index : %d\n", text); } } /*-------------------------------------------------------------*\ Print information about all notes in current symdef \*-------------------------------------------------------------*/ error = ProTestSymDefInfoNote(fp, drawing, i, &symdefs[j], symdata); /*-------------------------------------------------------------*\ Print information about all attaches in the current symdef \*-------------------------------------------------------------*/ error = ProTestSymDefInfoAttach(fp, symdata); ProTKFprintf(fp,"---------------------------------------------------------------------\n"); } if(symdefs!=NULL) { error = ProArrayFree((ProArray*)&symdefs); TEST_CALL_REPORT ("ProArrayFree()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); } } /*-------------------------------------------------------------*\ Restore current sheet \*-------------------------------------------------------------*/ error = ProDrawingCurrentSheetSet( drawing, current_sheet ); TEST_CALL_REPORT ("ProDrawingCurrentSheetSet()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); /*-------------------------------------------------------------*\ Close file and show it in the information window. \*-------------------------------------------------------------*/ fclose(fp); error = ProInfoWindowDisplay(ProStringToWstring(wstr,file_name), NULL, NULL); TEST_CALL_REPORT ("ProInfoWindowDisplay()", "ProTestSymDefInfo()", error, error != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); }