本程序实现了修改vtkActor坐标系并保存修改后的STL文件得功能
1.定义MyStyle.h
#pragma once
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include<vtkImageData.h>
#include<vtkPiecewiseFunction.h>
#include<vtkColorTransferFunction.h>
#include<vtkVolumeProperty.h>
#include<vtkVolume.h>
#include<vtkBoxWidget.h>
#include<vtkPointData.h>
#include<vtkDICOMImageReader.h>
#include<vtkImagePlaneWidget.h>
#include<vtkTransform.h>
#include<vtkPlane.h>
#include<vtkMarchingCubes.h>
#include<vtkExtractVOI.h>
#include<vtkImageTracerWidget.h>
#include "vtkGlyphSource2D.h"
#include<vtkLinearExtrusionFilter.h>
#include<vtkImageStencil.h>
#include<vtkPolyDataToImageStencil.h>
#include<vtkStripper.h>
#include<vtkFixedPointVolumeRayCastMapper.h>
#include<vtkOpenGLGPUVolumeRayCastMapper.h>
#include<vtkTriangleFilter.h>
#include<vtkMarchingContourFilter.h>
#include<vtkContourFilter.h>
#include<vtkQuadricClustering.h>
#include<vtkMergePoints.h>
#include<vtkVectorNorm.h>
#include<vtkImageShrink3D.h>
#include<vtkWorldPointPicker.h>
#include <vtkImageViewer2.h>
#include<vtkPolygon.h>
#include<vtkImageStencilToImage.h>
#include<vtkImageMathematics.h>
#include<vtkPolyDataConnectivityFilter.h>
#include<vtkSmartVolumeMapper.h>
#include<vtkPropPicker.h>
#include "vtkPolyDataReader.h"
#include <vtkSmartPointer.h>
#include <vtkDataSetMapper.h>
#include <vtkIdTypeArray.h>
#include <vtkPolyDataMapper.h>
#include <vtkCellArray.h>
#include <vtkPlaneSource.h>
#include <vtkCellPicker.h>
#include <vtkProperty.h>
#include <vtkObjectFactory.h>
#include "vtkSmoothPolyDataFilter.h"
#include "vtkPolyDataNormals.h"
#include "vtkAppendFilter.h"
#include "vtkDataSetCollection.h"
#include "vtkCollection.h"
#include "vtkType.h"
#include<vtkGPUVolumeRayCastMapper.h>
#include <vtkRendererCollection.h>
#include <vtkUnstructuredGrid.h>
#include <vtkPolyData.h>
#include <vtkPoints.h>
#include "vtkDecimatePro.h"
#include "vtkDataSet.h"
#include "vtkAreaPicker.h"
#include "vtkInteractorStyleRubberBandPick.h"
#include "vtkExtractGeometry.h"
#include "vtkBooleanOperationPolyDataFilter.h"
#include "vtkGeometryFilter.h"
#include "vtkClipPolyData.h"
#include "vtkPointWidget.h"
#include "vtkMath.h"
#include <vtkConeSource.h>
#include <QFileDialog>
#include <QMessageBox>
#include <qdebug.h>
#include <vtkAutoInit.h>
#include <vtkCoordinate.h>
#include <vtkWindowToImageFilter.h>
#include <vtkBMPWriter.h>
#include <QDesktopWidget.h>
#include <QGuiApplication.h>
#include <QRect.h>
#include <QApplication>
#include <QDesktopWidget>
#include <vtkMetaImageWriter.h>
#include <vtkImageActor.h>
#include <vtkImageMapper3D.h>
#include <vtkPNGWriter.h>
#include <vtkImageDataGeometryFilter.h>
#include <vector>
#include <string>
#include <vtkImageSliceMapper.h>
#include <vtkPNGReader.h>
#include <vtkSTLReader.h>
#include <vtkTexture.h>
#include <vtkTextureMapToCylinder.h>
#include <vtkImageFlip.h>
#include <vtkImageGradient.h>
#include <vtkImageMagnitude.h>
#include <vtkImageShiftScale.h>
#include <vtkImageHybridMedian2D.h>
#include <vtkSphereSource.h>
#include <vtkTextProperty.h>
#include <vtkProperty2D.h>
#include <vtkActor.h>
#include <vtkPolyData.h>
#include <vtkSphereSource.h>
#include <vtkCommand.h>
#include <vtkWidgetEvent.h>
#include <vtkCallbackCommand.h>
#include <vtkWidgetEventTranslator.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkLookupTable.h>
#include <vtkImageProperty.h>
#include <vtkImageMapToColors.h>
#include <vtkImageResample.h>
#include <vtkTransformPolyDataFilter.h>
#include <vtkSTLWriter.h>
#include <vtkMetaImageReader.h>
#include<Eigen\Core>
#include<math.h>
using namespace Eigen;
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
class MyStyle : public vtkInteractorStyleTrackballActor
{
public:
static MyStyle* New();
vtkTypeMacro(MyStyle, vtkInteractorStyleTrackballActor);
virtual void OnLeftButtonDown();
virtual void OnRightButtonDown();
virtual void OnRightButtonUp();
virtual void OnLeftButtonUp();
public:
Matrix4f matrix;
vtkActor* ActorA;
vtkSTLReader* pSurgicalReader;
};
2.对应的 MyStyle.cpp
#include "MyStyle.h"
#include <vtkMetaImageWriter.h>
#include <vtkInformation.h>
MyStyle* MyStyle::New()
{
return new MyStyle;
}
void MyStyle::OnLeftButtonDown()
{
vtkInteractorStyleTrackballActor::OnLeftButtonDown();
}
void MyStyle::OnRightButtonDown()
{
vtkSmartPointer<vtkMatrix4x4> pMatTemp = vtkSmartPointer<vtkMatrix4x4>::New();
for (size_t i = 0; i < 4; i++)
{
for (size_t j = 0; j < 4; j++)
{
pMatTemp->SetElement(i, j, matrix(i, j));
}
}
vtkSmartPointer<vtkTransform> pTrans = vtkSmartPointer<vtkTransform>::New();
pTrans->SetMatrix(pMatTemp);
vtkSmartPointer<vtkTransformPolyDataFilter> pFilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
pFilter->SetTransform(pTrans);
pFilter->SetInputData(pSurgicalReader->GetOutput());
pFilter->Update();
vtkSmartPointer<vtkPolyData> pPolydata = vtkSmartPointer<vtkPolyData>::New();
pPolydata->SetPolys(pFilter->GetOutput()->GetPolys());
pPolydata->SetPoints(pFilter->GetOutput()->GetPoints());
vtkSmartPointer<vtkSTLWriter> stlWriter =
vtkSmartPointer<vtkSTLWriter>::New();
stlWriter->SetFileName("test.STL");
stlWriter->SetInputData(pPolydata);
stlWriter->Write();
}
void MyStyle::OnRightButtonUp()
{
}
void MyStyle::OnLeftButtonUp()
{
matrix << ActorA->GetMatrix()->GetElement(0, 0), ActorA->GetMatrix()->GetElement(0, 1), ActorA->GetMatrix()->GetElement(0, 2), ActorA->GetMatrix()->GetElement(0, 3),
ActorA->GetMatrix()->GetElement(1, 0), ActorA->GetMatrix()->GetElement(1, 1), ActorA->GetMatrix()->GetElement(1, 2), ActorA->GetMatrix()->GetElement(1, 3),
ActorA->GetMatrix()->GetElement(2, 0), ActorA->GetMatrix()->GetElement(2, 1), ActorA->GetMatrix()->GetElement(2, 2), ActorA->GetMatrix()->GetElement(2, 3),
ActorA->GetMatrix()->GetElement(3, 0), ActorA->GetMatrix()->GetElement(3, 1), ActorA->GetMatrix()->GetElement(3, 2), ActorA->GetMatrix()->GetElement(3, 3);
vtkInteractorStyleTrackballActor::OnLeftButtonUp();
}
3.头文件VtkChangeAxis.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_VtkChangeAxis.h"
#include <vtkPolyData.h>
#include <vtkSTLReader.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkAutoInit.h>
#include <vtkObjectFactory.h>
#include <vtkRendererCollection.h>
#include <vtkVolumeRayCastCompositeFunction.h>
#include <vtkVolumeRayCastIsosurfaceFunction.h>
#include <vtkVolumeRayCastMapper.h>
#include <vtkPropPicker.h>
#include <vtkImageShiftScale.h>
#include <vtkImageCast.h>
#include <vtkWorldPointPicker.h>
#include <vtkOrientationMarkerWidget.h>
#include<vtkCellPicker.h>
#include<vtkPolyDataReader.h>
#include<vtkClipPolyData.h>
#include<vtkAxesActor.h>
#include <vtkLineSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkAxesActor.h>
#include <vtkSTLWriter.h>
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
#include <vtkTransform.h>
#include <vtkSphereSource.h>
#include <vtkInteractorStyleSwitch.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include<vtkInteractorStyleTrackballActor.h>
#include <vtkWindowToImageFilter.h>
#include <vtkBMPWriter.h>
#include <vtkTransformPolyDataFilter.h>
#include <vtkAppendPolyData.h>
#include "MyStyle.h"
#define LINE_LEN 20
class VtkChangeAxis : public QMainWindow
{
Q_OBJECT
public:
VtkChangeAxis(QWidget *parent = Q_NULLPTR);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor;
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor1;
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style1;
vtkSmartPointer<vtkRenderWindow> renderWindow1;
vtkSmartPointer<vtkRenderWindow> renderWindow2;
vtkSmartPointer<vtkActor> actor;
vtkSmartPointer<MyStyle> mystyle;
vtkSmartPointer<vtkSTLReader> reader;
public slots:
void loadStl();
void on_PbsetCameraStyle();
void on_PbsetActorStyle();
void on_PbshowResult();
private:
Ui::VtkChangeAxisClass ui;
};
4.VtkChangeAxis.cpp
#include "VtkChangeAxis.h"
#include "qdebug.h"
#include<vtkOutlineFilter.h>
VtkChangeAxis::VtkChangeAxis(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor1 = vtkSmartPointer<vtkRenderWindowInteractor>::New();
style1 = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindow1 = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow2 = vtkSmartPointer<vtkRenderWindow>::New();
mystyle = vtkSmartPointer<MyStyle>::New();
actor = vtkSmartPointer<vtkActor>::New();
reader = vtkSmartPointer<vtkSTLReader>::New();
renderWindow1 = ui.qvtkWidget->GetRenderWindow();
renderWindow2 = ui.qvtkWidget_2->GetRenderWindow();
connect(ui.pushButton_load, SIGNAL(clicked()),this,SLOT(loadStl()));
connect(ui.pushButton_camerstyle, SIGNAL(clicked()), this, SLOT(on_PbsetCameraStyle()));
connect(ui.pushButton_actorstyle, SIGNAL(clicked()), this, SLOT(on_PbsetActorStyle()));
connect(ui.pushButton_showresult, SIGNAL(clicked()), this, SLOT(on_PbshowResult()));
}
void VtkChangeAxis::loadStl()
{
std::string inputFilename = "tip.stl";
reader->SetFileName(inputFilename.c_str());
reader->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader->GetOutputPort());
//显示坐标系
vtkSmartPointer<vtkAxesActor> actor2 =
vtkSmartPointer<vtkAxesActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderWindow1->AddRenderer(renderer);
vtkSmartPointer<vtkCellPicker> worldPointPicker =
vtkSmartPointer<vtkCellPicker>::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor->SetInteractorStyle(style);
renderWindowInteractor->SetRenderWindow(renderWindow1);
renderWindowInteractor->SetPicker(worldPointPicker);
actor2->SetPosition(100, 0, 0);
actor2->SetTotalLength(LINE_LEN, LINE_LEN, LINE_LEN);
actor2->SetShaftType(0);
actor2->SetAxisLabels(0);
actor2->SetCylinderRadius(0.02);
vtkSmartPointer<vtkOutlineFilter>outlineData = vtkSmartPointer<vtkOutlineFilter>::New();
outlineData->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper>mapOutline = vtkSmartPointer<vtkPolyDataMapper>::New();
mapOutline->SetInputConnection(outlineData->GetOutputPort());
vtkSmartPointer<vtkActor>outline = vtkSmartPointer<vtkActor>::New();
outline->SetMapper(mapOutline);
outline->GetProperty()->SetColor(0, 0, 0);
renderer->AddActor(actor2);
renderer->AddActor(actor);
renderer->AddActor(outline);
renderer->SetBackground(0.22745, 0.83137, 0.98823);
renderWindow1->Render();
}
void VtkChangeAxis::on_PbsetCameraStyle()
{
renderWindowInteractor->SetInteractorStyle(style1);
renderWindow1->Render();
}
void VtkChangeAxis::on_PbsetActorStyle()
{
renderWindowInteractor->SetInteractorStyle(mystyle);
mystyle->ActorA = actor;
mystyle->pSurgicalReader = reader;
renderWindow1->Render();
}
void VtkChangeAxis::on_PbshowResult()
{
std::string inputFilename = "test.STL";
vtkSmartPointer<vtkSTLReader> reader1 = vtkSmartPointer<vtkSTLReader>::New();
reader1->SetFileName(inputFilename.c_str());
reader1->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader1->GetOutputPort());
//显示坐标系
vtkSmartPointer<vtkAxesActor> actor2 =
vtkSmartPointer<vtkAxesActor>::New();
vtkSmartPointer<vtkActor> actor1 = vtkSmartPointer<vtkActor>::New();
actor1->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer1 =
vtkSmartPointer<vtkRenderer>::New();
renderWindow2->AddRenderer(renderer1);
vtkSmartPointer<vtkCellPicker> worldPointPicker =
vtkSmartPointer<vtkCellPicker>::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style0 =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor1->SetInteractorStyle(style0);
renderWindowInteractor1->SetRenderWindow(renderWindow2);
renderWindowInteractor1->SetPicker(worldPointPicker);
actor2->SetPosition(100, 0, 0);
actor2->SetTotalLength(LINE_LEN, LINE_LEN, LINE_LEN);
actor2->SetShaftType(0);
actor2->SetAxisLabels(0);
actor2->SetCylinderRadius(0.02);
renderer1->AddActor(actor1);
renderer1->AddActor(actor2);
renderer1->SetBackground(0.22745, 0.83137, 0.98823);
renderWindow2->Render();
}
5.main函数
#include "VtkChangeAxis.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
VtkChangeAxis w;
w.show();
return a.exec();
}
![运行结果如图示:](https://img-blog.csdnimg.cn/8414af18f7cc4b8e8dbc3a0df333f502.jpeg#pic_center)
修改vtkActor的坐标系
最新推荐文章于 2024-05-15 23:45:38 发布