#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct outline_struct { double min[3]; double max[3]; ProMdl model; ProMatrix matrix; } outline_struct; typedef struct surf_tesselate_struct { int face_id; double corner1[3]; double corner2[3]; double corner3[3]; } surf_tesselate_struct; //Copy a vector to another double *ProUtilVectorCopy( double from[3], double to[3]) { if(from == NULL) to[0] = to[1] = to[2] = 0.0; else { to[0] = from[0]; to[1] = from[1]; to[2] = from[2]; } return(to); } //Transform a 3d point by a matrix void ProUtilPointTrans( double m[4][4], double p[3], double output[3]) { double buff[4]; ProError status; if(m == NULL) { ProUtilVectorCopy(p, output); return; } status = ProPntTrfEval(p, m, buff); ProUtilVectorCopy(buff, output); } 7 // draw outline as wireframe ProError draw_outline_wireframe(ProVector min,ProVector max) { ProVector vec; vec[0]=min[0]; vec[1]=min[1]; vec[2]=min[2]; ProGraphicsPenPosition(vec); vec[1] = max[1]; ProGraphicsLineDraw(vec); vec[0] = max[0]; ProGraphicsLineDraw(vec); vec[1] = min[1]; ProGraphicsLineDraw(vec); vec[0] = min[0]; ProGraphicsLineDraw(vec); vec[2] = max[2]; ProGraphicsLineDraw(vec); vec[1] = max[1]; ProGraphicsLineDraw(vec); vec[0] = max[0]; ProGraphicsLineDraw(vec); vec[1] = min[1]; ProGraphicsLineDraw(vec); vec[0] = min[0]; ProGraphicsLineDraw(vec); vec[0]=min[0]; vec[1]=min[1]; vec[2]=min[2]; ProGraphicsPenPosition(vec); vec[2] = max[2]; ProGraphicsLineDraw(vec); vec[1] = max[1]; ProGraphicsLineDraw(vec); vec[2] = min[2]; ProGraphicsLineDraw(vec); vec[0] = max[0]; ProGraphicsLineDraw(vec); vec[2] = max[2]; ProGraphicsLineDraw(vec); vec[1] = min[1]; ProGraphicsLineDraw(vec); vec[2] = min[2]; ProGraphicsLineDraw(vec); return PRO_TK_NO_ERROR; } 7 // Copy one matrix to another, or initialize a matrix to be the unitary matrix void ProUtilMatrixCopy( double input[4][4], double output[4][4]) { int i,j; if(input == NULL) { for(i=0;i<4;i++) { for(j=0;j<4;j++) { output[i][j] = 0.0; } } output[0][0] = 1.0; output[1][1] = 1.0; output[2][2] = 1.0; output[3][3] = 1.0; } else { for(i=0;i<4;i++) { for(j=0;j<4;j++) { output[i][j] = input[i][j]; } } } } 7 // Find the inverse of a transformation matrix int ProUtilMatrixInvert( double m[4][4], double output[4][4]) { double vec[3], scale_sq, inv_sq_scale; int i,j; //If the matrix is null, return the identity matrix if(m == NULL) { ProUtilMatrixCopy(NULL, output); return(1); } //Obtain the matrix scale vec[0] = m[0][0]; vec[1] = m[0][1]; vec[2] = m[0][2]; scale_sq = vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]; //Check whether there is an inverse, and if not, return 0 if(scale_sq < (.000000001 * .000000001)) return(0); //Need the inverse scale squared inv_sq_scale = 1.0 / scale_sq; //The orientation vectors for(j=0;j<3;j++) { for(i=0;i<3;i++) { output[j][i] = m[i][j] * inv_sq_scale; } output[j][3] = 0.0; } // The shift vectors for(i=0;i<3;i++) { output[3][i] = 0.0; for(j=0;j<3;j++) { output[3][i] -= m[i][j] * m[3][j] * inv_sq_scale; } } output[3][3] = 1.0; return(1); } ProError ModelOutlineCompute(ProMdl model, double *modelLength = NULL) { ProError err; // 初始化 outline_struct get_outline; get_outline.max[0]=-100000; get_outline.max[1]=-100000; get_outline.max[2]=-100000; get_outline.min[0]=+100000; get_outline.min[1]=+100000; get_outline.min[2]=+100000; ProMatrix rel_matrix={ {1.0, 0.0, 0.0, 0.0}, {0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 1.0, 0.0}, {0.0, 0.0, 0.0, 1.0} }; // 獲取默認坐標系的矩陣 ProSelection sel_outline_csys; char outline_csys_def[PRO_NAME_SIZE] = "PRT_M_CENTER"; ProName csys_def_name; ProStringToWstring(csys_def_name, outline_csys_def); ProModelitem csys_gi; err = ProModelitemByNameInit(model, PRO_CSYS, csys_def_name, &csys_gi); if (err == PRO_TK_NO_ERROR) { ProGeomitemdata *p_csys_daten; err = ProGeomitemdataGet(&csys_gi,&p_csys_daten); if (err!=PRO_TK_NO_ERROR) { return PRO_TK_USER_ABORT; } err = ProMatrixInit(p_csys_daten->data.p_csys_data->x_vector, p_csys_daten->data.p_csys_data->y_vector, p_csys_daten->data.p_csys_data->z_vector, p_csys_daten->data.p_csys_data->origin, rel_matrix); err = ProGeomitemdataFree(&p_csys_daten); } // 通過曲面特徵計算檔案的外形 ProSurfaceTessellationData *tes_data = NULL; err = ProPartTessellate((ProPart)model,0.1,0,PRO_B_FALSE,&tes_data); int i, j, SurfCount =0; ProSurface outlineSurfs[6]; err=ProArraySizeGet((ProArray)tes_data, &SurfCount); if (err != PRO_TK_NO_ERROR || SurfCount < 1) { return err; } ProSrftype surfType; // 先將曲面排序,首先計算圓柱面 ProSurfaceTessellationData *cylSurfData = NULL; ProSurfaceTessellationData *notCysSurfData = NULL; err = ProArrayAlloc(0, sizeof(ProSurfaceTessellationData), 1, (ProArray*)&cylSurfData); err = ProArrayAlloc(0, sizeof(ProSurfaceTessellationData), 1, (ProArray*)¬CysSurfData); for (i = 0; i < SurfCount; ++i) { err = ProSurfaceTypeGet(tes_data[i].surface, &surfType); if (surfType == PRO_SRF_CYL) { err = ProArrayObjectAdd((ProArray*)&cylSurfData, -1, 1, &tes_data[i]); } else { err = ProArrayObjectAdd((ProArray*)¬CysSurfData, -1, 1, &tes_data[i]); } } int cylSurfCount = 0; err = ProArraySizeGet((ProArray)cylSurfData, &cylSurfCount); for (i = 0; i < cylSurfCount; ++i) { tes_data[i] = cylSurfData[i]; } for (i = 0; i < SurfCount - cylSurfCount; ++i) { tes_data[i + cylSurfCount] = notCysSurfData[i]; } //int face_id=0; for(i=0; i
get_outline.max[0]) { get_outline.max[0]=transformed[0]; outlineSurfs[0] = tes_data[i].surface; } if(transformed[1]>get_outline.max[1]) { get_outline.max[1]=transformed[1]; outlineSurfs[1] = tes_data[i].surface; } if(transformed[2]>get_outline.max[2]) { get_outline.max[2]=transformed[2]; outlineSurfs[2] = tes_data[i].surface; } if(transformed[0]
data.p_surface_data->srf_shape.cylinder.radius <= check_radius) { continue; } check_radius = surfData->data.p_surface_data->srf_shape.cylinder.radius; ProUtilPointTrans(rel_matrix,surfData->data.p_surface_data->srf_shape.cylinder.origin,virtual_center); ProVector surfNormal; ProUtilVectorCopy(surfData->data.p_surface_data->srf_shape.cylinder.e3, surfNormal); if (fabs(surfNormal[0] - rel_matrix[0][0]) < cyl_comp_tolerance && fabs(surfNormal[1] - rel_matrix[0][1]) < cyl_comp_tolerance && fabs(surfNormal[2] - rel_matrix[0][2]) < cyl_comp_tolerance) { axis_id = 0; } else if (fabs(surfNormal[0] + rel_matrix[0][0]) < cyl_comp_tolerance && fabs(surfNormal[1] + rel_matrix[0][1]) < cyl_comp_tolerance && fabs(surfNormal[2] + rel_matrix[0][2]) < cyl_comp_tolerance) { axis_id = 0; } else if (fabs(surfNormal[0] - rel_matrix[1][0]) < cyl_comp_tolerance && fabs(surfNormal[1] - rel_matrix[1][1]) < cyl_comp_tolerance && fabs(surfNormal[2] - rel_matrix[1][2]) < cyl_comp_tolerance) { axis_id = 1; } else if (fabs(surfNormal[0] + rel_matrix[1][0]) < cyl_comp_tolerance && fabs(surfNormal[1] + rel_matrix[1][1]) < cyl_comp_tolerance && fabs(surfNormal[2] + rel_matrix[1][2]) < cyl_comp_tolerance) { axis_id = 1; } else if (fabs(surfNormal[0] - rel_matrix[2][0]) < cyl_comp_tolerance && fabs(surfNormal[1] - rel_matrix[2][1]) < cyl_comp_tolerance && fabs(surfNormal[2] - rel_matrix[2][2]) < cyl_comp_tolerance) { axis_id = 2; } else if (fabs(surfNormal[0] + rel_matrix[2][0]) < cyl_comp_tolerance && fabs(surfNormal[1] + rel_matrix[2][1]) < cyl_comp_tolerance && fabs(surfNormal[2] + rel_matrix[2][2]) < cyl_comp_tolerance) { axis_id = 2; } } } } if(axis_id!=-1) { is_cylinder=1; for(i=0; i
檔案外形計算
最新推荐文章于 2021-07-23 17:09:43 发布