/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*--------------------------------------------------------------------*\ Pro/TOOLKIT includes \*--------------------------------------------------------------------*/ #include <ProToolkit.h> #include <ProAnalysis.h> #include <ProModelitem.h> #include <ProMessage.h> #include <ProArray.h> #include <ProPoint.h> #include <ProDtmPnt.h> #include <ProUtil.h> /*--------------------------------------------------------------------*\ Application includes \*--------------------------------------------------------------------*/ #include "TestError.h" #include "TestAnalysis.h" #include "UtilMath.h" /*====================================================================*\ FUNCTION : ProTestCompCurveUiAction() PURPOSE : Callback for UI action of analysis feature \*====================================================================*/ ProError ProTestCompCurveUiAction ( ProAnalysis analysis) { CompCurvedata_t *data; ProError err = PRO_TK_NO_ERROR; ProSelection *sel; int n_sel; ProModelitem model_item; ProCurve curve; ProVector origin, x, y; TEST_CALL_REPORT ("ProAnalysisUiAction()", "ProTestCompCurveUiAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the data pointer from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCompCurveUiAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_USER_ABORT); ProArrayAlloc (0, sizeof (ProModelitem), 1, (ProArray*)&data->curves); ProMessageDisplay (msgfil, (char *)"USER Select a curve"); /*--------------------------------------------------------------------*\ Collect curves for future composite curve \*--------------------------------------------------------------------*/ while (1) { if (ProSelect ((char *)"curve", 1, NULL, NULL, NULL, NULL, &sel, &n_sel) != PRO_TK_NO_ERROR || n_sel < 1) break; err = ProSelectionModelitemGet(sel[0], &model_item); TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestCompCurveUiAction()", err, err != PRO_TK_NO_ERROR); if (model_item.type != PRO_CURVE || err != PRO_TK_NO_ERROR) continue; err = ProArrayObjectAdd ((ProArray*)&data->curves, PRO_VALUE_UNUSED, 1, &model_item); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCompCurveUiAction()", err, err != PRO_TK_NO_ERROR); } err = ProArraySizeGet (data->curves, &n_sel); if (n_sel < 1 || err != PRO_TK_NO_ERROR) return PRO_TK_USER_ABORT; return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveDimsAction() PURPOSE : \*====================================================================*/ ProError ProTestCompCurveDimsAction( ProAnalysis analysis, double **dims) { ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisDimsAction()", "ProTestCompCurveDimsAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ No dimensions \*--------------------------------------------------------------------*/ return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveInfoallocAction() PURPOSE : Callback to allocate application data needed to describe the analysis feature \*====================================================================*/ ProError ProTestCompCurveInfoallocAction( ProAnalysis analysis) { CompCurvedata_t *data; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfoallocAction()", "ProTestCompCurveInfoallocAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Allocate a data structure \*--------------------------------------------------------------------*/ data = (CompCurvedata_t*)calloc(1, sizeof(CompCurvedata_t)); if (data == NULL) return PRO_TK_USER_ABORT; /*--------------------------------------------------------------------*\ Put the data pointer into the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoSet(analysis, data); TEST_CALL_REPORT ("ProAnalysisInfoSet()", "ProTestCompCurveInfoallocAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveInfofreeAction() PURPOSE : Callback to free the application data \*====================================================================*/ ProError ProTestCompCurveInfofreeAction( ProAnalysis analysis) { CompCurvedata_t *data; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfofreeAction()", "ProTestCompCurveInfofreeAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the data pointer from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCompCurveInfofreeAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ Free the data \*--------------------------------------------------------------------*/ free (data); /*--------------------------------------------------------------------*\ Set the data pointer in the analysis to NULL \*--------------------------------------------------------------------*/ err = ProAnalysisInfoSet (analysis, NULL); TEST_CALL_REPORT ("ProAnalysisInfoSet()", "ProTestCompCurveInfofreeAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveCompcheckAction() PURPOSE : Callback to tell Pro/E whether computation can be performed in this analysis feature \*====================================================================*/ ProError ProTestCompCurveCompcheckAction( ProAnalysis analysis) { ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisComputecheckAction()", "ProTestCompCurveCompcheckAction()", err, err != PRO_TK_NO_ERROR); return (PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveComputeAction() PURPOSE : Callback to perform the analysis feature computation \*====================================================================*/ ProError ProTestCompCurveComputeAction( ProAnalysis analysis) { ProError err = PRO_TK_NO_ERROR; ProGeomitem *curves; ProGeomitemdata *gdata; double *par_arr, double1, double2, double3; ProPoint3d *pnt_arr, point1, point2; ProVector *tan_arr, vector1, vector2; ProBoolean is_inactive; int c, p, n_curves, n_pnt; CompCurvedata_t *data; ProComponentCurvedata *component; TEST_CALL_REPORT ("ProAnalysisComputeAction()", "ProTestCompCurveComputeAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCompCurveComputeAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); ProArraySizeGet (data->curves, &n_curves); err = ProArrayAlloc (0, sizeof(ProComponentCurvedata), 1, (ProArray*)&data->components); for (c = 0; c < n_curves; c++) { /*--------------------------------------------------------------------*\ Get geometry of curve \*--------------------------------------------------------------------*/ err = ProGeomitemdataGet(&data->curves[c], &gdata); TEST_CALL_REPORT ("ProGeomitemdataGet()", "ProTestCompCurveComputeAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Allocate memory for curve component \*--------------------------------------------------------------------*/ err = ProComponentCurvedataAlloc (&component); TEST_CALL_REPORT ("ProComponentCurvedataAlloc()", "ProTestCompCurveComputeAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Initialize curve component \*--------------------------------------------------------------------*/ err = ProComponentCurvedataInit (gdata->data.p_curve_data, PRO_CURVE_NO_FLIP, component); TEST_CALL_REPORT ("ProComponentCurvedataInit()", "ProTestCompCurveComputeAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Add curve component to array \*--------------------------------------------------------------------*/ err = ProArrayObjectAdd ((ProArray*)&data->components, PRO_VALUE_UNUSED, 1, component); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCompCurveComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProGeomitemdataFree(&gdata); TEST_CALL_REPORT ("ProGeomitemdataFree()", "ProTestCompCurveComputeAction()", err, err != PRO_TK_NO_ERROR); } return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveDisplayAction() PURPOSE : Callback to display the results of the analysis computation \*====================================================================*/ ProError ProTestCompCurveDisplayAction( ProAnalysis analysis) { ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisDisplayAction()", "ProTestCompCurveDisplayAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveOutputAction() PURPOSE : Callback to write textual information about the result of the computation \*====================================================================*/ ProError ProTestCompCurveOutputAction( ProAnalysis analysis, ProLine **lines) { ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisOutputAction()", "ProTestCompCurveOutputAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveSavecheckAction() PURPOSE : Callback to tell Pro/E whether the analysis application data can be saved \*====================================================================*/ ProError ProTestCompCurveSavecheckAction( ProAnalysis analysis) { ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisSavecheckAction()", "ProTestCompCurveSavecheckAction()", err, err != PRO_TK_NO_ERROR); return (PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveInfosaveAction() PURPOSE : Callback to tell Pro/E what element references are required by the analysis feature, and save the rest of the info to Ext Data \*====================================================================*/ ProError ProTestCompCurveInfosaveAction( ProAnalysis analysis, ProFeature *feature, ProSelection **references) { ProError err = PRO_TK_NO_ERROR; CompCurvedata_t *data; ProSelection sel; int num, i; TEST_CALL_REPORT ("ProAnalysisInfosaveAction()", "ProTestCompCurveInfosaveAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCompCurveInfosaveAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ Save references \*--------------------------------------------------------------------*/ ProArraySizeGet (data->curves, &num); for (i = 0; i < num; i++) { err = ProSelectionAlloc (NULL, &data->curves[i], &sel); TEST_CALL_REPORT ("ProSelectionAlloc()", "ProTestCompCurveInfosaveAction()", err, err != PRO_TK_NO_ERROR); err = ProArrayObjectAdd((ProArray*)references, PRO_VALUE_UNUSED, 1, &sel); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCompCurveInfosaveAction()", err, err != PRO_TK_NO_ERROR); } return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveInforetrieveAction() PURPOSE : Callback to get the references Pro/E has stored with the analysis feature \*====================================================================*/ ProError ProTestCompCurveInforetrieveAction( ProAnalysis analysis, ProFeature *feature, ProSelection *references) { CompCurvedata_t *data; int num, i; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInforetrieveAction()", "ProTestCompCurveInforetrieveAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the data pointer from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCompCurveInforetrieveAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ Retrieve references \*--------------------------------------------------------------------*/ ProArraySizeGet (references, &num); for (i = 0; i < num; i++) { err = ProSelectionModelitemGet(references[i], &data->curves[i]); TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestCompCurveInforetrieveAction()", err, err != PRO_TK_NO_ERROR); } return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveInfocopyAction() PURPOSE : Copy information \*====================================================================*/ ProError ProTestCompCurveInfocopyAction( ProAnalysis from, ProAnalysis to) { CompCurvedata_t *fdata, *tdata; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfocopyAction()", "ProTestCompCurveInfocopyAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analyses \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (from, (ProAppData*)&fdata); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCompCurveInfocopyAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); err = ProAnalysisInfoGet (to, (ProAppData*)&tdata); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCompCurveInfocopyAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ Copy the application-specific data (everything except references) \*--------------------------------------------------------------------*/ tdata->curves = fdata->curves; return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCompCurveResultAction() PURPOSE : Callback to give Pro/E the feature parameters and geometry that the analysis feature must contain \*====================================================================*/ ProError ProTestCompCurveResultAction( ProAnalysis analysis, ProBoolean names_only, ProAnalysisParameter **parameters, ProAnalysisGeomitem **geometry) { CompCurvedata_t *data; ProAnalysisGeomitem geomitem; ProAnalysisParameter param; ProError err = PRO_TK_NO_ERROR; int num, i, n_pnt, s; ProCurvedata *curve_data; ProCurveDir dir; TEST_CALL_REPORT ("ProAnalysisResultAction()", "ProTestCompCurveResultAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCompCurveResultAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /* CURVE */ ProStringToWstring (geomitem.name,(char *)"COMP_CURVE"); geomitem.create = PRO_B_TRUE; geomitem.type = PRO_ANALYSIS_COMP_CRV; if (!names_only) { ProArrayAlloc (1, sizeof(ProAnalysisEntity), 1, (ProArray*)&geomitem.shapes); err = ProCurvedataAlloc (&geomitem.shapes[0].curve); TEST_CALL_REPORT ("ProCurvedataAlloc()", "ProTestCompCurveResultAction()", err, err != PRO_TK_NO_ERROR); err = ProCompositeCurvedataInit (data->components, geomitem.shapes[0].curve); TEST_CALL_REPORT ("ProCompositeCurvedataInit()", "ProTestCompCurveResultAction()", err, err != PRO_TK_NO_ERROR); } err = ProArrayObjectAdd((ProArray*)geometry, PRO_VALUE_UNUSED, 1, &geomitem); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCompCurveResultAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); }