如何实现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
相关产品推荐
相关产品推荐

