当前位置:网站首页>Qt+vtk+occt reading iges/step model
Qt+vtk+occt reading iges/step model
2022-07-03 11:56:00 【windSnowLi】
Reference link
Main code
#include "VTKOCCT.h"
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepPrimAPI_MakeCone.hxx>
#include <IVtkTools_ShapeDataSource.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyDataMapper.h>
#include <IGESControl_Reader.hxx>
#include <STEPCAFControl_Reader.hxx>
//Lesson 17
#include <Bnd_Box.hxx>
#include <BRepBndLib.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <vtkCubeSource.h>
#include <vtkEllipseArcSource.h>
#include <vtkSphereSource.h>
#include <vtkConeSource.h>
#include <vtkAppendPolyData.h >
#include <vtkCleanPolyData.h >
#include <vtkNew.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkBoundingBox.h>
#include <vtkAxesActor.h>
decltype(auto) ReadIges(const char* file) {
IGESControl_Reader reader;
reader.ReadFile(file);
reader.TransferRoots();
TopoDS_Shape shape = reader.OneShape();
vtkNew<vtkPolyData> polydata;
vtkNew<vtkPolyDataMapper> mapper;
vtkNew<vtkActor> actor;
vtkNew<IVtkTools_ShapeDataSource> shapeSource;
shapeSource->SetShape(new IVtkOCC_Shape(shape));
shapeSource->Update();
mapper->SetInputConnection(shapeSource->GetOutputPort());
actor->SetMapper(mapper);
return actor;
}
decltype(auto) ReadStep(const char* file) {
STEPControl_Reader readerSTEP;
IFSelect_ReturnStatus statSTEP = readerSTEP.ReadFile(file);
IFSelect_PrintCount modeSTEP = IFSelect_ListByItem;
readerSTEP.PrintCheckLoad(Standard_False, modeSTEP);
readerSTEP.TransferRoots();
TopoDS_Shape shape = readerSTEP.OneShape();
vtkNew<vtkPolyDataMapper> mapper;
vtkNew<vtkActor> actor;
vtkNew<IVtkTools_ShapeDataSource> shapeSource;
shapeSource->SetShape(new IVtkOCC_Shape(shape));
shapeSource->Update();
mapper->SetInputConnection(shapeSource->GetOutputPort());
actor->SetMapper(mapper);
return actor;
}
decltype(auto) TopoDSShapeSphere() {
//TopoDS_ShapeSphere
gp_Ax2 sphere_origin(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1));
BRepPrimAPI_MakeCone mkCone(sphere_origin, 1.0, 0.01, 1);
const TopoDS_Shape& TopoDS_ShapemkConeTMP = mkCone.Shape();
TopoDS_Shape TopoDS_ShapeCONE = static_cast<TopoDS_Shape>(TopoDS_ShapemkConeTMP);
gp_Trsf TSPHERE;
TSPHERE.SetScaleFactor(0.9);
TSPHERE.SetTranslationPart(gp_Vec(0, 0, 0));
BRepBuilderAPI_Transform stepBRepTransformationTOPBOX(TopoDS_ShapeCONE, TSPHERE, Standard_True);
TopoDS_ShapeCONE = stepBRepTransformationTOPBOX.Shape();
vtkNew<IVtkTools_ShapeDataSource> TOPOCONESource;
TOPOCONESource->SetShape(new IVtkOCC_Shape(TopoDS_ShapeCONE));
vtkNew<vtkActor> actorTOPOCONE;
vtkNew<vtkPolyDataMapper> mapperTOPOCONE;
actorTOPOCONE->SetMapper(mapperTOPOCONE);
mapperTOPOCONE->SetInputConnection(TOPOCONESource->GetOutputPort());
return actorTOPOCONE;
}
decltype(auto) VTKpointOnMeshes(const char* file) {
STEPControl_Reader readerSTEP;
IFSelect_ReturnStatus statSTEP = readerSTEP.ReadFile(file);
IFSelect_PrintCount modeSTEP = IFSelect_ListByItem;
readerSTEP.PrintCheckLoad(Standard_False, modeSTEP);
readerSTEP.TransferRoots();
TopoDS_Shape TopoDS_ShapeSTEP = readerSTEP.OneShape();
//VTKpointOnMeshes
vtkNew<vtkPoints> VTKpointsOnMeshes;
vtkNew<vtkCellArray> verticesForVTKpointsOnMeshes;
vtkIdType pid[1];
//vtkPolyData creation
vtkNew<vtkPolyData> PolyDataVTKPointsOnMeshes;
//vtkPolyData initialization
PolyDataVTKPointsOnMeshes->SetPoints(VTKpointsOnMeshes);
PolyDataVTKPointsOnMeshes->SetVerts(verticesForVTKpointsOnMeshes);
//VTKpoint IGES, STEP TopoDS_ShapeBOX CALC
Bnd_Box aabb;
//AABB ALGO Per TopoDS_Shape mesh , Please choose the source you like to run and put it in next line
BRepBndLib::Add(TopoDS_ShapeSTEP, aabb, true); //TopoDS_ShapeIGES //TopoDS_ShapeSTEP //TopoDS_ShapeCONE
//VTKpointIGES CALC per TopoDS_Shape mesh
int density = 20;
gp_XYZ Pmin = aabb.CornerMin().XYZ();
gp_XYZ Pmax = aabb.CornerMax().XYZ();
gp_XYZ D = Pmax - Pmin;
double dim[3] = {
D.X(),D.Y(),D.Z() };
double mind = Min(dim[0], Min(dim[1], dim[2]));
const double d = mind / density;
int nslice[3] = {
int(Round(dim[0] / d)) + 1 ,
int(Round(dim[1] / d)) + 1 ,
int(Round(dim[2] / d)) + 1 };
for (int i = 0; i < nslice[0]; ++i)
for (int j = 0; j < nslice[1]; ++j)
for (int k = 0; k < nslice[2]; ++k)
{
gp_XYZ p = Pmin
+ gp_XYZ(d * i, 0, 0)
+ gp_XYZ(0, d * j, 0)
+ gp_XYZ(0, 0, d * k);
pid[0] = VTKpointsOnMeshes->InsertNextPoint(p.X(), p.Y(), p.Z());
verticesForVTKpointsOnMeshes->InsertNextCell(1, pid);
};
//Append the meshes
vtkNew<vtkAppendPolyData> appendFilter;
appendFilter->AddInputData(PolyDataVTKPointsOnMeshes);
//Remove any duplicate points.
vtkNew<vtkCleanPolyData> cleanFilterForMapperVTKShapes;
cleanFilterForMapperVTKShapes->SetInputConnection(appendFilter->GetOutputPort());
cleanFilterForMapperVTKShapes->Update();
vtkNew<vtkPolyDataMapper> mapperVTKShapes;
mapperVTKShapes->SetInputConnection(cleanFilterForMapperVTKShapes->GetOutputPort());
vtkNew<vtkActor> actorVTKShapes;
actorVTKShapes->SetMapper(mapperVTKShapes);
return actorVTKShapes;
}
VTKOCCT::VTKOCCT(QWidget* parent)
: QMainWindow(parent)
{
vtkWidget = new QVTKOpenGLNativeWidget(this);
this->resize(600, 400);
this->setCentralWidget(vtkWidget);
// ViewPort Division
double xmins[4] = {
0, 0.5, 0 ,0.5 };
double xmaxs[4] = {
0.5, 1, 0.5,1 };
double ymins[4] = {
0, 0, 0.5,0.5 };
double ymaxs[4] = {
0.5, 0.5, 1,1 };
auto igesActor = ReadIges("D:/TEST/3D/igs/ Laser sword .igs");
auto rendererIges = vtkSmartPointer< vtkRenderer >::New();
rendererIges->SetViewport(xmins[0], ymins[0], xmaxs[0], ymaxs[0]);
rendererIges->AddActor(igesActor);
auto stepActor = ReadStep("D:/TEST/3D/step/Assem1.STEP");
auto rendererStep = vtkSmartPointer< vtkRenderer >::New();
rendererStep->SetViewport(xmins[1], ymins[1], xmaxs[1], ymaxs[1]);
rendererStep->AddActor(stepActor);
auto topoActor = TopoDSShapeSphere();
auto rendererTopo = vtkSmartPointer< vtkRenderer >::New();
rendererTopo->SetViewport(xmins[2], ymins[2], xmaxs[2], ymaxs[2]);
rendererTopo->AddActor(topoActor);
auto vTKpointOnMeshes = VTKpointOnMeshes("D:/TEST/3D/step/ Leaves .STEP");
auto rendererVTKpointOnMeshes = vtkSmartPointer< vtkRenderer >::New();
rendererVTKpointOnMeshes->SetViewport(xmins[3], ymins[3], xmaxs[3], ymaxs[3]);
rendererVTKpointOnMeshes->AddActor(vTKpointOnMeshes);
vtkNew<vtkAxesActor> axes;
// Chief,
// Initialize array
double axesLength[3]{
100,100,100 };
axes->SetTotalLength(axesLength);
rendererIges->AddActor(axes);
vtkWidget->renderWindow()->AddRenderer(rendererIges);
vtkWidget->renderWindow()->AddRenderer(rendererStep);
vtkWidget->renderWindow()->AddRenderer(rendererTopo);
vtkWidget->renderWindow()->AddRenderer(rendererVTKpointOnMeshes);
}
VTKOCCT::~VTKOCCT()
{
}
## effect 
边栏推荐
- Unity3d learning notes 5 - create sub mesh
- vulnhub之GeminiInc
- Master and backup role election strategy in kept
- STL tutorial 10 container commonalities and usage scenarios
- C language utf8toutf16 (UTF-8 characters are converted to hexadecimal encoding)
- Vulnhub geminiinc V2
- Colleagues wrote a responsibility chain model, with countless bugs
- (database authorization - redis) summary of unauthorized access vulnerabilities in redis
- STL tutorial 8-map
- vulnhub之Ripper
猜你喜欢

