/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <GearDesign.h>
#include <ProUI.h>
#include <ProUIDialog.h>
#include <ProParameter.h>
#include <ProUIRadiogroup.h>
#include <ProUILabel.h>
#include <ProUICascadebutton.h>
#include <ProUICheckbutton.h>
#include <ProUIDashboard.h>
#include <ProUIDrawingarea.h>
#include <ProUIInputpanel.h>
#include <ProUIPushbutton.h>
#include <ProUISpinbox.h>
#include <ProUITable.h>
#include <UtilString.h>
#include <ProUITab.h>
#include <ProMessage.h>
#include <stdlib.h>
#define GD_UI_MAIN "geardesigndlg"
#define GD_UI_CLOSEBTN "CloseBtn"
#define GD_UI_CLOSEBTN_M "CloseBtn_M"
#define GD_UI_LOADBTN_M "LoadBtn_M"
#define GD_UI_GEARTYPE_GROUP_M "GearTypeGroup_M"
#define GD_UI_LOADBTN_RMB "LoadBtn_RMB"
#define GD_UI_GEARTYPE_GROUP_RMB "GearTypeGroup_RMB"
#define GD_UI_TOOL_DELETE_M "DeleteBtn_M"
#define GD_UI_TOOL_MODIFY_M "ModifyBtn_M"
#define GD_UI_TOOL_REGENERATE_M "RegenerateBtn_M"
#define GD_UI_TOOL_MATERIAL_M "MaterialBtn_M"
#define GD_UI_TOOL_SAVEDVIEWS_CASCADE_M "SavedViewsCascade_M"
#define GD_UI_TOOL_VIEW_CHOICE_M "SavedViewsChoice_M"
#define GD_UI_TOOL_VIEW_DEFAULTCREATE_M "CreateDefaultView_M"
#define GD_UI_TOOL_VIEW_STORE_M "StoreView_M"
#define GD_UI_GROUP_SPUR "SPUR"
#define GD_UI_GROUP_RING "RING"
#define GD_UI_GROUP_HELICAL "HELICAL"
#define GD_UI_LOADBTN "LoadBtn"
#define GD_UI_CREATEBTN "CreateButton"
#define GD_UI_MAINTAB "GearDesignSteps"
#define GD_UI_DATUM_LAYOUT "DefaultDatums"
#define GD_UI_DISK_LAYOUT "GearDisk"
#define GD_UI_HOLE_LAYOUT "GearHole"
#define GD_UI_HUB_LAYOUT "GearHub"
#define GD_UI_BACKPLATE_LAYOUT "GearBackPlate"
#define GD_UI_TEETH_LAYOUT "GearTeeth"
#define GD_UI_LABEL_COMPLETED "CreatedLabel"
#define GD_UI_LABEL_NOT_COMPLETED "NotCreatedLabel"
#define GD_UI_STATUS_TABLE "ComponentsTable"
#define GD_UI_STATUS_DONECOL "Created"
#define GD_UI_STATUS_COMPCOL "Component"
#define GD_UI_STATUS_REQCOL "Required"
#define GD_UI_DATUM_ROW "Datums"
#define GD_UI_DISK_ROW "Disk"
#define GD_UI_HOLE_ROW "Hole"
#define GD_UI_HUB_ROW "Hub"
#define GD_UI_BACKPLATE_ROW "Back Plate"
#define GD_UI_TEETH_ROW "Teeth"
#define GD_UI_XOFFSET_INPUT "XOffsetInput"
#define GD_UI_YOFFSET_INPUT "YOffsetInput"
#define GD_UI_ZOFFSET_INPUT "ZOffsetInput"
#define GD_UI_GEARDISK_W_INPUT "GearDiskWidth"
#define GD_UI_GEARDISK_D_INPUT "GearDiskDiameter"
#define GD_UI_GEARHOLE_D_INPUT "GearHoleDiameter"
#define GD_UI_KEYWAY_W_INPUT "KeywayWidth"
#define GD_UI_KEYWAY_H_INPUT "KeywayHeight"
#define GD_UI_KEYWAY_W_LABEL "KeywayWidthLabel"
#define GD_UI_KEYWAY_H_LABEL "KeywayHeightLabel"
#define GD_UI_INCLUDE_KEYWAY "IncludeKeywayCheck"
#define GD_UI_GEARHUB_D_INPUT "HubDiameter"
#define GD_UI_GEARHUB_T_INPUT "HubThickness"
#define GD_UI_KEY_W_INPUT "KeyWidth"
#define GD_UI_KEY_H_INPUT "KeyHeight"
#define GD_UI_KEY_W_LABEL "KeyWidthLabel"
#define GD_UI_KEY_H_LABEL "KeyHeightLabel"
#define GD_UI_INCLUDE_KEY "IncludeKeyCheck"
#define GD_UI_BN_R_INPUT "BackNotchRadius"
#define GD_UI_BP_D_INPUT "BackPlateDiameter"
#define GD_UI_BP_T_INPUT "BackPlateThickness"
#define GD_UI_BN_R_LABEL "BackNotchRadiusLabel"
#define GD_UI_INCLUDE_BN "IncludeBacknotchCheck"
#define GD_UI_N_TEETH_SPINBOX "NumTeeth"
#define GD_UI_TOOTH_INNER_SURF_LABEL "ToothInnerSurfaceLabel"
#define GD_UI_TOOTH_INNER_SURF_INPUT "ToothInnerSurface"
#define GD_UI_TOOTH_PRESSURE_ANGLE "GearToothPressureAngle"
#define GD_UI_TOOTH_P1_INPUT "GearToothParam1"
#define GD_UI_HELIX_ANGLE "HelixAngle"
#define GD_UI_HELIX_ANGLE_LABEL "HelixAngleLabel"
#define GD_UI_MENUPANE_RMB "MenuPane_RMB"
static int ProTKGDUIDatumFromUIUpdate (GearParam* g_ptr);
static int ProTKGDUIDatumUIUpdate (GearParam* g_ptr);
static int ProTKGDUIDiskFromUIUpdate (GearParam* g_ptr);
static int ProTKGDUIDiskUIUpdate (GearParam* g_ptr);
static int ProTKGDUIHoleFromUIUpdate (GearParam* g_ptr);
static int ProTKGDUIHoleUIUpdate (GearParam* g_ptr);
static int ProTKGDUIHubFromUIUpdate (GearParam* g_ptr);
static int ProTKGDUIHubUIUpdate (GearParam* g_ptr);
static int ProTKGDUIBackplateFromUIUpdate (GearParam* g_ptr);
static int ProTKGDUIBackplateUIUpdate (GearParam* g_ptr);
static int ProTKGDUITeethFromUIUpdate (GearParam* g_ptr);
static int ProTKGDUITeethUIUpdate (GearParam* g_ptr);
static ProBoolean ProTKGDUICreateButtonUpdate (GearParam* g_ptr);
int ProTKGDUIStatusTableInit (GearParam* g_ptr);
int ProTKGDUIStatusTableRowUpdate (GearParam* g_ptr, ProTKGDStep step, char* new_row_name);
typedef int (*ProTKGDUIInteractionFunction) (GearParam* g_ptr);
/*--------------------------------------------------------------------*\
Links creation step to table and layouts in the UI.
\*--------------------------------------------------------------------*/
typedef struct
{
ProTKGDStep step;
char* step_layout;
char* step_row_name;
ProTKGDUIInteractionFunction update_from_ui_function;
ProTKGDUIInteractionFunction update_ui_function;
} ProTKGDUIStepComponent;
static ProTKGDUIStepComponent gd_components [] =
{
{PTK_GD_DATUM, GD_UI_DATUM_LAYOUT, GD_UI_DATUM_ROW,
ProTKGDUIDatumFromUIUpdate, ProTKGDUIDatumUIUpdate},
{PTK_GD_DISK, GD_UI_DISK_LAYOUT, GD_UI_DISK_ROW,
ProTKGDUIDiskFromUIUpdate, ProTKGDUIDiskUIUpdate},
{PTK_GD_HOLE, GD_UI_HOLE_LAYOUT, GD_UI_HOLE_ROW,
ProTKGDUIHoleFromUIUpdate, ProTKGDUIHoleUIUpdate},
{PTK_GD_HUB, GD_UI_HUB_LAYOUT, GD_UI_HUB_ROW,
ProTKGDUIHubFromUIUpdate, ProTKGDUIHubUIUpdate},
{PTK_GD_BACKPLATE, GD_UI_BACKPLATE_LAYOUT, GD_UI_BACKPLATE_ROW,
ProTKGDUIBackplateFromUIUpdate, ProTKGDUIBackplateUIUpdate},
{PTK_GD_TEETH, GD_UI_TEETH_LAYOUT, GD_UI_TEETH_ROW,
ProTKGDUITeethFromUIUpdate, ProTKGDUITeethUIUpdate},
};
static ProError status;
/*=============================================================*\
Function: ProTKGDUIDatumUIUpdate
Purpose: Datum parameters -> UI
\*=============================================================*/
int ProTKGDUIDatumUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_XOFFSET_INPUT, g_ptr->datum_x_offset);
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_YOFFSET_INPUT, g_ptr->datum_y_offset);
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_ZOFFSET_INPUT, g_ptr->datum_z_offset);
ProTKGDUICreateButtonUpdate (g_ptr);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIDatumFromUIUpdate
Purpose: Datum parameters <- UI
\*=============================================================*/
int ProTKGDUIDatumFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_XOFFSET_INPUT, &g_ptr->datum_x_offset);
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_YOFFSET_INPUT, &g_ptr->datum_y_offset);
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_ZOFFSET_INPUT, &g_ptr->datum_z_offset);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIDiskUIUpdate
Purpose: Disk parameters -> UI
\*=============================================================*/
int ProTKGDUIDiskUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_GEARDISK_D_INPUT, g_ptr->gear_diam);
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_GEARDISK_W_INPUT, g_ptr->gear_depth);
if (g_ptr->gear_type == HELICAL_GEAR)
{
ProUILabelShow (GD_UI_MAIN, GD_UI_HELIX_ANGLE_LABEL);
ProUIInputpanelShow (GD_UI_MAIN, GD_UI_HELIX_ANGLE);
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_HELIX_ANGLE, g_ptr->helix_angle);
}
else
{
ProUILabelHide (GD_UI_MAIN, GD_UI_HELIX_ANGLE_LABEL);
ProUIInputpanelHide (GD_UI_MAIN, GD_UI_HELIX_ANGLE);
}
if (ProTKGDUICreateButtonUpdate (g_ptr))
{
if (g_ptr->gear_depth == 0.0 || g_ptr->gear_diam == 0.0)
ProUIPushbuttonDisable (GD_UI_MAIN, GD_UI_CREATEBTN);
else
ProUIPushbuttonEnable (GD_UI_MAIN, GD_UI_CREATEBTN);
}
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIDiskFromUIUpdate
Purpose: Disk parameters <- UI
\*=============================================================*/
int ProTKGDUIDiskFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_GEARDISK_D_INPUT, &g_ptr->gear_diam);
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_GEARDISK_W_INPUT, &g_ptr->gear_depth);
if (g_ptr->gear_type == HELICAL_GEAR)
{
ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_HELIX_ANGLE, &g_ptr->helix_angle);
}
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIKeywayUIUpdate
Purpose: Keyway parameters -> UI
\*=============================================================*/
int ProTKGDUIKeywayUIUpdate (GearParam* g_ptr, ProBoolean create)
{
if (create)
{
ProUILabelEnable (GD_UI_MAIN, GD_UI_KEYWAY_W_LABEL);
ProUILabelEnable (GD_UI_MAIN, GD_UI_KEYWAY_H_LABEL);
ProUIInputpanelEnable (GD_UI_MAIN, GD_UI_KEYWAY_W_INPUT);
ProUIInputpanelEnable (GD_UI_MAIN, GD_UI_KEYWAY_H_INPUT);
}
else
{
ProUILabelDisable (GD_UI_MAIN, GD_UI_KEYWAY_W_LABEL);
ProUILabelDisable (GD_UI_MAIN, GD_UI_KEYWAY_H_LABEL);
ProUIInputpanelDisable (GD_UI_MAIN, GD_UI_KEYWAY_W_INPUT);
ProUIInputpanelDisable (GD_UI_MAIN, GD_UI_KEYWAY_H_INPUT);
}
ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_KEYWAY_W_INPUT, g_ptr->keyway_in_width);
ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_KEYWAY_H_INPUT, g_ptr->keyway_in_height);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIKeywayFromUIUpdate
Purpose: Keyway parameters <- UI
\*=============================================================*/
int ProTKGDUIKeywayFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_KEYWAY_W_INPUT, &g_ptr->keyway_in_width);
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_KEYWAY_H_INPUT, &g_ptr->keyway_in_height);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIHoleUIUpdate
Purpose: Hole parameters -> UI
\*=============================================================*/
int ProTKGDUIHoleUIUpdate (GearParam* g_ptr)
{
ProBoolean show_keyway;
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_GEARHOLE_D_INPUT, g_ptr->inner_diam);
if (ProTKGDUICreateButtonUpdate (g_ptr))
{
if (g_ptr->inner_diam == 0.0)
ProUIPushbuttonDisable (GD_UI_MAIN, GD_UI_CREATEBTN);
else
ProUIPushbuttonEnable (GD_UI_MAIN, GD_UI_CREATEBTN);
}
show_keyway = (g_ptr->keyway_created)?PRO_B_TRUE:PRO_B_FALSE;
ProTKGDUIKeywayUIUpdate (g_ptr, show_keyway);
if (g_ptr->keyway_created)
ProUICheckbuttonSet (GD_UI_MAIN, GD_UI_INCLUDE_KEYWAY);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIHoleFromUIUpdate
Purpose: Hole parameters <- UI
\*=============================================================*/
int ProTKGDUIHoleFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_GEARHOLE_D_INPUT, &g_ptr->inner_diam);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIKeyUIUpdate
Purpose: Key parameters -> UI
\*=============================================================*/
int ProTKGDUIKeyUIUpdate (GearParam* g_ptr, ProBoolean create)
{
if (create)
{
ProUILabelEnable (GD_UI_MAIN, GD_UI_KEY_W_LABEL);
ProUILabelEnable (GD_UI_MAIN, GD_UI_KEY_H_LABEL);
ProUIInputpanelEnable (GD_UI_MAIN, GD_UI_KEY_W_INPUT);
ProUIInputpanelEnable (GD_UI_MAIN, GD_UI_KEY_H_INPUT);
}
else
{
ProUILabelDisable (GD_UI_MAIN, GD_UI_KEY_W_LABEL);
ProUILabelDisable (GD_UI_MAIN, GD_UI_KEY_H_LABEL);
ProUIInputpanelDisable (GD_UI_MAIN, GD_UI_KEY_W_INPUT);
ProUIInputpanelDisable (GD_UI_MAIN, GD_UI_KEY_H_INPUT);
}
ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_KEY_W_INPUT, g_ptr->keyway_out_width);
ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_KEY_H_INPUT, g_ptr->keyway_out_height);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIKeyFromUIUpdate
Purpose: Key parameters <- UI
\*=============================================================*/
int ProTKGDUIKeyFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_KEY_W_INPUT, &g_ptr->keyway_out_width);
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_KEY_H_INPUT, &g_ptr->keyway_out_height);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIHubUIUpdate
Purpose: Hub parameters -> UI
\*=============================================================*/
int ProTKGDUIHubUIUpdate (GearParam* g_ptr)
{
ProBoolean show_key;
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_GEARHUB_D_INPUT, g_ptr->hub_out_diam);
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_GEARHUB_T_INPUT, g_ptr->hub_depth);
if (ProTKGDUICreateButtonUpdate (g_ptr))
{
if (g_ptr->hub_out_diam == 0.0 || g_ptr->hub_depth == 0.0)
ProUIPushbuttonDisable (GD_UI_MAIN, GD_UI_CREATEBTN);
else
ProUIPushbuttonEnable (GD_UI_MAIN, GD_UI_CREATEBTN);
}
show_key = (g_ptr->key_created)?PRO_B_TRUE:PRO_B_FALSE;
ProTKGDUIKeyUIUpdate (g_ptr, show_key);
if (g_ptr->key_created)
ProUICheckbuttonSet (GD_UI_MAIN, GD_UI_INCLUDE_KEY);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIHubFromUIUpdate
Purpose: Hub parameters <- UI
\*=============================================================*/
int ProTKGDUIHubFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_GEARHUB_D_INPUT, &g_ptr->hub_out_diam);
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_GEARHUB_T_INPUT, &g_ptr->hub_depth);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIBacknotchUIUpdate
Purpose: Backnotch parameters -> UI
\*=============================================================*/
int ProTKGDUIBacknotchUIUpdate (GearParam* g_ptr, ProBoolean create)
{
if (create)
{
ProUILabelEnable (GD_UI_MAIN, GD_UI_BN_R_LABEL);
ProUIInputpanelEnable (GD_UI_MAIN, GD_UI_BN_R_INPUT);
}
else
{
ProUILabelDisable (GD_UI_MAIN, GD_UI_BN_R_LABEL);
ProUIInputpanelDisable (GD_UI_MAIN, GD_UI_BN_R_INPUT);
}
ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_BN_R_INPUT, g_ptr->backnotch_rad);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIBacknotchFromUIUpdate
Purpose: Backnotch parameters <- UI
\*=============================================================*/
int ProTKGDUIBacknotchFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_BN_R_INPUT, &g_ptr->backnotch_rad);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIBackplateUIUpdate
Purpose: Backplate parameters -> UI
\*=============================================================*/
int ProTKGDUIBackplateUIUpdate (GearParam* g_ptr)
{
ProBoolean show_bn;
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_BP_D_INPUT, g_ptr->backplate_diam);
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_BP_T_INPUT, g_ptr->backplate_depth);
if (ProTKGDUICreateButtonUpdate (g_ptr))
{
if (/*g_ptr->backplate_created || */g_ptr->backplate_diam == 0.0 || g_ptr->backplate_depth == 0.0)
ProUIPushbuttonDisable (GD_UI_MAIN, GD_UI_CREATEBTN);
else
ProUIPushbuttonEnable (GD_UI_MAIN, GD_UI_CREATEBTN);
}
show_bn = (g_ptr->backnotch_created)?PRO_B_TRUE:PRO_B_FALSE;
ProTKGDUIBacknotchUIUpdate (g_ptr, show_bn);
if (g_ptr->backnotch_created)
ProUICheckbuttonSet (GD_UI_MAIN, GD_UI_INCLUDE_BN);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIBackplateFromUIUpdate
Purpose: Backplate parameters <- UI
\*=============================================================*/
int ProTKGDUIBackplateFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_BP_D_INPUT, &g_ptr->backplate_diam);
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_BP_T_INPUT, &g_ptr->backplate_depth);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUITeethUIUpdate
Purpose: Teeth parameters -> UI
\*=============================================================*/
int ProTKGDUITeethUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_TOOTH_PRESSURE_ANGLE, g_ptr->Pressure_angle);
status = ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_TOOTH_P1_INPUT, g_ptr->tooth_par1);
status = ProUISpinboxIntegerSet (GD_UI_MAIN, GD_UI_N_TEETH_SPINBOX, g_ptr->n_of_teeth);
if (g_ptr->gear_type == RING_GEAR)
{
ProUILabelShow (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_LABEL);
ProUIInputpanelShow (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_INPUT);
ProUIInputpanelDoubleSet (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_INPUT,
g_ptr->inner_diam);
}
else
{
ProUILabelHide (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_LABEL);
ProUIInputpanelHide (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_INPUT);
}
if (ProTKGDUICreateButtonUpdate (g_ptr))
{
if ( g_ptr->Pressure_angle == 0.0 ||
g_ptr->tooth_par1 == 0.0 || g_ptr->n_of_teeth == 0)
ProUIPushbuttonDisable (GD_UI_MAIN, GD_UI_CREATEBTN);
else
ProUIPushbuttonEnable (GD_UI_MAIN, GD_UI_CREATEBTN);
}
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUITeethFromUIUpdate
Purpose: Teeth parameters <- UI
\*=============================================================*/
int ProTKGDUITeethFromUIUpdate (GearParam* g_ptr)
{
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_TOOTH_PRESSURE_ANGLE, &g_ptr->Pressure_angle);
status = ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_TOOTH_P1_INPUT, &g_ptr->tooth_par1);
status = ProUISpinboxIntegerGet (GD_UI_MAIN, GD_UI_N_TEETH_SPINBOX, &g_ptr->n_of_teeth);
if (g_ptr->gear_type == RING_GEAR)
ProUIInputpanelDoubleGet (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_INPUT,
&g_ptr->inner_diam);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIStepFromTableGet
Purpose: Utility: Get step id from table row
\*=============================================================*/
int ProTKGDUIStepFromTableGet (char* table_row, ProTKGDStep* step)
{
int ii;
for (ii = 0; ii < NUM_GD_STEPS; ii ++)
{
if (strcmp (table_row, gd_components[ii].step_row_name) == 0)
{
*step = gd_components [ii].step;
return (int)PRO_TK_NO_ERROR;
}
}
return (int)PRO_TK_GENERAL_ERROR;
}
/*=============================================================*\
Function: ProTKGDUICreateButtonUpdate
Purpose: Utility: Update sensitivity of "Create" menu button
\*=============================================================*/
ProBoolean ProTKGDUICreateButtonUpdate (GearParam* g_ptr)
{
ProTKGDStep step = g_ptr->current_step;
ProBoolean enable;
switch (step)
{
case PTK_GD_DATUM:
enable = (g_ptr->datum_created ? PRO_B_FALSE : PRO_B_TRUE);
break;
case PTK_GD_DISK:
enable = (g_ptr->disk_created ? PRO_B_FALSE : PRO_B_TRUE);
break;
case PTK_GD_HOLE:
enable = (g_ptr->hole_created ? PRO_B_FALSE : PRO_B_TRUE);
break;
case PTK_GD_HUB:
enable = (g_ptr->hub_created ? PRO_B_FALSE : PRO_B_TRUE);
break;
case PTK_GD_BACKPLATE:
enable = (g_ptr->backplate_created ? PRO_B_FALSE : PRO_B_TRUE);
break;
case PTK_GD_TEETH:
enable = (g_ptr->teeth_created ? PRO_B_FALSE : PRO_B_TRUE);
break;
}
if (enable)
{
if (step != PTK_GD_DATUM && !g_ptr->datum_created)
enable = PRO_B_FALSE;
if (step != PTK_GD_DATUM && step != PTK_GD_DISK && !g_ptr->disk_created)
enable = PRO_B_FALSE;
if (g_ptr->gear_type == RING_GEAR)
if (step != PTK_GD_DATUM && step != PTK_GD_DISK && step != PTK_GD_BACKPLATE && !g_ptr->backplate_created)
enable = PRO_B_FALSE;
}
if (enable)
ProUIPushbuttonEnable (GD_UI_MAIN, GD_UI_CREATEBTN);
else
ProUIPushbuttonDisable (GD_UI_MAIN, GD_UI_CREATEBTN);
return enable;
}
/*=============================================================*\
Function: ProTKGDUIToggleType
Purpose: Utility: toggle type (ring <-> spur) in the UI
\*=============================================================*/
void ProTKGDUIToggleType (GearParam* g_ptr)
{
/* Clear status table */
ProUITableCellComponentDelete (GD_UI_MAIN, GD_UI_STATUS_TABLE,
GD_UI_DATUM_ROW, GD_UI_STATUS_DONECOL);
ProUITableCellComponentDelete (GD_UI_MAIN, GD_UI_STATUS_TABLE,
GD_UI_DISK_ROW, GD_UI_STATUS_DONECOL);
if (g_ptr->gear_type == HELICAL_GEAR)
{
ProUILabelShow (GD_UI_MAIN, GD_UI_HELIX_ANGLE_LABEL);
ProUIInputpanelShow (GD_UI_MAIN, GD_UI_HELIX_ANGLE);
}
else
{
ProUILabelHide (GD_UI_MAIN, GD_UI_HELIX_ANGLE_LABEL);
ProUIInputpanelHide (GD_UI_MAIN, GD_UI_HELIX_ANGLE);
}
ProUITableCellComponentDelete (GD_UI_MAIN, GD_UI_STATUS_TABLE,
GD_UI_HOLE_ROW, GD_UI_STATUS_DONECOL);
ProUITableCellComponentDelete (GD_UI_MAIN, GD_UI_STATUS_TABLE,
GD_UI_HUB_ROW, GD_UI_STATUS_DONECOL);
ProUITableCellComponentDelete (GD_UI_MAIN, GD_UI_STATUS_TABLE,
GD_UI_BACKPLATE_ROW, GD_UI_STATUS_DONECOL);
ProUITableCellComponentDelete (GD_UI_MAIN, GD_UI_STATUS_TABLE,
GD_UI_TEETH_ROW, GD_UI_STATUS_DONECOL);
ProUITableRownamesSet (GD_UI_MAIN, GD_UI_STATUS_TABLE, 0, NULL);
if (g_ptr->gear_type == RING_GEAR)
{
ProUILabelShow (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_LABEL);
ProUIInputpanelShow (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_INPUT);
}
else
{
ProUILabelHide (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_LABEL);
ProUIInputpanelHide (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_INPUT);
}
/* Reinitialize it */
ProTKGDUIStatusTableInit (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUISelectNext
Purpose: Utility: select next item (typically after creation)
\*=============================================================*/
int ProTKGDUISelectNext (GearParam* g_ptr, ProTKGDStep step)
{
ProTKGDStepInfo* order;
int ii, current_index;
ProTKGDStep next_step;
char * next_select [2];
switch (g_ptr->gear_type)
{
case SPUR_GEAR:
order = (ProTKGDStepInfo*)spur_gear_designinfo;
break;
case HELICAL_GEAR:
order = (ProTKGDStepInfo*)helical_gear_designinfo;
break;
case RING_GEAR:
order = (ProTKGDStepInfo*)ring_gear_designinfo;
break;
}
for (ii = 0; ii < NUM_GD_STEPS; ii++)
{
if (order[ii].step == step)
{
current_index = ii;
break;
}
}
ProTKGDUIStatusTableRowUpdate (g_ptr, step, gd_components[step].step_row_name);
if (current_index != NUM_GD_STEPS - 1)
{
next_step = order [current_index + 1].step;
next_select[0] = gd_components[next_step].step_row_name;
next_select[1] = GD_UI_STATUS_COMPCOL;
g_ptr->current_step = next_step;
ProUITableSelectednamesSet (GD_UI_MAIN, GD_UI_STATUS_TABLE,
2, next_select);
ProUITabSelectednamesSet (GD_UI_MAIN, GD_UI_MAINTAB,
1, &gd_components[next_step].step_layout);
gd_components [next_step].update_ui_function (g_ptr);
}
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIStatusTableRowUpdate
Purpose: Utility: update the creation status icon in table
\*=============================================================*/
int ProTKGDUIStatusTableRowUpdate (GearParam* g_ptr,
ProTKGDStep step,
char* new_row_name)
{
ProBoolean created = PRO_B_FALSE;
char* current_component;
char* new_component;
char* source_label;
switch (step)
{
case PTK_GD_DATUM:
if (g_ptr->datum_created)
created = PRO_B_TRUE;
new_component = "DatumCreatedLabel";
break;
case PTK_GD_DISK:
if (g_ptr->disk_created)
created = PRO_B_TRUE;
new_component = "DiskCreatedLabel";
break;
case PTK_GD_HOLE:
if (g_ptr->hole_created)
created = PRO_B_TRUE;
new_component = "HoleCreatedLabel";
break;
case PTK_GD_HUB:
if (g_ptr->hub_created)
created = PRO_B_TRUE;
new_component = "HubCreatedLabel";
break;
case PTK_GD_BACKPLATE:
if (g_ptr->backplate_created)
created = PRO_B_TRUE;
new_component = "BackplateCreatedLabel";
break;
case PTK_GD_TEETH:
if (g_ptr->teeth_created)
created = PRO_B_TRUE;
new_component = "TeethCreatedLabel";
break;
}
ProUITableCellComponentDelete (GD_UI_MAIN,
GD_UI_STATUS_TABLE,
new_row_name,
GD_UI_STATUS_DONECOL);
if (created)
source_label = GD_UI_LABEL_COMPLETED;
else
source_label = GD_UI_LABEL_NOT_COMPLETED;
ProUITableCellComponentCopy (GD_UI_MAIN,
GD_UI_STATUS_TABLE,
new_row_name,
GD_UI_STATUS_DONECOL,
GD_UI_MAIN,
source_label,
new_component);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIStatusTableRowAdd
Purpose: Utility: add the designated row to the table
\*=============================================================*/
int ProTKGDUIStatusTableRowAdd (GearParam* g_ptr,
ProTKGDStep step,
ProBoolean required)
{
char ** row_names;
int n_rows;
char * new_row_name = gd_components [step].step_row_name;
ProLine new_row_label;
status = ProUITableRownamesGet (GD_UI_MAIN, GD_UI_STATUS_TABLE,
&n_rows, &row_names);
if (status == PRO_TK_NO_ERROR && n_rows > 0)
{
ProUITableRowsInsert (GD_UI_MAIN, GD_UI_STATUS_TABLE,
row_names [n_rows-1], 1,
&new_row_name);
ProStringarrayFree (row_names, n_rows);
}
else
{
ProUITableRowsInsert (GD_UI_MAIN, GD_UI_STATUS_TABLE,
NULL, 1,
&new_row_name);
}
ProStringToWstring (new_row_label, new_row_name);
ProUITableCellLabelSet (GD_UI_MAIN, GD_UI_STATUS_TABLE,
new_row_name, GD_UI_STATUS_COMPCOL,
new_row_label);
ProUITableCellLabelSet (GD_UI_MAIN, GD_UI_STATUS_TABLE,
new_row_name, GD_UI_STATUS_REQCOL,
(required?L"Required":L"Optional"));
ProTKGDUIStatusTableRowUpdate (g_ptr, step, new_row_name);
return PRO_TK_NO_ERROR;
}
/*=============================================================*\
Function: ProTKGDUIStatusTableInit
Purpose: Utility: initialize the creation status table
\*=============================================================*/
int ProTKGDUIStatusTableInit (GearParam* g_ptr)
{
ProTKGDStepInfo* order;
int ii;
switch (g_ptr->gear_type)
{
case SPUR_GEAR:
order = (ProTKGDStepInfo*)spur_gear_designinfo;
break;
case HELICAL_GEAR:
order = (ProTKGDStepInfo*)helical_gear_designinfo;
break;
case RING_GEAR:
order = (ProTKGDStepInfo*)ring_gear_designinfo;
break;
}
for (ii = 0; ii < NUM_GD_STEPS; ii++)
{
ProTKGDUIStatusTableRowAdd (g_ptr, order [ii].step, order [ii].required);
}
return PRO_TK_NO_ERROR;
}
/*=================== UI ACTION FUNCTIONS =====================*/
/*=============================================================*\
Function: ProTKGDUICloseAction
Purpose: Close button action function
\*=============================================================*/
void ProTKGDUICloseAction (char* dialog,
char *component,
ProAppData appdata)
{
ProUIDialogExit (dialog, 0);
}
/*=============================================================*\
Function: ProTKGDUIDiskInputAction
Purpose: Disk params input action function
\*=============================================================*/
void ProTKGDUIDiskInputAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProTKGDUIDiskFromUIUpdate (g_ptr);
ProTKGDUIDiskUIUpdate (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUIHoleInputAction
Purpose: Hole params input action function
\*=============================================================*/
void ProTKGDUIHoleInputAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProTKGDUIHoleFromUIUpdate (g_ptr);
ProTKGDUIHoleUIUpdate (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUITableSelectAction
Purpose: Table selection action function
\*=============================================================*/
void ProTKGDUITableSelectAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProTKGDStep step;
int n_sel;
char** selections;
ProCharLine sel_row;
ProUITableSelectednamesGet (GD_UI_MAIN, GD_UI_STATUS_TABLE,
&n_sel, &selections);
/* Need to know only the selected row in the table */
strcpy (sel_row, selections [0]);
ProStringarrayFree (selections, n_sel);
ProTKGDUIStepFromTableGet (sel_row, &step);
status = ProUITabSelectednamesSet (GD_UI_MAIN, GD_UI_MAINTAB,
1, &gd_components [step].step_layout);
g_ptr->current_step = step;
gd_components [step].update_ui_function (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUICreateAction
Purpose: "Create" button action function
\*=============================================================*/
void ProTKGDUICreateAction (char* dialog,
char *component,
ProAppData appdata)
{
ProError err;
ProBoolean keyway, key, bn;
GearParam* g_ptr = (GearParam*)appdata;
char ** selected_layout;
int num_selected;
ProTKGDStep step = g_ptr->current_step;
gd_components [step].update_from_ui_function (g_ptr);
switch (step)
{
case PTK_GD_DATUM:
ProUserCreateDatum (g_ptr);
break;
case PTK_GD_DISK:
ProUserCreateDisk (g_ptr);
break;
case PTK_GD_HOLE:
ProUserCreateHole (g_ptr);
ProUICheckbuttonGetState (GD_UI_MAIN, GD_UI_INCLUDE_KEYWAY, &keyway);
if (keyway)
{
ProTKGDUIKeywayFromUIUpdate (g_ptr);
ProUserCreateKeyway (g_ptr);
}
ProUIRadiogroupDisable (GD_UI_MAIN, GD_UI_GEARTYPE_GROUP_M);
break;
case PTK_GD_HUB:
ProUserCreateHub (g_ptr);
ProUICheckbuttonGetState (GD_UI_MAIN, GD_UI_INCLUDE_KEY, &key);
if (key)
{
ProTKGDUIKeyFromUIUpdate (g_ptr);
ProUserCreateKey (g_ptr);
}
ProUIRadiogroupDisable (GD_UI_MAIN, GD_UI_GEARTYPE_GROUP_M);
break;
case PTK_GD_BACKPLATE:
ProUserCreateBackPlate (g_ptr);
ProUICheckbuttonGetState (GD_UI_MAIN, GD_UI_INCLUDE_BN, &bn);
if (bn)
{
ProTKGDUIBacknotchFromUIUpdate (g_ptr);
ProUserCreateBackNotch (g_ptr);
}
ProUIRadiogroupDisable (GD_UI_MAIN, GD_UI_GEARTYPE_GROUP_M);
break;
case PTK_GD_TEETH:
if (g_ptr->gear_type == RING_GEAR)
ProUserCreateToothSurf (g_ptr);
ProUserCreateTooth (g_ptr);
ProUserCreateTeeth (g_ptr);
ProUIRadiogroupDisable (GD_UI_MAIN, GD_UI_GEARTYPE_GROUP_M);
break;
}
gd_components [step].update_ui_function (g_ptr);
ProTKGDUISelectNext (g_ptr, step);
return;
}
/*=============================================================*\
Function: ProTKGDUIHubInputAction
Purpose: Hub params input action function
\*=============================================================*/
void ProTKGDUIHubInputAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProTKGDUIHubFromUIUpdate (g_ptr);
ProTKGDUIHubUIUpdate (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUIBackplateInputAction
Purpose: Backplate params input action function
\*=============================================================*/
void ProTKGDUIBackplateInputAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProTKGDUIBackplateFromUIUpdate (g_ptr);
ProTKGDUIBackplateUIUpdate (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUITeethInputAction
Purpose: Teeth params input action function
\*=============================================================*/
void ProTKGDUITeethInputAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProTKGDUITeethFromUIUpdate (g_ptr);
ProTKGDUITeethUIUpdate (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUITeethUpdateAction
Purpose: Teeth params update action function (spinbox)
\*=============================================================*/
void ProTKGDUITeethUpdateAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProTKGDUITeethFromUIUpdate (g_ptr);
ProTKGDUITeethUIUpdate (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUIIncludeKeywayAction
Purpose: Include keyway checkbox action function
\*=============================================================*/
void ProTKGDUIIncludeKeywayAction (char* dialog,
char *component,
ProAppData appdata)
{
ProBoolean keyway;
GearParam* g_ptr = (GearParam*)appdata;
ProUICheckbuttonGetState (GD_UI_MAIN, GD_UI_INCLUDE_KEYWAY, &keyway);
ProTKGDUIKeywayUIUpdate (g_ptr, keyway);
}
/*=============================================================*\
Function: ProTKGDUIIncludeKeyAction
Purpose: Include key checkbox action function
\*=============================================================*/
void ProTKGDUIIncludeKeyAction (char* dialog,
char *component,
ProAppData appdata)
{
ProBoolean key;
GearParam* g_ptr = (GearParam*)appdata;
ProUICheckbuttonGetState (GD_UI_MAIN, GD_UI_INCLUDE_KEY, &key);
ProTKGDUIKeyUIUpdate (g_ptr, key);
}
/*=============================================================*\
Function: ProTKGDUIIncludeBacknotchAction
Purpose: Include backnotch checkbox action function
\*=============================================================*/
void ProTKGDUIIncludeBacknotchAction (char* dialog,
char *component,
ProAppData appdata)
{
ProBoolean bn;
GearParam* g_ptr = (GearParam*)appdata;
ProUICheckbuttonGetState (GD_UI_MAIN, GD_UI_INCLUDE_BN, &bn);
ProTKGDUIBacknotchUIUpdate (g_ptr, bn);
}
/*=============================================================*\
Function: ProTKGDUIToggleTypeAction
Purpose: Action function for menu radiogroup (type)
\*=============================================================*/
void ProTKGDUIToggleTypeAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
int n_sels;
char** sel_names;
int new_type;
ProUIRadiogroupSelectednamesGet (GD_UI_MAIN, component,
&n_sels, &sel_names);
if (strcmp (sel_names[0], GD_UI_GROUP_SPUR) == 0)
new_type = SPUR_GEAR;
/*if(strcmp (sel_names[0], GD_UI_GROUP_RING) == 0)
new_type = RING_GEAR;*/
if(strcmp (sel_names[0], GD_UI_GROUP_HELICAL) == 0)
new_type = HELICAL_GEAR;
else
new_type = RING_GEAR;
ProStringarrayFree (sel_names, n_sels);
if (new_type == g_ptr->gear_type)
return;
g_ptr->gear_type = new_type;
ProTKGDUIToggleType (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUILoadParamsAction
Purpose: Action function for "Load Params" button
\*=============================================================*/
void ProTKGDUILoadParamsAction (char* dialog,
char *component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
int m_id, action, first=0;
ProName name;
static int mode=0;
ProLine w_ext;
char line[PRO_PATH_SIZE];
ProParameter param;
ProParamvalue parvalue;
ProModelitem modelitem;
ProPath *w_path_arr, w_def_path, w_sel_path;
ProName *w_path_lab_arr;
ProError err;
char dlg_name [PRO_LINE_SIZE];
char* rg_entry;
ProName unit_type;
int cur_type = g_ptr->gear_type;
ProMdlName new_name;
strcpy (dlg_name, dialog);
/*-----------------------------------------------------------------*\
Check Gear Design
\*-----------------------------------------------------------------*/
ProMdlToModelitem(g_ptr->model, &modelitem);
ProStringToWstring(name, "Gear_Design");
err = ProParameterInit(&modelitem, name, ¶m);
ProMessageDisplay(MSGFIL, "PROTKGD Select a parameter file");
ProStringToWstring(w_def_path, ".");
ProStringToWstring(w_ext, "*.txt");
/* No default dirs */
err = ProArrayAlloc(0, sizeof(ProPath), 1, (ProArray*)&w_path_arr);
err = ProArrayAlloc(0, sizeof(ProPath), 1, (ProArray*)&w_path_lab_arr);
/* Open file */
err = ProFileMdlnameOpen(NULL, w_ext, w_path_arr, w_path_lab_arr, w_def_path, NULL,
w_sel_path);
ProArrayFree((ProArray*)&w_path_arr);
ProArrayFree((ProArray*)&w_path_lab_arr);
ProWstringToString(line, w_sel_path);
first = 1;
if (ProUserReadParamFile(line ,g_ptr)!=0)
return;
if (g_ptr->gear_type != cur_type)
ProTKGDUIToggleType (g_ptr);
/*if (g_ptr->gear_type == RING_GEAR)
rg_entry = GD_UI_GROUP_RING;*/
if(g_ptr->gear_type == SPUR_GEAR)
rg_entry = GD_UI_GROUP_SPUR;
if(g_ptr->gear_type == HELICAL_GEAR)
rg_entry = GD_UI_GROUP_HELICAL;
else
rg_entry = GD_UI_GROUP_SPUR;
ProUIRadiogroupSelectednamesSet (GD_UI_MAIN,
GD_UI_GEARTYPE_GROUP_M,
1, &rg_entry);
ProTKGDUIDatumUIUpdate (g_ptr);
ProTKGDUIDiskUIUpdate (g_ptr);
ProTKGDUIHoleUIUpdate (g_ptr);
ProTKGDUIHubUIUpdate (g_ptr);
ProTKGDUIBackplateUIUpdate (g_ptr);
ProTKGDUITeethUIUpdate (g_ptr);
ProParamvalueSet(&parvalue, (void *)w_sel_path, PRO_PARAM_STRING);
ProParameterWithUnitsCreate(&modelitem, name, &parvalue, NULL, ¶m);
ProStringToWstring(new_name, g_ptr->name);
ProMdlnameRename(g_ptr->model, new_name);
ProStringToWstring(name, g_ptr->material);
ProPartMaterialSet((ProPart)g_ptr->model, name);
{
ProUnititem* units;
ProUnitsystem new_system;
ProError status;
switch(g_ptr->units)
{
case PRO_UNITLENGTH_CM:
ProStringToWstring(unit_type, "cm");
break;
case PRO_UNITLENGTH_FT:
ProStringToWstring(unit_type, "ft");
break;
case PRO_UNITLENGTH_IN:
ProStringToWstring(unit_type, "in");
break;
case PRO_UNITLENGTH_M:
ProStringToWstring(unit_type, "m");
break;
case PRO_UNITLENGTH_MM:
ProStringToWstring(unit_type, "mm");
break;
}
status = ProArrayAlloc (1, sizeof (ProUnititem), 1, (ProArray*)&units);
status = ProUnitInit (g_ptr->model, unit_type, &units[0]);
status = ProMdlUnitsystemCreate (g_ptr->model, PRO_UNITSYSTEM_MLT,
L"ParamLen M T", units, &new_system);
status = ProMdlPrincipalunitsystemSet(g_ptr->model, &new_system,
PRO_UNITCONVERT_SAME_SIZE, PRO_B_TRUE, PRO_VALUE_UNUSED);
}
}
/*=============================================================*\
Function: ProTKGDUIDeleteAction
Purpose: Delete button action function
\*=============================================================*/
void ProTKGDUIDeleteAction (char* dialog, char* component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProUserDeleteDesign (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUIModifyAction
Purpose: Modify button action function
\*=============================================================*/
void ProTKGDUIModifyAction (char* dialog, char* component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProUserModifyDesign (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUIRegenerateAction
Purpose: Regenerate button action function
\*=============================================================*/
void ProTKGDUIRegenerateAction (char* dialog, char* component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProUserRegenerate (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUIMaterialAction
Purpose: Set Material button action function
\*=============================================================*/
void ProTKGDUIMaterialAction (char* dialog, char* component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProUserMaterial (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUIViewSelectAction
Purpose: Saved view selection action function
\*=============================================================*/
void ProTKGDUIViewSelectAction (char* dialog, char* component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
char** names;
int n_names;
ProName new_view;
ProView view;
ProUIRadiogroupSelectednamesGet (GD_UI_MAIN,
GD_UI_TOOL_VIEW_CHOICE_M,
&n_names, &names);
ProStringToWstring (new_view, names [0]);
ProStringarrayFree (names, n_names);
ProViewRetrieve(g_ptr->model, new_view, &view);
}
/*=============================================================*\
Function: ProTKGDUIViewSelectAction
Purpose: Utility: update contents of the saved views radiogroup
\*=============================================================*/
void ProTKGDUIViewNamesUpdate (GearParam* g_ptr)
{
ProError err;
ProLine* names;
int num_views;
int ii, len;
char** new_names;
wchar_t** new_labels;
err = ProViewNamesGet(g_ptr->model, &names, NULL, &num_views);
if (err != PRO_TK_NO_ERROR || num_views<=0)
{
ProUICascadebuttonDisable (GD_UI_MAIN,
GD_UI_TOOL_SAVEDVIEWS_CASCADE_M);
}
else
{
ProUICascadebuttonEnable (GD_UI_MAIN,
GD_UI_TOOL_SAVEDVIEWS_CASCADE_M);
new_names = (char**) calloc (num_views, sizeof (char*));
new_labels = (wchar_t**) calloc (num_views, sizeof (wchar_t*));
for (ii = 0; ii < num_views; ii++)
{
len = ProUtilWstrLen (names [ii]) + 1;
new_names [ii] = (char*) calloc (len, sizeof (char));
ProWstringToString (new_names [ii], names [ii]);
new_labels [ii] = (wchar_t*) calloc (len, sizeof (wchar_t));
ProUtilWstrcpy (new_labels [ii], names [ii]);
}
ProUIRadiogroupNamesSet (GD_UI_MAIN, GD_UI_TOOL_VIEW_CHOICE_M,
num_views, new_names);
ProUIRadiogroupLabelsSet (GD_UI_MAIN, GD_UI_TOOL_VIEW_CHOICE_M,
num_views, new_labels);
for (ii = 0; ii < num_views; ii++)
{
free (new_names [ii]);
free (new_labels [ii]);
}
free (new_names);
free (new_labels);
ProArrayFree ((ProArray*)&names);
}
}
/*=============================================================*\
Function: ProTKGDUIDefaultViewCreateAction
Purpose: Create Default Views action function
\*=============================================================*/
void ProTKGDUIDefaultViewCreateAction (char* dialog, char* component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProUserCreateViewAuto (g_ptr);
ProTKGDUIViewNamesUpdate (g_ptr);
}
/*=============================================================*\
Function: ProTKGDUIViewStoreAction
Purpose: Save View action function
\*=============================================================*/
void ProTKGDUIViewStoreAction (char* dialog, char* component,
ProAppData appdata)
{
GearParam* g_ptr = (GearParam*)appdata;
ProUserCreateViewManual (g_ptr);
ProTKGDUIViewNamesUpdate (g_ptr);
}
/*=============================================================*\
Function: ProUserNewgearUI
Purpose: Initialize and launch the Gear Design dialog
\*=============================================================*/
int ProUserNewgearUI()
{
ProError err;
int ui_status;
GearParam *g_ptr;
ProMdl model;
err = ProMdlCurrentGet(&model);
if (err != PRO_TK_NO_ERROR)
return (-1);
g_ptr = (GearParam*)calloc(1, sizeof(GearParam));
memset (g_ptr, '\0', sizeof (GearParam));
g_ptr->model = (ProPart)model;
g_ptr->current_step = PTK_GD_DATUM;
ProUserAssignParamDef (g_ptr);
/*-----------------------------------------------------------------*\
Collect information about created features
\*-----------------------------------------------------------------*/
if (ProUserCheckFeatures(g_ptr)!=PRO_TK_NO_ERROR)
{
ProMessageDisplay(MSGFIL, "USER Error while check Gear Design");
return (-1);
}
err = ProUIDialogCreate (GD_UI_MAIN, GD_UI_MAIN);
if (err != PRO_TK_NO_ERROR)
return PRO_TK_GENERAL_ERROR;
/* UI Initialization */
err = ProUIDialogCloseActionSet (GD_UI_MAIN,
(ProUIAction)ProTKGDUICloseAction, NULL);
/* Close actions */
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_CLOSEBTN,
(ProUIAction)ProTKGDUICloseAction, NULL);
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_CLOSEBTN_M,
(ProUIAction)ProTKGDUICloseAction, NULL);
/* Load actions */
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_LOADBTN_M,
(ProUIAction)ProTKGDUILoadParamsAction, g_ptr);
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_LOADBTN_RMB,
(ProUIAction)ProTKGDUILoadParamsAction, g_ptr);
/* Toggle state action */
err = ProUIRadiogroupSelectActionSet (GD_UI_MAIN, GD_UI_GEARTYPE_GROUP_M,
(ProUIAction)ProTKGDUIToggleTypeAction, g_ptr);
err = ProUIRadiogroupSelectActionSet (GD_UI_MAIN, GD_UI_GEARTYPE_GROUP_RMB,
(ProUIAction)ProTKGDUIToggleTypeAction, g_ptr);
/* Create action */
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_CREATEBTN,
(ProUIAction)ProTKGDUICreateAction,
g_ptr);
/* Checkbutton actions */
err = ProUICheckbuttonActivateActionSet (GD_UI_MAIN, GD_UI_INCLUDE_KEYWAY,
(ProUIAction)ProTKGDUIIncludeKeywayAction, g_ptr);
err = ProUICheckbuttonActivateActionSet (GD_UI_MAIN, GD_UI_INCLUDE_KEY,
(ProUIAction)ProTKGDUIIncludeKeyAction, g_ptr);
err = ProUICheckbuttonActivateActionSet (GD_UI_MAIN, GD_UI_INCLUDE_BN,
(ProUIAction)ProTKGDUIIncludeBacknotchAction, g_ptr);
/* Input actions */
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_GEARDISK_W_INPUT,
(ProUIAction)ProTKGDUIDiskInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_GEARDISK_D_INPUT,
(ProUIAction)ProTKGDUIDiskInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_HELIX_ANGLE,
(ProUIAction)ProTKGDUIDiskInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_GEARHOLE_D_INPUT,
(ProUIAction)ProTKGDUIHoleInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_TOOTH_P1_INPUT,
(ProUIAction)ProTKGDUITeethInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_GEARHUB_D_INPUT,
(ProUIAction)ProTKGDUIHubInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_GEARHUB_T_INPUT,
(ProUIAction)ProTKGDUIHubInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_BP_D_INPUT,
(ProUIAction)ProTKGDUIBackplateInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_BP_T_INPUT,
(ProUIAction)ProTKGDUIBackplateInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_TOOTH_PRESSURE_ANGLE,
(ProUIAction)ProTKGDUITeethInputAction,
g_ptr);
err = ProUIInputpanelInputActionSet (GD_UI_MAIN, GD_UI_TOOTH_INNER_SURF_INPUT,
(ProUIAction)ProTKGDUITeethInputAction,
g_ptr);
err = ProUISpinboxUpdateActionSet (GD_UI_MAIN, GD_UI_N_TEETH_SPINBOX,
(ProUIAction)ProTKGDUITeethUpdateAction,
g_ptr);
/* Update table */
ProTKGDUIStatusTableInit (g_ptr);
err = ProUITableSelectActionSet (GD_UI_MAIN, GD_UI_STATUS_TABLE,
(ProUIAction)ProTKGDUITableSelectAction,
g_ptr);
ProTKGDUIDatumUIUpdate (g_ptr);
ProTKGDUIDiskUIUpdate (g_ptr);
ProTKGDUIHoleUIUpdate (g_ptr);
ProTKGDUIHubUIUpdate (g_ptr);
ProTKGDUIBackplateUIUpdate (g_ptr);
ProTKGDUITeethUIUpdate (g_ptr);
/* Tools actions */
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_TOOL_DELETE_M,
(ProUIAction)ProTKGDUIDeleteAction,
g_ptr);
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_TOOL_MODIFY_M,
(ProUIAction)ProTKGDUIModifyAction,
g_ptr);
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_TOOL_REGENERATE_M,
(ProUIAction)ProTKGDUIRegenerateAction,
g_ptr);
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_TOOL_MATERIAL_M,
(ProUIAction)ProTKGDUIMaterialAction,
g_ptr);
ProTKGDUIViewNamesUpdate (g_ptr);
err = ProUIRadiogroupSelectActionSet (GD_UI_MAIN, GD_UI_TOOL_VIEW_CHOICE_M,
(ProUIAction)ProTKGDUIViewSelectAction,
g_ptr);
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN,
GD_UI_TOOL_VIEW_DEFAULTCREATE_M,
(ProUIAction)ProTKGDUIDefaultViewCreateAction,
g_ptr);
err = ProUIPushbuttonActivateActionSet (GD_UI_MAIN, GD_UI_TOOL_VIEW_STORE_M,
(ProUIAction)ProTKGDUIViewStoreAction,
g_ptr);
/* Popup menu */
err = ProUIDialogPopupmenuSet (GD_UI_MAIN, GD_UI_MENUPANE_RMB);
err = ProUIDialogActivate (GD_UI_MAIN, &ui_status);
if (err != PRO_TK_NO_ERROR)
return PRO_TK_GENERAL_ERROR;
err = ProUIDialogDestroy (GD_UI_MAIN);
free (g_ptr);
return PRO_TK_NO_ERROR;
}