/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*----------------------------------------------------------------------------*\ Pro/TOOLKIT includes \*----------------------------------------------------------------------------*/ #include <ProToolkit.h> #include <ProSelection.h> #include <ProWeld.h> #include <ProMenu.h> /*----------------------------------------------------------------------------*\ Application includes \*----------------------------------------------------------------------------*/ #include "UtilMenu.h" #include "UtilFiles.h" #include "UtilMessage.h" #include "UtilString.h" #include <PTApplsUnicodeUtils.h> #include <ProTKRunTime.h> #include <ProUtil.h> /*----------------------------------------------------------------------------*\ Application macros \*----------------------------------------------------------------------------*/ #define WELD_INFO 0 #define PARAM_INFO 1 #define WELD_QCR ".wld" #define PARAM_QCR "_param.wld" /*----------------------------------------------------------------------------*\ Application prototypes \*----------------------------------------------------------------------------*/ char* ProTestWeldTypeGet (ProWeldtype ); char* ProTestWeldSubtypeGet (ProWeldsubtype ); ProError ProTestWeldIntermittencePrint (ProFeature *, ProStandard, FILE *); /*============================================================================*\ FUNCTION : ProTestWeldMenu() PURPOSE : Create a weld Menu. \*============================================================================*/ int ProTestWeldMenu () { ProError err; int menu_id, action; int ProTestWeldAct(); err= ProMenuFileRegister( (char *)"TkWelding", (char *)"tkwelding.mnu", &menu_id ); TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestWeldMenu()", err, err!= PRO_TK_NO_ERROR ); ProMenubuttonActionSet( (char *)"TkWelding", (char *)"WeldInfo", (ProMenubuttonAction)ProTestWeldAct, NULL, 0 ); ProMenubuttonActionSet( (char *)"TkWelding", (char *)"TkWelding", (ProMenubuttonAction)ProMenuDelete, NULL, 0 ); err= ProMenuCreate( PROMENUTYPE_MAIN,(char *)"TkWelding", &menu_id ); TEST_CALL_REPORT( "ProMenuCreate()", "ProTestWeldMenu()", err, err!= PRO_TK_NO_ERROR ); ProMenuProcess( (char *)"TkWelding", &action ); return (0); } /*============================================================================*\ FUNCTION : ProTestWeldMenu() PURPOSE : Get options for testing \*============================================================================*/ int ProTestWeldAct () { int id, num_sel; ProError err; ProUtilMenuButtons buttons[] = { {"WeldInfo", 0, TEST_CALL_PRO_MENU_DELETE}, {"Weld", WELD_INFO, 0}, {"Parameters", PARAM_INFO, 0}, {"", 0, 0} }; ProSelection *sel = NULL; ProModelitem model_item; int ProTestWeldParam (ProFeature *weld); int ProTestWeldInfo (ProFeature *weld); if (ProUtilMenuIntValueSelect( buttons, &id) != PRO_TK_NO_ERROR) return -1; while (1) { ProUtilMsgPrint ("gen", "TEST %0s", "Select weld."); if (ProSelect((char *)"feature", 1, NULL, NULL, NULL, NULL, &sel, &num_sel) != PRO_TK_NO_ERROR || sel == NULL) return(0); ProSelectionModelitemGet(sel[0], &model_item); err = ProWeldSequenceIdGet ((ProFeature*)&model_item, &num_sel); TEST_CALL_REPORT ("ProWeldSequenceIdGet", "ProTestWeldAct", err, err!=PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR ) { ProUtilMsgPrint ("gen", "TEST %0s", "The selected feature is not" " weld. Try again."); continue; } break; } switch (id) { case WELD_INFO: ProTestWeldInfo ((ProFeature*)&model_item); break; case PARAM_INFO: ProTestWeldParam((ProFeature*)&model_item); break; default:; } return (0); } /*============================================================================*\ FUNCTION : ProTestWeldInfo () PURPOSE : Store weld information. \*============================================================================*/ int ProTestWeldInfo (ProFeature *weld) { int sequence_id; FILE *fp = NULL; char c_name[PRO_MDLNAME_SIZE]; ProMdlName w_name; ProError err; ProWeldtype type; ProWeldsubtype subtype; ProWeldInfo info; ProFeature rod; ProUtilCname fname; ProTestQcrName(&(weld->owner), (char *)WELD_QCR, fname); if ((fp = PTApplsUnicodeFopen (fname, "w")) != NULL) { err = ProMdlMdlnameGet(weld->owner, w_name); ProWstringToString (c_name, w_name); ProTKFprintf (fp, "\n\t Weld information \n"); ProTKFprintf (fp, "\nAssembly Name: %s\n", c_name); err = ProWeldRodGet (weld, &rod); TEST_CALL_REPORT ("ProWeldRodGet", "ProTestWeldInfo", err, err!=PRO_TK_NO_ERROR); err = ProWeldRodNameGet (&rod, w_name); TEST_CALL_REPORT ("ProWeldRodNameGet", "ProTestWeldInfo", err, err!=PRO_TK_NO_ERROR); ProWstringToString (c_name, w_name); ProTKFprintf (fp, "Rod : %s\n", c_name); err = ProWeldTypeGet (weld, &type, &subtype); TEST_CALL_REPORT ("ProWeldTypeGet", "ProTestWeldInfo", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "Type %s, Subtype %s \n", ProTestWeldTypeGet (type), ProTestWeldSubtypeGet (subtype)); err = ProWeldSequenceIdGet (weld, &sequence_id); TEST_CALL_REPORT ("ProWeldSequenceIdGet", "ProTestWeldInfo", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "Sequ id = %d\n", sequence_id); err = ProWeldInfoGet (weld, &info); TEST_CALL_REPORT ("ProWeldInfoGet", "ProTestWeldInfo", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "Size = (%f, %f)\n x_sec_area = %f\n length = %f\n", info.size[0],info.size[1], info.x_sec_area, info.length); ProTKFprintf (fp, " volume = %f\n mass = %f\n time = %f\n rod_length = %f", info.volume, info.mass, info.time, info.rod_length); fclose (fp); ProStringToWstring(w_name, fname); ProInfoWindowDisplay(w_name, NULL, NULL); } return (0); } /*============================================================================*\ FUNCTION : ProTestWeldInfo () PURPOSE : Store weld specific information. \*============================================================================*/ int ProTestWeldParam (ProFeature *weld) { ProError err; ProWeldFilletdata fillet ; ProWeldGroovedata groove ; ProWeldPlugdata plug ; ProWeldSlotdata slot ; ProWeldSpotdata spot ; ProUtilCname fname; char c_name[PRO_MDLNAME_SIZE]; ProMdlName w_name; FILE *fp; ProWeldtype type; ProWeldsubtype subtype; int num_belongs = 0; ProFeature *belongs = NULL; ProTestQcrName(&(weld->owner), (char *)PARAM_QCR, fname); if ((fp = PTApplsUnicodeFopen (fname, "w")) != NULL) { err = ProMdlMdlnameGet(weld->owner, w_name); ProWstringToString (c_name, w_name); ProTKFprintf (fp, "\n\t Weld parameters \n"); ProTKFprintf (fp, "\nAssembly Name: %s\n", c_name); err = ProWeldTypeGet (weld, &type, &subtype); TEST_CALL_REPORT ("ProWeldTypeGet", "ProTestWeldParam", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "Type %s, Subtype %s \n", ProTestWeldTypeGet (type), ProTestWeldSubtypeGet (subtype)); switch(type) { case PRO_WELD_FILLET : err = ProWeldFilletdataGet(weld, &fillet); TEST_CALL_REPORT ("ProWeldFilletdataGet", "ProTestWeldParam", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "\n all_around is %s\n trajectory_length = %f", (fillet.all_around == PRO_B_TRUE) ? "true" : "false", fillet.trajectory_length); break; case PRO_WELD_GROOVE : err = ProWeldGroovedataGet(weld, &groove); TEST_CALL_REPORT ("ProWeldGroovedataGet", "ProTestWeldParam", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "\n butt_width = %f\n face_offset = %f\n" "trajectory_length = %f\n penetration = %f", groove.butt_width, groove.face_offset, groove.trajectory_length, groove.penetration); break; case PRO_WELD_PLUG : err = ProWeldPlugdataGet(weld, &plug); TEST_CALL_REPORT ("ProWeldPlugdataGet", "ProTestWeldParam", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "\n depth = %f", plug.depth); break; case PRO_WELD_SLOT : err = ProWeldSlotdataGet(weld, &slot); TEST_CALL_REPORT ("ProWeldSlotdataGet", "ProTestWeldParam", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "\n depth = %f", slot.depth); break; case PRO_WELD_SPOT : err = ProWeldSpotdataGet(weld, &spot); TEST_CALL_REPORT ("ProWeldSpotdataGet", "ProTestWeldParam", err, err!=PRO_TK_NO_ERROR); ProTKFprintf (fp, "\n number_of_points = %d\n diameter = %f\n" "penetration = %f", spot.number_of_points, spot.diameter, spot.penetration); break; default:; } err = ProTestWeldIntermittencePrint (weld, PROSTANDARD_ANSI, fp); if (err == PRO_TK_E_NOT_FOUND) ProTKFprintf(fp,"\n The weld is not intermittent"); err = ProWeldCompoundGet (weld, &belongs, &num_belongs); TEST_CALL_REPORT ("ProWeldCompoundGet", "ProTestWeldParam", err, err!=PRO_TK_NO_ERROR); if (num_belongs>0) { ProTKFprintf (fp, "\n Weld is a compound. Belong features %s", num_belongs); err = ProArrayFree ((ProArray*)&belongs); } else if (err == PRO_TK_E_NOT_FOUND) ProTKFprintf(fp,"\n The weld is not compound weld"); fclose (fp); ProStringToWstring(w_name, fname); ProInfoWindowDisplay(w_name, NULL, NULL); } return (0); } /*============================================================================*\ FUNCTION : ProTestWeldTypeGet() PURPOSE : Convert ProWeldtype to string. \*============================================================================*/ char* ProTestWeldTypeGet (ProWeldtype type) { switch (type) { case PRO_WELD_FILLET: return (char *)"FILLET"; case PRO_WELD_GROOVE: return (char *)"GROOVE"; case PRO_WELD_PLUG: return (char *)"PLUG"; case PRO_WELD_SLOT: return (char *)"SLOT"; case PRO_WELD_SPOT: return (char *)"SPOT"; } return (char *)"Unknown"; } /*============================================================================*\ FUNCTION : ProTestWeldSubtypeGet () PURPOSE : Convert ProWeldsubtype to string. \*============================================================================*/ char* ProTestWeldSubtypeGet (ProWeldsubtype subtype) { switch (subtype) { case PRO_WELD_GROOVE_NONE: return (char *)"NONE"; case PRO_WELD_GROOVE_SQUARE: return (char *)"SQUARE"; case PRO_WELD_GROOVE_V: return (char *)"V"; case PRO_WELD_GROOVE_BEVEL: return (char *)"BEVEL"; case PRO_WELD_GROOVE_U: return (char *)"U"; case PRO_WELD_GROOVE_J: return (char *)"J"; case PRO_WELD_GROOVE_FLARED_V: return (char *)"FLARED V"; case PRO_WELD_GROOVE_FLARED_BEVEL: return (char *)"FLARED BEVEL"; } return (char *)"Unknown"; } /*============================================================================*\ FUNCTION : ProTestWeldIntermittencePrint() PURPOSE : Print weld intermittence information. \*============================================================================*/ ProError ProTestWeldIntermittencePrint ( ProFeature *weld, ProStandard standard, FILE* fp) { ProError err; ProWeldIntermittence ince; err = ProWeldIntermittenceGet (weld, standard, &ince); TEST_CALL_REPORT ("ProWeldIntermittenceGet", "ProTestWeldIntermittencePrint", err, err!=PRO_TK_NO_ERROR); if(err != PRO_TK_NO_ERROR) return(err); ProTKFprintf (fp, "\n Intermittence in %s standard:\n", (standard == PROSTANDARD_ANSI)?"ANSI":"ISO"); ProTKFprintf (fp, " angular is %s\n", (ince.angular == PRO_B_TRUE) ? "true" : "false"); ProTKFprintf (fp, " at_center is %s\n", (ince.at_center == PRO_B_TRUE) ? "true" : "false"); ProTKFprintf (fp, " length = %f\n pitch = %f\n number_of_welds = %d\n", ince.length, ince.pitch, ince.number_of_welds); return(err); }