天天看點

OpenCASCADE+MFC讀取PMI資訊OpenCASCADE+MFC讀取PMI資訊

OpenCASCADE+MFC讀取PMI資訊

1、用到的類: XCAFDoc_DimTolTool

說明:包含XCAF文檔的GD&T部分。為GD&T部分管理提供工具。可用于擷取stp檔案裡的尺寸,形位公差、基準。

2、示例代碼

//PMI工具
	Handle(XCAFDoc_DimTolTool) m_DimTolTool;
	//Shape工具
	Handle(XCAFDoc_ShapeTool)  m_ShapeTool;
	//基準 
	TDF_LabelSequence DatumLabels;
	m_DimTolTool->GetDatumLabels(DatumLabels);
	//尺寸
	TDF_LabelSequence DimensionLabels;
	m_DimTolTool->GetDimensionLabels(DimensionLabels);
	//形位公差
	TDF_LabelSequence GeomTolLabels;
	m_DimTolTool->GetGeomToleranceLabels( GeomTolLabels);
	//基準
	for (TDF_LabelSequence::Iterator aIter(DatumLabels); aIter.More(); aIter.Next())
	{
		const TDF_Label& aLabel = aIter.Value();
		Handle(XCAFDoc_Datum) aDatum;
		//擷取标簽類基準屬性
		if (!aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
			continue;
		Handle(XCAFDimTolObjects_DatumObject) aDatumObj = aDatum->GetObject();
		if (!aDatumObj.IsNull())
		{
			TDF_LabelSequence theShapeLFirst;
			TDF_LabelSequence theShapeLSecond;
			//擷取基準關聯的shape對象的标簽 theShapeLSecond應該是空的
			m_DimTolTool->GetRefShapeLabel(aLabel, theShapeLFirst, theShapeLSecond);
			TopoDS_Shape aShape;
			if (theShapeLFirst.Size() > 0)
			{
				TDF_Label aLabel = theShapeLFirst.First();
				aShape = m_ShapeTool->GetShape(aLabel);
			}
			else
				continue;
			//基準名字 如:A
			Handle(TCollection_HAsciiString) DatumName = aDatumObj->GetName();
			}
		}

	//尺寸
	for (TDF_LabelSequence::Iterator aIter(DimensionLabels); aIter.More(); aIter.Next())
	{
		const TDF_Label& aLabel = aIter.Value();
		Handle(XCAFDoc_Dimension) aDimAttr;
		//擷取标簽内的尺寸屬性
		if (!aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimAttr))
			continue;
		Handle(XCAFDimTolObjects_DimensionObject) aDimTolObj = aDimAttr->GetObject();
		if (!aDimTolObj.IsNull())
		{
			TDF_LabelSequence theShapeLFirst;
			TDF_LabelSequence theShapeLSecond;
			m_DimTolTool->GetRefShapeLabel(aLabel, theShapeLFirst, theShapeLSecond);
			TopoDS_Shape aFirstShape;
			TopoDS_Shape aSecondShape;
			if (theShapeLFirst.Size() > 0)
			{
				TDF_Label aLabel = theShapeLFirst.First();
				aFirstShape = m_ShapeTool->GetShape(aLabel);
			}
			if (theShapeLSecond.Size() > 0)
			{
				TDF_Label aLabel = theShapeLSecond.First();
				aSecondShape = m_ShapeTool->GetShape(aLabel);
			}
			//尺寸類型 如:長度尺寸 半徑直徑尺寸,沒有角度尺寸
			XCAFDimTolObjects_DimensionType DimensionType = aDimTolObj->GetType();
			//公差類型
			//極值表示法
			if (aDimTolObj->IsDimWithRange())
			{
				Standard_Real UpperBound = aDimTolObj->GetUpperBound();//最大值
				Standard_Real LowerBound = aDimTolObj->GetLowerBound();//最小值
			}
			//上下偏差表示法
			if (aDimTolObj->IsDimWithPlusMinusTolerance())
			{
				Standard_Real UpperTolValue = aDimTolObj->GetUpperTolValue();//上偏差
				Standard_Real LowerTolValue = aDimTolObj->GetLowerTolValue();//下偏差
			}
			//标準公差 如H7
			if (aDimTolObj->IsDimWithClassOfTolerance())
			{
				Standard_Boolean theHole; //是否是孔
				XCAFDimTolObjects_DimensionFormVariance theFormVariance;//定義形式方差的值
				XCAFDimTolObjects_DimensionGrade theGrade;//定義公差等級值
				Standard_Boolean bClassOfTolerance = aDimTolObj->GetClassOfTolerance(theHole, theFormVariance, theGrade);
				}
			}
		}

	//形位公差  
	for (TDF_LabelSequence::Iterator aIter(GeomTolLabels); aIter.More(); aIter.Next())
	{
		const TDF_Label& aLabel = aIter.Value();
		Handle(XCAFDoc_GeomTolerance) aDimTol;
		//擷取标注内的形位公差屬性
		if (!aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aDimTol))
			continue;
		Handle(XCAFDimTolObjects_GeomToleranceObject) aDimTolObj = aDimTol->GetObject();
		if (!aDimTolObj.IsNull())
		{
			TDF_LabelSequence theShapeLFirst;
			TDF_LabelSequence theShapeLSecond;
			m_DimTolTool->GetRefShapeLabel(aLabel, theShapeLFirst, theShapeLSecond);
			TopoDS_Shape aShape;
			if (theShapeLFirst.Size() > 0)
			{
				TDF_Label aLabel = theShapeLFirst.First();
				aShape = m_ShapeTool->GetShape(aLabel);
			}
			else
				continue;
			//公差類型
			XCAFDimTolObjects_GeomToleranceType GeomTolType = aDimTolObj->GetType();
			//公內插補點
			Standard_Real GeomTolValue = aDimTolObj->GetValue();
			//公內插補點字首符号
			XCAFDimTolObjects_GeomToleranceTypeValue TypeOfValue = aDimTolObj->GetTypeOfValue();
			//公內插補點實體要求
			XCAFDimTolObjects_GeomToleranceMatReqModif MaterialRequirementModifier = aDimTolObj->GetMaterialRequirementModifier();
			//關聯基準
			Handle(XCAFDoc_GraphNode) aNode;
			if (aLabel.FindAttribute(XCAFDoc::DatumTolRefGUID(), aNode) && aNode->NbChildren() > 0)
			{
				for (Standard_Integer k = 1; k <= aNode->NbChildren(); k++)
				{
					Handle(XCAFDoc_Datum) aDatum;
					TDF_Label aDatumLabel = aNode->GetChild(k)->Label();
					if (aDatumLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
					{
						Handle(XCAFDimTolObjects_DatumObject) aDatumObj = aDatum->GetObject();
						//基準名稱 如:A
						Handle(TCollection_HAsciiString) DatumName = aDatumObj->GetName();
					}
				}
			}
			//傳回公差的修飾符序列
			XCAFDimTolObjects_GeomToleranceModifiersSequence aModif = aDimTolObj->GetModifiers();
			if (!aModif.IsEmpty())
			{
				for (Standard_Integer k = aModif.Lower(); k <= aModif.Upper(); k++)
				{
					XCAFDimTolObjects_GeomToleranceModif GeomToleranceModif = aModif.Value(k);
				}
			}
		}
	}
           

注:擷取到PMI資訊後,根據OpenCASCADE提供的相關類重構PMI圖形顯示!

繼續閱讀