You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现vtkAxisActor2D双侧刻度显示及动态设置刻度间距?

PyVista标尺双侧刻度+动态间距实现

原代码问题

下面这段代码用于在PyVista 3D场景中通过vtkAxisActor2D绘制标尺,但目前仅支持单侧刻度显示,且刻度间距无法灵活调整,需要优化为双侧显示刻度并支持自定义刻度间距。

原代码:

def create_ruler_in(x1, y1, x2, y2,title="",tick_dis=10):
            
            ruler = pv.plotting._vtk.vtkAxisActor2D()
            ruler.GetPositionCoordinate().SetCoordinateSystemToDisplay()
            ruler.GetPosition2Coordinate().SetCoordinateSystemToDisplay()
            ruler.GetPositionCoordinate().SetReferenceCoordinate(None)
            ruler.GetPositionCoordinate().SetValue(x1, y1)
            ruler.GetPosition2Coordinate().SetValue(x2, y2)
            
            distance = np.linalg.norm(np.asarray([x1, y1]) - np.asarray([x2, y2]))
            ruler.SetRange(0, distance)
            
            if title != "":
                ruler.SetTitle(title)
                label_color = pv.plotting.Color('red')
                ruler.SetFontFactor(0.6)
                ruler.GetTitleTextProperty().SetColor(label_color.float_rgb)
                ruler.GetTitleTextProperty().SetFontSize(12)
                ruler.SetTitlePosition(0.5)
                ruler.UseFontSizeFromPropertyOn()
               
                
            ruler.GetProperty().SetColor(*tick_color.int_rgb)    

            ruler.SetLabelVisibility(False)
            ruler.SetTickVisibility(True)
            
            plotter.add_actor(ruler, reset_camera=False, pickable=False)

修改后的实现代码

利用vtkAxisActor2D的次要刻度(Tick2)属性实现双侧对称显示,同时根据输入的刻度间距动态计算刻度数量:

import numpy as np
import pyvista as pv

def create_ruler_in(x1, y1, x2, y2, title="", tick_dis=10):
    # 初始化标尺实例
    ruler = pv.plotting._vtk.vtkAxisActor2D()
    # 设置坐标系统为显示坐标系
    ruler.GetPositionCoordinate().SetCoordinateSystemToDisplay()
    ruler.GetPosition2Coordinate().SetCoordinateSystemToDisplay()
    ruler.GetPositionCoordinate().SetReferenceCoordinate(None)
    ruler.GetPositionCoordinate().SetValue(x1, y1)
    ruler.GetPosition2Coordinate().SetValue(x2, y2)
    
    # 计算标尺总长度
    distance = np.linalg.norm(np.asarray([x1, y1]) - np.asarray([x2, y2]))
    ruler.SetRange(0, distance)
    
    # 处理动态刻度间距与双侧刻度
    if distance > 0:
        # 根据自定义间距计算刻度数量
        num_ticks = int(distance // tick_dis) + 1
        ruler.SetNumberOfTicks(num_ticks)
        
        # 启用主、次刻度,次刻度用于标尺另一侧的对称显示
        ruler.TickVisibilityOn()
        ruler.Tick2VisibilityOn()
        # 设置主、次刻度长度一致,保证双侧对称
        ruler.SetTickLength(5)
        ruler.SetTick2Length(5)
        
        # 统一刻度颜色,保证视觉一致性
        tick_color = pv.plotting.Color('black')
        ruler.GetProperty().SetColor(*tick_color.int_rgb)
        ruler.GetProperty().SetTick2Color(*tick_color.int_rgb)
    
    # 标题配置保持原逻辑
    if title != "":
        ruler.SetTitle(title)
        label_color = pv.plotting.Color('red')
        ruler.SetFontFactor(0.6)
        ruler.GetTitleTextProperty().SetColor(label_color.float_rgb)
        ruler.GetTitleTextProperty().SetFontSize(12)
        ruler.SetTitlePosition(0.5)
        ruler.UseFontSizeFromPropertyOn()
    
    ruler.SetLabelVisibility(False)
    plotter.add_actor(ruler, reset_camera=False, pickable=False)

核心改动说明

  • 双侧刻度实现:开启Tick2Visibility,将次要刻度(Tick2)的长度设置为主刻度一致,利用vtk自带的双刻度属性实现标尺两侧对称显示刻度。
  • 动态间距控制:通过标尺总长度除以自定义间距tick_dis计算所需刻度数量,再用SetNumberOfTicks设置,确保刻度间距符合输入值。
  • 视觉统一:同步设置主、次刻度的颜色,避免双侧刻度出现色差。

内容的提问来源于stack exchange,提问作者hs hs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:52:28