当前位置: 首页 > news >正文

【LibreCAD】LibreCAD 撤销功能相关类(LC_UndoableRelZero)

第一个文件:LC_UndoableRelZero.h (头文件)

文件说明

这是 LibreCAD 中实现可撤销相对零点操作的类声明头文件,用于管理图形视口中相对零点的移动操作。

代码结构分析

1. 类定义
#ifndefLC_UNDOABLERELZERO_H#defineLC_UNDOABLERELZERO_H
  • 标准的头文件保护宏,防止重复包含
2. 类声明
classLC_UndoableRelZero:publicRS_Undoable
  • 继承自RS_Undoable基类,表明这是一个可撤销操作
  • 用于封装相对零点的移动操作
3. 成员变量
private:LC_GraphicViewport*viewport=nullptr;RS_Vector m_From=RS_Vector(0,0,0);// 移动前的坐标RS_Vector m_To=RS_Vector(0,0,0);// 移动后的坐标
  • viewport: 指向图形视口的指针
  • m_From: 记录相对零点移动前的三维坐标 (x,y,z)
  • m_To: 记录相对零点移动后的三维坐标
4. 关键方法
voidundoStateChanged(boolundone)override;
  • 重写基类的虚函数
  • 当撤销/重做状态改变时被调用
  • undone参数表示操作是否被撤销

第二个文件:LC_UndoSecti​​on.cpp (源文件)

文件说明

这是 LibreCAD 中撤销操作区域管理类的实现文件,用于批量管理一组撤销操作。

代码结构分析

1. 构造函数
LC_UndoSection::LC_UndoSection(RS_Document*doc,LC_GraphicViewport*view,constboolhandleUndo/*= true*/):document(doc),viewport(view),valid(handleUndo&&nullptr!=doc&&nullptr!=view){if(valid){document->startUndoCycle();}}

功能:

  • 初始化撤销操作区域
  • 参数说明:
    • doc: 文档指针
    • view: 图形视口指针
    • handleUndo: 是否处理撤销操作(默认为 true)
  • 验证条件:文档和视口都不为空且handleUndo为 true
  • 如果有效,开始一个撤销周期
2. 析构函数
LC_UndoSection::~LC_UndoSection(){try{if(valid&&viewport!=nullptr){RS_Undoable*relativeZeroUndoable=viewport->getRelativeZeroUndoable();if(relativeZeroUndoable!=nullptr){document->addUndoable(relativeZeroUndoable);}document->endUndoCycle();}}catch(...){}}

功能:

  • 对象销毁时自动调用
  • 关键操作流程:
    1. 检查区域是否有效且视口存在
    2. 获取视口中的相对零点可撤销操作
    3. 如果有相关操作,添加到文档的撤销列表中
    4. 结束撤销周期
  • 使用 try-catch 捕获所有异常,确保资源清理
3. 添加撤销操作的方法
voidLC_UndoSection::addUndoable(RS_Undoable*undoable){if(valid){document->addUndoable(undoable);}}

功能:

  • 向当前撤销区域添加可撤销操作
  • 仅当区域有效时才执行添加
  • 参数undoable可以是任何继承自RS_Undoable的对象

两个类的关系和工作流程

协同工作模式

用户操作相对零点 ↓ LC_UndoableRelZero 记录移动信息 ↓ LC_UndoSection 开始撤销周期 ↓ 执行其他相关操作 ↓ LC_UndoSection 析构时: 1. 获取相对零点操作 2. 添加到文档撤销列表 3. 结束撤销周期

关键设计特点

  1. RAII 模式(资源获取即初始化)

    • LC_UndoSection在构造时开始撤销周期
    • 在析构时自动结束周期并清理资源
    • 异常安全设计
  2. 职责分离

    • LC_UndoableRelZero: 封装具体的操作数据
    • LC_UndoSection: 管理撤销操作的执行流程
  3. 灵活扩展

    • 通过addUndoable()可以添加各种类型的撤销操作
    • 基类设计支持多态

使用场景示例

当用户在 LibreCAD 中执行一个包含多个步骤的复杂操作时:

// 开始一个撤销区域LC_UndoSectionundoSection(document,viewport);// 执行操作1performOperation1();undoSection.addUndoable(operation1Undoable);// 执行操作2(包括相对零点移动)moveRelativeZero(from,to);// LC_UndoableRelZero 会自动记录// 执行操作3performOperation3();undoSection.addUndoable(operation3Undoable);// undoSection 析构时,所有操作被作为一个整体添加到撤销列表

这样设计的好处是,用户可以一次性撤销整个操作序列,而不是逐个撤销每个小步骤。

http://www.cnnetsun.cn/news/3108.html

相关文章:

  • 智谱开源 GLM-ASR 系列语音识别模型;Pebble 发布智能指环 Index 01:本地语音转录与指令执行丨日报
  • Vibe Coding 你应该更激进:用最 SOTA 的模型,赚最高的时薪|编码人声
  • 2025年的大模型使用——各有所长,各有不同
  • 智能汽车解决方案构成,形成从环境感知到车辆控制的完整生态
  • NPU编程范式的革命 - 基于MlaProlog案例的“软件定义计算流“实践
  • 超越MlaProlog:构建自定义CV融合算子的通用设计模式库
  • 2026年远程控制软件选择指南!内含十款主流应用深度横评
  • Mac桌面远比你以为的更强大,ToDesk加持轻松控安卓!
  • 它为工厂省下的每一颗螺丝钉里,藏着多大未来?
  • 【Python】水位测量与水体识别技术实现,基于Cascade R-CNN模型详解_1
  • 基于YOLO11-C3k2-MambaOut-FDConv的汗宫建筑检测与识别技术
  • 【焊接检测技术】基于YOLO11-SEG-REPVGGOREPA模型的焊接缺陷检测与分类系统详解
  • 【珍藏】RAG实战指南:解决大模型应用痛点,附学习路径
  • 【深度收藏】转岗AI产品经理全攻略:市场需求分析与能力提升路径
  • 从零开始学大模型:收藏这份完整学习路径,助你成为AI应用开发工程师
  • 收藏必备!AI产品经理转型指南:10年总监亲授核心能力清单,小白也能快速上手
  • GLM-4.6V:从视觉理解到行动执行
  • 企业不良记录清除方法
  • 收藏!AI产品经理必备的大模型基础知识与术语解析
  • 【值得收藏】大模型Agent实战指南:企业最需要的4大AI能力+15个工业级项目案例
  • 收藏!成为AI应用开发工程师的完整学习路线,助你快速入门大模型开发
  • 【收藏】大模型应用开发实战:非AI背景程序员的入门宝典
  • 本周日上海见|AI 落地真问题,现场对线等你来!
  • AI视频工具普及,为何内容团队效率不升反降?
  • Harmony开发之服务卡片开发——解锁原子化服务
  • Harmony开发之公共事件与通知——应用间的沟通桥梁
  • 爱创猫 AI 省钱技巧:购物返利 + 券,网购不花冤枉钱
  • 《2025 facebook广告最新算法完整指南(含企业实操 SOP)》-云百邦出品
  • leetcode算法-最大乘积子数组
  • DFM必备技能:IPC-2221C新版PCB设计标准详解