AnyCAD(MFC版)三種格式(IGES,STEP,STL)三維零件的讀取


AnyCAD(MFC版)三種格式(IGES,STEP,STL)三維零件的讀取

注:顯示請參考利用AnyCAD在MFC中對話框中增加三維顯示

零件讀取代碼

類型 相關類
IGES TopoDataExchangeIges
STEP TopoDataExchangeStep
STL TopoDataExchangeStl

IGES讀取與測試

void CAnyCADTest1Dlg::OnBnClickedImportIges()
{
	// TODO: 在此添加控件通知處理程序代碼
	CFileDialog igesDlg(TRUE);
	igesDlg.m_ofn.lpstrTitle = _T("讀取IGES文件");
	igesDlg.m_ofn.lpstrFilter = _T("IGES(*.iges\0*.iges;*.igs\0All Files\0*.*\0\0)"); 
	if (!igesDlg.DoModal())
	{
		AfxMessageBox(_T("模型導入失敗!")); 
		return;
	}
   
#ifdef UNICODE
	USES_CONVERSION;
	string path = T2A(igesDlg.GetPathName());
#else
	string path = igesDlg.GetPathName().GetBuffer(0);
#endif

	TopoDataExchangeIges iges;				//復合類型(Topo_COMPOUND),24個頂點,6個面,24條邊
	m_igesShape = iges.Read(path);

//	auto node = m_Window3D.ShowGeometry(m_igesShape, ElementId(2));     //該句為顯示讀入模型的語句

    ///////////////////////////后面為一些測試//////////////////////////
	EnumTopoShapeType type = m_igesShape.GetShapeType();                //類型

	//對iges的face進行提取
	m_subGroup = GlobalInstance::topoExplor.ExplorFaces(m_igesShape);

	TopoShapeGroup edgeGroup = GlobalInstance::topoExplor.ExplorEdges(m_igesShape);
	EdgeClassifier edgeClassfier;
	edgeClassfier.Initialize(m_igesShape);
	TopoShapeGroup freeEdgeGroup = edgeClassfier.GetFreeEdges();
	int size = edgeGroup.Size();                            			//24
	int size1 = freeEdgeGroup.Size();									//23
	int size2 = edgeClassfier.GetSharedEdges().Size();					//0
	int size3 = edgeClassfier.GetStandaloneEdges().Size();				//0
	for (int i(0); i < size; ++i)
	{
		m_Window3D.ShowGeometry(edgeGroup.GetTopoShape(i), ElementId(i+1));
	}

	m_Window3D.GetView().RequestDraw(1);
}

STEP讀取與測試

void CAnyCADTest1Dlg::OnBnClickedImportStep()
{
	// TODO: 在此添加控件通知處理程序代碼
	CFileDialog stepDlg(TRUE);
	stepDlg.m_ofn.lpstrTitle = _T("讀取STEP文件");
	stepDlg.m_ofn.lpstrFilter = _T("STEP(*.step\0*.step\0All Files\0*.*\0\0)");
	if (!stepDlg.DoModal())
	{
		AfxMessageBox(_T("模型導入失敗!"));
		return;
	}

#ifdef UNICODE
	USES_CONVERSION;
	string path = T2A(stepDlg.GetPathName());
#else
	string path = stepDlg.GetPathName().GetBuffer(0);
#endif

	TopoDataExchangeStep step;		//實體(Topo_SOLID ),8個頂點,6個面,12條邊
	m_stepShape = step.Read(path);

//	auto node = m_Window3D.ShowGeometry(m_stpShape, ElementId(2));      //該句為顯示讀入模型的語句

///////////////////////////后面為一些測試//////////////////////////
	EnumTopoShapeType type = m_stepShape.GetShapeType();        //類型

	//對step的face進行提取
	m_subGroup = GlobalInstance::topoExplor.ExplorFaces(m_stepShape);

	TopoShapeGroup edgeGroup = GlobalInstance::topoExplor.ExplorEdges(m_stepShape);
	EdgeClassifier edgeClassfier;
	edgeClassfier.Initialize(m_stepShape);
	TopoShapeGroup sharedEdgeGroup = edgeClassfier.GetSharedEdges();
	int size = edgeGroup.Size();                                //12
	int size1 = edgeClassfier.GetFreeEdges().Size();			//0
	int size2 = sharedEdgeGroup.Size();							//11
	int size3 = edgeClassfier.GetStandaloneEdges().Size();		//0
	for (int i(0); i < size2; ++i)
	{
		m_Window3D.ShowGeometry(sharedEdgeGroup.GetTopoShape(i), ElementId(i + 1));
	}
	
	m_Window3D.GetView().RequestDraw(1);
}

