实现类头文件
以下是对你提供的 ScaleBarController.h
头文件添加详细注释后的版本,帮助你更清晰地理解每个成员和方法的用途,尤其是在 VTK 中的作用:
#ifndef SCALEBARCONTROLLER_H
#define SCALEBARCONTROLLER_H
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkTextActor.h>
#include <vtkLineSource.h>
#include <vtkPolyDataMapper2D.h>
#include <vtkActor2D.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCallbackCommand.h>
// 管理并绘制屏幕固定像素长度的比例尺控制器
class ScaleBarController
{
public:
// 构造函数,初始化渲染器、窗口和交互器
ScaleBarController(vtkSmartPointer<vtkRenderer> renderer,
vtkSmartPointer<vtkRenderWindow> renderWindow,
vtkSmartPointer<vtkRenderWindowInteractor> interactor);
// 更新比例尺显示内容(长度、位置、标签等)
void UpdateScaleBar();
// 当比例尺需要重新添加回 renderer 时调用(如清空或重建渲染场景后)
void ReAddToRenderer();
private:
// 交互事件的静态回调函数,用于处理缩放限制、比例尺更新等逻辑
static void OnInteractionEvent(vtkObject *caller, unsigned long eid,
void *clientdata, void *calldata);
// 创建比例尺的 VTK 对象,包括线段和文字
void CreateScaleBarActors();
// 获取当前屏幕下 1 像素对应多少 world 单位(单位:world units / pixel)
double GetCurrentScaleFactor();
// 根据传入的真实比例长度,计算美观的跳变长度(如:0.5 → 1 → 5 → 10...)
double ComputeRoundedLength(double length);
// -------------------------
// VTK 渲染相关对象
// -------------------------
vtkSmartPointer<vtkRenderer> renderer_; // 场景渲染器
vtkSmartPointer<vtkRenderWindow> renderWindow_; // 渲染窗口
vtkSmartPointer<vtkRenderWindowInteractor> interactor_; // 用户交互器
// -------------------------
// 比例尺的绘制元素
// -------------------------
vtkSmartPointer<vtkLineSource> lineSource_; // 比例尺的线段
vtkSmartPointer<vtkPolyDataMapper2D> lineMapper_; // 2D 映射器
vtkSmartPointer<vtkActor2D> lineActor_; // 2D 绘制 actor
vtkSmartPointer<vtkTextActor> scaleText_; // 比例尺文字标签(显示数值)
vtkSmartPointer<vtkCallbackCommand> interactionCallback_; // 鼠标缩放事件监听回调
// -------------------------
// 状态控制参数
// -------------------------
const int pixelLength_ = 200; // 比例尺在屏幕上固定显示的像素长度(单位 px)
double lastValidParallelScale_ = 1.0; // 上一次合法 Parallel 投影的相机缩放值
double lastValidCameraDistance_ = 1.0; // 上一次合法 Perspective 投影的相机距离
};
#endif // SCALEBARCONTROLLER_H
实现类源文件
以下是你提供的 ScaleBarController.cpp
文件的完整代码分析版,我已逐行添加关键注释,帮助你清晰理解每段逻辑的作用,特别是与 VTK 比例尺渲染、缩放监听、状态回退控制 相关的部分:
#include "ScaleBarController.h"
#include <vtkTextProperty.h>
#include <vtkCoordinate.h>
#include <vtkCamera.h>
#include <sstream>
#include <iomanip>