/*
Copyright (c) 2024 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 <PTWCServer.h>
/*====================================================================*\
FUNCTION: PTWCCreateOrUpdateDXF
PURPOSE: Create or update a DXF copy of the active drawing. If the
copy is already in the project, it will be checked out and
updated. If the file is new, it will be created in "Plans".
\*====================================================================*/
int PTWCCreateOrUpdateDXF ()
{
ProMdl model;
ProMdlType type;
ProMdlFileName filename;
ProMdlName modelname;
ProPath filepath, ws_path;
wchar_t* server;
wchar_t* ws_name;
wchar_t* context;
wchar_t* model_url = NULL;
ProServerCheckoutConflicts conflicts;
ProPath folder;
/*--------------------------------------------------------------------*\
Obtain current drawing handle and export to DXF
\*--------------------------------------------------------------------*/
status = ProMdlCurrentGet (&model);
PT_TEST_LOG_SUCC ("ProMdlCurrentGet()");
status = ProMdlMdlnameGet (model, modelname);
PT_TEST_LOG_SUCC ("ProMdlMdlnameGet()");
ProWstringCopy (modelname, filename, PRO_VALUE_UNUSED);
PTWCUtilWstringToLower (filename);
ProWstringConcatenate (L"_drw.dxf", filename, PRO_VALUE_UNUSED);
status = ProOutputFileMdlnameWrite (model, filename, PRO_DXF_FILE, NULL, NULL, NULL, NULL);
PT_TEST_LOG_SUCC ("ProOutputFileMdlnameWrite()");
/*--------------------------------------------------------------------*\
If the file already exists in the project, check it out by its
object name.
\*--------------------------------------------------------------------*/
status = ProServerObjectsCheckout (NULL, filename, PRO_B_TRUE,
NULL, &model_url, &conflicts);
PT_TEST_LOG_SUCC ("ProServerObjectsCheckout()");
/*--------------------------------------------------------------------*\
A conflict most likely indicates that the file does not exist
in the project already. This error is ignored.
\*--------------------------------------------------------------------*/
if (status == PRO_TK_CHECKOUT_CONFLICT)
{
ProServerconflictsFree (conflicts);
}
/*--------------------------------------------------------------------*\
Get the full disk path to the output DXF file as the source of the
File Copy operation.
\*--------------------------------------------------------------------*/
status = ProDirectoryCurrentGet (filepath);
PT_TEST_LOG_SUCC ("ProDirectoryCurrentGet()");
ProWstringConcatenate (filename, filepath, PRO_VALUE_UNUSED);
/*--------------------------------------------------------------------*\
Build the workspace path as the target of the File Copy operation.
\*--------------------------------------------------------------------*/
status = ProServerActiveGet (&server);
PT_TEST_LOG_SUCC ("ProServerActiveGet()");
status = ProServerContextGet (server, &context);
PT_TEST_LOG_SUCC ("ProServerContextGet()");
status = ProServerWorkspaceGet (server, &ws_name);
PT_TEST_LOG_SUCC ("ProServerWorkspaceGet()");
PTWCUtilBuildWSPath (server, ws_name, ws_path);
/*--------------------------------------------------------------------*\
Copy the file to the workspace as a top-level object.
\*--------------------------------------------------------------------*/
status = ProFileCopyToWS (filepath, ws_path, NULL);
PT_TEST_LOG_SUCC ("ProFileCopyToWS()");
/*--------------------------------------------------------------------*\
Checkin the workspace. If the object is new, it will go to
the Plans folder.
\*--------------------------------------------------------------------*/
PTWCUtilBuildPJLFolder (server, context, "Plans", folder);
PTWCUtilCheckinWSToFolder (ws_name, folder);
ProWstringFree (server);
ProWstringFree (context);
ProWstringFree (ws_name);
ProWstringFree (model_url);
return 0;
}
/*====================================================================*\
FUNCTION: PTWCAccessCreateOrUpdateDXF
PURPOSE: The access function for the create or update DXF command.
\*====================================================================*/
uiCmdAccessState PTWCAccessCreateOrUpdateDXF (uiCmdAccessMode m)
{
ProMode mode;
wchar_t* server;
wchar_t* server_class;
int result;
/*--------------------------------------------------------------------*\
This command accessible only in drawing mode.
\*--------------------------------------------------------------------*/
status = ProModeCurrentGet (&mode);
if (mode != PRO_MODE_DRAWING)
return ACCESS_REMOVE;
/*--------------------------------------------------------------------*\
Ensure that there is an active Windchill server
\*--------------------------------------------------------------------*/
return (PTWCUtilAccessIfWCServer ());
}