/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ #include <ProToolkit.h> #include <ProMenuBar.h> #include <ProMdl.h> #include <ProFeature.h> #include <ProLayer.h> #include <ProAnnotationFeat.h> #include <ProAnnotationElem.h> #include <PTAFExamples.h> #include <ProTKRunTime.h> /*====================================================================*\ FUNCTION : TestPTAFExUpdatePatternNotes() PURPOSE : Enable access to the Update Pattern Notes \*====================================================================*/ uiCmdAccessState TestPTAFExUpdatePatternNotes(uiCmdAccessMode access_mode) { ProMdl mdl; ProMdlType mdltype; ProModelitem selected_item; ProSelection *sel=NULL; ProFeattype feat_type; ProPattern annot_pattern; /*---------------------------------------------------------------------*\ Test to See if the current model is a Part / Assembly where annotation features exist \*---------------------------------------------------------------------*/ status = ProMdlCurrentGet(&mdl); if (status != PRO_TK_NO_ERROR) return (ACCESS_UNAVAILABLE); ProMdlTypeGet(mdl, &mdltype); if ((mdltype != PRO_MDL_PART) && (mdltype != PRO_MDL_ASSEMBLY)) return (ACCESS_UNAVAILABLE); /*---------------------------------------------------------------------*\ Test to see if the Selection buffer if empty Get the Annotation Element from the Selection buffer \*---------------------------------------------------------------------*/ status = PTAFExTestforSelectionsInBuffer(); PT_TEST_LOG_SUCC("PTAFExTestforSelectionsInBuffer "); if (status != PRO_TK_NO_ERROR) return (ACCESS_UNAVAILABLE); /*---------------------------------------------------------------------*\ User gets the ProSelection from the selection buffer \*---------------------------------------------------------------------*/ status = ProSelbufferSelectionsGet(&sel); /*---------------------------------------------------------------------*\ Get ModelItem from the ProSelection \*---------------------------------------------------------------------*/ status = ProSelectionModelitemGet(sel[0], &selected_item); PT_TEST_LOG_SUCC("PTAFExCreateRoundfromAE::ProSelectionModelitemGet "); ProSelectionarrayFree (sel); if (selected_item.type == PRO_FEATURE) { /*---------------------------------------------------------------------*\ Make sure that the feature type is Annotation \*---------------------------------------------------------------------*/ status = ProFeatureTypeGet((ProFeature *)&selected_item, &feat_type); if (feat_type == PRO_FEAT_ANNOTATION) { /*---------------------------------------------------------------------*\ Get the Pattern for this feature, if available \*---------------------------------------------------------------------*/ status = ProFeaturePatternGet((ProFeature *)&selected_item, PRO_FEAT_PATTERN, &annot_pattern); if (status == PRO_TK_NO_ERROR) return (ACCESS_AVAILABLE); else return (ACCESS_UNAVAILABLE); } } return (ACCESS_UNAVAILABLE); } /*====================================================================*\ FUNCTION : PTAFExFeatureAnnotElemUpdateVisitAction() PURPOSE : Enable access to the Update Pattern Notes \*====================================================================*/ ProError PTAFExFeatureAnnotElemUpdateVisitAction (ProAnnotationElem *annot_elem, ProError status, ProAppData p_new_string) { ProError err; ProAnnotation note; wchar_t** existing_note; wchar_t** new_note; int i; int p_size, new_size; /*---------------------------------------------------------------------*\ Get the Annotation from the Annotation element \*---------------------------------------------------------------------*/ err = ProAnnotationelemAnnotationGet(annot_elem, ¬e); ProAnnotationUndisplay (¬e, NULL, NULL); /*---------------------------------------------------------------------*\ Make sure that the annotation is a 3D note \*---------------------------------------------------------------------*/ if (note.type != PRO_NOTE) return PRO_TK_NO_ERROR; else { /*---------------------------------------------------------------------*\ Get the existing Note from the ProNote \*---------------------------------------------------------------------*/ err = ProNoteTextGet((ProNote *)¬e, PRODISPMODE_SYMBOLIC, &existing_note); /*---------------------------------------------------------------------*\ Get the size (array) of the existing note \*---------------------------------------------------------------------*/ err = ProArraySizeGet((ProArray)existing_note, &p_size); /*---------------------------------------------------------------------*\ Allocate the new note text as a new array. This allows us to use ProWstringproarrayFree on the existing note text array, later. \*---------------------------------------------------------------------*/ err = ProArrayAlloc (p_size+1, sizeof (wchar_t*), 1, (ProArray*)&new_note); for (i = 0; i < p_size; i ++) { new_note [i] = existing_note [i]; } new_note [p_size] = (wchar_t*)calloc (strlen (p_new_string) + 1, sizeof (wchar_t)); /*---------------------------------------------------------------------*\ Add the new string value to the array \*---------------------------------------------------------------------*/ ProStringToWstring(new_note[p_size], (char *)p_new_string); /*---------------------------------------------------------------------*\ Add the new line to the 3D note \*---------------------------------------------------------------------*/ err = ProNoteTextSet((ProNote *)¬e, new_note); ProAnnotationDisplay (¬e, NULL, NULL, NULL); /*---------------------------------------------------------------------*\ Free allocated memory \*---------------------------------------------------------------------*/ free (new_note [p_size]); ProArrayFree ((ProArray*)&new_note); ProWstringproarrayFree (existing_note); } return PRO_TK_GENERAL_ERROR; } /*====================================================================*\ FUNCTION : PTAFExFeatureAnnotElemVisitAction() PURPOSE : Visit function for Annotation Elements in a Feature \*====================================================================*/ ProError PTAFExFeatureAnnotElemVisitAction (ProAnnotationElem *annot_elem, ProError status, ProAppData dummy) { ProError err; ProLayer layer; ProLayerItem layer_item; ProMdl current_model; ProName layer_name; ProFeature feature; ProNote note; err = ProMdlCurrentGet(¤t_model); if (status != PRO_TK_NO_ERROR) return (ACCESS_UNAVAILABLE); ProStringToWstring(layer_name, "PTAFEX_TK"); /*---------------------------------------------------------------------*\ Get the Feature from the Annotation element \*---------------------------------------------------------------------*/ err = ProAnnotationelemFeatureGet(annot_elem, &feature); err = ProAnnotationelemAnnotationGet (annot_elem, ¬e); /*---------------------------------------------------------------------*\ Since the Annotation Erase does not work consistently, We will use the blanked layer approach \*---------------------------------------------------------------------*/ err = ProLayerCreate(current_model, layer_name, &layer); if ((err == PRO_TK_NO_ERROR) || (err == PRO_TK_E_FOUND)) { /*---------------------------------------------------------------------*\ Add the annotation element to the layer \*---------------------------------------------------------------------*/ err = ProLayerItemInit(PRO_LAYER_FEAT, feature.id, current_model, &layer_item); err = ProLayerItemAdd(&layer, &layer_item); /*---------------------------------------------------------------------*\ Set the layer status to BLANK and save \*---------------------------------------------------------------------*/ err = ProLayerDisplaystatusSet(&layer, PRO_LAYER_TYPE_BLANK); err = ProLayerDisplaystatusSave(current_model); } return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION : TestPTAFExUpdatePatternNotes() PURPOSE : Enable access to the Update Pattern Notes \*====================================================================*/ ProError PTAFExUpdateAnnotationLeader(ProMdl model, int leader_feat_id, int num_members) { ProFeature feat; char new_string[PRO_LINE_SIZE]; /*---------------------------------------------------------------------*\ Initialize a feature object \*---------------------------------------------------------------------*/ status = ProFeatureInit(model, leader_feat_id, &feat); /*---------------------------------------------------------------------*\ Create the New string to be passed to add to the Leader Annotation Feature \*---------------------------------------------------------------------*/ ProTKSprintf(new_string, "%i: REF GENERAL PATTERN", num_members); /*---------------------------------------------------------------------*\ Visit the Annotation Elements in the Annotation Feature \*---------------------------------------------------------------------*/ status = ProFeatureAnnotationelemsVisit(&feat, (ProAnnotationelemVisitAction)PTAFExFeatureAnnotElemUpdateVisitAction, NULL, (ProAppData)new_string); return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION : TestPTAFExUpdatePatternNotes() PURPOSE : Enable access to the Update Pattern Notes \*====================================================================*/ ProError PTAFExHidePatternAnnotation (ProMdl model, int pattern_feat_id) { ProFeature feat; int dummy=0; /*---------------------------------------------------------------------*\ Initialize a feature object \*---------------------------------------------------------------------*/ status = ProFeatureInit(model, pattern_feat_id, &feat); /*---------------------------------------------------------------------*\ Visit the Annotation Elements in the Annotation Feature \*---------------------------------------------------------------------*/ status = ProFeatureAnnotationelemsVisit(&feat, (ProAnnotationelemVisitAction)PTAFExFeatureAnnotElemVisitAction, NULL, NULL); return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION : TestPTAFExUpdatePatternNotes() PURPOSE : Enable access to the Update Pattern Notes \*====================================================================*/ ProError PTAFExUpdateNotePattern() { ProSelection *sel=NULL; ProModelitem feature; ProFeature pattern_leader; ProFeattype feat_type; ProPattern annot_pattern; ProMdl curr_mdl; ProFeature* feat_members; int num_members; int i=0, j=0; status = ProMdlCurrentGet(&curr_mdl); if (status != PRO_TK_NO_ERROR) return (ACCESS_UNAVAILABLE); /*---------------------------------------------------------------------*\ Check to see if the pre-selected item is a Pattern of Annotation Features User gets the ProSelection from the selection buffer \*---------------------------------------------------------------------*/ status = ProSelbufferSelectionsGet(&sel); /*---------------------------------------------------------------------*\ Get ModelItem from the ProSelection \*---------------------------------------------------------------------*/ status = ProSelectionModelitemGet(sel[0], &feature); ProSelectionarrayFree (sel); /*---------------------------------------------------------------------*\ Make sure the item selected is a feature \*---------------------------------------------------------------------*/ if (feature.type != PRO_FEATURE) { ProMessageDisplay(message_file_init, "PTAFEX ERROR %0s", "Object selected is not a Pro/E Feature."); return PRO_TK_NO_ERROR; } status = ProFeatureTypeGet(&feature, &feat_type); if (feat_type == PRO_FEAT_ANNOTATION) { /*---------------------------------------------------------------------*\ Get the Pattern for this feature \*---------------------------------------------------------------------*/ status = ProFeaturePatternGet(&feature, PRO_FEAT_PATTERN, &annot_pattern); /*---------------------------------------------------------------------*\ Get the leader of the pattern \*---------------------------------------------------------------------*/ status = ProPatternLeaderGet(&annot_pattern, &pattern_leader); /*---------------------------------------------------------------------*\ Get the pattern information from the Pro/DEVELOP functions \*---------------------------------------------------------------------*/ status = ProPatternMembersGet(&annot_pattern, &feat_members); status = ProArraySizeGet(feat_members, &num_members); status = PTAFExUpdateAnnotationLeader(curr_mdl, feat_members[0].id, num_members); /*---------------------------------------------------------------------*\ Erase the annotation in the feature \*---------------------------------------------------------------------*/ for (i=1; i<num_members; i++) { status = PTAFExHidePatternAnnotation(curr_mdl, feat_members[i].id); } } ProWindowRepaint (PRO_VALUE_UNUSED); return PRO_TK_NO_ERROR; }