Пример #1
0
// 导出至STL
void OnExportSTLActFn()
{
	/*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;
	}

	// 选取面组
	vector<ProSelection> arrSelQlt;
	if (SelectObject(arrSelQlt, "dtmqlt"))
	{
		ProName mdlName;
		ProMdlNameGet(pMdl, mdlName);
		CString strMdlName(mdlName);
		ProFileName filename;
		wcsncpy_s(filename,  PRO_FILE_NAME_SIZE, strMdlName, _TRUNCATE);

		// 选择保存位置
		ProPath stlpath;
		if (ProFileSave(NULL, L"*.stl", NULL, NULL, NULL, filename, stlpath) == PRO_TK_NO_ERROR)
		{
			CString strStlPath(stlpath);
			ProGeomitem qltitem;
			ProSelectionModelitemGet(arrSelQlt[0], &qltitem);
			ProQuilt quilt;
			ProGeomitemToQuilt(&qltitem, &quilt);
			vector<ProSurface> arrSurfs;
			ProQuiltSurfaceVisit(quilt, QuiltSurfacesGetAction, NULL, &arrSurfs);
			vector<ProGeomitem> arrSurfsItems;
			for (int i=0; i<(int)arrSurfs.size(); i++)
			{
				ProGeomitem srfitem;
				ProSurfaceToGeomitem(ProMdlToSolid(pMdl), arrSurfs[i], &srfitem);
				arrSurfsItems.push_back(srfitem);
			}
			if (ExportStl(arrSurfsItems, strStlPath, 0.5, 1.0))
			{
				MessageBox(NULL, L"导出stl成功", L"提示", MB_OK);
			}
			else
				MessageBox(NULL, L"导出stl失败", L"提示", MB_OK|MB_ICONWARNING);
		}
	}

	InvalidateDrawing();
	ProMessageClear();
}
Пример #2
0
// 单侧放量
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();
}
Пример #3
0
// 整体放量
void OnOffsetGeneralActFn()
{
	/*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步:选择要偏移的面
	vector<ProSelection> arrSelSrf;
	ShowMessageTip(L"Tips.选择要偏移的面...");
	if (SelectObject(arrSelSrf, "dtmqlt"))
	{
		// 第3步:输入偏离值
		double dOffset;
		ShowMessageTip(L"输入偏移量,不能为0,但可以为负值:");
		if (ProMessageDoubleRead(NULL, &dOffset) == PRO_TK_NO_ERROR)
		{
			// 第4步:创建偏移特征
			ProModelitem itemQuilt;
			int nOffsetID = OffsetQuilt(pMdl, arrSelSrf[0], dOffset, itemQuilt);
			if (nOffsetID > 0)
			{
				SetSurfColor(itemQuilt, 255, 215, 0);
				// 第5步:隐藏原包覆面
				ProModelitem itemQuiltSel;
				ProSelectionModelitemGet(arrSelSrf[0], &itemQuiltSel);
				ProModelitemHide(&itemQuiltSel);
			}
			else
			{
				MessageBox(NULL, L"放量失败,详见模型特征树!", L"提示", MB_OK);
			}
		}
	}
	InvalidateDrawing();
	ProMessageClear();
}
Пример #4
0
// 草绘裁剪
void OnTrimBySketchActFn()
{
	/*if (!QuickCheckValidLicense(SMART_PROFESSIONAL))
		return;*/

	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	DestroyAllDialog();
	CancelSelectDialog();
	Sleep(50);

	ProError status;
	ProMdl pMdl = GetCurrentMdl();
	if (pMdl == NULL)
	{
		MessageBox(NULL, L"当前环境未发现模型!", L"提示", MB_OK|MB_ICONWARNING);
		return;
	}
	
	// 选择草绘
	vector<ProSelection> arrSel;
	ShowMessageTip(L"Tips.选择草绘特征...");
	while (SelectObject(arrSel, "feature"))
	{
		// 检查是否为草绘曲线
		ProFeature featSketch;
		status = ProSelectionModelitemGet(arrSel[0], &featSketch);
		ProFeattype featType;
		status = ProFeatureTypeGet(&featSketch, &featType);
		if (featType == PRO_FEAT_CURVE)
		{
			ProAsmcomppath acomppath;
			ProSelectionAsmcomppathGet(arrSel[0], &acomppath);

			ProSelection selQuilt;	// 待裁剪的平面
			BOOL bGetQuilt = FALSE;

			// 获取草绘曲线所在的平面
			ProElement elemTreeCurve = NULL;
			ProFeatureElemtreeExtract(&featSketch, NULL, PRO_FEAT_EXTRACT_NO_OPTS, &elemTreeCurve);
			ProElempathItem pathItemType[1];
			pathItemType[0].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
			pathItemType[0].path_item.elem_id = PRO_E_CURVE_TYPE;
			ProElempath elemPathCurveType;
			ProElempathAlloc(&elemPathCurveType);
			ProElempathDataSet(elemPathCurveType, pathItemType, 1);
			ProElement elemType;
			status = ProElemtreeElementGet(elemTreeCurve, elemPathCurveType, &elemType);
			if (status == PRO_TK_NO_ERROR)
			{
				ProValue valType;
				status = ProElementValueGet(elemType, &valType);
				ProValueData valdataType;
				status = ProValueDataGet(valType, &valdataType);
				if (valdataType.v.i == PRO_CURVE_TYPE_SKETCHED)
				{
					// 确定为草绘曲线,进而获取草绘平面
					ProElempathItem pathItemSketchPlane[3];
					pathItemSketchPlane[0].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
					pathItemSketchPlane[0].path_item.elem_id = PRO_E_STD_SECTION;
					pathItemSketchPlane[1].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
					pathItemSketchPlane[1].path_item.elem_id = PRO_E_STD_SEC_SETUP_PLANE;
					pathItemSketchPlane[2].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
					pathItemSketchPlane[2].path_item.elem_id = PRO_E_STD_SEC_PLANE;
					ProElempath elemPathPlane;
					ProElempathAlloc(&elemPathPlane);
					ProElempathDataSet(elemPathPlane, pathItemSketchPlane, 3);
					ProElement elemPlane;
					status = ProElemtreeElementGet(elemTreeCurve, elemPathPlane, &elemPlane);
					if (status == PRO_TK_NO_ERROR)
					{
						ProValue valPlane;
						status = ProElementValueGet(elemPlane, &valPlane);
						ProValueData valdataPlane;
						status = ProValueDataGet(valPlane, &valdataPlane);
						ProGeomitem itemSurf;
						ProSelectionModelitemGet(valdataPlane.v.r, &itemSurf);
						ProSurface surf;
						ProGeomitemToSurface(&itemSurf, &surf);

						// 获取面所在面组
						ProQuilt quilt;
						status = ProSurfaceQuiltGet(ProMdlToSolid(pMdl), surf, &quilt);
						if (status == PRO_TK_NO_ERROR)
						{
							ProGeomitem itemQuilt;
							status = ProQuiltToGeomitem(ProMdlToSolid(pMdl), quilt, &itemQuilt);
							status = ProSelectionAlloc(&acomppath, &itemQuilt, &selQuilt);
							bGetQuilt = TRUE;
						}
					}
				}
			}
			
			if (!bGetQuilt)
			{
				ShowMessageTip(L"Tips.草绘的放置面非可裁剪面,请手动选择需裁剪的面...");
				// 手动选取待裁剪的面
				vector<ProSelection> arrSelSrf;
				if (SelectObject(arrSelSrf, "dtmqlt"))
				{
					ProSelectionCopy(arrSelSrf[0], &selQuilt);
				}
				else
				{
					break;
				}
			}
	
			// 遍历特征,获取特征中的全部复合曲线
			vector<ProGeomitem> arrItemCurves;
			status = ProFeatureGeomitemVisit(&featSketch, PRO_CURVE, FeatureGeomsGetAction, NULL, &arrItemCurves);
			vector<int> arrFeatID;
			for (int i=0; i<arrItemCurves.size(); i++)
			{
				ProCurve curve;
				status = ProGeomitemToCurve(&arrItemCurves[i], &curve);
				// 检查是否为复合曲线
				ProEnttype curveType;
				status = ProCurveTypeGet(curve, &curveType);
				if (curveType == PRO_ENT_CMP_CRV)
				{
					// 进行裁剪
					ProSelection selCurve;
					status = ProSelectionAlloc(&acomppath, &arrItemCurves[i], &selCurve);
					int nFeatID = TrimQuiltByCurve(pMdl, selQuilt, selCurve, PRO_EDGE_SAME_DIRECTION);
					if (nFeatID > 0)
					{
						// 创建成功,记录特征ID
						arrFeatID.push_back(nFeatID);

						// 第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;
							}
						}
					}
				}
			}
			// 合并成组
			CreateFeatGroup(pMdl, arrFeatID, L"包覆面_裁剪");
			break;
		}
		else
		{
			// 
			MessageBox(NULL, L"所选特征非草绘特征,请重新选择!", L"提示", MB_OK);
		}
	}

	InvalidateDrawing();
	ProMessageClear();
}
Пример #5
0
// 环边裁剪
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();
}
Пример #6
0
// 表面清理
void OnCleanActFn()
{
	/*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;
	vector<ProModelitem> arrItemSrf;
	while (SelectObject(arrSelSrf, "surface", MAX_SELECTION))
	{
		BOOL bError = FALSE;
		// 第3步:创建基准面
		for (int i=0; i<(int)arrSelSrf.size(); i++)
		{
			ProModelitem itemSurf;
			ProSelectionModelitemGet(arrSelSrf[i], &itemSurf);

			ProModelitem itemPlane;
			int nDatumFeatID = CreateDatumPlane(pMdl, arrSelSrf[i], itemPlane);
			if (nDatumFeatID > 0)
			{
				arrItemSrf.push_back(itemPlane);
			}
		}
		// 第4步:创建实体化特征
		for (int i=0; i<(int)arrItemSrf.size(); i++)
		{
			ProSelection selPlane;
			ProSelectionAlloc(NULL, &arrItemSrf[i], &selPlane);
			if (CreateSolidify(pMdl, selPlane) < 0)
			{
				bError = TRUE;
			}
			SAFE_DELETE_SELECTION(selPlane);
		}

		arrSelSrf.clear();
		arrItemSrf.clear();
				
		// 第5步:显示处理结果
		if (bError && MessageBox(NULL, L"部分特征创建失败,详见模型特征树。是否继续?", L"提示", MB_YESNO) == IDNO)
		{
			break;
		}
	}
	InvalidateDrawing();
	ProMessageClear();
}
Пример #7
0
// 底面切除
void OnBottomCutActFn()
{
	/*if (!QuickCheckValidLicense(SMART_PROFESSIONAL))
		return;*/

	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	DestroyAllDialog();
	CancelSelectDialog();
	Sleep(50);
	ProError status;

	// 第1步:检查当前模型环境
	ProMdl pMdl = GetCurrentMdl();
	if (pMdl == NULL)
	{
		MessageBox(NULL, L"当前环境未发现模型!", L"提示", MB_OK|MB_ICONWARNING);
		return;
	}
	// 第2步:选择参考
	ShowMessageTip(L"Tips.选择拼接后的包覆面进行切除...");
	vector<ProSelection> arrSelQlt;
	ProSelection selQlt = NULL;
	if (SelectObject(arrSelQlt, "dtmqlt"))
	{
		status = ProSelectionCopy(arrSelQlt[0], &selQlt);

		// 第3步:暂时隐藏选择的面,选取完成后恢复显示
		ProModelitem itemQuilt;
		status = ProSelectionModelitemGet(arrSelQlt[0], &itemQuilt);
		status = ProModelitemHide(&itemQuilt);
		
		// 第4步:选择底面
		ShowMessageTip(L"Tips.选择需要平齐的底面...");
		vector<ProSelection> arrSelSrf;
		if (SelectObject(arrSelSrf, "surface"))
		{
			status = ProModelitemUnhide(&itemQuilt);

			// 第5步:以底面为参照创建基准面
			ProModelitem itemPlane;
			int nDatumFeatID = CreateDatumPlane(pMdl, arrSelSrf[0], itemPlane);
			if (nDatumFeatID > 0)
			{
				ProSelection selRef;
				status = ProSelectionAlloc(NULL, &itemPlane, &selRef);
				int nFeatID = TrimSurfaceBySurf(pMdl, selQlt, selRef, 1);
				if (nFeatID > 0)
				{
					// 第8步:提示是否反向或继续修剪
					CDlgConfirm dlg;
					while (1)
					{
						int nResult = (int)dlg.DoModal();
						if (nResult == IDRETRY) 
						{
							// 修改裁剪方向
							ProFeature feat;
							feat.id = nFeatID;
							feat.type = PRO_FEATURE;
							feat.owner = pMdl;
							ReverseTrimDirection(feat);
						}
						else
						{
							break;
						}
					}
				}
				else
				{
					MessageBox(NULL, L"切除失败,详见模型特征树!", L"提示", MB_OK);
				}
			}
		}
		else
			status = ProModelitemUnhide(&itemQuilt);
	}
	InvalidateDrawing();
	ProMessageClear();
}
Пример #8
0
// 拼接(智能选取)
void OnMergeAutoActFn()
{
	/*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;
	}
	ProError status;

	// 选取一个包覆面
	ShowMessageTip(L"Tips.选择需要拼接的包覆面...");
	vector<ProSelection> arrSelQuilts;
	if (SelectObject(arrSelQuilts, "dtmqlt"))
	{
		ProModelitem itemQuiltStart;
		status = ProSelectionModelitemGet(arrSelQuilts[0], &itemQuiltStart);
		ProQuilt quiltStart;
		status = ProGeomitemToQuilt(&itemQuiltStart, &quiltStart);

		vector<ProQuilt> arrQuiltMerge;
		arrQuiltMerge.push_back(quiltStart);

		// 获取全部Quilt
		vector<ProQuilt> arrQuilt;
		status = ProSolidQuiltVisit(ProMdlToSolid(pMdl), SolidQuiltsGetAction, NULL, &arrQuilt);
		ProQuilt quiltCurr;
		for (int i=0; i<arrQuiltMerge.size(); i++)
		{
			quiltCurr = arrQuiltMerge[i];
			for (int j=0; j<arrQuilt.size(); )
			{
				if (quiltCurr == arrQuilt[j])
				{
					// 剔除自身
					arrQuilt.erase(arrQuilt.begin()+j);
					continue;
				}
				if (CheckTwoQuiltNeighbor(pMdl, quiltCurr, arrQuilt[j]))
				{
					arrQuiltMerge.push_back(arrQuilt[j]);
					arrQuilt.erase(arrQuilt.begin()+j);
					continue;
				}
				j++;
			}
		}
		
		vector<ProSelection> arrSelMergeQuilt;
		for (int i=0; i<arrQuiltMerge.size(); i++)
		{
			ProModelitem itemQuilt;
			ProQuiltToGeomitem(ProMdlToSolid(pMdl), arrQuiltMerge[i], &itemQuilt);
			ProSelection selQuilt = NULL;
			ProSelectionAlloc(NULL, &itemQuilt, &selQuilt);
			arrSelMergeQuilt.push_back(selQuilt);
		}
		
		ProFeature featMerge;
		MergeQuilts(pMdl, arrSelMergeQuilt, PRO_SRF_MRG_INTSCT, featMerge);
	}

	InvalidateDrawing();
	ProMessageClear();
}
Пример #9
0
/*====================================================================*\
    FUNCTION :	ProUtilFeatureDump()
    PURPOSE  :	To write a decription of a feature to a text file
\*====================================================================*/
void ProUtilFeatureDump(
    ProModelitem *feature,
    FILE *fp)
{
    ProError status;
    ProSolid owner;
    ProAsmcomppath path;
    ProModelitem modelitem;    
    int n_children, c, n_parents, p;
    ProPatternStatus pstatus;
    ProGrppatternStatus gpstatus;
    ProFeatStatus fstatus;
    ProGroupStatus gstatus;
    ProSelection selection;
    char model_name[PRO_NAME_SIZE], model_type[PRO_NAME_SIZE];
    int m;
    ProFeattype ftype;
    char ftype_str[PRO_NAME_SIZE];
    int *children_ids, *parents_ids;
    ProBoolean is_nc_seq;
    ProWVerstamp stamp;
    char* p_stamp_string;

/*--------------------------------------------------------------------*\
    Check the feature owner
\*--------------------------------------------------------------------*/
    status = ProModelitemMdlGet(feature, (ProMdl *) &owner);
    TEST_CALL_REPORT("ProModelitemMdlGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProUtilModelnameGet((ProMdl*)&owner, model_name,  model_type);
    ProTKFprintf(fp,"Owner     : %s.%s\n", model_name, model_type);

/*--------------------------------------------------------------------*\
    Check the feature owner
\*--------------------------------------------------------------------*/
    status = ProFeatureSolidGet(feature, &owner);
    TEST_CALL_REPORT("ProFeatureSolidGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProUtilModelnameGet((ProMdl*)&owner, model_name,  model_type);
    ProTKFprintf(fp,"Sld Owner : %s.%s\n", model_name, model_type);

/*--------------------------------------------------------------------*\
    Get the list of children of the selected feature
\*--------------------------------------------------------------------*/
    status = ProFeatureChildrenGet(feature, &children_ids, &n_children);
    TEST_CALL_REPORT("ProFeatureChildrenGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "Children : ");
    for(c=0; c<n_children; c++)
	ProTKFprintf(fp,"%d ", children_ids[c]);
    ProTKFprintf(fp,"\n");

/*--------------------------------------------------------------------*\
    Get the list of parents of the selected feature
\*--------------------------------------------------------------------*/
    status = ProFeatureParentsGet(feature, &parents_ids, &n_parents);
    TEST_CALL_REPORT("ProFeatureParentsGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "Parents  : ");
    for(p=0; p<n_parents; p++)
	ProTKFprintf(fp,"%d ", parents_ids[p]);
    ProTKFprintf(fp,"\n");

/*--------------------------------------------------------------------*\
    Get the version stamp of the specified feature
\*--------------------------------------------------------------------*/
    status = ProVerstampAlloc( &stamp );
    TEST_CALL_REPORT("ProVerstampAlloc()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    status = ProFeatureVerstampGet( feature, &stamp );
    TEST_CALL_REPORT("ProFeatureVerstampGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    status = ProVerstampStringGet( stamp, &p_stamp_string );
    TEST_CALL_REPORT("ProVerstampStringGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    
    ProTKFprintf( fp,"Version stamp: %s\n", p_stamp_string );

    status = ProVerstampStringFree( &p_stamp_string );
    TEST_CALL_REPORT("ProVerstampStringFree()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    status = ProVerstampFree( &stamp );
    TEST_CALL_REPORT("ProVerstampFree()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);

/*--------------------------------------------------------------------*\
    Get the feature status
\*--------------------------------------------------------------------*/
    status = ProFeatureStatusGet(feature, &fstatus);
    TEST_CALL_REPORT("ProFeatureStatusGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "FEATURE STATUS       ");
    switch(fstatus)
    {
    case PRO_FEAT_INVALID:
	ProTKFprintf(fp, "Invalid\n");
	break;
    case PRO_FEAT_ACTIVE:
	ProTKFprintf(fp, "Active\n");
	break;
    case PRO_FEAT_INACTIVE:
	ProTKFprintf(fp, "Inactive\n");
	break;
    case PRO_FEAT_FAMTAB_SUPPRESSED:
	ProTKFprintf(fp, "Famtab suppressed\n");
	break;
    case PRO_FEAT_SIMP_REP_SUPPRESSED:
	ProTKFprintf(fp,"Simprep suppressed\n");
	break;
    case PRO_FEAT_PROG_SUPPRESSED:
	ProTKFprintf(fp,"Pro/PROGRAM suppressed\n");
	break;
    case PRO_FEAT_SUPPRESSED:
	ProTKFprintf(fp, "Suppressed\n");
	break;
    case PRO_FEAT_UNREGENERATED:
	ProTKFprintf(fp, "Unregenerated\n");
	break;
    default:
	ProTKFprintf(fp, "**UNKNOWN**\n");
	break;
    }

/*--------------------------------------------------------------------*\
    Get the group status of the feature
\*--------------------------------------------------------------------*/
    status = ProFeatureGroupStatusGet( feature, &gstatus );
    TEST_CALL_REPORT("ProFeatureGroupStatusGet()", "ProUtilFeatureDump()",
                                        status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "GROUP STATUS       ");
    switch(gstatus)
    {
    case PRO_GROUP_INVALID:
	ProTKFprintf(fp, "Invalid\n");
	break;
    case PRO_GROUP_NONE:
	ProTKFprintf(fp, "None\n");
	break;
    case PRO_GROUP_MEMBER:
	ProTKFprintf(fp, "Group member\n");
	break;
    default:
	ProTKFprintf(fp, "**UNKNOWN**\n");
	break;
    }

/*--------------------------------------------------------------------*\
    Get the pattern status of the feature
\*--------------------------------------------------------------------*/
    status = ProFeaturePatternStatusGet(feature, &pstatus);
    TEST_CALL_REPORT("ProFeaturePatternStatusGet()", "ProUtilFeatureDump()",
                                        status, status != PRO_TK_NO_ERROR);
    status = ProFeatureGrppatternStatusGet(feature, &gpstatus);
    TEST_CALL_REPORT("ProFeatureGrppatternStatusGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "PATTERN STATUS       ");
    switch(pstatus)
    {
    case PRO_PATTERN_LEADER:
	ProTKFprintf(fp, "Leader of a feature pattern\n");
	break;
    case PRO_PATTERN_MEMBER:
	ProTKFprintf(fp, "Member of a feature pattern\n");
	break;
    default:
	break;
    }
    switch(gpstatus)
    {
    case PRO_GRP_PATTERN_LEADER:
        ProTKFprintf(fp, "Leader of a group pattern\n");
        break;
    case PRO_GRP_PATTERN_MEMBER:
        ProTKFprintf(fp, "Member of a group pattern\n");
        break;
    case PRO_GRP_PATTERN_NONE:
        if (pstatus == PRO_PATTERN_NONE)
            ProTKFprintf(fp, "Not a pattern member\n");
        break;
    default:
        break;
    }

/*--------------------------------------------------------------------*\
    Get elements info. 
\*--------------------------------------------------------------------*/
    ProUtilFeatureElementsDump( feature, fp);

/*--------------------------------------------------------------------*\
    Find whether the feature is an NC sequence
\*--------------------------------------------------------------------*/
    status = ProFeatureIsNcseq(feature, &is_nc_seq);

   if ( is_nc_seq == PRO_B_TRUE )
	ProTKFprintf(fp, "Feature is an NC Sequence\n");
    TEST_CALL_REPORT("ProFeatureIsNcseq()", "ProUtilFeatureDump()",
				PRO_TK_NO_ERROR, status != PRO_TK_NO_ERROR);

/*--------------------------------------------------------------------*\
    Find out whether the feature is created in an assembly
\*--------------------------------------------------------------------*/
    status = ProFeatureSelectionGet(feature, &selection);
    TEST_CALL_REPORT("ProFeatureSelectionGet()", "ProUtilFeatureDump()",
				    status, ((status != PRO_TK_NO_ERROR) &&
					     (status != PRO_TK_BAD_CONTEXT) &&
					     (status != PRO_TK_E_NOT_FOUND)));
    if(!(status == PRO_TK_BAD_CONTEXT))
    if(status == PRO_TK_E_NOT_FOUND)
    {
	ProTKFprintf(fp,"ASSEMBLY REFERENCES :\n");
	ProTKFprintf(fp," (Assembly is not in session)\n");
    }
    else if(status == PRO_TK_NO_ERROR)
    {
	ProTKFprintf(fp,"ASSEMBLY REFERENCES :\n");
	
	status = ProSelectionAsmcomppathGet(selection, &path);
	TEST_CALL_REPORT("ProSelectionAsmcomppathGet()", "ProUtilFeatureDump()",
			 status, status != PRO_TK_NO_ERROR);

	status = ProSelectionModelitemGet(selection, &modelitem);
	TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProUtilFeatureDump()",
			 status, status != PRO_TK_NO_ERROR);
	
/*--------------------------------------------------------------------*\
	Assembly name
\*--------------------------------------------------------------------*/

	ProUtilModelnameGet((ProMdl*)&path.owner, model_name,  model_type);
	ProTKFprintf(fp,"    Owning model : %s.%s\n", model_name, model_type);

/*--------------------------------------------------------------------*\
	Feature id and type
\*--------------------------------------------------------------------*/
	status = ProFeatureTypeGet(&modelitem, &ftype);
	TEST_CALL_REPORT("ProFeatureTypeGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
	ProUtilFeattypeStr(ftype, ftype_str);
	ProTKFprintf(fp,"    Feature      : %d, type %s\n", modelitem.id, ftype_str);

/*--------------------------------------------------------------------*\
	Component id table
\*--------------------------------------------------------------------*/
	if (path.table_num > 0)
	{
	    ProTKFprintf(fp,"    comp_id_table   ");	    
	    for(m=0; m<path.table_num; m++)
	        ProTKFprintf(fp,"%d", path.comp_id_table[m]);
	    ProTKFprintf(fp, "\n");
	}
	
    }
}