/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <ProToolkit.h>
#include <ProWorkspace.h>
#include <ProWTUtils.h>
#include <ProBrowser.h>
#include <ProUtil.h>
#include <ProMenuBar.h>
#include <ProMode.h>
#include <ProDrawing.h>
#include <ProSolid.h>
#include <PTWCServer.h>
typedef struct
{
wchar_t* server;
wchar_t* ws_name;
ProPath ws_path;
} PTWCAsmVisitData;
/*====================================================================*\
FUNCTION: PTWCAddPartToPviewAsSecondary
PURPOSE: Visit action for each part in the assembly. Checkout the
part, export it to ProductView and add the results as
secondary content
\*====================================================================*/
static ProError PTWCAddPartToPviewAsSecondary (ProAsmcomppath* path, ProSolid solid,
ProError filter_status, ProAppData data)
{
PTWCAsmVisitData* visit_data = (PTWCAsmVisitData*)data;
ProMdlType type;
ProMdlName modelname;
ProMdlFileName objectname;
ProPath directory, filepath;
ProBoolean checkedout, modified;
wchar_t* model_url;
ProServerCheckoutConflicts conflicts;
ProSolid generic = NULL;
ProServerCheckoutOptions co_options;
/*--------------------------------------------------------------------*\
Ensure that the model is a part, and export it to ProductView format
\*--------------------------------------------------------------------*/
status = ProMdlTypeGet (solid, &type);
PT_TEST_LOG_SUCC ("ProMdlTypeGet()");
if (status != PRO_TK_NO_ERROR || type != PRO_MDL_PART)
return PRO_TK_NO_ERROR;
status = ProProductviewExport (solid, NULL, NULL);
PT_TEST_LOG_SUCC ("ProProductviewExport()");
/*--------------------------------------------------------------------*\
Derive the workspace path for the model
\*--------------------------------------------------------------------*/
status = ProMdlMdlnameGet (solid, modelname);
PT_TEST_LOG_SUCC ("ProMdlMdlnameGet()");
PTWCUtilWstringToLower (modelname);
ProWstringCopy (modelname, objectname, PRO_VALUE_UNUSED);
ProWstringConcatenate (L".prt", objectname, PRO_VALUE_UNUSED);
/*--------------------------------------------------------------------*\
If the object is not checked out, check it out. If the object is
an instance, checkout its top level generic with instances instead.
\*--------------------------------------------------------------------*/
status = ProServerObjectStatusGet (visit_data->server, visit_data->ws_name,
objectname, &checkedout, &modified);
PT_TEST_LOG_SUCC ("ProServerObjectStatusGet()");
if (status != PRO_TK_NO_ERROR || !checkedout)
{
status = ProServercheckoutoptsAlloc (&co_options);
PT_TEST_LOG_SUCC ("ProServercheckoutoptsAlloc()");
status = ProServercheckoutoptsIncludeinstancesSet (co_options,
PRO_SERVER_INCLUDE_ALL,
NULL);
PT_TEST_LOG_SUCC ("ProServercheckoutoptsIncludeinstancesSet()");
status = ProFaminstanceGenericGet (solid, PRO_B_FALSE,
(ProMdl*)&generic);
PT_TEST_LOG_SUCC ("ProFaminstanceGenericGet()");
status = ProServerObjectsCheckout (status == PRO_TK_NO_ERROR ? generic : solid,
NULL, PRO_B_TRUE,
co_options, &model_url, &conflicts);
PT_TEST_LOG_SUCC ("ProServerObjectsCheckout()");
ProWstringFree (model_url);
ProServercheckoutoptsFree (co_options);
}
if (status == PRO_TK_CHECKOUT_CONFLICT)
{
PTWCUtilSetInteractive (PRO_B_FALSE);
PTWCUtilConflictReport (conflicts);
ProServerconflictsFree (conflicts);
PTWCUtilSetInteractive (PRO_B_TRUE);
}
else
{
/*--------------------------------------------------------------------*\
Copy the ProductView .ol file as secondary content
\*--------------------------------------------------------------------*/
status = ProDirectoryCurrentGet (directory);
PT_TEST_LOG_SUCC ("ProDirectoryCurrentGet()");
ProWstringCopy (directory, filepath, PRO_VALUE_UNUSED);
ProWstringConcatenate (modelname, filepath, PRO_VALUE_UNUSED);
ProWstringConcatenate (L".ol", filepath, PRO_VALUE_UNUSED);
status = ProFileCopyToWS (filepath, visit_data->ws_path, objectname);
PT_TEST_LOG_SUCC ("ProFileCopyToWS()");
/*--------------------------------------------------------------------*\
Copy the ProductView .ed file as secondary content
\*--------------------------------------------------------------------*/
ProWstringCopy (directory, filepath, PRO_VALUE_UNUSED);
ProWstringConcatenate (modelname, filepath, PRO_VALUE_UNUSED);
ProWstringConcatenate (L".ed", filepath, PRO_VALUE_UNUSED);
status = ProFileCopyToWS (filepath, visit_data->ws_path, objectname);
PT_TEST_LOG_SUCC ("ProFileCopyToWS()");
}
return (PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION: PTWCPartsToProductView
PURPOSE: Export OL/ED files for each part, add as secondary content,
and checkin modified models.
\*====================================================================*/
int PTWCPartsToProductView ()
{
ProMdl model;
ProMdlType type;
PTWCAsmVisitData visit_data;
/*--------------------------------------------------------------------*\
Get the target models to be processed: the active part or assembly,
or the current solid in the active drawing
\*--------------------------------------------------------------------*/
status = ProMdlCurrentGet (&model);
PT_TEST_LOG_SUCC ("ProMdlCurrentGet()");
status = ProMdlTypeGet (model, &type);
PT_TEST_LOG_SUCC ("ProMdlTypeGet()");
if (type == PRO_MDL_DRAWING)
{
status = ProDrawingCurrentsolidGet ((ProDrawing)model,
(ProSolid*)&model);
PT_TEST_LOG_SUCC ("ProDrawingCurrsolidGet()");
status = ProMdlTypeGet (model, &type);
PT_TEST_LOG_SUCC ("ProMdlTypeGet()");
}
/*--------------------------------------------------------------------*\
Save some details about the active server to use for each visited
model.
\*--------------------------------------------------------------------*/
status = ProServerActiveGet (&visit_data.server);
PT_TEST_LOG_SUCC ("ProServerActiveGet()");
status = ProServerWorkspaceGet (visit_data.server, &visit_data.ws_name);
PT_TEST_LOG_SUCC ("ProServerWorkspaceGet()");
PTWCUtilBuildWSPath (visit_data.server, visit_data.ws_name, visit_data.ws_path);
/*--------------------------------------------------------------------*\
Process the single part, or all displayed parts in the assembly
\*--------------------------------------------------------------------*/
if (type == PRO_MDL_PART)
{
PTWCAddPartToPviewAsSecondary (NULL, model, PRO_TK_NO_ERROR,
(ProAppData)&visit_data);
}
else
{
status = ProSolidDispCompVisit (model, PTWCAddPartToPviewAsSecondary,
NULL, (ProAppData)&visit_data);
PT_TEST_LOG_SUCC ("ProSolidDispCompVisit()");
}
/*--------------------------------------------------------------------*\
Check in all changes
\*--------------------------------------------------------------------*/
PTWCUtilCheckinWSToFolder (visit_data.ws_name, NULL);
ProWstringFree (visit_data.server);
ProWstringFree (visit_data.ws_name);
return 0;
}
/*====================================================================*\
FUNCTION: PTWCAccessPartToPView
PURPOSE: Access function for the "part to ProductView" command
\*====================================================================*/
uiCmdAccessState PTWCAccessPartToPView (uiCmdAccessMode m)
{
ProMode mode;
wchar_t* server;
wchar_t* server_class;
int result;
status = ProModeCurrentGet (&mode);
if (mode != PRO_MODE_PART && mode != PRO_MODE_ASSEMBLY && mode != PRO_MODE_DRAWING)
return ACCESS_REMOVE;
/*--------------------------------------------------------------------*\
Ensure that there is an active Windchill server
\*--------------------------------------------------------------------*/
return (PTWCUtilAccessIfWCServer ());
}