/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*----------------------------------------------------------------*\ Pro/TOOLKIT includes \*----------------------------------------------------------------*/ #include <ProToolkit.h> #include <ProSelection.h> #include <ProObjects.h> #include <ProSolid.h> #include <ProMdl.h> #include <ProMessage.h> #include <ProNote.h> #include <ProArray.h> #include <ProGraphic.h> #include <ProAnnotation.h> /*----------------------------------------------------------------*\ Application includes \*----------------------------------------------------------------*/ #include "ProUtil.h" #include "TestError.h" #include "UtilMath.h" #include "UtilMatrix.h" /*----------------------------------------------------------------*\ Application data \*----------------------------------------------------------------*/ static ProName msg_file; /*================================================================*\ FUNCTION: UserSolidNoteCreate() PURPOSE: Example of note creation for solids \*================================================================*/ int UserSolidNoteCreate() { #define MAX_NOTE_LEN PRO_LINE_SIZE int err; ProSelection *p_sel; /* for selection */ int n_sel; ProModelitem note_owner; /* owner of the note */ wchar_t** text_arr; /* list of note text lines */ ProMdl model; /* current model */ ProLine w_notetext; /* line of note text */ ProNote note; /* note object */ ProNoteAttach note_attach; /* attach information for note */ int i; ProMouseButton button; ProPoint3d note_pos_scrn; /* note position in screen coordinates */ ProPoint3d outline[2]; /* points delimiting the model outline */ ProPoint3d note_pos; /* note position, in model coordinates */ ProMatrix vmatrix, inv_vmatrix; /* view matrix and inverse */ ProMatrix def_matrix = {{1.0, 0.0, 0.0, 0.0}, {0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 1.0, 0.0}, {0.0, 0.0, 0.0, 1.0}}; ProStringToWstring (msg_file, "msg_ugfund.txt"); /*----------------------------------------------------------------*\ Get the current model. \*----------------------------------------------------------------*/ err = ProMdlCurrentGet (&model); if (err != PRO_TK_NO_ERROR) { ProMessageDisplay (msg_file, "USER %0s F", "Error getting current model."); return (err); } /*----------------------------------------------------------------*\ Get the note text. \*----------------------------------------------------------------*/ ProMessageDisplay (msg_file, "USER %0s F", "Enter note text."); err = ProMessageStringRead (MAX_NOTE_LEN, w_notetext); if (err != PRO_TK_NO_ERROR) return (err); /*----------------------------------------------------------------*\ Fill the array of note lines. \*----------------------------------------------------------------*/ err = ProArrayAlloc (1, sizeof(wchar_t*), 1, (ProArray*)&text_arr); text_arr[0] = &w_notetext [0]; /*----------------------------------------------------------------*\ Get the modelitem for the model. \*----------------------------------------------------------------*/ err = ProMdlToModelitem (model, ¬e_owner); /*----------------------------------------------------------------*\ Create the note to be owned by the model. \*----------------------------------------------------------------*/ err = ProSolidNoteCreate (model, NULL, text_arr, ¬e); /*----------------------------------------------------------------*\ Get the leaders and add to the attachment. \*----------------------------------------------------------------*/ ProMessageDisplay (msg_file, "USER %0s F", "Select edges for leaders."); err = ProSelect ("edge", -1, NULL, NULL, NULL, NULL, &p_sel, &n_sel); if (err != PRO_TK_NO_ERROR) return (err); err = ProNoteAttachAlloc (¬e_attach); for (i = 0; i < n_sel; i++) { err = ProNoteAttachAddend (note_attach, p_sel[i], PRO_NOTE_ATT_NONE); } /*----------------------------------------------------------------*\ Get the note position, in screen coordinates. \*----------------------------------------------------------------*/ ProMessageDisplay (msg_file, "USER %0s F", "Select note location."); err = ProMousePickGet (PRO_LEFT_BUTTON, &button, note_pos_scrn); if (err != PRO_TK_NO_ERROR) return (err); /*----------------------------------------------------------------*\ Get the view matrix (the transformation from model coordinates to screen coordinates) and invert. \*----------------------------------------------------------------*/ err = ProViewMatrixGet (model, NULL, vmatrix); err = ProUtilMatrixInvert (vmatrix, inv_vmatrix); /*------------------------------------------------------------------*\ Transform the note position from screen coordinates to model coordinates. \*----------------------------------------------------------------*/ ProUtilPointTrans (inv_vmatrix, note_pos_scrn, note_pos); err = ProSolidDispoutlineGet (model, def_matrix, outline); /*----------------------------------------------------------------*\ Set the note position in terms of model size parameters (see ProNote.h) \*----------------------------------------------------------------*/ for (i = 0; i < 3; i++) { note_pos[i] = (note_pos[i] - outline[0][i]) / (outline[1][i] - outline[0][i]); } err = ProNoteAttachFreeSet (note_attach, note_pos[0], note_pos[1], note_pos[2]); err = ProNotePlacementSet (¬e, note_attach); /*----------------------------------------------------------------*\ Display the note. \*----------------------------------------------------------------*/ err = ProAnnotationShow ( (ProAnnotation*)¬e, NULL, NULL); /*----------------------------------------------------------------*\ Free the memory. \*----------------------------------------------------------------*/ err = ProNoteAttachRelease (¬e_attach); err = ProArrayFree ((ProArray*)&text_arr); return (PRO_TK_NO_ERROR); }