/*================================================================*\ FILE: TestSpool.c PURPOSE: Functions to manage cabling HISTORY: 18-AUG-98 I-01-17 Pavel $$1 Created. 14-Sep-98 I-01-19 Pavel $$2 Fixed 29-Dec-98 I-01-28 Alexey $$3 Add -4 as valid return value to TEST_CALL_REPORT for some ProCbl funcs \*=================================================================*/ #include "UtilCable.h" #include "UtilString.h" #include "TestError.h" /*--------------------------------------------------------------------*\ Pro/TOOLKIT includes \*--------------------------------------------------------------------*/ #include "ProToolkit.h" #include "ProMessage.h" #include "ProMenu.h" #include "ProMessage.h" #include "ProModelitem.h" #include "ProSelection.h" #include "ProUtil.h" /*--------------------------------------------------------------------*\ Pro/DEVELOP includes \*--------------------------------------------------------------------*/ #include "profiles.h" #include "TestError.h" #include "TestCable.h" #include "UtilCable.h" #include "UtilMenu.h" #include "UtilMessage.h" #include "UtilMath.h" #include "UtilString.h" /*--------------------------------------------------------------------*\ C System includes \*--------------------------------------------------------------------*/ #include /*--------------------------------------------------------------------*\ Application macros \*--------------------------------------------------------------------*/ #define MSGFIL _msgfil /*--------------------------------------------------------------------*\ Application data types \*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*\ Application global/external data \*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*\ Function prototypes \*--------------------------------------------------------------------*/ int ProTestSpool(ProAssembly*); int ProTestSpoolAction(ProAssembly*, int action); ProError ProTestSpoolParametersEdit(ProCblSpool*spool); ProError ProUtilParametersFileWrite(FILE *file, ProCblParameterInfo *p_param, int n_param); ProError ProUtilParametersFileRead(char *filename, ProCblParameterInfo **pp_param, int *pn_param); ProError ProUtilSpoolParametersToSpoolType(ProCblParameterInfo **pp_param, int *pn_param, ProName name, Procbl_cable_type *p_cable_type, Procbl_sheath_type *p_sheath_type); ProError ProUtilParametersFree(ProCblParameterInfo **pp_param, int n_param); ProError ProUtilFileOpen(char *extension,char *file_name); void ProUtilSetSpoolMenu(ProAssembly *p_assy); /*============================================================================*\ Function: ProTestSpool Purpose: Upper level spool menu \*============================================================================*/ int ProTestSpool( ProAssembly *p_assy) { ProError err; int menu_id, action, n_spools = 0; err = ProMenuFileRegister( "TkSpool", "tkspool.mnu", &menu_id ); ProMenubuttonActionSet( "TkSpool", "Read", (ProMenubuttonAction)ProTestSpoolAction, p_assy, TEST_SPOOL_READ ); ProMenubuttonActionSet( "TkSpool", "Write", (ProMenubuttonAction)ProTestSpoolAction, p_assy, TEST_SPOOL_WRITE ); ProMenubuttonActionSet( "TkSpool", "Create", (ProMenubuttonAction)ProTestSpoolAction, p_assy, TEST_SPOOL_CREATE ); ProMenubuttonActionSet( "TkSpool", "Edit", (ProMenubuttonAction)ProTestSpoolAction, p_assy, TEST_SPOOL_EDIT ); ProMenubuttonActionSet( "TkSpool", "List", (ProMenubuttonAction)ProTestSpoolAction, p_assy, TEST_SPOOL_LIST ); ProMenubuttonActionSet( "TkSpool", "TkSpool", (ProMenubuttonAction)ProMenuDelete, NULL, 0 ); err = ProMenuCreate( PROMENUTYPE_MAIN, "TkSpool", &menu_id ); ProUtilSetSpoolMenu(p_assy); err = ProMenuProcess( "TkSpool", &action ); TEST_CALL_REPORT( "ProMenuProcess()", "ProTestSpool()", err, err != PRO_TK_NO_ERROR ); return 0; } /*============================================================================*\ Function: ProUtilSetSpoolMenu Purpose: Enable/Disable spool menu buttons \*============================================================================*/ void ProUtilSetSpoolMenu( ProAssembly *p_assy) { int n_spools = 0; ProCblSpool *p_spools; ProError err; err = ProCblAssemblySpoolsGet(*p_assy, &p_spools, &n_spools); TEST_CALL_REPORT( "ProCblAssemblySpoolsGet()", "ProUtilSetSpoolMenu()", err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_NOT_FOUND ); ProUtilMenubuttonActivate("TkSpool", "Write", n_spools != 0); ProUtilMenubuttonActivate("TkSpool", "Edit", n_spools != 0); ProUtilMenubuttonActivate("TkSpool", "List", n_spools != 0); if (err == PRO_TK_NO_ERROR) ProArrayFree((ProArray*)&p_spools); } /*============================================================================*\ Function: ProTestSpoolCreate Purpose: Create spool \*============================================================================*/ ProError ProTestSpoolCreate( ProAssembly *p_assy, Procbl_cable_type cable_type, ProCblSpool *p_spool) { ProError err; Procbl_sheath_type sheath_type = PROCBL_BUNDLE_NONE; ProName w_name; static ProUtilMenuButtons bundle_type[] = { {"TkSheath Type", 0, TEST_CALL_PRO_MENU_DELETE}, {"None", PROCBL_BUNDLE_NONE, 0}, {"Shrink", PROCBL_BUNDLE_SHRINK, 0}, {"Tube", PROCBL_BUNDLE_TUBE, 0}, {"Tape", PROCBL_BUNDLE_TAPE, 0}, {"", 0, 0} }; if ( cable_type == PROCBL_TYPE_BUNDLE) { err = ProUtilMenuIntValueSelect(bundle_type, (int *)&sheath_type); if (err != PRO_TK_NO_ERROR) return (PRO_TK_GENERAL_ERROR); } ProMessageDisplay(MSGFIL, "TEST Enter Spool name [QUIT]:"); err = ProMessageStringRead(PRO_NAME_SIZE, w_name); if (err != PRO_TK_NO_ERROR) return (PRO_TK_GENERAL_ERROR); err = ProCblSpoolCreate(*p_assy, w_name, cable_type, sheath_type, p_spool); TEST_CALL_REPORT( "ProCblSpoolCreate()", "ProTestSpoolCreate()", err, err != PRO_TK_NO_ERROR ); if (err != PRO_TK_NO_ERROR) return (PRO_TK_GENERAL_ERROR); ProMessageDisplay(MSGFIL, "TEST Spool has been created successfully."); err = ProTestSpoolParametersEdit(p_spool); return (PRO_TK_NO_ERROR); } /*============================================================================*\ Function: ProTestSpoolAction Purpose: Upper level spool menu \*============================================================================*/ int ProTestSpoolAction( ProAssembly *p_assy, int action) { ProError err; ProName w_name, w_param_name, *wp_names = NULL; ProCharName name; ProCharLine param_value; char file_name[PRO_PATH_SIZE]; Procbl_cable_type cable_type; Procbl_sheath_type sheath_type; ProCblSpool spool, *p_spools; int i, n_spools, n_logical, *p_selected, n_sel, n_param; wchar_t **w_menus; FILE *file; Pro_parameter_info param, *p_param; static ProUtilMenuButtons spool_type[] = { {"TkCreate Spool", 0, TEST_CALL_PRO_MENU_DELETE}, {"Wire", PROCBL_TYPE_WIRE, 0 }, {"Cable", PROCBL_TYPE_CABLE, 0 }, {"Sheath", PROCBL_TYPE_BUNDLE,0 }, {"From Logical", -1,0 }, {"",0,0} }; switch (action) { case TEST_SPOOL_READ: /* Open spool file */ err = ProUtilFileOpen("*.spl", file_name); if (err != PRO_TK_NO_ERROR) break; /* Read parameters */ err = ProUtilParametersFileRead(file_name, &p_param, &n_param); if (err != PRO_TK_NO_ERROR || n_param <=0) break; err = ProUtilSpoolParametersToSpoolType(&p_param, &n_param, w_name, &cable_type, &sheath_type); if (err != PRO_TK_NO_ERROR) break; /* Create spool */ err = ProCblSpoolCreate(*p_assy, w_name, cable_type, sheath_type, &spool); TEST_CALL_REPORT( "ProCblSpoolCreate()", "ProTestSpoolAction()", err, err != PRO_TK_NO_ERROR ); if (err == PRO_TK_NO_ERROR) { ProMessageDisplay(MSGFIL, "TEST Spool has been created successfully."); } break; case TEST_SPOOL_CREATE: err = ProCblSpoolFromLogicalGet(*p_assy, &wp_names, &n_logical); TEST_CALL_REPORT( "ProCblSpoolFromLogicalGet()", "ProTestSpoolAction()", err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_NOT_FOUND ); if (err == PRO_TK_NO_ERROR) { spool_type[4].special_flag = 0; } else { spool_type[4].special_flag = TEST_CALL_PRO_MENUBUTTON_DELETE; } err = ProUtilMenuIntValueSelect(spool_type, (int *)&cable_type); if (err != PRO_TK_NO_ERROR) { if (wp_names) err = ProArrayFree((ProArray*)&wp_names); break; } if ((int)cable_type == -1) { /* From Logical */ err = ProUtilMenuStringsAlloc(&w_menus); for (i=0; ivalue_type != PRO_WIDE_STRING_TYPE) return (PRO_TK_BAD_INPUTS); if (!ProUtilStrwscmp("WIRE", p_param->value.strval)) p_cable_type[0] = PROCBL_TYPE_WIRE; else if (!ProUtilStrwscmp("PREFAB", p_param->value.strval)) p_cable_type[0] = PROCBL_TYPE_CABLE; else if (!ProUtilStrwscmp("SHEATH", p_param->value.strval)) p_cable_type[0] = PROCBL_TYPE_BUNDLE; else return (PRO_TK_BAD_INPUTS); return (PRO_TK_NO_ERROR); } /*============================================================================*\ Function: ProUtilSpoolParametersToSpoolType Purpose: Convert read-only spool parameters to values adn remove it from list \*============================================================================*/ ProError ProUtilSpoolParametersToSpoolType( ProCblParameterInfo **pp_param, /* In/Out : the array of param */ int *pn_param, /* In/Out : the number of param */ ProName name, Procbl_cable_type *p_cable_type, Procbl_sheath_type *p_sheath_type) { int i, nname = -1, ntype = -1, nsheath = -1; int n_param = *pn_param; ProCblParameterInfo *p_param = *pp_param; Procbl_cable_type cable_type; Procbl_sheath_type sheath_type = PROCBL_BUNDLE_NONE; for (i=0; i