コード例 #1
0
// 得到曲面的另一个同源面
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;
}
コード例 #2
0
ファイル: MenuHandler.cpp プロジェクト: ZuDame/Smart3DCoating
// 环边裁剪
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();
}