/* 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