FreeCAD中事务机制实现原理分析

1.基本实现思路

实现一个文件的撤销重做最简单的思想就是,在每个撤销重做节点处保存一份文件的内容,撤销重做时,分别替换对应节点处的文件内容即可。这种做法开销太大,每个节点处都需要保存一份完整的文档内容,每次撤销重做时都需要替换全部的文档内容。

如果每个撤销重做节点处只保存此节点相对于上一节点改变的内容,每次撤销重做时只修改两个节点间差异的内容,可以有效的降低撤销重做的开销。FreeCAD的撤销重做机制就是基于这种思想实现的。

节点和节点之间的修改可以总结为三种情况:增加、删除、改变。撤销重做机制的主要内容就是记录这三种情况下的修改,并复原这三种情况的修改。

2.FreeCAD撤销重做对象

FreeCAD撤销重做机制的对象是Document对象,也就是说,Document对象的修改可以被撤销重做,其他的不可以撤销重做。

3.FreeCAD撤销重做相关类

App::Document类中包含了一系列Transaction类的容器,可以看出,Transaction类其实是App::Document撤销重做节点的表示类。

分析Transaction类的成员:


他的成员变量只有三个,一个是表示其名称的Name,一个是表示其标识符的transID,一个是表示修改信息的_Objects。_Objects对象是一个多索引的容器,里面存储了一系列的TransactionalObject和TransactionObject的键值对。TransactionalObject表示的是Document中被修改的对象单元,App层Document的对象单元是以DocumentObject为基类的,Gui层的Document的对象单元是以ViewProviderDocumentObject为基类的。TransactionObject表示对象单元被修改的内容,当文档的对象单元被修改时,将修改前的内容记录在TransactionObject中。对应于Document的对象单元,TransactionObject也被分为两类,TransactionDocumentObject和TransactionViewProvider,分别保存App层和Gui层的对象单元的修改。_Objects对象则表示一系列对文档单元对象的修改。

Transaction类的有几个比较重要的方法:

apply方法时Transaction类执行撤销重做的借口,其流程比较简单,把所有的单元对象的修改依次执行撤销重做(这里之所以要将所有的修改都做一遍Del、New、Change是因为存在耦合的情况,New和Change可能存储在同一个修改记录中)。

以上这几个方法主要是添加单元对象的修改到该类的_Objects对象中。

再来分析TransactionObject类,其成员变量如下:

Status表征此次修改的类型:新建、删除或者修改;_PropChangeMap表示被修改的属性的容器,其key为属性指针,PropData为修改前属性的内容(这里还要说明一下,Document的单元对象其实都是一堆属性的容器,从其基类PropertyContainer可以看出,因此对文档的修改其实就是对其中的Property的修改,所以在此处存在一个容器保存所有被修改的属性);_NameInDocument表示文档中该对象单元的名字(注意这个单元对象在文档中名字与其Label属性不同,Label属性表示其对用户的名字,而这个名字表示这个对象在文档中存储的标识符)。

分析其成员函数:

这三个方法是执行撤销重做的接口,分析其函数内容:

Transaction中的applyDel和applyNew并没有实现任何内容,这是由于,这一层的TransactionObject并不知道到底是该对App层的Document操作还是Gui层的Document操作。

applyChn的主要功能则是将_PropChangeMap中的所有属性依次恢复到原来的状态。

再来分析TransactionDocumentObject类,如下所示,该类无其他成员变量,仅仅是重载了applyNew和applyDel方法。

分析其重载方法的实现:

在这两个方法中,分别将相应的DocumentObject对象移除和添加到App::Document中。

再来分析TransactionViewProvider类,

该类也仅仅是重载了applyNew和applyDel方法,分析其重载方法的实现

其applyNew方法将对应的ViewProviderDocumentObject添加到Gui::Document中,但applyDel方法中并未进行相应的删除工作,这是因为ViewProviderDocumentObject的删除是被DocumentObject触发实现的,并未提交到撤销重做系统中。

4.FreeCAD撤销重做的基本流程

创建撤销节点流程:

撤销执行流程:

重做执行流程:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/357787.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop3:MapReduce中的Partition原理及自定义Partition

一、默认Partition分区配置 以WC案例来进行验证。 1、设置setNumReduceTasks 修改的代码 这行代码,确定了reduceTask的数量,也确定了分区逻辑 在mapper文件中,打上断点 计算分区的代码 这里会对每一个kv进行计算,然后&#…

【JavaEE】Spring Web MVC详解

一.基本概念. 1.什么是Spring Web MVC? 官方链接: https://docs.spring.io/spring-framework/reference/web/webmvc.html Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning…

浅析MySQL-基础篇01

目录 执行一条select语句,发生了什么? MYSQL执行流程是怎么样的? 第一步:连接器 第二步:查询缓存 第三步:解析SQL 解析器 第四步:执行SQL 预处理器 优化器 执行器 执行一条select语句…

hive on spark 记录

环境&#xff1a; hadoop 2.7.2 spark-without-hadoop 2.4.6 hive 2.3.4 hive-site.xml <property><name>hive.execution.engine</name><value>spark</value> </property> <property><name>spark.yarn.jars</name>&l…

