/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <ProToolkit.h>
#include <ProMenuBar.h>
#include <ProSurface.h>
#include <ProElement.h>
#include <ProAnnotationFeat.h>
#include <ProAnnotationElem.h>
#include <ProNote.h>
#include <PTAFExamples.h>
/*====================================================================*\
FUNCTION : PTTestAccessNotesSelected()
PURPOSE : Enable access to the button for note/annotation plane conversion
\*====================================================================*/
uiCmdAccessState PTTestAccessNotesSelected(uiCmdAccessMode access_mode)
{
ProSelection* note_sels;
int size, i;
ProModelitem note;
/*---------------------------------------------------------------------*\
Check for one or more selected notes
\*---------------------------------------------------------------------*/
status = ProSelbufferSelectionsGet (¬e_sels);
PT_TEST_LOG_SUCC ("ProSelbufferSelectionsGet()");
if (status != PRO_TK_NO_ERROR)
return ACCESS_UNAVAILABLE;
status = ProArraySizeGet (note_sels, &size);
PT_TEST_LOG_SUCC ("ProArraySizeGet()");
if (status != PRO_TK_NO_ERROR || size <= 0)
return ACCESS_UNAVAILABLE;
for (i = 0; i < size; i++)
{
status = ProSelectionModelitemGet (note_sels [i], ¬e);
PT_TEST_LOG_SUCC ("ProSelectionModelitemGet()");
/*---------------------------------------------------------------------*\
If any non-notes are selected, this command can't be used
\*---------------------------------------------------------------------*/
if (note.type != PRO_NOTE)
{
ProSelectionarrayFree (note_sels);
return ACCESS_UNAVAILABLE;
}
}
ProSelectionarrayFree (note_sels);
return ACCESS_AVAILABLE;
}
/*====================================================================*\
FUNCTION : PTConvertNoteToAnnotationplane
PURPOSE : Convert a note to use the selected annotation plane
\*====================================================================*/
ProError PTConvertNoteToAnnotationplane (ProNote* note, ProAnnotationPlane* ap)
{
ProNoteAttach attach;
/*---------------------------------------------------------------------*\
Extract the current note placement
\*---------------------------------------------------------------------*/
status = ProNotePlacementGet (note, &attach);
PT_TEST_LOG_SUCC ("ProNotePlacementGet()");
/*---------------------------------------------------------------------*\
Assign the annotation plane and reassign the placement to the note
\*---------------------------------------------------------------------*/
status = ProNoteAttachPlaneSet (attach, ap);
PT_TEST_LOG_SUCC ("ProNoteAttachPlaneSet()");
status = ProNotePlacementSet (note, attach);
PT_TEST_LOG_SUCC ("ProNotePlacementSet()");
status = ProNoteAttachRelease (&attach);
PT_TEST_LOG_SUCC ("ProNoteAttachRelease()");
return PRO_TK_NO_ERROR;
}
/*====================================================================*\
FUNCTION : PTSelectAnnotationplane
PURPOSE : Interactively select an datum to be an annotation plane
\*====================================================================*/
ProError PTSelectAnnotationplane (int size, ProAnnotationPlane* ap)
{
ProSelection* sels = NULL;
ProGeomitem plane;
int n_sels;
ProSurface surf;
ProGeomitemdata* data;
ProVector normal;
/*---------------------------------------------------------------------*\
Prompt for the selection
\*---------------------------------------------------------------------*/
if (size == 1)
{
status = ProMessageDisplay (message_file_init,
"PTNC Select the datum plane to use as the annotation plane for the note.");
PT_TEST_LOG_SUCC ("ProMessageDisplay()");
}
else
{
status = ProMessageDisplay (message_file_init,
"PTNC Select the datum plane to use as the annotation plane for the notes.");
PT_TEST_LOG_SUCC ("ProMessageDisplay()");
}
status = ProSelect ("datum", 1, NULL, NULL, NULL, NULL, &sels, &n_sels);
PT_TEST_LOG_SUCC ("ProSelect()");
if (status != PRO_TK_NO_ERROR)
return status;
status = ProSelectionUnhighlight (sels [0]);
PT_TEST_LOG_SUCC ("ProSelectionUnhighlight()");
/*---------------------------------------------------------------------*\
Extract the selected datum plane as a surface
\*---------------------------------------------------------------------*/
status = ProSelectionModelitemGet (sels [0], &plane);
PT_TEST_LOG_SUCC ("ProSelectionModelitemGet()");
status = ProGeomitemToSurface (&plane, &surf);
PT_TEST_LOG_SUCC ("ProGeomitemToSurface()");
/*---------------------------------------------------------------------*\
Extract the surface data to get the surface normal vector
\*---------------------------------------------------------------------*/
status = ProSurfaceDataGet (surf, &data);
PT_TEST_LOG_SUCC ("ProSurfaceDataGet()");
memcpy (normal, data->data.p_surface_data->srf_shape.plane.e3, sizeof (ProVector));
status = ProGeomitemdataFree (&data);
PT_TEST_LOG_SUCC ("ProGeomitemdataFree()");
/*---------------------------------------------------------------------*\
Create the annotation plane
\*---------------------------------------------------------------------*/
status = ProAnnotationplaneCreate (sels[0], normal, ap);
PT_TEST_LOG_SUCC ("ProAnnotationplaneCreate()");
if (status != PRO_TK_NO_ERROR)
return status;
return PRO_TK_NO_ERROR;
}
/*====================================================================*\
FUNCTION : PTNoteConvert
PURPOSE : Convert one or more selected notes to use annotation planes
\*====================================================================*/
int PTNoteConvert ()
{
ProSelection* note_sels = NULL;
int size, i;
ProNote note;
ProAnnotationPlane ap;
ap.id = PRO_VALUE_UNUSED;
/*---------------------------------------------------------------------*\
Extract the selected notes
\*---------------------------------------------------------------------*/
status = ProSelbufferSelectionsGet (¬e_sels);
PT_TEST_LOG_SUCC ("ProSelbufferSelectionsGet()");
status = ProArraySizeGet (note_sels, &size);
PT_TEST_LOG_SUCC ("ProArraySizeGet()");
for (i = 0; i < size; i++)
{
status = ProSelectionModelitemGet (note_sels [i], ¬e);
PT_TEST_LOG_SUCC ("ProSelectionModelitemGet()");
if (note.type == PRO_NOTE)
{
/*---------------------------------------------------------------------*\
If the user has not yet selected the annotation plane, prompt for this
\*---------------------------------------------------------------------*/
if (ap.id == PRO_VALUE_UNUSED)
{
status = PTSelectAnnotationplane (size, &ap);
if (status != PRO_TK_NO_ERROR)
return status;
}
/*---------------------------------------------------------------------*\
Hide the note, add the annotation plane, and redisplay the note
\*---------------------------------------------------------------------*/
status = ProAnnotationUndisplay (¬e, NULL, NULL);
PT_TEST_LOG_SUCC ("ProAnnotationErase()");
PTConvertNoteToAnnotationplane (¬e, &ap);
status = ProAnnotationDisplay (¬e, NULL, NULL, NULL);
PT_TEST_LOG_SUCC ("ProAnnotationDisplay()");
}
}
status = ProSelbufferClear ();
PT_TEST_LOG_SUCC ("ProSelbufferClear()");
/*---------------------------------------------------------------------*\
Reselect the notes for the next operation
\*---------------------------------------------------------------------*/
for (i = 0; i < size; i++)
{
status = ProSelbufferSelectionAdd (note_sels[i]);
PT_TEST_LOG_SUCC ("ProSelbufferSelectionAdd()");
}
ProSelectionarrayFree (note_sels);
return (1);
}