修改vtkActor的坐标系

本程序实现了修改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)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值