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。通過圖像也可以看出(如下圖)。