python版的vtk怎么自定义style

直接上代码

from vtkmodules.all import *

class MyRubberBand(vtkInteractorStyleRubberBand2D):
    def __init__(self):
        self.viewer =  None
        self.AddObserver("LeftButtonPressEvent", self.OnLeftButtonDown)
        self.AddObserver("LeftButtonReleaseEvent",self.OnLeftButtonUp)
        self.AddObserver('MouseMoveEvent',self.mouseMove)

        self.draw = False
        self.startPoint = [0,0,0]
        self.curPoint = [0,0,0]
        self.lastPoint = [0,0,0]



    def mouseMove(self,obj,event):
        if self.draw == True:
            self.curPoint[:2] = self.GetInteractor().GetEventPosition()
            self.curPoint[2] = 0
            self.drawLine()
            self.lastPoint[:2] = self.GetInteractor().GetEventPosition()
            self.lastPoint[2] = 0
        p = self.GetInteractor().GetEventPosition()
        print(p)

    def OnLeftButtonDown(self,obj,event):
        # vtkInteractorStyleRubberBand2D.OnLeftButtonDown()
        self.draw = True
        self.startPoint[:2] = self.GetInteractor().GetEventPosition()
        self.startPoint[2] = 0
        self.curPoint[:2] = self.startPoint[:2]
        self.curPoint[2] = 0
        self.lastPoint[:2] = self.startPoint[:2]
        self.lastPoint[2] = 0

    def OnLeftButtonUp(self,obj,event):
        self.draw = False

    def drawLine(self):


        self.viewer.GetRenderer().SetDisplayPoint(self.lastPoint)
        self.viewer.GetRenderer().DisplayToView()
        self.viewer.GetRenderer().ViewToWorld()

        start = self.viewer.GetRenderer().GetWorldPoint()

        self.viewer.GetRenderer().SetDisplayPoint(self.curPoint)
        self.viewer.GetRenderer().DisplayToView()
        self.viewer.GetRenderer().ViewToWorld()

        end = self.viewer.GetRenderer().GetWorldPoint()

        point1 = [0, 0, 0.1]
        point2 = [0, 0, 0.1]

        point1[0] = start[0] if start[0] > end[0] else end[0]
        point1[1] = start[1] if start[1] <= end[1] else end[1]

        point2[0] = start[0] if start[0] > end[0] else end[0]
        point2[1] = start[1] if start[1] > end[1] else end[1]

        print('a-----a')
        print(point1)
        print(point2)
        print('b-----b')

        self.SetLine(point1, point2)

 

    def SetRender(self,render):
        self.viewer = render

    def SetLine(self,point1,point2):
        lineSource = vtkLineSource()

        lineSource.SetPoint1(point1)
        lineSource.SetPoint2(point2)
        lineSource.Update()

        mapper = vtkPolyDataMapper()
        mapper.SetInputConnection(lineSource.GetOutputPort())
        actor = vtkActor()
        actor.SetMapper(mapper)
        actor.GetProperty().SetLineWidth(10)
        actor.GetProperty().SetColor(1.0,0.0,0.0)
        self.viewer.GetRenderer().AddActor(actor)
        self.viewer.Render()


if __name__ == '__main__':
    colors = vtkNamedColors()

    render = vtkRenderer()
    iren = vtkRenderWindowInteractor()

    reader1 = vtkJPEGReader()
    reader1.SetFileName('1.jpg')
    # reader1.SetDataOrigin(0,0,0)
    reader1.Update()

    render.SetBackground(colors.GetColor3d('darkgreen'))

    viewer = vtkImageViewer2()
    viewer.SetInputConnection(reader1.GetOutputPort())

    viewer.SetRenderer(render)
    viewer.SetSize(640, 480)
    viewer.SetColorLevel(500)
    viewer.SetColorWindow(2000)
    viewer.SetSlice(40)
    viewer.SetSliceOrientationToXY()
    viewer.Render()
    viewer.GetRenderer().SetBackground(1, 1, 1)
    viewer.GetRenderWindow().SetWindowName("ImageViewer2D")
    rwi =vtkRenderWindowInteractor()
    viewer.SetupInteractor(rwi)

    g_style = MyRubberBand()
    g_style.SetInteractor(rwi)
    rwi.SetInteractorStyle(g_style)
    g_style.SetRender(viewer)

    rwi.Start()

实现了画笔功能,不过还有欠缺,横向画的时候有bug

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VTK_CURSOR_CUSTOM是VTK(Visualization Toolkit)中提供的一种自定义光标的方式。使用VTK_CURSOR_CUSTOM可以让用户在VTK应用程序中使用自己定义的光标图像,从而增强应用程序的个性化和用户体验。 要使用VTK_CURSOR_CUSTOM,需要按照以下步骤进行操作: 1. 创建自定义光标图像。可以使用任何绘图工具创建PNG、JPEG或BMP格式的图像。 2. 将光标图像加载到VTK中。可以使用vtkImageData或vtkTexture等VTK类来加载图像数据。 3. 创建vtkCursor2D对象并设置自定义光标。vtkCursor2D是VTK中的一个2D光标类,可以在视图中显示自定义光标。 4. 将vtkCursor2D对象添加到vtkRenderWindow中。vtkRenderWindow是VTK中的一个窗口类,可以显示3D场景和2D元素。 5. 最后,将vtkRenderWindow显示出来,用户就可以看到自定义光标了。 下面是一个使用VTK_CURSOR_CUSTOM创建自定义光标的示例代码: ```python import vtk # 创建自定义光标图像 cursor_image = vtk.vtkPNGReader() cursor_image.SetFileName("custom_cursor.png") # 创建vtkCursor2D对象并设置自定义光标 cursor = vtk.vtkCursor2D() cursor.SetImageData(cursor_image.GetOutput()) # 创建vtkRenderWindow对象并添加vtkCursor2D对象 ren = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) iren.SetInteractorStyle(vtk.vtkInteractorStyleImage()) iren.Initialize() cursor.SetRenderer(ren) cursor.SetDisplayPosition(100, 100) cursor.Update() # 显示vtkRenderWindow renWin.Render() iren.Start() ``` 这个示例代码会创建一个自定义的光标图像custom_cursor.png,并将它加载到vtkCursor2D对象中。然后将vtkCursor2D对象添加到vtkRenderWindow中,并显示出来。用户可以在vtkRenderWindow中看到自定义光标,并在应用程序中使用它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值