/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <ProToolkit.h>
#include <ProObjects.h>
#include <ProMfg.h>
#include <ProMenu.h>
#include <ProNotify.h>
#include <ProRmdt.h>
#include <UtilFiles.h>
#include <ProTKRunTime.h>
#include <PTApplsUnicodeUtils.h>
#include <ProUtil.h>
/*--------------------------------------------------------------------*\
Application includes
\*--------------------------------------------------------------------*/
#include "TestError.h"
/*--------------------------------------------------------------------*\
Application macros
\*--------------------------------------------------------------------*/
#define USER_ON 1
#define USER_OFF 0
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
static FILE *log_file;
static int preaction_status = USER_OFF;
/*=============================================================*\
FUNCTION: ProTestMoldLayoutInfo
PURPOSE: Test Mold Layout info functions
\*=============================================================*/
int ProTestMoldLayoutInfo(ProMdl *model)
{
ProError status;
ProMoldLayout mold_layout;
FILE *fp;
int i, cor, num_p;
char **p_par_nam, line[256];
wchar_t **pw_par_val, *w_name;
double xyz_p[3], xyz_m[3], xyz_t[3];
ProPath w_path;
char fname[PRO_FILE_NAME_SIZE];
ProTestQcrName(model, (char*)".inf", fname);
fp = PTApplsUnicodeFopen(fname, "w");
ProStringToWstring(w_path, fname);
status = ProMfgMoldLayoutGet((ProMfg)*model, &mold_layout);
TEST_CALL_REPORT("ProMfgMoldLayoutGet()", "ProTestMoldLayoutInfo()",
status, status != PRO_TK_NO_ERROR);
if (status != PRO_TK_NO_ERROR)
return (0);
ProTKFprintf(fp, (char*)"IMM\n");
status = ProRmdtImmInfoGet(mold_layout, &w_name, &p_par_nam, &pw_par_val,
&num_p);
TEST_CALL_REPORT("ProRmdtImmInfoGet()", "ProTestMoldLayoutInfo()",
status, status != PRO_TK_NO_ERROR);
if (status == PRO_TK_NO_ERROR) {
if (w_name != NULL)
{
ProWstringToString(line, w_name);
ProTKFprintf(fp, (char*)" %-20s %s\n", (char*)"Name", line);
}
for (i=0; i<num_p; i++)
{
if (pw_par_val[i] == NULL || p_par_nam[i] == NULL)
continue;
ProWstringToString(line, pw_par_val[i]);
ProTKFprintf(fp, (char*)" %-20s %s\n", p_par_nam[i], line);
}
}
else
ProTKFprintf(fp, (char*)" Unspecified\n");
ProTKFprintf(fp, (char*)"\nMaterial\n");
status = ProRmdtMaterialInfoGet(mold_layout, &p_par_nam, &pw_par_val,
&num_p);
TEST_CALL_REPORT("ProRmdtMaterialInfoGet()", "ProTestMoldLayoutInfo()",
status, status != PRO_TK_NO_ERROR);
if (status == PRO_TK_NO_ERROR) {
for (i=0; i<num_p; i++)
{
if (pw_par_val[i] == NULL || p_par_nam[i] == NULL)
continue;
ProWstringToString(line, pw_par_val[i]);
ProTKFprintf(fp, (char*)" %-20s %s\n", p_par_nam[i], line);
}
}
else
ProTKFprintf(fp, (char*)" Unspecified\n");
ProTKFprintf(fp, (char*)"\nMold Base\n");
status = ProRmdtMoldBaseInfoGet(mold_layout, &p_par_nam, &pw_par_val,
&num_p, &cor);
TEST_CALL_REPORT("ProRmdtMoldBaseInfoGet()", "ProTestMoldLayoutInfo()",
status, status != PRO_TK_NO_ERROR);
if (status == PRO_TK_NO_ERROR) {
for (i=0; i<num_p; i++)
{
if (pw_par_val[i] == NULL || p_par_nam[i] == NULL)
continue;
ProWstringToString(line, pw_par_val[i]);
ProTKFprintf(fp, (char*)" %-20s %s\n", p_par_nam[i], line);
}
ProTKFprintf(fp, (char*)" Corner %d\n", cor);
}
else
ProTKFprintf(fp, (char*)" Unspecified\n");
ProTKFprintf(fp, (char*)"\nRef Model\n");
for (i=0;;i++)
{
status = ProRmdtRefModelInfoGet(mold_layout, i, xyz_p, xyz_m, xyz_t);
if (status!=PRO_TK_NO_ERROR)
break;
TEST_CALL_REPORT("ProRmdtRefModelInfoGet()", "ProTestMoldLayoutInfo()",
status, status != PRO_TK_NO_ERROR);
ProTKFprintf(fp, (char*)" %3d + %7.2f %7.2f %7.2f\n"
" - %7.2f %7.2f %7.2f\n"
" Total %7.2f %7.2f %7.2f\n",
i, xyz_p[0], xyz_p[1], xyz_p[2],
xyz_m[0], xyz_m[1], xyz_m[2],
xyz_t[0], xyz_t[1], xyz_t[2]);
}
if (i<=0)
ProTKFprintf(fp, (char*)" Unspecified\n");
ProTKFprintf(fp, (char*)"\nWorkpiece\n");
for (i=0;;i++)
{
status = ProRmdtWorkpieceInfoGet(mold_layout, i, xyz_p, xyz_m, xyz_t);
if (status!=PRO_TK_NO_ERROR)
break;
TEST_CALL_REPORT("ProRmdtWorkpieceInfoGet()",
"ProTestMoldLayoutInfo()", status, status != PRO_TK_NO_ERROR);
ProTKFprintf(fp, (char*)" %3d + %7.2f %7.2f %7.2f\n"
" - %7.2f %7.2f %7.2f\n"
" Total %7.2f %7.2f %7.2f\n",
i, xyz_p[0], xyz_p[1], xyz_p[2],
xyz_m[0], xyz_m[1], xyz_m[2],
xyz_t[0], xyz_t[1], xyz_t[2]);
}
if (i<=0)
ProTKFprintf(fp, (char*)" Unspecified\n");
fclose(fp);
ProInfoWindowDisplay(w_path, NULL, NULL);
return 0;
}
/*=============================================================*\
FUNCTION: ProUtilLogFileWrite
PURPOSE: write one line into log file
\*=============================================================*/
static void ProUtilLogFileWrite(char *line)
{
if (log_file != NULL)
{
ProTKFprintf(log_file, (char*)"%s function called\n", line);
}
}
/*=============================================================*\
FUNCTION: ProTestRmdtCreateWpPreAction
PURPOSE: Preaction function. Called before workpice created
\*=============================================================*/
ProError ProTestRmdtCreateWpPreAction(
ProMoldLayout mold_layout)
{
ProDlgWorkpieceData wp_def_sets;
int i, j;
ProError err;
TEST_CALL_REPORT("ProRmdtCreateWpPreAction()",
"ProTestRmdtCreateWpPreAction()", (ProError)0, 0);
ProUtilLogFileWrite((char*)"PRO_RMDT_CREATE_WP_PRE");
memset(&wp_def_sets, '\0', sizeof(wp_def_sets));
wp_def_sets.IsRect = PRO_B_TRUE;
wp_def_sets.IsSym = PRO_B_TRUE;
wp_def_sets.rect_dim[0] = 100.0;
wp_def_sets.rect_dim[1] = 200.0;
wp_def_sets.rect_dim[2] = 300.0;
wp_def_sets.radial_z = 150.0;
wp_def_sets.radial_diam = 120.0;
for (i = 0; i < 2; i++)
for (j = 0; j < 3; j++)
wp_def_sets.allowance[i][j] = 10.0;
err = ProRmdtDlgWorkpieceSet(mold_layout, &wp_def_sets);
TEST_CALL_REPORT("ProRmdtDlgWorkpieceSet()",
"ProTestRmdtCreateWpPreAction()", err, err != PRO_TK_NO_ERROR);
return err;
}
/*=============================================================*\
FUNCTION: ProTestRmdtCreateImmPreAction
PURPOSE: Preaction function. Called before workpice created
\*=============================================================*/
ProError ProTestRmdtCreateImmPreAction(
ProMoldLayout mold_layout)
{
ProError err;
ProName w_name;
TEST_CALL_REPORT("ProRmdtCreateImmPreAction()",
"ProTestRmdtCreateImmPreAction()", (ProError)0, 0);
ProUtilLogFileWrite((char*)"PRO_RMDT_CREATE_IMM_PRE");
ProStringToWstring(w_name, (char*)"IMM_14x14");
err = ProRmdtDlgImmSet(mold_layout, w_name);
TEST_CALL_REPORT("ProRmdtDlgImmSet()",
"ProTestRmdtCreateImmPreAction()", err, err != PRO_TK_NO_ERROR);
return (err);
}
/*=============================================================*\
FUNCTION: ProTestRmdtBoundBoxPreAction
PURPOSE: Preaction function.
\*=============================================================*/
ProError ProTestRmdtBoundBoxPreAction(
ProMoldLayout mold_layout)
{
ProError err;
ProMatrix matrix = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
TEST_CALL_REPORT("ProRmdtBoundBoxPreAction()",
"ProTestRmdtBoundBoxPreAction()", (ProError)0, 0);
ProUtilLogFileWrite((char*)"PRO_RMDT_BOUND_BOX_PRE");
err = ProRmdtDlgRefModelOrientSet(mold_layout, matrix);
TEST_CALL_REPORT("ProRmdtDlgRefModelOrientSet()",
"ProTestRmdtBoundBoxPreAction()", err, err != PRO_TK_NO_ERROR);
return (err);
}
/*=============================================================*\
FUNCTION: ProTestRmdtCavLayoutPreAction
PURPOSE: Preaction function.
\*=============================================================*/
ProError ProTestRmdtCavLayoutPreAction(
ProMoldLayout mold_layout)
{
ProError err;
ProDlgCavityLayoutData cavdata;
TEST_CALL_REPORT("ProRmdtCavLayoutPreAction()",
"ProTestRmdtCavLayoutPreAction()", (ProError)0, 0);
ProUtilLogFileWrite((char*)"PRO_RMDT_CAV_LAYOUT_PRE");
memset(&cavdata, '\0', sizeof(cavdata));
cavdata.cavity_layout_type = 0;
cavdata.is_symmetric = PRO_B_TRUE;
cavdata.mirror_type = 0;
cavdata.num = 9;
cavdata.num_x = 3;
cavdata.num_y = 3;
cavdata.offset_x = 2.0;
cavdata.offset_y = 2.0;
cavdata.inc_x = 2.0;
cavdata.inc_y = 2.0;
err = ProRmdtDlgCavityLayoutSet(mold_layout, &cavdata);
TEST_CALL_REPORT("ProRmdtDlgCavityLayoutSet()",
"ProTestRmdtCavLayoutPreAction()", err, err != PRO_TK_NO_ERROR);
return (err);
}
/*=============================================================*\
FUNCTION: ProTestRmdtMaterialPreAction
PURPOSE: Preaction function.
\*=============================================================*/
ProError ProTestRmdtMaterialPreAction(
ProMoldLayout mold_layout)
{
ProError err;
ProName w_gentype, w_mfg, w_trade, w_grade;
TEST_CALL_REPORT("ProRmdtMaterialPreAction()",
"ProTestRmdtMaterialPreAction()", (ProError)0, 0);
ProUtilLogFileWrite((char*)"PRO_RMDT_MATERIAL_PRE");
ProStringToWstring(w_gentype, (char*)"Policarbonate");
ProStringToWstring(w_mfg, (char*)"GE_plastics");
ProStringToWstring(w_trade, (char*)"Lexan");
ProStringToWstring(w_grade, (char*)"101R");
err = ProRmdtDlgMaterialSet(mold_layout, w_gentype, w_mfg, w_trade,
w_grade);
TEST_CALL_REPORT("ProRmdtDlgMaterialSet()",
"ProTestRmdtMaterialPreAction()", err, err != PRO_TK_NO_ERROR);
return (err);
}
/*=============================================================*\
FUNCTION: ProTestRmdtBaseSelectPreAction
PURPOSE: Preaction function.
\*=============================================================*/
ProError ProTestRmdtBaseSelectPreAction(
ProMoldLayout mold_layout)
{
ProError err;
ProName w_vendor, w_series, w_length, w_width;
TEST_CALL_REPORT("ProRmdtMBaseSelectPreAction()",
"ProTestRmdtBaseSelectPreAction()", (ProError)0, 0);
ProUtilLogFileWrite((char*)"PRO_RMDT_MBASE_SELECT_PRE");
ProStringToWstring(w_vendor, (char*)"Futaba");
ProStringToWstring(w_series, (char*)"SA");
ProStringToWstring(w_length, (char*)"200");
ProStringToWstring(w_width, (char*)"200");
err = ProRmdtDlgMoldBaseSet(mold_layout, w_vendor, w_series, w_length,
w_width);
TEST_CALL_REPORT("ProRmdtDlgMoldBaseSet()",
"ProTestRmdtBaseSelectPreAction()", err, err != PRO_TK_NO_ERROR);
return (err);
}
/*====================================================================*\
FUNCTION : ProTestRmdtPreactionSet()
PURPOSE : Set/unset preaction functions for ProRmdt actions
\*====================================================================*/
int ProTestRmdtPreactionSet(
ProMdl *mdl,
int action)
{
ProError err;
preaction_status = action;
if (action == USER_OFF)
{
err = ProMenubuttonActivate((char*)"TkMoldLayout",(char*)"Preaction on");
TEST_CALL_REPORT("ProMenubuttonActivate()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProMenubuttonDeactivate((char*)"TkMoldLayout",(char*)"Preaction off");
TEST_CALL_REPORT("ProMenubuttonDeactivate()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
if (log_file != NULL)
{
fclose(log_file);
log_file = 0;
}
err = ProNotificationUnset(PRO_RMDT_CREATE_IMM_PRE);
TEST_CALL_REPORT("ProNotificationUnset()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationUnset(PRO_RMDT_BOUND_BOX_PRE);
TEST_CALL_REPORT("ProNotificationUnset()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationUnset(PRO_RMDT_CAV_LAYOUT_PRE);
TEST_CALL_REPORT("ProNotificationUnset()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationUnset(PRO_RMDT_CREATE_WP_PRE);
TEST_CALL_REPORT("ProNotificationUnset()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationUnset(PRO_RMDT_MATERIAL_PRE);
TEST_CALL_REPORT("ProNotificationUnset()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationUnset(PRO_RMDT_MBASE_SELECT_PRE);
TEST_CALL_REPORT("ProNotificationUnset()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
}
else
{
err = ProMenubuttonActivate((char*)"TkMoldLayout",(char*)"Preaction off");
TEST_CALL_REPORT("ProMenubuttonActivate()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProMenubuttonDeactivate((char*)"TkMoldLayout",(char*)"Preaction on");
TEST_CALL_REPORT("ProMenubuttonDeactivate()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
if (log_file == NULL)
{
log_file = PTApplsUnicodeFopen("rmdt_notify.log", "w");
}
err = ProNotificationSet(PRO_RMDT_CREATE_IMM_PRE,
(ProFunction)ProTestRmdtCreateImmPreAction);
TEST_CALL_REPORT("ProNotificationSet()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationSet(PRO_RMDT_BOUND_BOX_PRE,
(ProFunction)ProTestRmdtBoundBoxPreAction);
TEST_CALL_REPORT("ProNotificationSet()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationSet(PRO_RMDT_CAV_LAYOUT_PRE,
(ProFunction)ProTestRmdtCavLayoutPreAction);
TEST_CALL_REPORT("ProNotificationSet()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationSet(PRO_RMDT_CREATE_WP_PRE,
(ProFunction)ProTestRmdtCreateWpPreAction);
TEST_CALL_REPORT("ProNotificationSet()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationSet(PRO_RMDT_MATERIAL_PRE,
(ProFunction)ProTestRmdtMaterialPreAction);
TEST_CALL_REPORT("ProNotificationSet()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
err = ProNotificationSet(PRO_RMDT_MBASE_SELECT_PRE,
(ProFunction)ProTestRmdtBaseSelectPreAction);
TEST_CALL_REPORT("ProNotificationSet()",
"ProTestRmdtPreactionSet()", err, err != PRO_TK_NO_ERROR);
}
return (0);
}
/*====================================================================*\
FUNCTION : ProTestMoldLayoutMenu()
PURPOSE : Define and activate menu of Toolkit Test commands Mold layout
\*====================================================================*/
int ProTestMoldLayoutMenu()
{
ProError status;
ProMdl model;
int action;
status = ProMdlCurrentGet(&model);
TEST_CALL_REPORT("ProMdlCurrentGet()", "ProTestMoldLayoutMenu()",
status, status != PRO_TK_NO_ERROR);
ProMenuFileRegister((char*)"TkMoldLayout",(char*)"tkrmdt.mnu", NULL);
ProMenubuttonActionSet((char*)"TkMoldLayout",(char*)"TkMoldLayout",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
ProMenubuttonActionSet((char*)"TkMoldLayout",(char*)"Preaction on",
(ProMenubuttonAction)ProTestRmdtPreactionSet, &model, USER_ON);
ProMenubuttonActionSet((char*)"TkMoldLayout",(char*)"Preaction off",
(ProMenubuttonAction)ProTestRmdtPreactionSet, &model, USER_OFF);
ProMenubuttonActionSet((char*)"TkMoldLayout",(char*)"-Info",
(ProMenubuttonAction)ProTestMoldLayoutInfo, &model, 0);
ProMenubuttonActionSet((char*)"TkMoldLayout",(char*)"Done TkML",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
ProMenuCreate(PROMENUTYPE_MAIN, (char*)"TkMoldLayout", NULL);
ProTestRmdtPreactionSet(&model, preaction_status);
ProMenuProcess((char*)"", &action);
return (0);
}