【git1】指令,commit,免密

文章目录 1.常用指令&#xff1a;git branch查看本地分支&#xff0c; -r查看远程分支&#xff0c; -a查看本地和远程&#xff0c;-v查看各分支最后一次提交, -D删除分支2.commit规范&#xff1a;git commit进入vi界面&#xff08;进入前要git config core.editor vim设一下vi模…

不用写一行代码,deepseek结合腾讯云语音识别来批量转录Mp3音频

首先&#xff0c;打开window系统中的cmd命令行工具&#xff0c;或者powershell&#xff0c;安装腾讯云tencentcloud的Python库 pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python 然后&#xff0c;开通腾讯云的对象存储COS服务&…

超级好用的JSON格式化可视化在线工具

JSON是开发非常常用的一种报文格式&#xff0c;最常见的需求就是将JSON进行格式化&#xff0c;最好是有图形化界面显示结构关系&#xff0c;以便进行数据分析。 理想的在线JSON工具&#xff0c;应该支持快速格式化、可压缩、快捷复制、可下载导出&#xff0c;对存在语法错误的地…

计算机组成原理 —— 存储系统(DRAM和SRAM,ROM)

计算机组成原理 —— 存储系统&#xff08;DRAM和SRAM&#xff09; DRAM和SRAMDRAM的刷新DRAM地址复用ROM&#xff08;Read-Only Memory&#xff08;只读存储器&#xff09;&#xff09; 我们今天来看DRAM和SRAM&#xff1a; DRAM和SRAM DRAM&#xff08;动态随机存取存储器&…

【ajax基础】回调函数地狱

一&#xff1a;什么是回调函数地狱 在一个回调函数中嵌套另一个回调函数&#xff08;甚至一直嵌套下去&#xff09;&#xff0c;形成回调函数地狱 回调函数地狱存在问题&#xff1a; 可读性差异常捕获严重耦合性严重 // 1. 获取默认第一个省份的名字axios({url: http://hmaj…

具有 Hudi、MinIO 和 HMS 的现代数据湖

Apache Hudi 已成为管理现代数据湖的领先开放表格式之一&#xff0c;直接在现代数据湖中提供核心仓库和数据库功能。这在很大程度上要归功于 Hudi 提供了表、事务、更新/删除、高级索引、流式摄取服务、数据聚类/压缩优化和并发控制等高级功能。 我们已经探讨了 MinIO 和 Hudi…

【Python】从0开始的Django基础

Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…

线程C++

#include <thread> #include <chrono> #include <cmath> #include <mutex> #include <iostream> using namespace std;mutex mtx; void threadCommunicat() {int ans 0;while (ans<3){mtx.lock();//上锁cout << "ans" <…

android 在线程中更新界面

在Android中&#xff0c;你不能直接从子线程中更新UI&#xff0c;因为这会导致应用崩溃。你需要使用Handler或runOnUiThread()来更新UI。 使用Handler 以下是如何使用Handler在子线程中更新UI的示例&#xff1a; 1. 创建Handler实例&#xff1a; import android.os.Bundle;…

docker搭建mongo副本集

1、mongo集群分类 MongoDB集群有4种类型&#xff0c;分别是主从复制、副本集、分片集群和混合集群。 MongoDB的主从复制是指在一个MongoDB集群中&#xff0c;一个节点&#xff08;主节点&#xff09;将数据写入并同步到其他节点&#xff08;从节点&#xff09;。主从复制提供…

数据可视化实验一:Panda数据处理及matplotlib绘图初步

目录​​​​​​​ 2024-6-17 一、请将所有含有发明家“吴峰”的发明专利的“申请日”打印出来。并将含有“吴峰”的所有发明专利条目保存到Excel中 1.1 代码实现 1.2 运行结果 二、读取文件创建城市、人口、性别比、城镇化率DataFrame对象&#xff0c;计算指标排名&…

【iOS】#include、#import、@class、@import

文章目录 #include#importclassimport总结 #include #include是c\c中的预处理器指令&#xff0c;用于包含头文件的内容 但是使用#include可能会出现重复包含文件的问题&#xff0c;因此需要使用&#xff08;#ifndef/#define/#endif&#xff09;。 #import //导入系统头文件…

学习C++第二天

1.缺省参数 缺省参数的概念&#xff1a; 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void show(int a 10) {cout << a << endl; }int main() {sho…

FPGA学习网站推荐

FPGA学习网站推荐 本文首发于公众号&#xff1a;FPGA开源工坊 引言 FPGA的学习主要分为以下两部分 语法领域内知识 做FPGA开发肯定要首先去学习相应的编程语言&#xff0c;FPGA开发目前在国内采用最多的就是使用Verilog做开发&#xff0c;其次还有一些遗留下来的项目会采用…

构建未来应用的核心,云原生技术栈解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、云原生技术栈 1、容器和容器编排 1.1 Docker 1.2 Kubernete…

如何配置node.js环境

文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址&#xff1a;node.js…