/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <ProToolkit.h>
#include <ProDrawing.h>
#include <ProArray.h>
#include <UtilMatrix.h>
/*====================================================================*\
FUNCTION : UsrListViews()
PURPOSE : Command to list view info in an information window
\*====================================================================*/
int UsrListViews()
{
ProDrawing drawing;
int n_views, view, sheet;
ProSolid solid;
ProMdlName modelName;
ProMdlExtension modelExtension;
ProVector outline[2];
double scale;
ProDrawingViewDisplay display;
char *sstyle;
ProView *views;
FILE *fp;
ProName wfname;
char name[PRO_MDLNAME_SIZE];
char type[PRO_MDLEXTENSION_SIZE];
ProPath modelFullPath = { 0 }, objDirPath = { 0 };
int modelVersion;
char *fname = "views.txt";
/*--------------------------------------------------------------------*\
Open a text file to contain the information to be displayed
\*--------------------------------------------------------------------*/
fp = PTApplsUnicodeFopen(fname, "w");
/*--------------------------------------------------------------------*\
Get the current drawing
\*--------------------------------------------------------------------*/
ProMdlCurrentGet((ProMdl*)&drawing);
/*--------------------------------------------------------------------*\
Collect the views into an array
\*--------------------------------------------------------------------*/
ProDrawingViewsCollect(drawing, &views);
ProArraySizeGet(views, &n_views);
for(view=0;view<n_views;view++)
{
/*--------------------------------------------------------------------*\
Get the sheet number for this view
\*--------------------------------------------------------------------*/
ProDrawingViewSheetGet(drawing, views[view], &sheet);
/*--------------------------------------------------------------------*\
Get the name of the solid that the view contains
\*--------------------------------------------------------------------*/
ProDrawingViewSolidGet(drawing, views[view], &solid);
ProMdlMdlnameGet((ProMdl)solid, modelName);
ProMdlExtensionGet((ProMdl)solid, modelExtension);
ProMdlOriginGet((ProMdl)solid, modelFullPath);
ProFileMdlnameParse (modelFullPath, objDirPath, NULL, NULL, &modelVersion);
ProWstringToString(name, modelName);
ProWstringToString(type, modelExtension);
/*--------------------------------------------------------------------*\
Get the outline, scale, and display state
\*--------------------------------------------------------------------*/
ProDrawingViewOutlineGet(drawing, views[view], outline);
ProDrawingViewScaleGet(drawing, views[view], &scale);
ProDrawingViewDisplayGet(drawing, views[view], &display);
/*--------------------------------------------------------------------*\
Write the information to the text file
\*--------------------------------------------------------------------*/
ProTKFprintf(fp,"View %d\n", view+1);
ProTKFprintf(fp," Solid : %s.%s.%d\n", name, type,
modelVersion);
ProTKFprintf(fp," Sheet : %d\n", sheet);
ProTKFprintf(fp," Lower left : %0.3f, %0.3f\n",
outline[0][0],
outline[0][1]);
ProTKFprintf(fp," Upper right : %0.3f, %0.3f\n",
outline[1][0],
outline[1][1]);
ProTKFprintf(fp," Scale : %0.3f\n", scale);
switch(display.style)
{
case PRO_DISPSTYLE_DEFAULT : sstyle = "default"; break;
case PRO_DISPSTYLE_WIREFRAME : sstyle = "wireframe"; break;
case PRO_DISPSTYLE_HIDDEN_LINE : sstyle = "hidden line"; break;
case PRO_DISPSTYLE_NO_HIDDEN : sstyle = "no hidden";break;
case PRO_DISPSTYLE_SHADED : sstyle = "shaded"; break;
}
ProTKFprintf(fp," Disp style : %s\n", sstyle);
}
/*--------------------------------------------------------------------*\
Close the file, and display it
\*------------------------------------------------------------------*/
fclose(fp);
ProStringToWstring(wfname, fname);
ProInfoWindowDisplay(wfname, NULL, NULL);
return 0;
}
/*====================================================================*\
FUNCTION : UsrSolidSelect()
PURPOSE : Utility to select a solid using the file browser and retrieve
it if it is not already in session.
\*====================================================================*/
int UsrSolidSelect(
ProSolid *solid)
{
ProName title;
ProLine filter;
ProPath wfile, wdir, wcurrent_dir;
char file[PRO_PATH_SIZE], dir[PRO_PATH_SIZE],
current_dir[PRO_PATH_SIZE];
ProBoolean different_dir;
char *slash, *root, *ext;
ProFamilyMdlName wroot;
ProMdlType mtype;
ProError status;
/*--------------------------------------------------------------------*\
Ask the user to select a prt or asm file
\*--------------------------------------------------------------------*/
ProStringToWstring(title,"Solid");
ProStringToWstring(filter,"*.prt,*.asm");
if(ProFileMdlnameOpen(title, filter, NULL, NULL, NULL, NULL, wfile) !=
PRO_TK_NO_ERROR)
return(0);
ProWstringToString(file, wfile);
/*--------------------------------------------------------------------*\
Parse out the directory, and see if it is different from the current
\*--------------------------------------------------------------------*/
different_dir = PRO_B_FALSE;
if(slash = strrchr(file,'/'))
{
*slash = '\0';
strcpy(dir, file);
strcpy(file, ++slash);
ProStringToWstring(wdir, dir);
ProDirectoryCurrentGet(wcurrent_dir);
ProWstringToString(current_dir, wcurrent_dir);
if(strcmp(current_dir, dir))
different_dir = PRO_B_TRUE;
}
/*--------------------------------------------------------------------*\
Parse out the file root name and model type
\*--------------------------------------------------------------------*/
root = strtok(file,".");
ProStringToWstring(wroot, root);
ext = strtok(NULL,".");
if(!strcmp(ext,"prt"))
mtype = PRO_MDL_PART;
else if(!strcmp(ext,"asm"))
mtype = PRO_MDL_ASSEMBLY;
else
return(0);
/*--------------------------------------------------------------------*\
If the solid is already in session, return with it
\*--------------------------------------------------------------------*/
if(ProMdlnameInit(wroot, (ProMdlfileType)mtype, (ProMdl*)solid) == PRO_TK_NO_ERROR)
return(1);
/*--------------------------------------------------------------------*\
Move the to correct directory, and try to retieve the solid
\*--------------------------------------------------------------------*/
if(different_dir)
ProDirectoryChange(wdir);
status = ProMdlnameRetrieve(wroot, (ProMdlfileType)mtype, (ProMdl*)solid);
if(different_dir)
ProDirectoryChange(wcurrent_dir);
if(status != PRO_TK_NO_ERROR)
return(0);
return(1);
}
/*====================================================================*\
FUNCTION : UsrCreateSheet()
PURPOSE : Create a new drawing sheet with a general, and two
projected,views of a selected solid
\*====================================================================*/
int UsrCreateSheet()
{
ProDrawing drawing;
int sheet;
ProSolid solid;
ProVector pos;
ProView view, pview;
ProVector outline[2];
ProMatrix matrix;
/*--------------------------------------------------------------------*\
Create a new sheet and make it current
\*--------------------------------------------------------------------*/
ProMdlCurrentGet((ProMdl)&drawing);
ProDrawingSheetCreate(drawing, &sheet);
ProDrawingCurrentSheetSet(drawing, sheet);
/*--------------------------------------------------------------------*\
Ask the user to select a solid and add it to the drawing
\*--------------------------------------------------------------------*/
if(!UsrSolidSelect(&solid))
return(0);
ProDrawingSolidAdd(drawing, solid);
/*--------------------------------------------------------------------*\
Create a general view from the Z axis direction
\*--------------------------------------------------------------------*/
ProUtilMatrixCopy(NULL, matrix);
pos[0] = 200.0;
pos[1] = 600.0;
pos[2] = 0.0;
ProDrawingGeneralviewCreate(drawing, solid, sheet, PRO_B_FALSE,
pos, 0.5, matrix, &view);
/*--------------------------------------------------------------------*\
Get the position and size of the new view
\*--------------------------------------------------------------------*/
ProDrawingViewOutlineGet(drawing, view, outline);
/*--------------------------------------------------------------------*\
Create a projected view to the right of the general view
\*--------------------------------------------------------------------*/
pos[0] = outline[1][0] + (outline[1][0] - outline[0][0]);
pos[1] = (outline[0][1] + outline[1][1]) / 2.0;
pos[2] = 0.0;
ProDrawingProjectedviewCreate(drawing, view, PRO_B_FALSE, pos,
&pview);
/*--------------------------------------------------------------------*\
Create a projected view below the general view
\*--------------------------------------------------------------------*/
pos[0] = (outline[0][0] + outline[1][0]) / 2.0;
pos[1] = outline[0][1] - (outline[1][1] - outline[0][1]);
ProDrawingProjectedviewCreate(drawing, view, PRO_B_FALSE, pos,
&pview);
return(1);
}