/* 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" #include "UtilMatrix.h" /*====================================================================*\ FUNCTION : ProTestSectionCsysFind() PURPOSE : \*====================================================================*/ int ProTestSectionCsysFind( ProSection section, ProVector origin, ProVector x, ProVector y) { int *ids, n_ids, i; Pro2dEntdef *entity; ProMatrix matrix; ProSectionLocationGet(section, matrix); ProSectionEntityIdsGet(section, &ids, &n_ids); for(i=0;i<n_ids;i++) { ProSectionEntityGet(section, ids[i], &entity); if(entity->type != PRO_2D_COORD_SYS) continue; origin[0] = ((Pro2dCoordSysdef*)entity)->pnt[0]; origin[1] = ((Pro2dCoordSysdef*)entity)->pnt[1]; origin[2] = 0.0; ProPntTrfEval(origin, matrix, origin); x[0]=1.0; x[1]=x[2]=0.0; ProVectorTrfEval(x, matrix, x); y[0]=y[2]=0.0; y[1]=1.0; ProVectorTrfEval(y, matrix, y); return(1); } return(0); } /*====================================================================*\ FUNCTION : ProTestCurvePlaneGet() PURPOSE : \*====================================================================*/ int ProTestCurvePlaneGet( ProFeature *feature, ProVector origin, ProVector x, ProVector y) { ProElempathItem items[4]; ProElempath epath; ProValue value; ProValueData vdata; ProGeomitem geomitem; ProFeattype ftype; ProGeomitemdata *gdata; ProSection section; ProError err; err = ProFeatureTypeGet (feature, &ftype); TEST_CALL_REPORT ("ProFeatureTypeGet()", "ProTestCurvePlaneGet()", err, err != PRO_TK_NO_ERROR); if(ftype != PRO_FEAT_CURVE) return(0); items[0].type = PRO_ELEM_PATH_ITEM_TYPE_ID; items[0].path_item.elem_id = PRO_E_STD_SECTION; items[1].type = PRO_ELEM_PATH_ITEM_TYPE_ID; items[1].path_item.elem_id = PRO_E_SKETCHER; err = ProElempathAlloc(&epath); TEST_CALL_REPORT ("ProElempathAlloc()", "ProTestCurvePlaneGet()", err, err != PRO_TK_NO_ERROR); err = ProElempathDataSet(epath, items, 2); TEST_CALL_REPORT ("ProElempathDataSet()", "ProTestCurvePlaneGet()", err, err != PRO_TK_NO_ERROR); err = ProFeatureElemValueGet(feature, epath, &value); TEST_CALL_REPORT ("ProElempathDataSet()", "ProTestCurvePlaneGet()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(0); err = ProValueDataGet(value, &vdata); TEST_CALL_REPORT ("ProElempathDataSet()", "ProTestCurvePlaneGet()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(0); section = (ProSection)vdata.v.p; err = ProElempathFree (&epath); err = ProValueFree (value); if(!ProTestSectionCsysFind(section, origin, x, y)) return(0); return(1); } /*====================================================================*\ FUNCTION : ProTestCurvewrapUiAction() PURPOSE : Callback for UI action of analysis feature \*====================================================================*/ ProError ProTestCurvewrapUiAction( ProAnalysis analysis) { ProSelection *sel; ProError err = PRO_TK_NO_ERROR; int n_sel; ProFeature feature; ProModelitem modelitem; Curvewrapdata_t *data; ProPoint p; ProDtmpntType ptype; ProVector origin, x, y; TEST_CALL_REPORT ("ProAnalysisUiAction()", "ProTestCurvewrapUiAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet(analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapUiAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return (PRO_TK_GENERAL_ERROR); ProMessageDisplay (msgfil, (char *)"USER Select sketched datum 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_NO_ERROR); err = ProSelectionModelitemGet(sel[0], &feature); TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestCurvewrapUiAction()", 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; } memcpy(&data->curve, &feature, sizeof(ProFeature)); ProMessageDisplay(msgfil,(char *)"USER Select a point on a surface to wrap onto"); while(1) { if(ProSelect((char *)"point",1,NULL,NULL,NULL,NULL,&sel, &n_sel) != PRO_TK_NO_ERROR || n_sel < 0) return(PRO_TK_NO_ERROR); err = ProSelectionModelitemGet(sel[0], &modelitem); TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestCurvewrapUiAction()", err, err != PRO_TK_NO_ERROR); err = ProPointInit((ProSolid)modelitem.owner, modelitem.id, &p); TEST_CALL_REPORT ("ProPointInit()", "ProTestCurvewrapUiAction()", err, err != PRO_TK_NO_ERROR); if(!ProTestPointPtypeGet((ProSolid)modelitem.owner, p, &ptype) || ptype != PRO_DTMPNT_TYPE_ON_SURF) ProMessageDisplay (msgfil, (char *)"USER That is not a point on surf. Select again"); else break; } memcpy(&data->point, &modelitem, sizeof(ProModelitem)); ProMessageDisplay(msgfil,(char *)"USER Enter rotation angle|||0.0"); err = ProMessageDoubleRead(NULL, &data->angle); if(err == PRO_TK_MSG_USER_QUIT) return(PRO_TK_GENERAL_ERROR); if(err != PRO_TK_NO_ERROR) data->angle = 0.0; return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpDimsAction() PURPOSE : Create dimentions \*====================================================================*/ ProError ProTestCurvewrapDimsAction( ProAnalysis analysis, double **dims) { Curvewrapdata_t *data; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisDimsAction()", "ProTestCurvewrapDimsAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet(analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapDimsAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_NO_ERROR); err = ProArrayObjectAdd ((ProArray*)dims, PRO_VALUE_UNUSED, 1, &data->angle); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCurvewrapDimsAction()", err, err != PRO_TK_NO_ERROR); err = ProArrayObjectAdd ((ProArray*)dims, PRO_VALUE_UNUSED, 1, &data->offset); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCurvewrapDimsAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpInfoallocAction() PURPOSE : Callback to allocate application data needed to describe the analysis feature \*====================================================================*/ ProError ProTestCurvewrapInfoallocAction( ProAnalysis analysis) { Curvewrapdata_t *data; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfoallocAction()", "ProTestCurvewrapInfoallocAction()", err, err != PRO_TK_NO_ERROR); data = (Curvewrapdata_t*)calloc(1, sizeof(Curvewrapdata_t)); data->offset = 0.0; data->curve.id = -1; data->point.id = -1; err = ProAnalysisInfoSet(analysis, data); TEST_CALL_REPORT ("ProAnalysisInfoSet()", "ProTestCurvewrapInfoallocAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewrapInfofreeAction() PURPOSE : Callback to free the application data \*====================================================================*/ ProError ProTestCurvewrapInfofreeAction( ProAnalysis analysis) { Curvewrapdata_t *data; int n_curves, c; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfofreeAction()", "ProTestCurvewrapInfofreeAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapInfofreeAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_NO_ERROR); if (data->curves != NULL) { err = ProArraySizeGet (data->curves, &n_curves); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestCurvewrapInfofreeAction()", err, err != PRO_TK_NO_ERROR); for (c = 0; c < n_curves; c++) { ProCurvedataFree (data->curves [c].curve); } ProArrayFree ((ProArray*)&data->curves); } free(data); err = ProAnalysisInfoSet(analysis, NULL); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapInfofreeAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpCompcheckAction() PURPOSE : Callback to tell Pro/E whether computation can be performed in this analysis feature \*====================================================================*/ ProError ProTestCurvewrapCompcheckAction( ProAnalysis analysis) { Curvewrapdata_t *data; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisComputecheckAction()", "ProTestCurvewrapCompcheckAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet(analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapCompcheckAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_NO_ERROR); if(data->curve.id < 0 || data->point.id < 0) return(PRO_TK_GENERAL_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpComputeAction() PURPOSE : Callback to perform the analysis feature computation \*====================================================================*/ ProError ProTestCurvewrapComputeAction( ProAnalysis analysis) { Curvewrapdata_t *data; double radians, cosine, sine; ProVector origin, x, y, z, pos, der1[2]; ProMatrix from_plane, to_plane; ProGeomitem *curves; ProGeomitemdata *gdata; int n_curves, c, p, i, size; ProCurve curve; ProSurfcurvedata surf_curve; ProCurvedata *spline; ProSelection point_sel; ProPoint point; ProUvParam uv; double xscale, yscale, t; ProError err = PRO_TK_NO_ERROR; ProBoolean is_inactive; ProSurface surface; int degree, num_knots, num_pnts; double *params, *weights; ProPoint3d *c_pnts; TEST_CALL_REPORT ("ProAnalysisComputeAction()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet(analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_NO_ERROR); ProTestCurvePlaneGet(&data->curve, origin, x, y); ProUtilVectorCross(x, y, z); ProMatrixInit(x, y, z, origin, from_plane); ProUtilMatrixInvert(from_plane, to_plane); err = ProSelectionAlloc(NULL, &data->point, &point_sel); TEST_CALL_REPORT ("ProSelectionAlloc()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); ProTestPointSrfGet(point_sel, &surface); ProSelectionFree (&point_sel); err = ProPointInit((ProSolid)data->point.owner, data->point.id, &point); TEST_CALL_REPORT ("ProPointInit()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProPointCoordGet(point, pos); TEST_CALL_REPORT ("ProPointCoordGet()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); pos[1] += data->offset; err = ProSurfaceParamEval((ProSolid)data->point.owner, surface, pos, uv); TEST_CALL_REPORT ("ProSurfaceParamEval()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProSurfaceXyzdataEval (surface, uv, NULL, der1, NULL, NULL); TEST_CALL_REPORT ("ProSurfaceXyzdataEval()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); xscale = 1.0/ProUtilVectorLength(der1[0]); yscale = 1.0/ProUtilVectorLength(der1[1]); err = ProUtilCollectFeatureGeomitems (&data->curve, PRO_CURVE, &curves); if (err != PRO_TK_NO_ERROR) return PRO_TK_USER_ABORT; err = ProArraySizeGet (curves, &n_curves); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProArrayAlloc (0, sizeof(ProSurfcurvedata), 1, (ProArray*)&data->curves); TEST_CALL_REPORT ("ProArrayAlloc()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); for (c = 0; c < n_curves; c++) { err = ProCurvedataAlloc (&spline); TEST_CALL_REPORT ("ProCurvedataAlloc()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); 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 : spline->spline.num_points = 2; spline->spline.type = PRO_ENT_SPLINE; ProArrayAlloc (2, sizeof(double), 1, (ProArray*)&spline->spline.par_arr); ProArrayAlloc (2, sizeof(ProVector), 1, (ProArray*)&spline->spline.tan_arr); ProArrayAlloc (2, sizeof(ProVector), 1, (ProArray*)&spline->spline.pnt_arr); spline->spline.par_arr[0] = 0.0; spline->spline.par_arr[1] = 1.0; memcpy(spline->spline.pnt_arr[0], gdata->data.p_curve_data->line.end1, sizeof(ProVector)); memcpy(spline->spline.pnt_arr[1], gdata->data.p_curve_data->line.end2, sizeof(ProVector)); ProUtilVectorDiff(spline->spline.pnt_arr[1], spline->spline.pnt_arr[0], spline->spline.tan_arr[0]); ProUtilVectorNormalize(spline->spline.tan_arr[0], spline->spline.tan_arr[0]); ProUtilVectorCopy(spline->spline.tan_arr[0], spline->spline.tan_arr[1]); break; case PRO_ENT_ARC : spline->spline.num_points = 6; spline->spline.type = PRO_ENT_SPLINE; ProArrayAlloc (spline->spline.num_points, sizeof(double), 1, (ProArray*)&spline->spline.par_arr); ProArrayAlloc(spline->spline.num_points, sizeof(ProVector), 1, (ProArray*)&spline->spline.tan_arr); ProArrayAlloc(spline->spline.num_points, sizeof(ProVector), 1, (ProArray*)&spline->spline.pnt_arr); for(i=0;i<6;i++) { t= 0.2 * i; spline->spline.par_arr[i] = t; err = ProCurveInit((ProSolid)curves[c].owner, curves[c].id, &curve); TEST_CALL_REPORT ("ProCurveInit()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProCurveXyzdataEval(curve, t, spline->spline.pnt_arr[i], spline->spline.tan_arr[i], NULL); TEST_CALL_REPORT ("ProCurveXyzdataEval()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); } break; case PRO_ENT_SPLINE : spline->spline.num_points = gdata->data.p_curve_data->spline.num_points; spline->spline.type = PRO_ENT_SPLINE; ProArrayAlloc (spline->spline.num_points, sizeof(double), 1, (ProArray*)&spline->spline.par_arr); ProArrayAlloc(spline->spline.num_points, sizeof(ProVector), 1, (ProArray*)&spline->spline.tan_arr); ProArrayAlloc(spline->spline.num_points, sizeof(ProVector), 1, (ProArray*)&spline->spline.pnt_arr); for (p = 0; p < gdata->data.p_curve_data->spline.num_points; p++) { memcpy (spline->spline.pnt_arr[p], gdata->data.p_curve_data->spline.pnt_arr[p], sizeof(ProVector)); spline->spline.par_arr[p] = gdata->data.p_curve_data->spline.par_arr[p]; } break; case PRO_ENT_B_SPLINE : err = ProBsplinedataGet (gdata->data.p_curve_data, °ree, ¶ms, &weights, &c_pnts, &num_knots, &num_pnts); TEST_CALL_REPORT ("ProBsplinedataGet()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProBsplinedataInit (degree, params, weights, c_pnts, num_knots, num_pnts, spline); TEST_CALL_REPORT ("ProBsplinedataInit()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); break; default: continue; } radians = TWOPI * data->angle / 360.0; sine = sin(radians); cosine = cos(radians); if (gdata->data.p_curve_data->line.type == PRO_ENT_B_SPLINE) { for (p = 0; p < spline->b_spline.num_c_points; p++) { if (spline->b_spline.weights != NULL) { spline->b_spline.c_pnts[p][0] /= spline->b_spline.weights[p]; spline->b_spline.c_pnts[p][1] /= spline->b_spline.weights[p]; spline->b_spline.c_pnts[p][2] /= spline->b_spline.weights[p]; } err = ProPntTrfEval (spline->b_spline.c_pnts[p], to_plane, spline->b_spline.c_pnts[p]); TEST_CALL_REPORT ("ProPntTrfEval()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); spline->b_spline.c_pnts[p][0] = cosine * spline->b_spline.c_pnts[p][0] + sine * spline->b_spline.c_pnts[p][1]; spline->b_spline.c_pnts[p][1] = -sine * spline->b_spline.c_pnts[p][0] + cosine * spline->b_spline.c_pnts[p][1]; spline->b_spline.c_pnts[p][0] *= xscale; spline->b_spline.c_pnts[p][1] *= yscale; spline->b_spline.c_pnts[p][0] += uv[0]; spline->b_spline.c_pnts[p][1] += uv[1]; if (spline->b_spline.weights != NULL) { spline->b_spline.c_pnts[p][0] *= spline->b_spline.weights[p]; spline->b_spline.c_pnts[p][1] *= spline->b_spline.weights[p]; spline->b_spline.c_pnts[p][2] *= spline->b_spline.weights[p]; } } } else { for (p = 0; p < spline->spline.num_points; p++) { err = ProPntTrfEval (spline->spline.pnt_arr[p], to_plane, spline->spline.pnt_arr[p]); TEST_CALL_REPORT ("ProPntTrfEval()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); spline->spline.pnt_arr[p][0] = cosine * spline->spline.pnt_arr[p][0] + sine * spline->spline.pnt_arr[p][1]; spline->spline.pnt_arr[p][1] = -sine * spline->spline.pnt_arr[p][0] + cosine * spline->spline.pnt_arr[p][1]; spline->spline.pnt_arr[p][0] *= xscale; spline->spline.pnt_arr[p][1] *= yscale; spline->spline.pnt_arr[p][0] += uv[0]; spline->spline.pnt_arr[p][1] += uv[1]; err = ProVectorTrfEval (spline->spline.tan_arr[p], to_plane, spline->spline.tan_arr[p]); TEST_CALL_REPORT ("ProVectorTrfEval()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); spline->spline.tan_arr[p][0] = cosine * spline->spline.pnt_arr[p][0] + sine * spline->spline.pnt_arr[p][1]; spline->spline.tan_arr[p][1] = -sine * spline->spline.pnt_arr[p][0] + cosine * spline->spline.pnt_arr[p][1]; spline->spline.tan_arr[p][0] *= xscale; spline->spline.tan_arr[p][1] *= yscale; } } err = ProSurfcurvedataInit (surface, spline, (ProCurvedata*)&surf_curve); TEST_CALL_REPORT ("ProSurfcurvedataInit()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProCurvedataMemoryFree (spline); err = ProArrayObjectAdd ((ProArray*)&data->curves, PRO_VALUE_UNUSED, 1, &surf_curve); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); err = ProGeomitemdataFree(&gdata); TEST_CALL_REPORT ("ProGeomitemdataFree()", "ProTestCurvewrapComputeAction()", err, err != PRO_TK_NO_ERROR); } err = ProArrayFree ((ProArray*)&curves); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpDisplayAction() PURPOSE : Callback to display the results of the analysis computation \*====================================================================*/ ProError ProTestCurvewrapDisplayAction( ProAnalysis analysis) { Curvewrapdata_t *data; int n_curves, c, p; ProVector pos; ProError err = PRO_TK_NO_ERROR; ProPoint3d point; TEST_CALL_REPORT ("ProAnalysisDisplayAction()", "ProTestCurvewrapDisplayAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet(analysis, (ProAppData*)&data); if (err != PRO_TK_NO_ERROR) return(PRO_TK_NO_ERROR); err = ProArraySizeGet(data->curves, &n_curves); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestCurvewrapDisplayAction()", err, err != PRO_TK_NO_ERROR); for (c = 0; c < n_curves; c++) { if (data->curves[c].curve->line.type == PRO_ENT_B_SPLINE) { for (p = 0; p < data->curves[c].curve->b_spline.num_c_points; p++) { point[0] = data->curves[c].curve->b_spline.c_pnts[p][0]; point[1] = data->curves[c].curve->b_spline.c_pnts[p][1]; point[2] = data->curves[c].curve->b_spline.c_pnts[p][2]; if (data->curves[c].curve->b_spline.weights != NULL) { point[0] /= data->curves[c].curve->b_spline.weights[p]; point[1] /= data->curves[c].curve->b_spline.weights[p]; point[2] /= data->curves[c].curve->b_spline.weights[p]; } err = ProSurfaceXyzdataEval (data->curves[c].surface, point, pos, NULL, NULL, NULL); TEST_CALL_REPORT ("ProSurfaceXyzdataEval()", "ProTestCurvewrapDisplayAction()", err, err != PRO_TK_NO_ERROR); if (p == 0) ProGraphicsPenPosition(pos); else ProGraphicsLineDraw(pos); } } else { for (p = 0; p < data->curves[c].curve->spline.num_points; p++) { err = ProSurfaceXyzdataEval (data->curves[c].surface, data->curves[c].curve->spline.pnt_arr[p], pos, NULL, NULL, NULL); TEST_CALL_REPORT ("ProSurfaceXyzdataEval()", "ProTestCurvewrapDisplayAction()", err, err != PRO_TK_NO_ERROR); if (p == 0) ProGraphicsPenPosition(pos); else ProGraphicsLineDraw(pos); } } } return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpOutputAction() PURPOSE : Callback to write textual information about the result of the computation \*====================================================================*/ ProError ProTestCurvewrapOutputAction( ProAnalysis analysis, ProLine **lines) { ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisOutputAction()", "ProTestCurvewrapOutputAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpSavecheckAction() PURPOSE : Callback to tell Pro/E whether the analysis application data can be saved \*====================================================================*/ ProError ProTestCurvewrapSavecheckAction( ProAnalysis analysis) { ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisSavecheckAction()", "ProTestCurvewrapSavecheckAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpInfosaveAction() PURPOSE : Callback to tell Pro/E what element references are required by the analysis feature \*====================================================================*/ ProError ProTestCurvewrapInfosaveAction( ProAnalysis analysis, ProFeature *feature, ProSelection **references) { Curvewrapdata_t *data; ProSelection sel; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfosaveAction()", "ProTestCurvewrapInfosaveAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet (analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapInfosaveAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_NO_ERROR); ProSelectionAlloc(NULL, &data->curve, &sel); ProArrayObjectAdd((ProArray*)references, -1, 1, &sel); ProSelectionAlloc(NULL, &data->point, &sel); ProArrayObjectAdd((ProArray*)references, -1, 1, &sel); return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpInforetrieveAction() PURPOSE : Callback to get the references Pro/E has stored with the analysis feature \*====================================================================*/ ProError ProTestCurvewrapInforetrieveAction( ProAnalysis analysis, ProFeature *feature, ProSelection *references) { Curvewrapdata_t *data; int n_dims; ProDimension *p_dims; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInforetrieveAction()", "ProTestCurvewrapInforetrieveAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet(analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapInforetrieveAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_NO_ERROR); ProSelectionModelitemGet(references[0], &data->curve); ProSelectionModelitemGet(references[1], &data->point); /*--------------------------------------------------------------------*\ 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->angle = dim_value; err = ProDimensionValueGet(&p_dims[1], &dim_value); data->offset = dim_value; } return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpInfocopyAction() PURPOSE : Copy information \*====================================================================*/ ProError ProTestCurvewrapInfocopyAction( ProAnalysis from, ProAnalysis to) { Curvewrapdata_t *fdata, *tdata; int n_curves, c; ProError err = PRO_TK_NO_ERROR; TEST_CALL_REPORT ("ProAnalysisInfocopyAction()", "ProTestCurvewrapInfocopyAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet (from, (ProAppData*)&fdata); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapInfocopyAction()", 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()", "ProTestCurvewrapInfocopyAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); memcpy(&tdata->curve, &fdata->curve, sizeof(ProFeature)); memcpy(&tdata->point, &fdata->point, sizeof(ProFeature)); tdata->angle = fdata->angle; tdata->offset = fdata->offset; return(PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestCurvewarpResultAction() PURPOSE : Callback to give Pro/E the feature parameters and geometry that the analysis feature must contain \*====================================================================*/ ProError ProTestCurvewrapResultAction( ProAnalysis analysis, ProBoolean names_only, ProAnalysisParameter **parameters, ProAnalysisGeomitem **geometry) { ProAnalysisParameter param; ProAnalysisGeomitem geomitem; ProSurface surface; ProCurvedata *curves_data; Curvewrapdata_t *data; int n_geoms, n_shapes, g, s, n_curves, c, p; ProCharName buff; ProError err = PRO_TK_NO_ERROR; double *par_arr; ProPoint3d *pnt_arr; ProPoint3d *tan_arr; int num; TEST_CALL_REPORT ("ProAnalysisResultAction()", "ProTestCurvewrapResultAction()", err, err != PRO_TK_NO_ERROR); err = ProAnalysisInfoGet(analysis, (ProAppData*)&data); TEST_CALL_REPORT ("ProAnalysisInfoGet()", "ProTestCurvewrapResultAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return(PRO_TK_GENERAL_ERROR); /*--------------------------------------------------------------------*\ TEMP PARAMETER JUST TO MAKE SURE THE ENTITY GETS CREATED \*--------------------------------------------------------------------*/ ProStringToWstring(param.name, (char *)"TESTPARAM"); param.create = PRO_B_TRUE; ProStringToWstring(param.description, (char *)"This is my test parameter"); ProArrayAlloc(1, sizeof(ProParamvalue), 1, (ProArray*)¶m.values); param.values[0].type = PRO_PARAM_DOUBLE; param.values[0].value.d_val=99.9; ProArrayObjectAdd((ProArray*)parameters, -1, 1, ¶m); ProStringToWstring(geomitem.name, (char *)"SURF_CURVE"); geomitem.create = PRO_B_TRUE; geomitem.type = PRO_ANALYSIS_CURVE; if (!names_only) { ProArraySizeGet (data->curves, &n_curves); ProArrayAlloc (n_curves, sizeof(ProAnalysisEntity), 1, (ProArray*)&geomitem.shapes); for (c = 0; c < n_curves; c++) { err = ProCurvedataAlloc (&geomitem.shapes[c].curve); TEST_CALL_REPORT ("ProCurvedataAlloc()", "ProTestCurvewrapResultAction()", err, err != PRO_TK_NO_ERROR); err = ProSurfcurvedataGet ((ProCurvedata*)&data->curves[c], &surface, &curves_data); TEST_CALL_REPORT ("ProSurfcurvedataGet()", "ProTestCurvewrapResultAction()", err, err != PRO_TK_NO_ERROR); if (err != PRO_TK_NO_ERROR) return PRO_TK_GENERAL_ERROR; err = ProSurfcurvedataInit (surface, curves_data, geomitem.shapes[c].curve); TEST_CALL_REPORT ("ProSurfcurvedataInit()", "ProTestCurvewrapResultAction()", err, err != PRO_TK_NO_ERROR); err = ProCurvedataMemoryFree ( curves_data ) ; TEST_CALL_REPORT ("ProCurvedataFree()", "ProTestCurvewrapResultAction()", err, err != PRO_TK_NO_ERROR); } } err = ProArrayObjectAdd ((ProArray*)geometry, PRO_VALUE_UNUSED, 1, &geomitem); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestCurvewrapResultAction()", err, err != PRO_TK_NO_ERROR); return(PRO_TK_NO_ERROR); }