尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之整体架构与源码组织

【LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之整体架构与源码组织 励志不掉头发的内向程序员个人主页✨️ 个人专栏: 《C语言》《Linux学习》偶尔悲伤偶尔被幸福所完善️博主简介:文章目录前言一、从用户视角看 LibreCAD1.1、菜单栏1.2、工具栏1.3、状态栏1.4、图层1.5、命令行二、从程序员视角看 LibreCAD三、LibreCAD 源码目录分析3.1、libraries3.2、librecad3.3、plugins3.4、tools四、LibreCAD 核心模块划分五、一个问题画一条线到底发生了什么总结前言上一章节我们简单的了解了什么是LibreCAD那本章节我们便来开始从源码的角度来看看LibreCAD一、从用户视角看 LibreCAD我们可以看到其实从用户的角度来看LibreCAD主要就是由这几个部分来划分的由菜单栏、工具栏、状态栏、图层、命令行以及最中心的绘画区构成每个模块具体的用法也很显而易见这里简单介绍一下。1.1、菜单栏LibreCAD 的菜单栏位于软件窗口顶部是用户访问各种 CAD 功能的主要入口。不同菜单按照功能进行了分类涵盖了文件管理、绘图、编辑、视图控制、尺寸标注以及对象修改等操作。最主要的操作有文件File负责图纸文件的基本管理包括新建、打开、保存、另存为、导入、导出和打印等操作。编辑Edit提供撤销、重做、剪切、复制、粘贴、删除等常用编辑功能。视图View用于控制绘图区域的显示方式例如缩放、平移、刷新以及网格显示等。工具Tools提供软件配置、选项设置以及一些辅助工具。绘图DrawLibreCAD 最核心的功能之一用于创建各种 CAD 图形例如直线、圆、圆弧、矩形、椭圆以及文字等。1.2、工具栏工具栏位于菜单栏下方\绘图区域左侧通过图标的形式提供常用功能的快捷入口。相比菜单栏工具栏能够减少操作层级让用户更加快速地执行绘图、修改、捕捉以及视图控制等操作。例如用户可以直接通过工具栏选择绘制直线、圆、矩形等图形。1.3、状态栏状态栏位于软件窗口底部用于显示当前绘图环境和操作状态信息。在进行绘图操作时可以查看当前鼠标的坐标、图层、线宽、线型以及捕捉状态等信息。它能够帮助用户实时了解当前绘图状态。1.4、图层图层用于对 CAD 图形进行分类和管理。用户可以根据不同的绘图内容创建多个图层并分别设置图层的颜色、线型、线宽以及可见性等属性。例如可以将建筑墙体、尺寸标注和文字分别放置在不同图层中从而方便管理和编辑图纸。1.5、命令行命令行位于绘图区域右下方是用户与 LibreCAD 进行交互的另一种方式。用户可以通过输入命令或相关参数来执行绘图、修改和视图操作同时软件也会通过命令行提示当前操作需要进行的下一步操作。例如在绘制直线时命令行可能会提示用户依次选择起点和终点。因此命令行不仅是功能入口也是 LibreCAD 交互式操作流程的重要组成部分。二、从程序员视角看 LibreCAD程序员的角度肯定是和用户的角度所看到的内容是不一样的用户对CAD的各种需求本质上是需要程序员去进行处理的而用户和程序员之间的桥梁本质上就是通过信号来传递的。用户通过点击不同的位置发出不同的信号而程序员则是对不同的信号进行处理返回用户所需的各种诉求。所以在程序员的视角来看 LIbreCAD 则是不同的信号对应着不同的函数去处理不同的需求。程序员在得到不同信号后处理完毕之后再返回给 LibreCAD 的不同模块最后返回到屏幕上供用户去查看。三、LibreCAD 源码目录分析看大型的代码不要一开始上来就去看各种 .cpp 的细节而是先来看看它的目录结构。这就是 LibreCAD 的主要目录结构我们来一个一个简单来聊聊。3.1、librarieslibraries 目录主要用于存放 LibreCAD 依赖的基础库、第三方库以及一些相对独立的功能模块。这些代码并不完全属于 LibreCAD 的界面功能而是为上层的绘图、几何计算、文件处理等功能提供基础支持。jwwlib 主要负责 JWW 格式文件的解析和读写。JWW 是日本 CAD 软件 Jw_cad 使用的图纸格式。libdxfrw 这个是三个里面非常重要的一个。它是 LibreCAD 相关的独立库主要负责DXF 文件读取DXF 文件写入部分 DWG 文件读取muparser 这个和前两个不一样它不是 CAD 文件格式库而是一个数学表达式解析库。这三个文件我们简单了解即可以后有机会再来详细聊聊我们只要知道这个目录里面的文件的功能是用来给我们下一个核心的目录里面的文件实现各种功能的基础设施即可。3.2、librecad这是 LibreCAD 的核心也是以后我们回去详细了解和讲解的文件夹这个文件夹就是来实现 LibreCAD 的各种功能的。我们可以看到核心的头文件都在 Headers 文件夹中而它的实现则是在 Sources 中。Forms 则是 qt 图像化界面文件.uiResources 文件夹里面则是图片资源。我们简单来看看 Headers 和 Sources 吧。不同版本的目录组织可能会有所变化但总体可以按照界面、交互、绘图数据、图形显示几个方向理解。其中尤其值得关注的是actions/这里与用户的具体操作行为密切相关。用户的各种绘画行为都会调用到这个文件夹中的文件比如去画一条直线就会调用到该文件夹的rs_actiondrawline文件这个文件中记录了我们用户在选到点之后在绘画区画一条直线的操作到底是怎么实现的。所以这个文件夹是 LibreaCAD 绘画的核心。这个文件夹中则是记录了我们 LibreCAD 对我们用户画出来的各种图案是怎么管理的核心我们用户在依靠上面的action 文件夹去画出一条直线后依靠这个文件夹去生成这个直线的实体就像类和类的实例化一样你在画线的时候这个时候只是有类但是还没有实例化出一个实体只有你按下鼠标确认画出这条直线的时候才会调用该文件夹去生成一个实体然后通过这个文件夹去管理起来同时这里面还有怎么在屏幕上显示、图层相关、撤销相关等文件。可以说这个就是 LibreCAD 中的功能的核心。main 函数则是我们 LibreCAD 的主执行流各种控件、主界面等都是在 main 函数中去定义的生成的而 ui 则是我们各种控件或者对话框的图像化界面.ui 文件在上面提到的 Forms 中。3.3、pluginsplugins 用于放置 LibreCAD 的插件相关代码。插件机制允许将部分功能以相对独立的模块形式组织起来从而扩展 LibreCAD 的能力。对于第一次阅读源码来说这部分可以暂时放到后面不需要一开始就研究。3.4、toolstools 目录主要存放 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 刚开始是怎么创建它的图形化界面的以及它的每个控件是怎么创建和管理的欢迎大家继续观看当然有什么说的不是很好的地方也请指出啦谢谢大家。坚持到这里已经很厉害啦辛苦啦ʕ • ᴥ • ʔづ♡ど
返回列表