STL讀取與測試

void CAnyCADTest1Dlg::OnBnClickedImportStl()
{
	// TODO: 在此添加控件通知處理程序代碼
	CFileDialog stlDlg(TRUE);
	stlDlg.m_ofn.lpstrTitle = _T("讀取STL文件");
	stlDlg.m_ofn.lpstrFilter = _T("STL(*.stl\0*.stl\0All Files\0*.*\0\0)");
	if (!stlDlg.DoModal())
	{
		AfxMessageBox(_T("模型導入失敗!"));
		return;
	}

#ifdef UNICODE
	USES_CONVERSION;
	string path = T2A(stlDlg.GetPathName());
#else
	string path = stlDlg.GetPathName().GetBuffer(0);
#endif

	TopoDataExchangeStl stl;		//三角面片(Topo_SHELL),8個頂點,12個面(三角面),18條邊
	m_stlShape = stl.Read(path);

	//	auto node = m_Window3D.ShowGeometry(m_stpShape, ElementId(2));     //該句為顯示讀入模型的語句
    
    ///////////////////////////后面為一些測試//////////////////////////
	EnumTopoShapeType type = m_stlShape.GetShapeType();         //類型

	//對stl的face進行提取
	m_subGroup = GlobalInstance::topoExplor.ExplorFaces(m_stlShape);

	TopoShapeGroup edgeGroup = GlobalInstance::topoExplor.ExplorEdges(m_stlShape);
	EdgeClassifier edgeClassfier;
	edgeClassfier.Initialize(m_stlShape);
	TopoShapeGroup freeEdgeGroup = edgeClassfier.GetFreeEdges();
	int size = edgeGroup.Size();							//18
	int size1 = freeEdgeGroup.Size();						//0
	int size2 = edgeClassfier.GetSharedEdges().Size();		//17
	int size3 = edgeClassfier.GetStandaloneEdges().Size();	//0
	for (int i(0); i < size; ++i)
	{
		m_Window3D.ShowGeometry(edgeGroup.GetTopoShape(i), ElementId(i + 1));
	}

	m_Window3D.GetView().RequestDraw(1);
}

測試分析

  以上程序讀取的均為長方體快,為同一長方體塊的三種文件。
  以上程序中在讀取完三種零件后對讀取零件的一些屬性進行了測試,主要包含以下屬性:
    (1) type:讀取得到的零件的類型;
    (2) 邊數:包括兩種 ——
           a)通過GlobalInstance::topoExplor.ExplorEdges獲取的物體所有邊界,個數為size;
           b)通過edgeClassfier.GetFreeEdges獲取的物體邊界,其中又包括三種邊界free edge,shared edge,standalone edge,對應的個數為size1,size2,size3。
  
  測試代碼結果如下表所示(表格中后兩列是后期補充的實驗,測試模型頂點個數及面個數):

零件名稱 size size1 size2 size3 type 頂點個數 面個數
IGES 24 23 0 0 Topo_COMPOUND 24 6
STEP 12 0 11 0 Topo_SOLID 8 6
STL 18 0 17 0 Topo_SHELL 8 12

  從表中可以看出,
    (1) 通過edgeClassfier.GetFreeEdges獲取的邊界個數(size1+size2+size3)總比通過GlobalInstance::topoExplor.ExplorEdges獲取的邊界個數(size)少1,通過繪制結果可以看出少的是GlobalInstance::topoExplor.ExplorEdges獲取的最后一個邊界。
    (2) IGES獲取的零件類型為復合類型,邊界個數與頂點個數均為24,相當於每個面單獨統計一次邊界和頂點,導致測得的長方體邊界數為實際的兩倍,頂點個數為實際的三倍;
    (3) STEP獲取的零件類型為實體類型,邊界個數與頂點個數均與實際長方體邊界個數和頂點個數相同;
    (4) STL獲取的零件類型為面片類型,且為三角面片。而長方體表面為四邊形,因此存儲為STL模型時自動對長方體表面進行划分,每個面添加了一條邊界從而將四邊形轉化為三角形面片,因此得到的面個數為12,邊界個數為18。通過圖像也可以看出(如下圖)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM