👓️博主简介:
文章目录
- 前言
- 一、从用户视角看 LibreCAD
- 1.1、菜单栏
- 1.2、工具栏
- 1.3、状态栏
- 1.4、图层
- 1.5、命令行
- 二、从程序员视角看 LibreCAD
- 三、LibreCAD 源码目录分析
- 3.1、libraries
- 3.2、librecad
- 3.3、plugins
- 3.4、tools
- 四、LibreCAD 核心模块划分
- 五、一个问题:画一条线到底发生了什么?
- 总结
前言
上一章节我们简单的了解了什么是LibreCAD,那本章节我们便来开始从源码的角度来看看LibreCAD
一、从用户视角看 LibreCAD
我们可以看到,其实从用户的角度来看LibreCAD主要就是由这几个部分来划分的,由菜单栏、工具栏、状态栏、图层、命令行以及最中心的绘画区构成,每个模块具体的用法也很显而易见,这里简单介绍一下。
1.1、菜单栏
LibreCAD 的菜单栏位于软件窗口顶部,是用户访问各种 CAD 功能的主要入口。不同菜单按照功能进行了分类,涵盖了文件管理、绘图、编辑、视图控制、尺寸标注以及对象修改等操作。
最主要的操作有:
- 文件(File):负责图纸文件的基本管理,包括新建、打开、保存、另存为、导入、导出和打印等操作。
- 编辑(Edit):提供撤销、重做、剪切、复制、粘贴、删除等常用编辑功能。
- 视图(View):用于控制绘图区域的显示方式,例如缩放、平移、刷新以及网格显示等。
- 工具(Tools):提供软件配置、选项设置以及一些辅助工具。
- 绘图(Draw):LibreCAD 最核心的功能之一,用于创建各种 CAD 图形,例如直线、圆、圆弧、矩形、椭圆以及文字等。
1.2、工具栏
工具栏位于菜单栏下方\绘图区域左侧,通过图标的形式提供常用功能的快捷入口。相比菜单栏,工具栏能够减少操作层级,让用户更加快速地执行绘图、修改、捕捉以及视图控制等操作。例如,用户可以直接通过工具栏选择绘制直线、圆、矩形等图形。
1.3、状态栏
状态栏位于软件窗口底部,用于显示当前绘图环境和操作状态信息。在进行绘图操作时,可以查看当前鼠标的坐标、图层、线宽、线型以及捕捉状态等信息。它能够帮助用户实时了解当前绘图状态。
1.4、图层
图层用于对 CAD 图形进行分类和管理。用户可以根据不同的绘图内容创建多个图层,并分别设置图层的颜色、线型、线宽以及可见性等属性。例如,可以将建筑墙体、尺寸标注和文字分别放置在不同图层中,从而方便管理和编辑图纸。
1.5、命令行
命令行位于绘图区域右下方,是用户与 LibreCAD 进行交互的另一种方式。用户可以通过输入命令或相关参数来执行绘图、修改和视图操作,同时软件也会通过命令行提示当前操作需要进行的下一步操作。
例如在绘制直线时,命令行可能会提示用户依次选择起点和终点。因此,命令行不仅是功能入口,也是 LibreCAD 交互式操作流程的重要组成部分。
二、从程序员视角看 LibreCAD
程序员的角度肯定是和用户的角度所看到的内容是不一样的,用户对CAD的各种需求本质上是需要程序员去进行处理的,而用户和程序员之间的桥梁本质上就是通过信号来传递的。用户通过点击不同的位置,发出不同的信号,而程序员则是对不同的信号进行处理,返回用户所需的各种诉求。
所以在程序员的视角来看 LIbreCAD 则是不同的信号对应着不同的函数去处理不同的需求。
程序员在得到不同信号后处理完毕,之后再返回给 LibreCAD 的不同模块,最后返回到屏幕上供用户去查看。
三、LibreCAD 源码目录分析
看大型的代码,不要一开始上来就去看各种 .cpp 的细节,而是先来看看它的目录结构。
这就是 LibreCAD 的主要目录结构,我们来一个一个简单来聊聊。
3.1、libraries
libraries 目录主要用于存放 LibreCAD 依赖的基础库、第三方库以及一些相对独立的功能模块。这些代码并不完全属于 LibreCAD 的界面功能,而是为上层的绘图、几何计算、文件处理等功能提供基础支持。
- jwwlib: 主要负责 JWW 格式文件的解析和读写。JWW 是日本 CAD 软件 Jw_cad 使用的图纸格式。
- libdxfrw: 这个是三个里面非常重要的一个。它是 LibreCAD 相关的独立库,主要负责:
DXF 文件读取
DXF 文件写入
部分 DWG 文件读取 - muparser: 这个和前两个不一样,它不是 CAD 文件格式库,而是一个数学表达式解析库。
这三个文件我们简单了解即可,以后有机会再来详细聊聊,我们只要知道,这个目录里面的文件的功能是用来给我们下一个核心的目录里面的文件实现各种功能的基础设施即可。
3.2、librecad
这是 LibreCAD 的核心,也是以后我们回去详细了解和讲解的文件夹,这个文件夹就是来实现 LibreCAD 的各种功能的。
我们可以看到,核心的头文件都在 Headers 文件夹中,而它的实现则是在 Sources 中。Forms 则是 qt 图像化界面文件(.ui),Resources 文件夹里面则是图片资源。我们简单来看看 Headers 和 Sources 吧。
不同版本的目录组织可能会有所变化,但总体可以按照界面、交互、绘图数据、图形显示几个方向理解。
其中尤其值得关注的是:actions/
这里与用户的具体操作行为密切相关。
用户的各种绘画行为,都会调用到这个文件夹中的文件,比如去画一条直线,就会调用到该文件夹的rs_actiondrawline文件,这个文件中记录了我们用户在选到点之后,在绘画区画一条直线的操作到底是怎么实现的。所以这个文件夹是 LibreaCAD 绘画的核心。
这个文件夹中则是记录了我们 LibreCAD 对我们用户画出来的各种图案是怎么管理的核心,我们用户在依靠上面的action 文件夹去画出一条直线后,依靠这个文件夹去生成这个直线的实体,就像类和类的实例化一样,你在画线的时候,这个时候只是有类,但是还没有实例化出一个实体,只有你按下鼠标,确认画出这条直线的时候,才会调用该文件夹去生成一个实体,然后通过这个文件夹去管理起来,同时这里面还有怎么在屏幕上显示、图层相关、撤销相关等文件。可以说,这个就是 LibreCAD 中的功能的核心。
main 函数则是我们 LibreCAD 的主执行流,各种控件、主界面等都是在 main 函数中去定义的生成的,而 ui 则是我们各种控件或者对话框的图像化界面,.ui 文件在上面提到的 Forms 中。
3.3、plugins
plugins 用于放置 LibreCAD 的插件相关代码。插件机制允许将部分功能以相对独立的模块形式组织起来,从而扩展 LibreCAD 的能力。对于第一次阅读源码来说,这部分可以暂时放到后面,不需要一开始就研究。
3.4、tools
tools 目录主要存放 LibreCAD 开发过程中使用的辅助工具和脚本,用于项目的构建、代码生成、配置或其他开发维护工作。它通常不直接参与 LibreCAD 的核心绘图逻辑。tools 更偏向于 “怎么把项目开发、编译和维护起来”,而不是“LibreCAD 如何完成绘图”。我们简单了解了解即可。
以上便是我们 LibreCAD 的大致目录结构,我们主要回去给大家讲解 librecad 目录里面的内容,它的代码设计的十分优雅,我相信大家在学习的时候肯定也会感受到的。
四、LibreCAD 核心模块划分
从功能和源码职责来看,LibreCAD 可以大致划分为以下几个核心模块:
- GUI 界面模块: 菜单栏、工具栏、对话框、图层面板等界面管理
- Action 交互模块: 响应用户的鼠标、键盘和菜单操作,组织具体操作流程
- Entity 图形实体模块: 表示直线、圆、圆弧、文字、尺寸等 CAD 图形对象
- Document 文档模块: 管理当前 CAD 图纸、图层以及图形实体
- 绘图 / View 模块: 将 CAD 数据转换为屏幕上的图形并负责显示
- Snap 捕捉模块: 提供端点、中点、圆心、交点等精确捕捉功能
- Command 命令模块: 处理命令行输入以及命令解析
- 文件 I/O 模块: 负责 DXF、JWW 等 CAD 文件的读取和保存
- Block / Layer 模块: 管理图块和图层等 CAD 数据组织结构
下面就是简单的 LibreCAD 核心模块的执行图。
虽然看上去模块非常多,但是每个模块之间的解耦都是十分优雅的,我们在调用不同模块的时候完全就不会不用去关系别的地方是否会出现问题,这也是我觉得 LibreCAD 软件的源码写的十分优雅的原因,我们在学习的时候,在学习不同模块的时候,看到别的不了解的模块也完全不会影响我们的学习和理解,简单带过即可,等学习完后再反过来看,感受软件在执行过程中的各种调用,肯定会有wow,这个代码怎么写的这么好的感慨。
五、一个问题:画一条线到底发生了什么?
我们大家在了解完上面的内容,大致了解了 LibreCAD 的一些功能,可以先来推测推测画一条直线会发生什么?
首先,用户在选取我们画直线的工具,这个时候肯定会给计算机发送信号,就说用户要画直线啦,这个时候计算机就会调用画直线的功能,也就是我们上面讲的 actiondrawline,然后计算机非常快速的准备好,这个时候用户选了第一个点,也会给用户发送信号,用户选了一个点,这个点的坐标是什么什么,然后计算机就记录下来,在去准备第二个动作,用户这个时候选啦第二个点啦,告诉计算机,计算机看到有两个点啦,可以画直线啦,然后就生成一个直线对象,给它背后的数据结构管理起来,然后再调用什么撤销逻辑啦,图层逻辑啦,绘画逻辑啦等等,最终就会显示到屏幕上来,这个就是画直线,或者说画全部图案的流程。
我们之后就会来详细的讲解这里每个流程的步骤啦,以及每个模块之间是怎么解耦的啦。
总结
以上简单的了解了 LibreCAD 的架构以及它有什么功能,下一章节我们先从 main 函数来看看 LibreCAD 刚开始是怎么创建它的图形化界面的,以及它的每个控件是怎么创建和管理的,欢迎大家继续观看,当然有什么说的不是很好的地方也请指出啦,谢谢大家。
🎇坚持到这里已经很厉害啦,辛苦啦🎇 ʕ • ᴥ • ʔ づ♡ど