The excel table is transferred to word, and the table does not exceed the edge paper range

Vulnhub's presidential

laravel 时区问题timezone

Ripper of vulnhub
![Capturing and sorting out external Fiddler -- Conversation bar and filter [2]](/img/04/e9cc027d753e7049f273d866eefdce.png)
Capturing and sorting out external Fiddler -- Conversation bar and filter [2]

Xml的(DTD,xml解析,xml建模)

PHP基础

Excel快速跨表复制粘贴

错排问题 (抽奖,发邮件)

Colleagues wrote a responsibility chain model, with countless bugs
随机推荐
OpenGL 索引缓存对象EBO和线宽模式
ftp登录时,报错“530 Login incorrect.Login failed”
CGroup introduction
【学习笔记】dp 状态与转移
Excel quick cross table copy and paste
Solution to the second weekly test of ACM intensive training of Hunan Institute of technology in 2022
Kubernetes 三打探针及探针方式
Hongmeng fourth training
How should intermediate software designers prepare for the soft test
Master and backup role election strategy in kept
Concurrent programming - singleton
OpenGL 着色器使用
vulnhub之raven2
mysql使用update联表更新的方法
错排问题 (抽奖,发邮件)
vulnhub之Ripper
解决msvcp120d.dll和msvcr120d.dll缺失
Simple factory and factory method mode
vulnhub之presidential
836. 合并集合(DAY 63)并查集