左鍵點選三角面片,並用右鍵刪除

#include "stdafx.h"

#include "vtkPolyDataReader.h"
#include <vtkSmartPointer.h>
#include <vtkRendererCollection.h>
#include <vtkDataSetMapper.h>
#include <vtkUnstructuredGrid.h>
#include <vtkIdTypeArray.h>
#include <vtkTriangleFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkCommand.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPlaneSource.h>
#include <vtkCellPicker.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkProperty.h>
#include <vtkSelectionNode.h>
#include <vtkSelection.h>
#include <vtkExtractSelection.h>
#include <vtkObjectFactory.h>
#include "vtkDecimatePro.h"
#include "vtkSmoothPolyDataFilter.h"
#include "vtkPolyDataNormals.h"
#include "vtkAppendFilter.h"
#include "vtkDataSetCollection.h"
#include "vtkCollection.h"
#include <list>
#include "vtkType.h"
#include "vtkDataSet.h"
// Catch mouse events

//對TrackballCamera這種交互方式的繼承重寫

std::list<int> v;
class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
	static MouseInteractorStyle* New();

	MouseInteractorStyle()
	{
		selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
		selectedActor = vtkSmartPointer<vtkActor>::New();
		appendFilter = vtkSmartPointer<vtkAppendFilter>::New();
	}

	virtual void OnLeftButtonDown()
	{

		// Get the location of the click (in window coordinates)
		int* pos = this->GetInteractor()->GetEventPosition();

		vtkSmartPointer<vtkCellPicker> picker =
			vtkSmartPointer<vtkCellPicker>::New();
		picker->SetTolerance(0.0005);
		// Pick from this location.
		vtkSmartPointer<vtkRenderWindowInteractor> Interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
		Interactor = this->GetInteractor();
		vtkRenderer *CurrentRenderer = Interactor->FindPokedRenderer(pos[0],pos[1]);
		//picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());
		picker->Pick(pos[0],pos[1],0,CurrentRenderer);

		double* worldPosition = picker->GetPickPosition();
		std::cout << "Cell id is: " << picker->GetCellId() << std::endl;

		if(picker->GetCellId() != -1)
		{

			std::cout << "Pick position is: " << worldPosition[0] << " " << worldPosition[1]
			<< " " << worldPosition[2] << endl;

			vtkSmartPointer<vtkIdTypeArray> ids =                      //vtkIdTypeArray就是vtkIdType(int)類型的一個數組
				vtkSmartPointer<vtkIdTypeArray>::New();


			ids->SetNumberOfComponents(1);
			ids->InsertNextValue(picker->GetCellId());

			vtkSmartPointer<vtkSelectionNode> selectionNode =
				vtkSmartPointer<vtkSelectionNode>::New();
			selectionNode->SetFieldType(vtkSelectionNode::CELL);
			selectionNode->SetContentType(vtkSelectionNode::INDICES);
			selectionNode->SetSelectionList(ids);

			vtkSmartPointer<vtkSelection> selection =
				vtkSmartPointer<vtkSelection>::New();
			selection->AddNode(selectionNode);

			vtkSmartPointer<vtkExtractSelection> extractSelection =

				vtkSmartPointer<vtkExtractSelection>::New();
#if VTK_MAJOR_VERSION <= 5
			extractSelection->SetInput(0, this->Data);
			extractSelection->SetInput(1, selection);
#else
			extractSelection->SetInputData(0, this->Data);
			extractSelection->SetInputData(1, selection);
#endif
			extractSelection->Update();

			// In selection
			vtkSmartPointer<vtkUnstructuredGrid> selected =
				vtkSmartPointer<vtkUnstructuredGrid>::New();
			selected->ShallowCopy(extractSelection->GetOutput());

			std::cout << "There are " << selected->GetNumberOfPoints()
				<< " points in the selection." << std::endl;
			std::cout << "There are " << selected->GetNumberOfCells()
				<< " cells in the selection." << std::endl;


			appendFilter->AddInput(selected);

			//v.push_back(picker->GetCellId());
			int flag =1;

			for (std::list<int>::iterator it = v.begin() ; it != v.end(); it++)
			{
				if (*it == picker->GetCellId())
					flag = 0;
					
			}

			if (flag == 1)
			{
				v.push_back(picker->GetCellId());
			}

			cout<<v.size()<<endl;

			selectedMapper->SetInputConnection(appendFilter->GetOutputPort());

			selectedActor->SetMapper(selectedMapper);
			//selectedActor->GetProperty()->EdgeVisibilityOn();
			selectedActor->GetProperty()->SetColor(1,0,0);
			//selectedActor->GetProperty()->SetLineWidth(3);

			this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);

		}
		// Forward events
		vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
	}

	virtual void OnRightButtonDown()
	{
		int* pos = this->GetInteractor()->GetEventPosition();

		vtkSmartPointer<vtkCellPicker> picker =
			vtkSmartPointer<vtkCellPicker>::New();
		picker->SetTolerance(0.0005);
		// Pick from this location.
		vtkSmartPointer<vtkRenderWindowInteractor> Interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
		Interactor = this->GetInteractor();
		vtkRenderer *CurrentRenderer = Interactor->FindPokedRenderer(pos[0],pos[1]);
		//picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());
		picker->Pick(pos[0],pos[1],0,CurrentRenderer);

		double* worldPosition = picker->GetPickPosition();
		std::cout << "Cell id is: " << picker->GetCellId() << std::endl;

		if(picker->GetCellId() != -1)
		{
			int i=0;
			for (std::list<int>::iterator it = v.begin() ; it != v.end(); it++)
			{
				if (*it == picker->GetCellId())
				{
					v.remove(*it);
					break;
				}
				i++;
			}

			vtkSmartPointer<vtkDataSetCollection> collection = vtkSmartPointer<vtkDataSetCollection>::New();
			collection = appendFilter->GetInputList();
			int NumberOfItems = collection->GetNumberOfItems();
			std::cout<<"There are"<< NumberOfItems<<" Item In Collection"<<std::endl;
			vtkDataSet *selected = collection->GetItem(i);

			appendFilter->RemoveInput(selected);
			appendFilter->Update();

			collection = appendFilter->GetInputList();
			std::cout<<"After Remove,There are"<< collection->GetNumberOfItems()<<" Item In Collection"<<std::endl;


			selectedMapper->SetInputConnection(appendFilter->GetOutputPort());
			selectedActor->SetMapper(selectedMapper);
			//selectedActor->GetProperty()->EdgeVisibilityOn();
			selectedActor->GetProperty()->SetColor(1,0,0);
			//selectedActor->GetProperty()->SetLineWidth(3);

			this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);
		}

		vtkInteractorStyleTrackballCamera::OnRightButtonDown();

	}

	vtkSmartPointer<vtkPolyData> Data;
	vtkSmartPointer<vtkDataSetMapper> selectedMapper;
	vtkSmartPointer<vtkActor> selectedActor;
	vtkSmartPointer<vtkAppendFilter> appendFilter;

};


