// 单侧放量 void OnOffsetSingleActFn() { /*if (!QuickCheckValidLicense(SMART_PROFESSIONAL)) return;*/ AFX_MANAGE_STATE(AfxGetStaticModuleState()); DestroyAllDialog(); CancelSelectDialog(); Sleep(50); ProMdl pMdl = GetCurrentMdl(); if (pMdl == NULL) { MessageBox(NULL, L"当前环境未发现模型!", L"提示", MB_OK|MB_ICONWARNING); return; } // 选择面 vector<ProSelection> arrSelQlt; ShowMessageTip(L"Tips.选择要偏移的面..."); if (SelectObject(arrSelQlt, "surface")) { // 输入偏离值 double dOffset; ShowMessageTip(L"输入偏移量,不能为0,但可以为负值:"); if (ProMessageDoubleRead(NULL, &dOffset) == PRO_TK_NO_ERROR) { // 判断面的方向 ProModelitem itemSurf; ProSelectionModelitemGet(arrSelQlt[0], &itemSurf); ProSurface surf; ProGeomitemToSurface(&itemSurf, &surf); ProGeomitemdata* psrfdata; ProSurfaceDataGet(surf, &psrfdata); if (psrfdata->data.p_surface_data->orient == PRO_SURF_ORIENT_IN) dOffset = dOffset*(-1); ProGeomitemdataFree(&psrfdata); // 创建偏移特征 int nOffsetID = OffsetSurfaceWithSide(pMdl, arrSelQlt[0], dOffset); if (nOffsetID > 0) { // 修改面颜色 ProFeature feat; feat.id = nOffsetID; feat.type = PRO_FEATURE; feat.owner = pMdl; vector<ProModelitem> arrQuilts; ProFeatureGeomitemVisit(&feat, PRO_QUILT, FeatureGeomsGetAction, NULL, &arrQuilts); for (int i=0; i<arrQuilts.size(); i++) SetSurfColor(arrQuilts[i], 255, 215, 0); } } } InvalidateDrawing(); ProMessageClear(); }
void CSDMdlMachFlatBottomHoleCheck::GetPlaneSurfAxis(ProSurface Surf, double SurfAxis[]) { ProError status; ProGeomitemdata* GeoItemdata; status = ProSurfaceDataGet(Surf, &GeoItemdata); for (int i = 0; i< 3; i++) { SurfAxis[i] = (*GeoItemdata).data.p_surface_data->srf_shape.plane.e3[i]; } }
// 获取模型中类轴曲面集_过滤函数 ProError CSDMdlMachLongAxisCheck::GetSldAxisSurfaceFilter(ProSurface pSurf, ProAppData pData) { pData; ProGeomitemdata *pGeomData = NULL; ProSurfaceDataGet(pSurf, &pGeomData); ProError status = PRO_TK_CONTINUE; if (pGeomData->data.p_surface_data->type == PRO_SRF_CYL || pGeomData->data.p_surface_data->type == PRO_SRF_CONE) status = PRO_TK_NO_ERROR; ProGeomitemdataFree(&pGeomData); return status; }
// 获取曲面数据 BOOL CSDMdlMachLongAxisCheck::SetSurfaceData(ProSurface pSurf, ProSurface pSameSurf, SDC_SurfaceData &surfData) { if (NULL == pSurf) return FALSE; surfData.pSurface = pSurf; surfData.pSameSurf = pSameSurf; ProGeomitemdata *pGeomData = NULL; ProSurfaceDataGet(pSurf, &pGeomData); BOOL bRet = FALSE; if (pGeomData->data.p_surface_data->type == PRO_SRF_CYL) { VectorCopy(pGeomData->data.p_surface_data->srf_shape.cylinder.origin, surfData.origin); VectorCopy(pGeomData->data.p_surface_data->srf_shape.cylinder.e3, surfData.axisVector); VectorCopy(pGeomData->data.p_surface_data->xyz_min, surfData.minPt); VectorCopy(pGeomData->data.p_surface_data->xyz_max, surfData.maxPt); SVDOUBLE3 minProj, maxProj; ProjectPtToLine(SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.origin), SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.e3), SVDOUBLE3(surfData.minPt), minProj); ProjectPtToLine(SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.origin), SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.e3), SVDOUBLE3(surfData.maxPt), maxProj); surfData.dDiameter = pGeomData->data.p_surface_data->srf_shape.cylinder.radius * 2.0; SVDOUBLE3ToPoint3D(minProj, surfData.minPt); SVDOUBLE3ToPoint3D(maxProj, surfData.maxPt); bRet = TRUE; } else if (pGeomData->data.p_surface_data->type == PRO_SRF_CONE) { VectorCopy(pGeomData->data.p_surface_data->srf_shape.cone.origin, surfData.origin); VectorCopy(pGeomData->data.p_surface_data->srf_shape.cone.e3, surfData.axisVector); VectorCopy(pGeomData->data.p_surface_data->xyz_min, surfData.minPt); VectorCopy(pGeomData->data.p_surface_data->xyz_max, surfData.maxPt); SVDOUBLE3 minProj, maxProj; ProjectPtToLine(SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.origin), SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.e3), SVDOUBLE3(surfData.minPt), minProj); ProjectPtToLine(SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.origin), SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.e3), SVDOUBLE3(surfData.maxPt), maxProj); double dR1 = CalculateDistance(SVDOUBLE3(surfData.minPt), SVDOUBLE3(minProj)); double dR2 = CalculateDistance(SVDOUBLE3(surfData.maxPt), SVDOUBLE3(maxProj)); surfData.dDiameter = dR1 < dR2 ? (dR1 * 2.0) : (dR2 * 2.0); VectorCopy(minProj, surfData.minPt); VectorCopy(maxProj, surfData.maxPt); bRet = TRUE; } ProGeomitemdataFree(&pGeomData); return TRUE; }
// 判断圆柱面或圆锥面的法向是否远离轴线 BOOL CSDMdlMachLongAxisCheck::IsSurfNormalAwayFromAxis(ProSurface pSurf) { if (NULL == pSurf) return FALSE; ProGeomitemdata *pSurfData = NULL; ProSurfaceDataGet(pSurf, &pSurfData); BOOL bRet = FALSE; if (pSurfData->data.p_surface_data->type == PRO_SRF_CYL || pSurfData->data.p_surface_data->type == PRO_SRF_CONE) { if (pSurfData->data.p_surface_data->orient == PRO_SURF_ORIENT_OUT) bRet = TRUE; } ProGeomitemdataFree(&pSurfData); return bRet; }
// 根据参数得到相邻的曲面 ProSurface CSDMdlMachLongAxisCheck::GetNeighborSurf(const SDC_SurfaceData &surfData, BOOL bIsMinPara) { ProSurface pSurf = surfData.pSurface; ProSurface pNeighborSurf = NULL; ProGeomitemdata *pGeomData = NULL; ProSurfaceDataGet(pSurf, &pGeomData); ProEdge pCloseEdge = GetCloseEdge(bIsMinPara ? surfData.minPt : surfData.maxPt, pGeomData->data.p_surface_data->contour_arr); if (pCloseEdge != NULL) { ProEdge pEdge1, pEdge2; ProSurface pFace1, pFace2; ProEdgeNeighborsGet(pCloseEdge, &pEdge1, &pEdge2, &pFace1, &pFace2); if (pFace1 == pSurf) pNeighborSurf = pFace2; else pNeighborSurf = pFace1; } ProGeomitemdataFree(&pGeomData); return pNeighborSurf; }
ProError CSDMdl505PolarCheck::SurfaceVisitAction(ProSurface pSurf, ProError status, ProAppData pData) { UNUSED_ALWAYS(status); PolarCylVisitData &visitData = *((PolarCylVisitData*)pData); ProGeomitemdata* pgdata; if (ProSurfaceDataGet(pSurf, &pgdata) == PRO_TK_NO_ERROR) { if (pgdata->data.p_surface_data->type == PRO_SRF_CYL) { visitData.line[0] = pgdata->data.p_surface_data->srf_shape.cylinder.e3[0]; visitData.line[1] = pgdata->data.p_surface_data->srf_shape.cylinder.e3[1]; visitData.line[2] = pgdata->data.p_surface_data->srf_shape.cylinder.e3[2]; visitData.pt[0] = pgdata->data.p_surface_data->srf_shape.cylinder.origin[0]; visitData.pt[1] = pgdata->data.p_surface_data->srf_shape.cylinder.origin[1]; visitData.pt[2] = pgdata->data.p_surface_data->srf_shape.cylinder.origin[2]; ProGeomitemdataFree(&pgdata); return PRO_TK_USER_ABORT; } ProGeomitemdataFree(&pgdata); } return PRO_TK_NO_ERROR; }