/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*--------------------------------------------------------------------*\
Pro/Toolkit includes
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProMenuBar.h>
#include <ProMdl.h>
#include <ProSelection.h>
#include <ProFeature.h>
#include <ProWstring.h>
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
static wchar_t MSGFIL[] = {'u','t','i','l','i','t','i','e','s','.','t','x','t','\0'};
/*=====================================================================*\
FUNCTION: PTUtilElemtreeXMLShow
PURPOSE: Show an XML file in the embedded browser.
Note: native XML support in the browser is only available in Microsoft
Internet Explorer.
\*=====================================================================*/
ProError PTUtilElemtreeXMLShow (ProFileName filename)
{
ProPath win_url;
ProPath current_dir;
int win_id;
ProStringToWstring (win_url, "file://");
status = ProDirectoryCurrentGet (current_dir);
status = ProWstringConcatenate (current_dir, win_url, PRO_VALUE_UNUSED);
status = ProWstringConcatenate (filename, win_url, PRO_VALUE_UNUSED);
status = ProWindowCurrentGet (&win_id);
status = ProWindowURLShow (win_id, win_url);
return PRO_TK_NO_ERROR;
}
/*=====================================================================*\
FUNCTION: UserFeatXMLWrite
PURPOSE: Write a feature's element tree to an XML file.
\*=====================================================================*/
int UserFeatXMLWrite (ProFeature* feat)
{
ProElement elemtree;
wchar_t wFilename [PRO_FILE_NAME_SIZE];
/*--------------------------------------------------------------------*\
Prompt for the filename
\*--------------------------------------------------------------------*/
ProMessageDisplay ( MSGFIL, "USER Enter the XML file name:");
if (ProMessageStringRead (PRO_FILE_NAME_SIZE, wFilename) != PRO_TK_NO_ERROR)
return (0);
/*--------------------------------------------------------------------*\
Extract the element tree and convert it to XML
\*--------------------------------------------------------------------*/
status = ProFeatureElemtreeExtract (feat,NULL,PRO_FEAT_EXTRACT_NO_OPTS,&elemtree);
if ( status == PRO_TK_NO_ERROR )
{
status = ProElemtreeWrite (elemtree, PRO_ELEMTREE_XML, wFilename);
ProFeatureElemtreeFree(feat, elemtree);
}
if (status == PRO_TK_NO_ERROR )
{
PTUtilElemtreeXMLShow(wFilename);
}
return status;
}
/*=====================================================================*\
FUNCTION: UserFeatXMLWrite_AO
PURPOSE: Action/Object callback for feature export to XML.
\*=====================================================================*/
static int UserFeatXMLWrite_AO()
{
ProError status;
ProSelection* sel_array;
int n_sels;
ProFeature feat;
/*--------------------------------------------------------------------*\
Select the feature for XML info
\*--------------------------------------------------------------------*/
ProMessageDisplay ( MSGFIL, "USER Select feature:");
status = ProSelect ("feature,membfeat", 1, NULL, NULL, NULL, NULL, &sel_array, &n_sels);
if (status != PRO_TK_NO_ERROR)
return (0);
status = ProSelectionModelitemGet (sel_array [0], &feat);
UserFeatXMLWrite (&feat);
return (1);
}
/*=====================================================================*\
FUNCTION: UserFeatXMLWrite_OA
PURPOSE: Object/Action callback for feature export to XML.
\*=====================================================================*/
int UserFeatXMLWrite_OA()
{
ProError status;
ProSelection* sel_array;
ProFeature feat;
/*--------------------------------------------------------------------*\
Extract the current selected feature
\*--------------------------------------------------------------------*/
status = ProSelbufferSelectionsGet (&sel_array);
status = ProSelectionModelitemGet (sel_array [0], &feat);
UserFeatXMLWrite (&feat);
ProSelectionarrayFree (sel_array);
return (1);
}
#define OA 1 /* Standard OA in the menu system, typically gray out
the button when not usable*/
#define PM 2 /* OA in a popup menu, typically remove the button when
not usable */
/*=====================================================================*\
FUNCTION: UserFeatXMLWrite_TestLow
PURPOSE: Access function for the button for feature export to XML.
\*=====================================================================*/
static uiCmdAccessState UserFeatXMLWrite_TestLow (ProSelection* sels, int mode)
{
uiCmdAccessState access_result;
ProBoolean should_free = PRO_B_FALSE;
ProError status;
int size;
/*-----------------------------------------------------------------*\
Set the default return if the button is unusable.
\*-----------------------------------------------------------------*/
if (mode == OA)
access_result = ACCESS_UNAVAILABLE;
else
access_result = ACCESS_REMOVE;
/*-----------------------------------------------------------------*\
If called without selections, extract the current selections from
the buffer.
\*-----------------------------------------------------------------*/
if (sels == NULL)
{
status = ProSelbufferSelectionsGet (&sels);
if (status != PRO_TK_NO_ERROR)
return access_result;
if (sels == NULL)
return access_result;
should_free = PRO_B_TRUE;
}
/*-----------------------------------------------------------------*\
This command allows only one selection.
\*-----------------------------------------------------------------*/
status = ProArraySizeGet (sels, &size);
if (status != PRO_TK_NO_ERROR)
return access_result;
if (size == 1)
{
ProFeature feature;
status = ProSelectionModelitemGet (sels [0], &feature);
/*-----------------------------------------------------------------*\
If the selected type is feature, its element tree must be extractable.
\*-----------------------------------------------------------------*/
if (feature.type == PRO_FEATURE)
{
ProElement element;
status = ProFeatureElemtreeExtract (&feature, NULL, PRO_FEAT_EXTRACT_NO_OPTS,
&element);
if (status == PRO_TK_NO_ERROR)
{
ProFeatureElemtreeFree (&feature, element);
access_result = ACCESS_AVAILABLE;
}
}
}
if (should_free)
ProSelectionarrayFree (sels);
return access_result;
}
/*=====================================================================*\
FUNCTION: UserFeatXMLWrite_TestMdlTree
PURPOSE: Access function for the model tree popup menu button.
\*=====================================================================*/
uiCmdAccessState UserFeatXMLWrite_TestMdlTree (uiCmdAccessMode mode)
{
return UserFeatXMLWrite_TestLow (NULL, PM);
}
/*=====================================================================*\
FUNCTION: UserFeatXMLWrite_TestPM
PURPOSE: Access function for the graphics window popup menu button.
\*=====================================================================*/
uiCmdAccessState UserFeatXMLWrite_TestPM (uiCmdCmdId id,
ProAppData data,
ProSelection* sels)
{
return UserFeatXMLWrite_TestLow (sels, PM);
}
#undef OA
#undef PM