左键点选三角面片,并用右键删除

来源:互联网 发布:网络域名怎么查看 编辑:程序博客网 时间:2024/04/30 00:18
#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 <= 5extractSelection->SetInput(0, this->Data);extractSelection->SetInput(1, selection);#elseextractSelection->SetInputData(0, this->Data);extractSelection->SetInputData(1, selection);#endifextractSelection->Update();// In selectionvtkSmartPointer<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 eventsvtkInteractorStyleTrackballCamera::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); // BluerenderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;}