def add_newData(self, path): xyz = genfromtxt(path, dtype=float, usecols=[0, 1, 2]) minH = xyz[:, 2].min() maxH = xyz[:, 2].max() count = len(xyz) pcd = VtkPointCloud(minH, maxH, count) pcd.clearPoints() for k in range(size(xyz, 0)): point = xyz[k] pcd.addPoint(point) self.pointCloud = pcd self.__addActor()
def __getPointCloud(self): xyz = genfromtxt(self.fileName,dtype=float,usecols=[0,1,2]) minH=xyz[:,2].min() maxH=xyz[:,2].max() count = len(xyz) print(count) pcd=VtkPointCloud(minH,maxH,count) pcd.clearPoints() counter=size(xyz,0) print(counter) self.signalStart.emit(counter) print("b") for k in range(size(xyz,0)): self.signalNow.emit(k) point = xyz[k] pcd.addPoint(point) self.pcd = pcd print("b")
def __getRawToPointCloud(self): rLoader=rawLoader() rLoader.setRawPath(self.fileName) z = rLoader.getHEIGHTRAWVALUE() z = z[(z>-99999)] zMax = numpy.amax(z) zMin = numpy.amin(z) #print("get raw:",zMin,zMax) count = rLoader.getWIDTH()*rLoader.getHEIGHT() pcd = VtkPointCloud(zMin,zMax,count) pcd.clearPoints() xyz = rLoader.rawToXYZ() counter = size(xyz,0) self.signalStart.emit(counter) for i in range(size(xyz,0)): self.signalNow.emit(i) point = xyz[i] pcd.addPoint(point) self.rawInfo=[rLoader.getWIDTH(),rLoader.getHEIGHT(),rLoader.getRESX(),rLoader.getRESY(),rLoader.getCHANNEL()] self.pcd = pcd
class XYZviewer(QtWidgets.QFrame): pickedPointSignal = QtCore.pyqtSignal(int) def __init__(self, parent, dataPath): super(XYZviewer,self).__init__(parent) self.interactor = QVTKRenderWindowInteractor(self) self.layout = QtWidgets.QHBoxLayout() self.layout.addWidget(self.interactor) self.layout.setContentsMargins(0,0,0,0) self.setLayout(self.layout) self.pointCloud = VtkPointCloud() self.pcdCollection=[] self.actors = [] self.pickedID=[] self.e=ErrorObserver() self.interactor.AddObserver("ErrorEvent",self.e) if self.e.ErrorOccurred(): print(e.ErrorMessage) #self.load_data(loadPath) if dataPath != None: self.add_data(dataPath) # Renderer self.renderer = vtk.vtkRenderer() self.cubeAxesActor = vtk.vtkCubeAxesActor() self.setCubeAxesActor() self.cubeAxesActor.SetBounds(0,100,0,100,0,100) self.renderer.AddActor(self.cubeAxesActor) # Scalar Bar self.scalarBarActor = vtk.vtkScalarBarActor() self.setScalarBar() self.renderer.AddActor(self.scalarBarActor) #renderer.SetBackground(.2, .3, .4) #colors=vtk.vtkNamedColors() #colors.SetColor("BkgColor",[179,204,255,255]) #renderer.SetBackground(colors.GetColor3d("BkgColor")) self.pointCloud.setLUTRange(0,10) #cam=self.renderer.GetActiveCamera() #cam.Azimuth(-45) #cam.Elevation(0) #cam.Roll(90) #cam.SetViewUp(0,0,1) #cam.SetPosition(0,1,0) #cam.SetParallelProjection(0) #cam.Elevation(-10) #self.renderer.SetActiveCamera(cam) #self.renderer.ResetCamera() #renderer.SetLayer(1) # Render Window renderWindow = self.interactor.GetRenderWindow() #renderWindow = vtk.vtkRenderWindow() #print(renderWindow) #renderWindow.SetNumberOfLayers(2) renderWindow.AddRenderer(self.renderer) #renderWindow.AddRenderer(self.addLogo()) # Interactor #renderWindowInteractor = vtk.vtkRenderWindowInteractor() self.interactor.SetRenderWindow(renderWindow) self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTerrain()) # Scalar Bar #self.addScalarBar(self.pointCloud.getLUT()) #renderWindow.SetInteractor(self.interactor) # Logo #self.addLogo() self.renderer.ResetCamera() # Begin Interaction renderWindow.Render() renderWindow.SetWindowName("XYZ Data Viewer:"+ "xyz") self.interactor.Start() #renderWindowInteractor.Start() # Pack to class #self.renderer=renderer #self.interactor=interactor def start(self): self.interactor.Start() def load_data(self,filename): print("start viewer") data = genfromtxt(filename,dtype=float,usecols=[0,1,2]) #print("generate xyz: ",data[0][2]) #return for k in range(size(data,0)): point = data[k] self.pointCloud.addPoint(point) def addLogo(self): imgReader = vtk.vtkPNGReader() imgReader.SetFileName("benano.png") imgReader.Update() #print(imgReader.GetOutput()) imgActor = vtk.vtkImageActor() imgActor.SetInputData(imgReader.GetOutput()) background_renderer = vtk.vtkRenderer() background_renderer.SetLayer(0) background_renderer.InteractiveOff() background_renderer.AddActor(imgActor) return background_renderer def setScalarBar(self): lut=self.pointCloud.getLUT() scalarBar=self.scalarBarActor scalarBar.SetOrientationToVertical() scalarBar.SetLookupTable(lut) scalarBar.SetBarRatio(0.12) scalarBar.SetTitleRatio(0.12) scalarBar.SetMaximumWidthInPixels(60) scalarBar.SetMaximumHeightInPixels(300) #print(self.scalarBar.GetProperty().SetDisplayLocationToBackground()) #self.scalarBar.SetDisplayPosition(750,250) scalarBar.SetDisplayPosition(60,400) textP = vtk.vtkTextProperty() textP.SetFontSize(10) scalarBar.SetLabelTextProperty(textP) scalarBar.SetTitleTextProperty(textP) scalarBar.SetNumberOfLabels(8) scalarBar.SetLabelFormat("%-#6.3f")#輸出格式 #self.scalarBarWidget = vtk.vtkScalarBarWidget() #self.scalarBarWidget.SetInteractor(self.interactor) #self.scalarBarWidget.SetScalarBarActor(self.scalarBar) #self.scalarBarWidget.On() self.scalarBarActor=scalarBar def setCubeAxesActor(self): cubeAxesActor = self.cubeAxesActor #設定軸上下限 bounds = self.pointCloud.getBounds() cubeAxesActor.SetBounds(bounds) #將RENDER CAMERA指定給軸 cubeAxesActor.SetCamera(self.renderer.GetActiveCamera()) #設定標題與標籤文字顏色 cubeAxesActor.GetTitleTextProperty(0).SetColor(0.5,0.5,0.5) cubeAxesActor.GetLabelTextProperty(0).SetColor(0.5,0.5,0.5) cubeAxesActor.GetTitleTextProperty(1).SetColor(0.5,0.5,0.5) cubeAxesActor.GetLabelTextProperty(1).SetColor(0.5,0.5,0.5) cubeAxesActor.GetTitleTextProperty(2).SetColor(0.5,0.5,0.5) cubeAxesActor.GetLabelTextProperty(2).SetColor(0.5,0.5,0.5) #設定坐標軸線寬 cubeAxesActor.GetXAxesLinesProperty().SetLineWidth(0.5) cubeAxesActor.GetYAxesLinesProperty().SetLineWidth(0.5) cubeAxesActor.GetZAxesLinesProperty().SetLineWidth(0.5) #開啟網格線 cubeAxesActor.DrawXGridlinesOn() cubeAxesActor.DrawYGridlinesOn() cubeAxesActor.DrawZGridlinesOn() #內部網格線不畫 cubeAxesActor.SetDrawXInnerGridlines(0) cubeAxesActor.SetDrawYInnerGridlines(0) cubeAxesActor.SetDrawZInnerGridlines(0) #網格線顏色 cubeAxesActor.GetXAxesGridlinesProperty().SetColor(0.5,0.5,0.5) cubeAxesActor.GetYAxesGridlinesProperty().SetColor(0.5,0.5,0.5) cubeAxesActor.GetZAxesGridlinesProperty().SetColor(0.5,0.5,0.5) #控制軸的繪製方式(外,最近,最遠,靜態最近,靜態外) cubeAxesActor.SetFlyMode(4) #設定刻度線的位置(內,外,兩側) cubeAxesActor.SetTickLocation(1) #網格線樣式(所有,最近,最遠) cubeAxesActor.SetGridLineLocation(2) cubeAxesActor.XAxisMinorTickVisibilityOff() cubeAxesActor.YAxisMinorTickVisibilityOff() cubeAxesActor.ZAxisMinorTickVisibilityOn() self.cubeAxesActor=cubeAxesActor def add_axisWidget(self): axes = vtk.vtkAxesActor() axisWidget = vtk.vtkOrientationMarkerWidget() axisWidget.SetOutlineColor(0.9,0.5,0.1) axisWidget.SetOrientationMarker(axes) iren = self.interactor.GetRenderWindow().GetInteractor() axisWidget.SetInteractor(iren) axisWidget.SetViewport(0,0,0.4,0.4) axisWidget.EnabledOn() axisWidget.InteractiveOn() def add_newData(self,pcd): ''' print("generate xyz") for k in range(size(data,0)): point = data[k] #20*(random.rand(3)-0.5) pcd.addPoint(point) self.renderer.AddActor(pcd.vtkActor) ''' self.pointCloud=pcd self.addActor() def addActor(self): """ self.pcdCollection.append(self.xyzLoader.pcd) print("Current pcd count: ", len(self.pcdCollection)) #self.actors.append(self.pcdCollection[-1].vtkActor) #create each actor from xyz collection for i in self.pcdCollection: self.renderer.AddActor(i.vtkActor) #print(i.vtkActor) """ self.removeAll() isMesh = False isDelaunay3D=False isSurfRecon=1 if isMesh: self.pointCloud.generateMesh() #self.renderer.AddActor(self.pointCloud.vtkActor) self.mainActor=self.pointCloud.boundaryActor elif isDelaunay3D: self.mainActor=self.pointCloud.delaunay3D() elif isSurfRecon: self.mainActor=self.pointCloud.surfaceRecon() else: self.mainActor=self.pointCloud.vtkActor self.renderer.AddActor(self.mainActor) self.setCubeAxesActor() self.renderer.AddActor(self.cubeAxesActor) self.setScalarBar() self.renderer.AddActor(self.scalarBarActor) self.renderer.ResetCamera() self.refresh_renderer() cam = self.renderer.GetActiveCamera() self.oriMatrix = cam.GetExplicitProjectionTransformMatrix() def removeAll(self): actors = self.renderer.GetActors() #print(actors) for i in actors: self.renderer.RemoveActor(i) for i in range(len(self.pcdCollection)): #print(i) del self.pcdCollection[-1] #print(len(self.pcdCollection)) def reset_Camera(self): print(self.oriMatrix) center_x,center_y,center_z=self.mainActor.GetCenter() cam = self.renderer.GetActiveCamera() cam.SetPosition(center_x,center_y,center_z+1) cam.SetViewUp(0,1,0) self.renderer.ResetCamera() self.refresh_renderer() def setCameraTop(self): center_x,center_y,center_z=self.mainActor.GetCenter() cam=self.renderer.GetActiveCamera() cam.SetPosition(center_x+1,center_y,center_z) cam.SetViewUp(0,0,1) #cam.Azimuth(180) print(cam.GetPosition()) #self.renderer.SetActiveCamera(cam) self.renderer.ResetCamera() self.refresh_renderer() def setCameraLeft(self): self.renderer.ResetCamera() cam=self.renderer.GetActiveCamera() #cam.SetPosition(0,0,0) #cam.SetViewUp(0,1,0) cam.Azimuth(-10) #self.renderer.SetActiveCamera(cam) self.renderer.ResetCamera() self.refresh_renderer() def setCameraRight(self): self.renderer.ResetCamera() cam=self.renderer.GetActiveCamera() #cam.SetPosition(0,0,0) #cam.SetViewUp(0,1,0) cam.Azimuth(10) #self.renderer.SetActiveCamera(cam) self.renderer.ResetCamera() self.refresh_renderer() def refresh_renderer(self): #self.renderer.ResetCamera() renderWindow = self.interactor.GetRenderWindow() renderWindow.Render() def applyTransform(self,x,y,z): center_x,center_y,center_z=self.mainActor.GetCenter() w = vtk.vtkTransform() #w.Translate(-center_x,-center_y,-center_z) #vtk not auto change type from string to double w.RotateX(float(x)) w.RotateY(float(y)) w.RotateZ(float(z)) self.mainActor.SetUserTransform(w) self.refresh_renderer() def setParallelCamera(self,state): cam = self.renderer.GetActiveCamera() cam.SetParallelProjection(state) self.renderer.ResetCamera() self.refresh_renderer() def setPickerMode(self,state): import utilities.pointPicker as pStyle print(pStyle) print(state) if state==2: self.interactor.SetInteractorStyle(pStyle.testStyle(self.emitPickedPoint)) else: self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTerrain()) def emitPickedPoint(self,int): self.pickedID.append(int) x,y,z=self.pointCloud.vtkPoints.GetPoint(int) print("emit:",int,x,y,z) self.pickedPointSignal.emit(int) sphereSource = vtk.vtkSphereSource() sphereSource.SetCenter(x,y,z) sphereSource.SetRadius(1) sphereSource.SetThetaResolution(10) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(sphereSource.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(1,0,0) #actor.GetProperty().SetRepresentationToWireframe() print(actor) actors = self.renderer.GetActors() print(actors) self.renderer.AddActor(actor) self.refresh_renderer() if len(self.pickedID)>3: self.drawKochanekSpline(self.pickedID) def drawParametricSpline(self,IDList): points = vtk.vtkPoints() for i in IDList: p=self.pointCloud.vtkPoints.GetPoint(i) points.InsertNextPoint(p) spline = vtk.vtkParametricSpline() spline.SetPoints(points) functionSource = vtk.vtkParametricFunctionSource() functionSource.SetParametricFunction(spline) functionSource.Update() mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(functionSource.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) self.renderer.AddActor(actor) self.refresh_renderer() def drawKochanekSpline(self,IDList): points = vtk.vtkPoints() for i in IDList: p=self.pointCloud.vtkPoints.GetPoint(i) points.InsertNextPoint(p) xSpline = vtk.vtkKochanekSpline() ySpline = vtk.vtkKochanekSpline() zSpline = vtk.vtkKochanekSpline() spline = vtk.vtkParametricSpline() spline.SetXSpline(xSpline) spline.SetYSpline(ySpline) spline.SetZSpline(zSpline) spline.SetPoints(points) functionSource = vtk.vtkParametricFunctionSource() functionSource.SetParametricFunction(spline) functionSource.Update() mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(functionSource.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) self.renderer.AddActor(actor) self.refresh_renderer() def SurfaceReconstruction(self): pointSource=vtk.vtkProgrammableSource() def readPoints(): output = pointSource.GetPolyDataOutput() points = vtk.vtkPoints() output.SetPoints(points) for i in IDList: p=self.pointCloud.vtkPoints.GetPoint(i) points.InsertNextPoint(p) pointSource.SetExecuteMethod(readPoints) surf = vtk.vtkSurfaceReconstructionFilter() surf.SetInputConnection(pointSource.GetOutputPort()) cf = vtk.vtkContourFilter() cf.SetInputConnection(surf.GetOutputPort()) cf.SetValue(0,0) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cf.GetOutputPort()) mapper.ScalarVisibilityOff() actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetDiffuseColor(1,0.3882,0.2784) actor.GetProperty().SetSpecularColor(1,1,1) actor.GetProperty().SetSpecular(.4) actor.GetProperty().SetSpecularPower(50) self.renderer.AddActor(actor) self.refresh_renderer()