vtkStandardNewMacro(MouseInteractorStyle);

int main (int, char *[])
{

	vtkSmartPointer<vtkPolyDataReader> reader = vtkSmartPointer<vtkPolyDataReader>::New() ; //read vtk polygonal data file ,vtkDataReader是一個專門用來的vtk文件的父類
	reader->SetFileName("weldedSpheres.vtk");    

	//進行精簡reduce the number of triangles in a mesh 
	vtkSmartPointer<vtkDecimatePro> deci = vtkSmartPointer<vtkDecimatePro>::New();    
	deci->SetInputConnection(reader->GetOutputPort());
	deci->SetTargetReduction(0.9);//Specify the desired reduction in the total number of polygons (e.g., if TargetReduction is set to 0.9, this filter will try to reduce the data set to 10% of its original size). 
	deci->PreserveTopologyOn();//Turn on/off whether to preserve the topology of the original mesh. If on, mesh splitting and hole elimination will not occur. This may limit the maximum reduction that may be achieved. 

	//設置優化 用拉普拉斯平滑來調整點的位置
	vtkSmartPointer<vtkSmoothPolyDataFilter> smoother= vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
	smoother->SetInputConnection(deci->GetOutputPort());
	smoother->SetNumberOfIterations(50);//Specify the number of iterations for Laplacian smoothing

	//計算多邊形網格的法線
	vtkSmartPointer<vtkPolyDataNormals> normals= vtkSmartPointer<vtkPolyDataNormals>::New();
	normals->SetInputConnection(smoother->GetOutputPort());
	normals->FlipNormalsOn();


	vtkSmartPointer<vtkPolyDataMapper> mapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInput(normals->GetOutput());

	vtkSmartPointer<vtkActor> actor =
		vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	actor->GetProperty()->SetColor(1.0,1.0,0.0);

	vtkSmartPointer<vtkRenderer> renderer =
		vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow =
		vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);
	renderWindowInteractor->Initialize();

	// Set the custom stype to use for interaction.
	vtkSmartPointer<MouseInteractorStyle> style =
		vtkSmartPointer<MouseInteractorStyle>::New();
	//style->SetDefaultRenderer(renderer);
	style->Data = normals->GetOutput();

	renderWindowInteractor->SetInteractorStyle(style);

	renderer->AddActor(actor);
	renderer->ResetCamera();

	renderer->SetBackground(0.6, 0.8, 0.8); // Blue

	renderWindow->Render();
	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}


發佈了5 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章