/* 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 "TestDimension.h" #include "UtilMath.h" /*====================================================================*\ FUNCTION : ProTestCurveUiAction() PURPOSE : Callback for UI action of analysis feature \*====================================================================*/ ProError ProTestCurveUiAction ( ProAnalysis analysis) { Curvedata_t *data; ProError err = PRO_TK_NO_ERROR; ProSelection *sel; int n_sel; ProFeature feature; ProCurve curve; ProVector origin, x, y; TEST_CALL_REPORT ("ProAnalysisUiAction()", "ProTestCurveUiAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Ask the user to select a curve. \*--------------------------------------------------------------------*/ ProMessageDisplay (msgfil, (char *)"USER Select a curve"); while (1) { if (ProSelect ((char *)"feature", 1, NULL, NULL, NULL, NULL, &sel, &n_sel) != PRO_TK_NO_ERROR || n_sel < 0) return (PRO_TK_USER_ABORT); err = ProSelectionModelitemGet(sel[0], &feature); TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestCurveUiAction()", err, err != PRO_TK_NO_ERROR); if (!ProTestCurvePlaneGet(&feature, origin, x, y)) ProMessageDisplay (msgfil, (char *)"USER That is not a sketched curve. Select again"); else break; } /*--------------------------------------------------------------------*\ Get the pointer to the data stored for this analysis feature, and set the datum point in it. \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveUiAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_USER_ABORT); memcpy (&data->curve, &feature, sizeof (ProFeature)); ProMessageDisplay (msgfil, (char *)"USER Enter the Z offset distance|||0.0"); err = ProMessageDoubleRead(NULL, &data->offset); if (err == PRO_TK_MSG_USER_QUIT) return(PRO_TK_USER_ABORT); if (err != PRO_TK_NO_ERROR) data->offset = 0.0; return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveDimsAction() PURPOSE : Create dimentions \*====================================================================*/ ProError ProTestCurveDimsAction( ProAnalysis analysis, double **dims) { Curvedata_t *data; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisDimsAction()", "ProTestCurveDimsAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet(analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveDimsAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); err = ProArrayObjectAdd ((ProArray*)dims, PRO_VALUE_UNUSED, 1, &data->offset); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCurveDimsAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveInfoallocAction() PURPOSE : Callback to allocate application data needed to describe the analysis feature \*====================================================================*/ ProError ProTestCurveInfoallocAction( ProAnalysis analysis) { Curvedata_t *data; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfoallocAction()", "ProTestCurveInfoallocAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Allocate a data structure \*--------------------------------------------------------------------*/ data = (Curvedata_t*)calloc(1, sizeof(Curvedata_t)); if (data == NULL) return PRO_TK_USER_ABORT; /*--------------------------------------------------------------------*\ Put the data pointer into the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoSet(analysis, data); TEST_CALL_REPORT ("ProAnalysisInfoSet()", "ProTestCurveInfoallocAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveInfofreeAction() PURPOSE : Callback to free the application data \*====================================================================*/ ProError ProTestCurveInfofreeAction( ProAnalysis analysis) { Curvedata_t *data; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfofreeAction()", "ProTestCurveInfofreeAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the data pointer from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveInfofreeAction()", 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()", "ProTestCurveInfofreeAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveCompcheckAction() PURPOSE : Callback to tell Pro/E whether computation can be performed in this analysis feature \*====================================================================*/ ProError ProTestCurveCompcheckAction( ProAnalysis analysis) { Curvedata_t *data; ProError err = PRO_TK_NO_ERROR; ProCurve curve; ProEnttype type; TEST_CALL_REPORT ("ProAnalysisComputecheckAction()", "ProTestCurveCompcheckAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the analysis data \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveCompcheckAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); err = ProFeatureTypeGet (&data->curve, (int*)&type); TEST_CALL_REPORT ("ProFeatureTypeGet()", "ProTestCurveCompcheckAction()", err, err != PRO_TK_NO_ERROR); if (type != PRO_FEAT_CURVE) return (PRO_TK_USER_ABORT); return (PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveComputeAction() PURPOSE : Callback to perform the analysis feature computation \*====================================================================*/ ProError ProTestCurveComputeAction( 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; Curvedata_t *data; ProCurvedata p_curve_data; TEST_CALL_REPORT ("ProAnalysisComputeAction()", "ProTestCurveComputeAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveComputeAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ Get the location of the datum point \*--------------------------------------------------------------------*/ err = ProUtilCollectFeatureGeomitems (&data->curve, PRO_CURVE, &curves); if (err != PRO_TK_NO_ERROR) return PRO_TK_USER_ABORT; ProArraySizeGet (curves, &n_curves); err = ProArrayAlloc (0, sizeof(ProCurvedata), 1, (ProArray*)&data->p_curve_data); for (c = 0; c < n_curves; c++) { err = ProGeomitemIsInactive (&curves[c], &is_inactive); TEST_CALL_REPORT ("ProGeomitemIsInactive()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); if (is_inactive == PRO_B_TRUE) continue; err = ProGeomitemdataGet(&curves[c], &gdata); TEST_CALL_REPORT ("ProGeomitemdataGet()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); switch(gdata->data.p_curve_data->line.type) { case PRO_ENT_LINE : err = ProLinedataGet (gdata->data.p_curve_data, point1, point2); point1[2] += data->offset; point2[2] += data->offset; err = ProLinedataInit (point1, point2, &p_curve_data); break; case PRO_ENT_ARC : err = ProArcdataGet (gdata->data.p_curve_data, vector1, vector2, point1, &double1, &double2, &double3); point1[2] += data->offset; err = ProArcdataInit (vector1, vector2, point1, double1, double2, double3, &p_curve_data); break; case PRO_ENT_SPLINE : err = ProSplinedataGet (gdata->data.p_curve_data, &par_arr, &pnt_arr, &tan_arr, &n_pnt); for (p = 0; p < n_pnt; p++) pnt_arr[p][2] += data->offset; err = ProSplinedataInit (par_arr, pnt_arr, tan_arr, n_pnt, &p_curve_data); break; default : continue; } err = ProArrayObjectAdd ((ProArray*)&data->p_curve_data, PRO_VALUE_UNUSED, 1, &p_curve_data); err = ProGeomitemdataFree(&gdata); TEST_CALL_REPORT ("ProGeomitemdataFree()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); } return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveDisplayAction() PURPOSE : Callback to display the results of the analysis computation \*====================================================================*/ ProError ProTestCurveDisplayAction( ProAnalysis analysis) { Curvedata_t *data; ProVector pos; ProError err = PRO_TK_NO_ERROR; ProEnttype type; int i, num, n_pnt; double *par_arr, double1, double2, double3; ProPoint3d *pnt_arr, point1, point2; ProVector *tan_arr, vector1, vector2; TEST_CALL_REPORT ("ProAnalysisDisplayAction()", "ProTestCurveDisplayAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveDisplayAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); err = ProArraySizeGet (data->p_curve_data, &num); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestCurveDisplayAction()", err, err != PRO_TK_NO_ERROR); for (i = 0; i < num; i++) { err = ProCurvedataTypeGet (&data->p_curve_data[i], &type); TEST_CALL_REPORT ("ProCurvedataTypeGet()", "ProTestCurveDisplayAction()", err, err != PRO_TK_NO_ERROR); switch (type) { case PRO_ENT_LINE : err = ProLinedataGet (&data->p_curve_data[i], point1, point2); ProGraphicsPenPosition(point1); ProGraphicsLineDraw(point2); break; case PRO_ENT_ARC : err = ProArcdataGet (&data->p_curve_data[i], vector1, vector2, point1, &double1, &double2, &double3); ProGraphicsArcDraw (point1, double3, vector1, vector2); break; case PRO_ENT_SPLINE : err = ProSplinedataGet (&data->p_curve_data[i], &par_arr, &pnt_arr, &tan_arr, &n_pnt); ProGraphicsPolylineDraw (pnt_arr, n_pnt); break; default : continue; } } return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveOutputAction() PURPOSE : Callback to write textual information about the result of the computation \*====================================================================*/ ProError ProTestCurveOutputAction( ProAnalysis analysis, ProLine **lines) { Curvedata_t *data; ProError err = PRO_TK_NO_ERROR; ProCharLine buff; ProLine ll[4]; TEST_CALL_REPORT ("ProAnalysisOutputAction()", "ProTestCurveOutputAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application dara from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveOutputAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ Write the origin of the csys \*--------------------------------------------------------------------*/ ProTKSprintf(buff,"Curve offset = %0.2f", data->offset); ProStringToWstring(ll[0], buff); err = ProArrayObjectAdd ((ProArray*)lines, PRO_VALUE_UNUSED, 1, ll); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCurveOutputAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveSavecheckAction() PURPOSE : Callback to tell Pro/E whether the analysis application data can be saved \*====================================================================*/ ProError ProTestCurveSavecheckAction( ProAnalysis analysis) { ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisSavecheckAction()", "ProTestCurveSavecheckAction()", err, err != PRO_TK_NO_ERROR); return (PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveInfosaveAction() PURPOSE : Callback to tell Pro/E what element references are required by the analysis feature \*====================================================================*/ ProError ProTestCurveInfosaveAction( ProAnalysis analysis, ProFeature *feature, ProSelection **references) { ProError err = PRO_TK_NO_ERROR; Curvedata_t *data; ProSelection sel; TEST_CALL_REPORT ("ProAnalysisInfosaveAction()", "ProTestCurveInfosaveAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveInfosaveAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ Output the reference to the datum point \*--------------------------------------------------------------------*/ err = ProSelectionAlloc (NULL, &data->curve, &sel); TEST_CALL_REPORT ("ProSelectionAlloc()", "ProTestCurveInfosaveAction()", err, err != PRO_TK_NO_ERROR); err = ProArrayObjectAdd((ProArray*)references, PRO_VALUE_UNUSED, 1, &sel); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCurveInfosaveAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveInforetrieveAction() PURPOSE : Callback to get the references Pro/E has stored with the analysis feature \*====================================================================*/ ProError ProTestCurveInforetrieveAction( ProAnalysis analysis, ProFeature *feature, ProSelection *references) { Curvedata_t *data; int n_dims; ProDimension *p_dims; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInforetrieveAction()", "ProTestCurveInforetrieveAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveInforetrieveAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ Copy the first reference to the application as the datum point \*--------------------------------------------------------------------*/ err = ProSelectionModelitemGet(references[0], &data->curve); TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestCurveInforetrieveAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ If the feature has a dimension, take its value as the offset \*--------------------------------------------------------------------*/ err = ProTestFeatureDimensionsCollect (feature, &p_dims); err = ProArraySizeGet ((ProArray)p_dims, &n_dims); if(n_dims > 0) { double dim_value; err = ProDimensionValueGet(&p_dims[0], &dim_value); data->offset = dim_value; } return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveInfocopyAction() PURPOSE : \*====================================================================*/ ProError ProTestCurveInfocopyAction( ProAnalysis from, ProAnalysis to) { Curvedata_t *fdata, *tdata; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfocopyAction()", "ProTestCurveInfocopyAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analyses \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (from, (ProAppData*)&fdata); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveInfocopyAction()", 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()", "ProTestCurveInfocopyAction()", 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) \*--------------------------------------------------------------------*/ memcpy (&tdata->curve, &fdata->curve, sizeof (ProFeature)); tdata->offset = fdata->offset; return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurveResultAction() PURPOSE : Callback to give Pro/E the feature parameters and geometry that the analysis feature must contain \*====================================================================*/ ProError ProTestCurveResultAction( ProAnalysis analysis, ProBoolean names_only, ProAnalysisParameter **parameters, ProAnalysisGeomitem **geometry) { Curvedata_t *data; ProAnalysisGeomitem geomitem; ProAnalysisParameter param; ProError err = PRO_TK_NO_ERROR; int num, i, n_pnt, s; double *par_arr, double1, double2, double3; ProPoint3d *pnt_arr, point1, point2; ProVector *tan_arr, vector1, vector2; TEST_CALL_REPORT ("ProAnalysisResultAction()", "ProTestCurveResultAction()", err, err != PRO_TK_NO_ERROR); /*--------------------------------------------------------------------*\ Get the application data from the analysis \*--------------------------------------------------------------------*/ err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurveResultAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /* CURVE */ ProStringToWstring (geomitem.name,(char *)"DTM_CURVE"); geomitem.create = PRO_B_TRUE; geomitem.type = PRO_ANALYSIS_CURVE; if (!names_only) { ProArraySizeGet (data->p_curve_data, &num); ProArrayAlloc (num, sizeof(ProAnalysisEntity), 1, (ProArray*)&geomitem.shapes); for (i = 0; i < num; i++) { err = ProCurvedataAlloc (&geomitem.shapes[i].curve); TEST_CALL_REPORT ("ProCurvedataAlloc()", "ProTestCurveResultAction()", err, err != PRO_TK_NO_ERROR); switch (data->p_curve_data[i].line.type) { case PRO_ENT_LINE : err = ProLinedataGet (&data->p_curve_data[i], point1, point2); err = ProLinedataInit (point1, point2, geomitem.shapes[i].curve); break; case PRO_ENT_ARC : err = ProArcdataGet (&data->p_curve_data[i], vector1, vector2, point1, &double1, &double2, &double3); err = ProArcdataInit (vector1, vector2, point1, double1, double2, double3, geomitem.shapes[i].curve); break; case PRO_ENT_SPLINE : err = ProSplinedataGet (&data->p_curve_data[i], &par_arr, &pnt_arr, &tan_arr, &n_pnt); TEST_CALL_REPORT ("ProSplinedataGet()", "ProTestCurveResultAction()", err, err != PRO_TK_NO_ERROR); err = ProSplinedataInit (par_arr, pnt_arr, tan_arr, n_pnt, geomitem.shapes[i].curve); TEST_CALL_REPORT ("ProSplinedataInit()", "ProTestCurveResultAction()", err, err != PRO_TK_NO_ERROR); break; default: break; } } } err = ProArrayObjectAdd((ProArray*)geometry, PRO_VALUE_UNUSED, 1, &geomitem); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCurveResultAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); }