/*====================================================================*\ FILE : TestCabling.c PURPOSE : Test for Pro/Toolkit cabling functionality HISTORY.. 18-AUG-98 I-01-17 Pavel $$1 Created. 14-Sep-98 I-01-19 Pavel $$2 Fixed 03-Nov-98 I-01-25 Alexey $$3 Move ProUtilFileOpen() to pt_utils 29-Dec-98 I-01-28 Alexey $$4 Add -4 as valid return value to TEST_CALL_REPORT for some ProCbl funcs \*====================================================================*/ #include "prodevelop.h" #include "pd_prototype.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 "UtilCollect.h" #include "UtilMenu.h" #include "UtilMessage.h" #include "UtilMath.h" #include "UtilString.h" /*--------------------------------------------------------------------*\ C System includes \*--------------------------------------------------------------------*/ #include /*--------------------------------------------------------------------*\ Application macros \*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*\ Application data types \*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*\ Application global/external data \*--------------------------------------------------------------------*/ ProCblHarness _harness; int _is_harness = 0; ProName _msgfil; /*--------------------------------------------------------------------*\ Function prototypes \*--------------------------------------------------------------------*/ /*============================================================================*\ Function: user_initialize Purpose: Initialize application \*============================================================================*/ int user_initialize() { int ProTestCabling(), menu_id; ProTestErrlogOpen("pt_toolkit", "", ""); ProMenuFileRegister("cabling","cabling.mnu", &menu_id); ProMenuAuxfileRegister("cabling","cabling.aux", &menu_id); ProMenubuttonActionSet("cabling","-Tkcabling", (ProMenubuttonAction)ProTestCabling, NULL, 0); return (0); } /*============================================================================*\ Function: user_terminate Purpose: Close log file. Required function. \*============================================================================*/ void user_terminate() { ProTestErrlogClose(); } /*============================================================================*\ Function: ProTestCabling Purpose: Upper level cabling menu \*============================================================================*/ int ProTestCabling() { ProError err; int menu_id; int action; ProAssembly mdl; ProStringToWstring(MSGFIL, "cabling_msg.txt"); err = ProMdlCurrentGet((ProMdl*)&mdl); err = ProMenuPush(); err = ProMenuFileRegister( "TkCabling", "tkcabling.mnu", &menu_id ); ProMenubuttonActionSet( "TkCabling", "Harness", (ProMenubuttonAction)ProTestHarness, &mdl, 0 ); ProMenubuttonActionSet( "TkCabling", "Spools", (ProMenubuttonAction)ProTestSpool, &mdl, 0 ); ProMenubuttonActionSet( "TkCabling", "Feature", (ProMenubuttonAction)ProTestCable, &mdl, 0 ); ProMenubuttonActionSet( "TkCabling", "Modify", (ProMenubuttonAction)ProTestCableModify, &mdl, 0 ); ProMenubuttonActionSet( "TkCabling", "Route", (ProMenubuttonAction)ProTestCableRoute, &mdl, 0 ); ProMenubuttonActionSet( "TkCabling", "Components", (ProMenubuttonAction)ProTestConnector, &mdl, 0 ); ProMenubuttonActionSet( "TkCabling", "Logical ref", (ProMenubuttonAction)ProTestLogicalRef, &mdl, 0 ); ProMenubuttonActionSet( "TkCabling", "Info", (ProMenubuttonAction)ProTestCablingInfo, &mdl, 0 ); ProMenubuttonActionSet( "TkCabling", "Done/Return", (ProMenubuttonAction)ProMenuDelete, NULL, 0 ); ProMenubuttonActionSet( "TkCabling", "TkCabling", (ProMenubuttonAction)ProMenuDelete, NULL, 0 ); err = ProMenuCreate( PROMENUTYPE_MAIN, "TkCabling", &menu_id ); ProUtilSetCablingMenu(); if( err == PRO_TK_NO_ERROR ) { err = ProMenuProcess( "TkCabling", &action ); TEST_CALL_REPORT( "ProMenuProcess()", "ProTestCabling()", err, err != PRO_TK_NO_ERROR ); } err = ProMenuPop(); return 0; } /*============================================================================*\ Function: ProUtilSetCablingMenu Purpose: Enable/Disable TkCabling menu buttons \*============================================================================*/ void ProUtilSetCablingMenu() { /* Disable some menu butoons if no current harness available */ ProUtilMenubuttonActivate("TkCabling", "Feature", IS_CURRENT_HARNESS); ProUtilMenubuttonActivate("TkCabling", "Modify", IS_CURRENT_HARNESS); ProUtilMenubuttonActivate("TkCabling", "Route", IS_CURRENT_HARNESS); } /*============================================================================*\ Function: ProTestHarness Purpose: Harness menu \*============================================================================*/ int ProTestHarness( ProAssembly *p_assy) { ProCblHarness *p_harness, harness; ProError err; int i, n_harness, action, menu_id; ProName w_name; wchar_t **w_menus; err = ProCblAssemblyHarnessesGet(*p_assy, &p_harness, &n_harness); TEST_CALL_REPORT( "ProCblAssemblyHarnessesGet()", "ProTestHarness()", err, err != PRO_TK_NO_ERROR ); if ((err != PRO_TK_NO_ERROR) && (err != PRO_TK_E_NOT_FOUND)) return (0); ProUtilMenuStringsAlloc(&w_menus); ProUtilMenuStringsStrAdd(&w_menus, "Create"); for (i=0; ivalue_type) { case PRO_INTEGER_TYPE: fprintf(file, "%-32d", p_params->value.intval); break; case PRO_DOUBLE_TYPE: fprintf(file, "%-32.3f", p_params->value.dblval); break; case PRO_WIDE_STRING_TYPE: ProWstringToString(line, p_params->value.strval); fprintf(file, "%-32s", line); break; } } fprintf(file, "\n"); break; } } return (PRO_TK_NO_ERROR); } /*============================================================================*\ Function: ProUtilTokenToParamValue Purpose: converts token to param value and returns its type \*============================================================================*/ int ProUtilTokenToParamValue( char* token, void* param_value) { double d, *p_d; char *end_ptr; int i, *p_i; d = strtod(token, &end_ptr); if (end_ptr[0] == '\0' ) { /* Value double or integer */ i = (int)d; if (fabs(i-d) < EPSM6) { p_i = (int*)param_value; *p_i = i; return (PRO_INTEGER_TYPE); } else { p_d = (double*)param_value; *p_d = d; return (PRO_DOUBLE_TYPE); } } else { ProStringToWstring((wchar_t*)param_value, token); return (PRO_WIDE_STRING_TYPE); } } /*============================================================================*\ Function: ProUtilParametersFileRead Purpose: Read parameter file saved by ProUtilParametersFileWrite \*============================================================================*/ ProError ProUtilParametersFileRead( char *filename, ProCblParameterInfo **pp_param, int *pn_param) { FILE *file; char last_line[PRO_PATH_SIZE], line[PRO_PATH_SIZE]; char *tokens[TEST_MAX_TOKENS], *names[TEST_MAX_TOKENS]; ProCblParameterInfo *p_param, param, param2; int i, n_param = 0, n_cells; file = fopen(filename, "r"); if (file == NULL) return (PRO_TK_GENERAL_ERROR); ProArrayAlloc(0, sizeof(ProCblParameterInfo), 1, (ProArray*)&p_param); while ((!feof(file)) && (fgets(line, PRO_PATH_SIZE, file) != NULL)) { if (line[0] == '!') { /* Read comment / The parameters name line */ strcpy(last_line, line); continue; } tokens[0] = strtok(line, " \t\n"); i = 0; /* While there are tokens in "string" */ while( tokens[i] != NULL ) { i++; if (i>= TEST_MAX_TOKEN) break; /* Get next token: */ tokens[i] = strtok(NULL, " \t\n"); } /*Invalid string */ if (i <2) continue; if (i == 2) { /* Found simple parameter */ ProStringToWstring(param.name, tokens[0]); param.param_type = PRO_USER_PARAM; param.value_type = ProUtilTokenToParamValue(tokens[1], ¶m.value); ProArrayObjectAdd((ProArray*)&p_param, -1, 1, ¶m); n_param++; } else { /* Found multicell parameter */ n_cells = i; names[0] = strtok(last_line, " \t\n"); i = 0; /* While there are names in "string" */ while( names[i] != NULL ) { i++; if (i>= TEST_MAX_TOKEN) break; /* Get next token: */ names[i] = strtok(NULL, " \t\n"); } /* Skip if two lines have different numbers of tokens */ if (i != n_cells) continue; ProStringToWstring(param.name, tokens[0]); param.param_type = PRO_USER_PARAM; param.value_type = PRO_MULTICELL_TYPE; ProArrayAlloc(0, sizeof(param), 1, (ProArray*)¶m.value.multval.cells); param.value.multval.ncells = n_cells - 1; for (i=1; iowner_type ? ".con" : ".cbl"); } else { strcpy(file_name, TEMP_FILE); } if (p_owner->owner_type) { err = ProCblConnectorParametersGet( (ProCblConnector*)p_owner->param_owner, &p_param, &n_param); TEST_CALL_REPORT( "ProCblConnectorParametersGet()", "ProUtilParametersAction()", err, err != PRO_TK_NO_ERROR); } else { err = ProCblCableParametersGet( (ProCblCable*)p_owner->param_owner, &p_param, &n_param); TEST_CALL_REPORT( "ProCblCableParametersGet()", "ProUtilParametersAction()", err, err != PRO_TK_NO_ERROR); } file = fopen(file_name, "w"); fprintf(file, "! Enter or modify parameters for the %s.\n", p_owner->owner_type ? "connector" : "cable"); ProUtilParametersFileWrite(file, p_param, n_param); fclose(file); if (action == TEST_PARAM_SAVE) ProMessageDisplay(MSGFIL, "TEST Parameter file %0s was created successfully.", file_name); break; case TEST_PARAM_MOD: ProUtilParametersAction(p_owner, TEST_PARAM_SAVE_DEFAULT); ProStringToWstring(w_file_name, TEMP_FILE); ProFileEdit(w_file_name); ProUtilParametersRead(p_owner, TEMP_FILE); break; case TEST_PARAM_RETR: err = ProUtilFileOpen(p_owner->owner_type ? "*.con" : "*.cbl", file_name); if (err != PRO_TK_NO_ERROR) break; ProUtilParametersRead(p_owner, file_name); break; case TEST_PARAM_SHOW: ProUtilParametersAction(p_owner, TEST_PARAM_SAVE_DEFAULT); ProStringToWstring(w_file_name, TEMP_FILE); ProInfoWindowDisplay(w_file_name, NULL, NULL); break; } return(0); } /*============================================================================*\ Function: ProUtilParametersRead Purpose: Read connector's parameters from file \*============================================================================*/ ProError ProUtilParametersRead( TestParamOwner *p_owner, char *file_name) { ProError err; ProCblParameterInfo *p_param, *p_param2; int n_param, n_param2, i, j; if (p_owner->owner_type) { err = ProCblConnectorParametersGet( (ProCblConnector*)p_owner->param_owner, &p_param, &n_param); TEST_CALL_REPORT( "ProCblConnectorParametersGet()", "ProTestConnParametersRead()", err, err != PRO_TK_NO_ERROR ); } else { err = ProCblCableParametersGet( (ProCblCable*)p_owner->param_owner, &p_param, &n_param); TEST_CALL_REPORT( "ProCblCableParametersGet()", "ProTestConnParametersRead()", err, err != PRO_TK_NO_ERROR ); } if (err != PRO_TK_NO_ERROR) return (err); err = ProUtilParametersFileRead(file_name, &p_param2, &n_param2); /* First delete parameters which are not present in new file */ for (i=0; iowner_type) { err = ProCblConnectorParameterDelete( (ProCblConnector*)p_owner->param_owner, p_param[i].name); TEST_CALL_REPORT("ProCblConnectorParameterDelete()", "ProTestConnParametersRead()", err, err != PRO_TK_NO_ERROR); } else { err = ProCblCableParameterDelete( (ProCblCable*)p_owner->param_owner, p_param[i].name); TEST_CALL_REPORT("ProCblCableParameterDelete()", "ProTestConnParametersRead()", err, err != PRO_TK_NO_ERROR); } } /* setup new parameter name */ if (p_owner->owner_type) { err = ProCblConnectorParametersSet ( (ProCblConnector*)p_owner->param_owner, p_param2, n_param2); TEST_CALL_REPORT("ProCblConnectorParametersSet()", "ProTestConnParametersRead()", err, err != PRO_TK_NO_ERROR ); } else { err = ProCblCableParametersSet ( (ProCblCable*)p_owner->param_owner, p_param2, n_param2); TEST_CALL_REPORT("ProCblCableParametersSet()", "ProTestConnParametersRead()", err, err != PRO_TK_NO_ERROR ); } ProUtilParametersFree(&p_param2, n_param2); return (PRO_TK_NO_ERROR); } /*=============================================================*\ Function: ProTestCableRoute Purpose: route cable (s) \*=============================================================*/ int ProTestCableRoute ( ProAssembly *p_assy) { int ierr, i, menu_id, action; void *routing_data; Select3d *sel; ProCblCable *p_cables, cable; ProError err; /*----------------------------------------------------------------*\ procbl_get_harness_cables \*----------------------------------------------------------------*/ ierr = pro_select("cable", -1, &sel, ProTestCurrentHarnessPreFilter, NULL); if (ierr <= 0) return (-1); ProArrayAlloc(0, sizeof(ProCblCable), 1, (ProArray*)&p_cables); for (i=0; i