// 得到曲面的另一个同源面 ProSurface CSDMdlMachLongAxisCheck::GetSameSurface(ProSolid pSld, ProSurface pSurf) { if (NULL == pSld || NULL == pSurf) return NULL; ProSurface pSameSurf = NULL; ProSurface *arrSameSurfs = NULL; ProArrayAlloc(0, sizeof(ProSurface), 1, (ProArray*)&arrSameSurfs); int nSurfSize = -1; ProError status = ProSurfaceSameSrfsFind(pSld, pSurf, &arrSameSurfs, &nSurfSize); if (status == PRO_TK_NO_ERROR && nSurfSize > 0) { for (int i=0; i<nSurfSize; i++) { if (arrSameSurfs[i] != pSurf) { pSameSurf = arrSameSurfs[i]; break; } } } SAFE_DELETE_PROARRAY(arrSameSurfs); return pSameSurf; }
// 环边裁剪 void OnTrimByEdgeActFn() { /*if (!QuickCheckValidLicense(SMART_PROFESSIONAL)) return;*/ AFX_MANAGE_STATE(AfxGetStaticModuleState()); DestroyAllDialog(); CancelSelectDialog(); Sleep(50); // 第1步:检查当前模型环境 ProMdl pMdl = GetCurrentMdl(); if (pMdl == NULL) { MessageBox(NULL, L"当前环境未发现模型!", L"提示", MB_OK|MB_ICONWARNING); return; } // 第2步:选择要裁剪的面 ShowMessageTip(L"Tips.选择需要裁剪的面..."); vector<ProSelection> arrSelSrf; ProSelection selSrf = NULL; while (SelectObject(arrSelSrf, "dtmqlt")) { ProSelectionCopy(arrSelSrf[0], &selSrf); // 第3步:暂时隐藏选择的面,选取完成后恢复显示 ProModelitem itemQuilt; ProSelectionModelitemGet(arrSelSrf[0], &itemQuilt); ProModelitemHide(&itemQuilt); // 第4步:选择面上的环(先选取环的一条边) int nEdgeDir = PRO_EDGE_SAME_DIRECTION; ProSelection *pArrSelInit = NULL; ProArrayAlloc(0, sizeof(ProSelection), 1, (ProArray*)&pArrSelInit); vector<ProSelection> arrSelEdge; while (SelectObject(arrSelEdge, "sldedge")) { // 第5步:获取边所在环的全部边 vector<ProSelection> arrSelContourEdges; if (GetContourByEdge(arrSelEdge[0], arrSelContourEdges, nEdgeDir)) { for (int i=0; i<arrSelContourEdges.size(); i++) { ProArrayObjectAdd((ProArray*)&pArrSelInit, 0, 1, &arrSelContourEdges[i]); } break; } else { int nMsgResult = MessageBox(NULL, L"选取的边不是完整环的组成边,是否手动选取?\n是:手动选取;否:重新选取; 取消:退出", L"提示", MB_YESNOCANCEL|MB_ICONWARNING); if (nMsgResult == IDYES) // 手动选择 { ProArrayObjectAdd((ProArray*)&pArrSelInit, 0, 1, &arrSelEdge[0]); break; } else if (nMsgResult == IDCANCEL) // 退出 { ProModelitemUnhide(&itemQuilt); InvalidateDrawing(); return; } } } // 第6步:自动选中对应完整环的全部边 arrSelEdge.clear(); if (SelectObject(arrSelEdge, "edge", MAX_SELECTION, pArrSelInit)) { // 判断面的方向 /*ProQuilt quilt; BOOL bSurfDirOut = FALSE; ProGeomitemToQuilt(&itemQuilt, &quilt); vector<ProSurface> arrSurfaces; ProQuiltSurfaceVisit(quilt, QuiltSurfacesGetAction, NULL, &arrSurfaces); ProGeomitemdata* psrfdata; ProSurfaceDataGet(arrSurfaces[0], &psrfdata); if (psrfdata->data.p_surface_data->orient == PRO_SURF_ORIENT_OUT) bSurfDirOut = TRUE; ProGeomitemdataFree(&psrfdata);*/ // 第7步:修剪曲面 int nFeatID = TrimQuiltByEdgeGroup(pMdl, selSrf, arrSelEdge, nEdgeDir); ProModelitemUnhide(&itemQuilt); SAFE_DELETE_PROARRAY(pArrSelInit); if (nFeatID > 0) { // 第8步:提示是否反向或继续修剪 CDlgConfirm dlg; while (1) { int nResult = (int)dlg.DoModal(); if (nResult == IDOK) { break; } else if (nResult == IDRETRY) { // 修改裁剪方向 ProFeature feat; feat.id = nFeatID; feat.type = PRO_FEATURE; feat.owner = pMdl; ReverseTrimDirection(feat); } else { InvalidateDrawing(); ProMessageClear(); return; } } } else if (MessageBox(NULL, L"裁剪失败,详见模型特征树。是否继续?", L"提示", MB_YESNO) == IDNO) { break; } } else { // 恢复显示 ProModelitemUnhide(&itemQuilt); break; } } InvalidateDrawing(); ProMessageClear(); }