/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*--------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProMdl.h>
#include <ProMenu.h>
#include <ProMessage.h>
#include <ProView.h>
#include <ProWindows.h>
#include <ProUtil.h>
/*--------------------------------------------------------------------*\
C System includes
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application includes
\*--------------------------------------------------------------------*/
#include "TestError.h"
#include "TestMenu.h"
#include "UtilFiles.h"
#include "UtilMatrix.h"
#include "UtilString.h"
#include "UtilMessage.h"
#include <ProTKRunTime.h>
#include <PTApplsUnicodeUtils.h>
#define EXT_VMTX ".vwm"
#define PRO_TEST_STORE_VIEW 1
#define PRO_TEST_RETRIEVE_VIEW 2
#define PRO_TEST_SET_VIEW 3
#define PRO_TEST_RESET_VIEW 4
#define PRO_TEST_REFRESH_VIEW 5
#define PRO_TEST_REDISPLAY_VIEW 6
#define PRO_TEST_ROTATE_VIEW_X 7
#define PRO_TEST_ROTATE_VIEW_Y 8
#define PRO_TEST_ROTATE_VIEW_Z 9
#define PRO_TEST_LIST_VIEWNAMES 10
#define PRO_TEST_REFIT_VIEW 11
#define PRO_TEST_REFIT_VINDOW 12
#define FPRINT3E(a,b,c) { \
ProTKFprintf (a, "%s %14.7e %14.7e %14.7e\n", \
b, c[0], c[1], c[2]); \
}
static ProMatrix tmatrix = {{1.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0},
{0.0, 0.0, 0.0, 1.0}};
/*====================================================================*\
FUNCTION : ProTestViewMenu()
PURPOSE : Set view test menu.
\*====================================================================*/
int ProTestViewMenu()
{
ProMdl model;
ProError status;
int menu_id, action;
/* Declare external functions */
extern int ProTestViewSet(ProAppData app_data, int option);
extern int ProTestViewRotate(ProAppData app_data, int option);
extern int ProTestViewStore(ProAppData app_data, int option);
extern int ProTestViewList(ProAppData app_data, int option);
#ifndef PROE_JR_BUILD
extern int ProTestViewMatrxWrite(ProAppData app_data, int option);
#endif
status = ProMdlCurrentGet(&model);
TEST_CALL_REPORT("ProMdlCurrentGet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
return(-1);
/* Set-up the menu. */
status = ProMenuFileRegister((char*)"TkView",(char*) "tkview.mnu", &menu_id);
TEST_CALL_REPORT("ProMenuFileRegister()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Set View",
(ProMenubuttonAction)ProTestViewSet, NULL, PRO_TEST_SET_VIEW);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Reset View",
(ProMenubuttonAction)ProTestViewSet, NULL, PRO_TEST_RESET_VIEW);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Refit View",
(ProMenubuttonAction)ProTestViewSet, NULL, PRO_TEST_REFIT_VIEW);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Refit Window",
(ProMenubuttonAction)ProTestViewSet, NULL, PRO_TEST_REFIT_VINDOW);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Rot View X",
(ProMenubuttonAction)ProTestViewRotate, NULL, PRO_TEST_ROTATE_VIEW_X);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Rot View Y",
(ProMenubuttonAction)ProTestViewRotate, NULL, PRO_TEST_ROTATE_VIEW_Y);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Rot View Z",
(ProMenubuttonAction)ProTestViewRotate, NULL, PRO_TEST_ROTATE_VIEW_Z);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Store View",
(ProMenubuttonAction)ProTestViewStore, NULL, PRO_TEST_STORE_VIEW);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Retrieve View",
(ProMenubuttonAction)ProTestViewStore, NULL, PRO_TEST_RETRIEVE_VIEW);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Refresh View",
(ProMenubuttonAction)ProTestViewSet, NULL, PRO_TEST_REFRESH_VIEW);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Redisplay View",
(ProMenubuttonAction)ProTestViewSet, NULL, PRO_TEST_REDISPLAY_VIEW);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-List Views",
(ProMenubuttonAction)ProTestViewList, NULL, PRO_TEST_LIST_VIEWNAMES);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
#ifndef PROE_JR_BUILD
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-View WinMatrx",
(ProMenubuttonAction)ProTestViewMatrxWrite, NULL, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
#endif
status = ProMenubuttonActionSet((char*)"TkView",(char*) "-Done/Return",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
/* Exit action for the menu. */
status = ProMenubuttonActionSet((char*)"TkView",(char*) "TkView",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
/* Display Menu and set it into action. */
status = ProMenuCreate(PROMENUTYPE_MAIN,(char*) "TkView", &menu_id);
TEST_CALL_REPORT("ProMenuCreate()", "ProTestView()",
status, status != PRO_TK_NO_ERROR);
status = ProMenuProcess((char*)"TkView", &action);
TEST_CALL_REPORT("ProMenuProcess()", "ProTestView()",
status, status != PRO_TK_NO_ERROR && status!= PRO_TK_E_FOUND);
return(1);
}
/*====================================================================*\
FUNCTION : ProTestViewSet()
PURPOSE : Set view matrix test.
\*====================================================================*/
int ProTestViewSet(ProAppData app_data, int option)
{
ProMatrix vmatrix, matrix;
ProError status;
double tvec[4];
int i, w_id;
status = ProWindowCurrentGet(&w_id);
TEST_CALL_REPORT("ProWindowCurrentGet()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
switch(option)
{
/* Set the view, using the identity matrix */
case PRO_TEST_SET_VIEW:
status = ProViewMatrixGet(NULL, NULL, vmatrix);
TEST_CALL_REPORT("ProViewMatrixGet()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
ProUtilMatrixCopy(tmatrix, matrix);
status = ProViewMatrixSet(NULL, NULL, matrix);
TEST_CALL_REPORT("ProViewMatrixSet()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowRepaint(PRO_VALUE_UNUSED);
TEST_CALL_REPORT("ProWindowRepaint()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
/* Now shift the matrix */
for(i=0; i<4; i++) tvec[i] = tmatrix[0][i];
for(i=0; i<4; i++) tmatrix[0][i] = tmatrix[1][i];
for(i=0; i<4; i++) tmatrix[1][i] = tmatrix[2][i];
for(i=0; i<4; i++) tmatrix[2][i] = tvec[i];
break;
/* Reset the view to default orientation */
case PRO_TEST_RESET_VIEW:
status = ProViewReset(NULL, NULL);
TEST_CALL_REPORT("ProViewReset()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowClear(w_id);
TEST_CALL_REPORT("ProWindowClear()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowRefresh(PRO_VALUE_UNUSED);
TEST_CALL_REPORT("ProWindowRefresh()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
break;
/* Refresh the window */
case PRO_TEST_REFRESH_VIEW:
status = ProWindowRefresh(PRO_VALUE_UNUSED);
TEST_CALL_REPORT("ProWindowRefresh()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
break;
/* Re-display the object */
case PRO_TEST_REDISPLAY_VIEW :
status = ProWindowClear(w_id);
TEST_CALL_REPORT("ProWindowClear()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowRefresh(PRO_VALUE_UNUSED);
TEST_CALL_REPORT("ProWindowRefresh()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
break;
case PRO_TEST_REFIT_VIEW:
status = ProViewRefit (NULL, NULL);
TEST_CALL_REPORT("ProViewRefit()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
break;
case PRO_TEST_REFIT_VINDOW:
status = ProWindowRefit (w_id);
TEST_CALL_REPORT("ProWindowRefit()", "ProTestViewSet()",
status, status != PRO_TK_NO_ERROR);
break;
default:
break;
}
return(1);
}
/*====================================================================*\
FUNCTION : ProTestViewRotate()
PURPOSE : Set rotated view.
\*====================================================================*/
int ProTestViewRotate(ProAppData app_data, int option)
{
double angle = 0.0;
double range[2] = {-180.0, 180.0};
int w_id;
ProError status;
status = ProWindowCurrentGet(&w_id);
TEST_CALL_REPORT("ProWindowCurrentGet()", "ProTestViewRotate()",
status, status != PRO_TK_NO_ERROR);
ProUtilMsgPrint("gen", "TEST %0s", "Enter an angle (-180,180): ");
status = ProMessageDoubleRead(range, &angle);
TEST_CALL_REPORT("ProMessageDoubleRead", "ProTestViewRotate()",
status, status != PRO_TK_NO_ERROR);
if(status != PRO_TK_NO_ERROR)
return(-1);
/* Perform the requested rotation */
switch(option)
{
case PRO_TEST_ROTATE_VIEW_X:
status = ProViewRotate(NULL, NULL, PRO_X_ROTATION, angle);
TEST_CALL_REPORT("ProViewRotate", "ProTestViewRotate()",
status, status != PRO_TK_NO_ERROR);
break;
case PRO_TEST_ROTATE_VIEW_Y:
ProViewRotate(NULL, NULL, PRO_Y_ROTATION, angle);
TEST_CALL_REPORT("ProViewRotate", "ProTestViewRotate()",
status, status != PRO_TK_NO_ERROR);
break;
case PRO_TEST_ROTATE_VIEW_Z:
ProViewRotate(NULL, NULL, PRO_Z_ROTATION, angle);
TEST_CALL_REPORT("ProViewRotate", "ProTestViewRotate()",
status, status != PRO_TK_NO_ERROR);
break;
default:
break;
}
status = ProWindowClear(w_id);
TEST_CALL_REPORT("ProWindowClear()", "ProTestViewRotate()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowRefresh(PRO_VALUE_UNUSED);
TEST_CALL_REPORT("ProWindowRefresh()", "ProTestViewRotate()",
status, status != PRO_TK_NO_ERROR);
return(1);
}
/*====================================================================*\
FUNCTION : ProTestViewStore()
PURPOSE : Store user's view.
\*====================================================================*/
int ProTestViewStore(ProAppData app_data, int option)
{
ProMdl model;
ProView p_view;
ProLine *view_names, *alt_names;
ProName menu_title, w_vname;
wchar_t **strings, **sel_str;
int num_views, i, n_sel;
ProError status;
/* Either store or retrieve a view */
switch(option)
{
case PRO_TEST_STORE_VIEW:
ProUtilMsgPrint("gen", "TEST %0s", "Enter a view name: ");
status = ProMessageStringRead(PRO_NAME_SIZE, w_vname);
TEST_CALL_REPORT("ProMessageStringRead", "ProTestViewStore",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
return(0);
status = ProViewStore(NULL, w_vname, &p_view);
TEST_CALL_REPORT("ProViewStore", "ProTestViewStore",
status, status != PRO_TK_NO_ERROR);
break;
case PRO_TEST_RETRIEVE_VIEW:
status = ProMdlCurrentGet(&model);
TEST_CALL_REPORT("ProMdlCurrentGet()", "ProTestViewStore()",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
return(-1);
status = ProViewNamesGet(model, &view_names, &alt_names, &num_views);
TEST_CALL_REPORT("ProViewNamesGet()", "ProTestViewStore()",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
{
ProUtilMsgPrint("gen", "TEST %0s", "Error in view names get.");
return(0);
}
else if (num_views <= 0)
{
ProUtilMsgPrint("gen", "TEST %0s", "No view has been stored!");
return(0);
}
/* Setup select menu for view names */
strings = (wchar_t **) calloc(num_views+1, sizeof(wchar_t *));
for (i = 0; i < num_views; i++) {
strings[i] = (wchar_t *) calloc(1, sizeof(ProName));
ProUtilWstrcpy(strings[i], view_names[i]);
}
strings[num_views] = (wchar_t *) calloc(1, sizeof(wchar_t));
ProStringToWstring(strings[num_views], (char*)"");
ProStringToWstring(menu_title, (char*)"VIEW NAMES");
status = ProMenuStringsSelect(menu_title, strings, 1, NULL,
&sel_str, &n_sel);
TEST_CALL_REPORT("ProMenuStringsSelect", "ProTestViewStore()",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
return(0);
else if (n_sel <= 0)
return(0);
status = ProViewRetrieve(NULL, sel_str[0], &p_view);
TEST_CALL_REPORT("ProViewRetrieve", "ProTestViewStore()",
status, status != PRO_TK_NO_ERROR);
/* Free the memory */
for (i = 0; i <= num_views; i++)
free((wchar_t *) strings[i]);
free((wchar_t **) strings);
ProArrayFree((ProArray *)&view_names);
ProArrayFree((ProArray *)&alt_names);
break;
default:
break;
}
return(1);
}
/*====================================================================*\
FUNCTION : ProTestViewList()
PURPOSE : List all stored views.
\*====================================================================*/
int ProTestViewList(ProAppData app_data, int option)
{
ProMdl model;
ProView p_view;
ProLine *view_names, *alt_names;
ProName w_fname;
char vname[PRO_NAME_SIZE], aname[PRO_NAME_SIZE];
char fname[] = "view_names.txt";
int num_views, i;
FILE *fp;
ProError status;
ProMatrix matrix;
status = ProMdlCurrentGet(&model);
TEST_CALL_REPORT("ProMdlCurrentGet()", "ProTestViewList()",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
return(-1);
status = ProViewNamesGet(model, &view_names, &alt_names, &num_views);
TEST_CALL_REPORT("ProViewNamesGet()", "ProTestViewList()",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
{
ProUtilMsgPrint("gen", "TEST %0s", "Error in view names get.");
return(0);
}
else if (num_views <= 0)
{
ProUtilMsgPrint("gen", "TEST %0s", "No view has been stored!");
return(0);
}
if ((fp = PTApplsUnicodeFopen(fname, "w")) == NULL) {
ProTKPrintf("\nThe output file [%s] cannot be opened.\n", fname);
return(0);
}
if (num_views > 0)
{
for (i = 0; i < num_views; i++)
{
ProTKFprintf(fp, "View Name %d: %s\t\tAlt Name: %s\n", i,
ProWstringToString(vname, view_names[i]),
ProWstringToString(aname, alt_names[i]) );
status = ProViewNameToView(model, view_names[i], &p_view);
TEST_CALL_REPORT("ProViewNameToView()", "ProTestViewList()",
status, status != PRO_TK_NO_ERROR);
status = ProViewMatrixGet(model, p_view, matrix);
TEST_CALL_REPORT("ProViewNameToView()", "ProTestViewList()",
status, status != PRO_TK_NO_ERROR);
FPRINT3E(fp, " matrix[0]", matrix[0]);
FPRINT3E(fp, " matrix[1]", matrix[1]);
FPRINT3E(fp, " matrix[2]", matrix[2]);
FPRINT3E(fp, " matrix[3]", matrix[3]);
}
fclose(fp);
ProStringToWstring(w_fname, fname);
ProInfoWindowDisplay(w_fname, NULL, NULL);
TEST_CALL_REPORT("ProInfoWindowDisplay", "ProTestViewList()",
status, status != PRO_TK_NO_ERROR);
}
else
{
ProTKFprintf(fp, "No view has been stored!\n");
fclose(fp);
ProUtilMsgPrint("gen", "TEST %0s", "No view has been stored!");
}
ProArrayFree((ProArray *) &view_names);
ProArrayFree((ProArray *) &alt_names);
return(num_views);
}
#ifndef PROE_JR_BUILD
/*====================================================================*\
FUNCTION : ProTestViewMatrxWrite()
PURPOSE : Write view matrix to a file.
\*====================================================================*/
int ProTestViewMatrxWrite(ProAppData app_data, int option)
{
ProMdl model;
ProMdlName model_name;
ProMdlType model_type;
ProCharName filename, name;
ProMatrix view, window, draw;
int w_id;
double width, height, x, y;
FILE *out_file;
ProError status;
status = ProMdlCurrentGet(&model);
TEST_CALL_REPORT("ProMdlCurrentGet()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
return(-1);
status = ProMdlMdlnameGet(model, model_name);
TEST_CALL_REPORT("ProMdlMdlnameGet()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
status = ProMdlTypeGet(model, &model_type);
TEST_CALL_REPORT("ProMdlTypeGet()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
out_file = ProUtilGenFilePtr(model, (char*)EXT_VMTX, filename, (char*)"w");
if( out_file == NULL )
{
ProTKPrintf("\nThe output file cannot be opened.\n");
return(0);
}
ProTKFprintf(out_file, "\n");
if(model_type == PRO_MDL_ASSEMBLY)
ProTKFprintf(out_file, "\n%s%s\n", "Assembly Name: ",
ProWstringToString(name, model_name) );
else if(model_type == PRO_MDL_PART)
ProTKFprintf(out_file, "\n%s%s\n", "Part Name: ",
ProWstringToString(name, model_name) );
/* For the view matrix */
ProTKFprintf(out_file, "\n");
status = ProViewMatrixGet(NULL, NULL, view);
TEST_CALL_REPORT("ProViewMatrixGet()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
FPRINT3E(out_file,"view[0]",view[0]);
FPRINT3E(out_file,"view[1]",view[1]);
FPRINT3E(out_file,"view[2]",view[2]);
FPRINT3E(out_file,"view[3]",view[3]);
/* For the window matrix */
ProTKFprintf(out_file, "\n");
status = ProWindowCurrentGet(&w_id);
TEST_CALL_REPORT("ProWindowCurrentGet()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowSizeGet(w_id, &width, &height);
TEST_CALL_REPORT("ProWindowSizeGet()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowPositionGet(w_id, &x, &y);
TEST_CALL_REPORT("ProWindowPositionGet()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
status = ProWindowCurrentMatrixGet(window);
TEST_CALL_REPORT("ProWindowCurrentMatrixGet(()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
ProTKFprintf(out_file, "Width = %7.3f Height = %7.3f X = %7.3f Y = %7.3f\n",
width, height, x, y);
FPRINT3E(out_file,"window[0]",window[0]);
FPRINT3E(out_file,"window[1]",window[1]);
FPRINT3E(out_file,"window[2]",window[2]);
FPRINT3E(out_file,"window[3]",window[3]);
/* For the drawing matrix */
ProTKFprintf(out_file, "\n");
status = ProViewMatrixGet(NULL, NULL, draw);
TEST_CALL_REPORT("ProViewMatrixGet()", "ProTestViewMatrxWrite()",
status, status != PRO_TK_NO_ERROR);
FPRINT3E(out_file,"draw[0]",draw[0]);
FPRINT3E(out_file,"draw[1]",draw[1]);
FPRINT3E(out_file,"draw[2]",draw[2]);
FPRINT3E(out_file,"draw[3]",draw[3]);
fclose (out_file);
return(0);
}
#endif