尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
LibreCAD 图层树视图(Layer Tree View)详解:基于命名约定的层次化图层管理
桌面应用图形学【免费下载链接】LibreCADLibreCAD is a cross-platform 2D CAD program. It can read DXF/DWG, and write DXF/DWG/PDF/SVG files. It supports point/line/circle/ellipse/parabola/hyperbola/spline primitives. The GUI is highly customizable, and has dozens of translations.项目地址https://gitcode.com/gh_mirrors/li/LibreCAD点击查看免费下载导读LibreCAD 是一款跨平台的开源 2D CAD 程序见 README.md其原生 DXF 格式并不支持图层的层级结构。本文围绕 ChangeLogs/LAYER_TREE_VIEW.md 介绍的Layer Tree View图层树视图控件讲解如何在纯命名约定的基础上为图层建立树状层级、借助图层类型前缀/后缀实现标注、信息、替代位置等辅助图层的自动归类以及如何利用正则过滤、拖放重组、分组批量操作来提升大型工程图的图层管理效率。读完本文你将掌握图层树的两种显示模式、五类预定义图层类型、完整工具栏动作与右键菜单操作以及该控件全部可配置项在源码中的实现与存储位置。一、问题背景DXF 图层为何需要树在大型工程图中图层数量可能非常多且同一图层常常被复用于单一零件/视图标注、零件的替代位置、注释与草图等附加信息也往往需要独立的图层。常见做法是用统一前缀为属于同一零件/视图的图层命名依靠命名中的公共逻辑前缀进行逻辑分组。但人工命名只能让分组的味道更接近依然存在局限前缀一旦拼写不一致分组就会失效。更根本的问题是DXF 格式本身不支持图层层级LibreCAD 原生图层结构同样没有层级概念见原文档 The Problem 一节。二、解决方案命名约定驱动 纯 UI 实现Layer Tree View 的核心理念可以概括为两点层级完全由命名约定推导假设图层名中存在某个统一的分隔子串默认是-该子串将图层名切分成若干层级片段第 1 个片段是顶层、最后一个片段是实际图层名中间片段自动成为虚拟图层组节点。纯 UI 实现不影响底层存储控件不改变RS_Layer内部结构与 DXF 存储格式原始平面图层列表RS_LayersList不受影响两个控件可以并行使用见原文档 Implementation notes 一节。从源码看这一设计得到了印证LC_LayerTreeItem中的m_name保存的是解析后的原始名称片段m_displayName是 UI 展示名m_fullName是完整路径而LC_LayerTreeItem对RS_Layer仅持有一个引用m_layer本身并不创建新的图层对象见 lc_layertreeitem.h。RS_Layer类中的m_layerType字段也明确注释为transient field, should be updated by LayerTreeWidget瞬态字段应由图层树控件更新见 rs_layer.h。源码中的层级构建流程在 lc_layertreemodel.cpp 的rebuildModel()中层级还原逻辑非常清晰// split by parts using defined separator of layer levels QStringList nameParts layerFullName.split(m_options-layerLevelSeparator, Qt::KeepEmptyParts); ... for (int indent 0; indent partsCount-1; indent){ const QString subName nameParts.at(indent); virtualRoot virtualRoot - getOrCreateVirtualChild(subName); ... } if (partsCount 0){ layerName nameParts.at(partsCount-1); }即先用layerLevelSeparator拆分全名除最后一段外的每一段通过getOrCreateVirtualChild()逐级挂到虚拟节点下最后一段作为实际图层的显示名。三、功能总览根据原文档 Features 一节控件提供的能力可分为以下几类各项功能均可在 lc_layertreewidget.cpp 中找到对应实现槽函数3.1 常规功能两种显示模式层级树状tree与平面列表flat list。LC_LayerTreeWidget中的m_flatListMode控制该模式toggleFlatView()槽函数负责切换见 lc_layertreewidget.h基于正则表达式的过滤可过滤图层或高亮匹配图层的图层拖放DragDrop重组通过拖动节点调整层级结构图层层级的分组操作对虚拟图层组节点的点击会递归作用于其全部后代图层。3.2 预定义的图层类型原文档定义了五类图层源码中由LC_LayerTreeItem::LayerType枚举实现见 lc_layertreeitem.h类型英文枚举值含义默认命名后缀普通图层NORMAL常规图层存放实体无标注图层DIMENSIONAL为对应普通图层存放尺寸标注信息图层INFORMATIONAL存放注释与草图_meta替代位置图层ALTERNATE_POSITION同一零件在不同位置的表达_pos虚拟图层VIRTUAL其他类型图层的容器类似文件夹由分隔符切分出的中间片段注意RS_Layer::LayerType枚举同样包含这五类见 rs_layer.hLC_LayerTreeItem与RS_Layer共用同一套类型体系类型标记会在rebuildModel()中通过layer-setLayerType(type)写回图层对象。类型识别完全依赖名称是否以指定后缀结尾这在rebuildModel()中有明确实现if (layerName.endsWith(m_options-alternatePositionLayerNameSuffix)){ type RS_Layer::LayerType::ALTERNATE_POSITION; ... } else if (layerName.endsWith(m_options-informationalLayerNameSuffix)){ type RS_Layer::LayerType::INFORMATIONAL; ... } else if (layerName.endsWith(m_options-dimensionalLayerNameSuffix)){ type RS_Layer::LayerType::DIMENSIONAL; ... }这里有个重要细节同名辅助图层会被自动挂到其主图层primary layer之下。例如Doors会被识别为Doors的标注子图层若Doors尚不存在则它会以Doors为主节点挂载findPrimaryLayerChild查找同父节点下已存在的同名主图层见 lc_layertreemodel.cpp。因此主图层必须排在辅助图层之前——源码注释明确指出依赖incoming list 已正确排序即主图层因排序在先已被插入树中。3.3 工具栏动作initButtonsBar()见 lc_layertreewidget.cpp构建了完整按钮条与文档列举一一对应显示所有图层Show all Layers隐藏除当前图层外的所有图层Hide all Layers except current显示/隐藏次级图层Show/Hide Secondary Layers按钮可勾选默认可见仅显示活动图层Show Active Layer Only全部展开Expand All树模式全部折叠Collapse All树模式折叠次级图层Collapse Secondary树模式全部锁定 / 全部解锁Lock/Unlock All Layers添加图层Add a layer添加标注图层Add Dimensions Layer移除图层Remove layer编辑/重命名图层Modify layer attributes / rename平面列表模式切换Flat List Mode此外updateToolBarButtons()会根据当前状态如是否树模式动态启用/禁用部分按钮。3.4 过滤框Filtering Box过滤框由过滤输入框QLineEdit、Highlight Mode勾选框与设置按钮组成见initFilterAndSettingsSection()lc_layertreewidget.cpp高亮模式Highlight Mode默认勾选。匹配正则的图层项在列表中高亮显示过滤模式取消勾选后仅显示匹配正则的图层项其余全部隐藏。两种模式由m_layerTreeModel-setFilteringRegexp(mask, highlightMode)驱动见 lc_layertreemodel.h模型内部以QRegularExpression m_filteringRegexp保存表达式并在rebuildModel()中对每个图层名执行hasMatch()匹配。3.5 图层树视图Layers Tree View展示基于命名约定的逻辑结构显示图层类型图标普通、虚拟、标注、信息、替代位置各有独立图标见 lc_layertreemodel.h提供图层标志列冻结可见性、锁定、打印、构造模型列定义见 lc_layertreemodel.h标志列支持 GROUP 操作点击虚拟图层组某一列的标志会递归应用到其后代图层。其实现位于slotTreeClicked()lc_layertreewidget.cpp虚拟图层通过layerItem-collectLayers(...)收集后代并统一调用manageLayersVisibilityFlag/manageLayersLockFlag/manageLayersPrintFlag/manageLayersConstructionFlag拖放重组层级LC_LayerTreeView重写dragEnterEvent/dropEvent模型提供performReStructure()见 lc_layertreeview.h双击虚拟图层展开其后代子项双击实际图层弹出图层编辑对话框项目感知的右键上下文菜单见下文可自定义外观颜色、显示项悬停显示完整图层名作为工具提示showToolTips选项控制可按层级深度对图层名进行可选缩进showIndentedName选项控制。3.6 图层操作Operations With Layers原文档列出的全部操作在源码中均有对应实现操作说明主要源码位置图层创建支持按图层类型使用默认画笔invokeLayerAddDialog/getDefaultPen()图层编辑名称、画笔、类型、构造标志等LC_LayerDialogExlc_layerdialog_ex.h层级感知重命名主图层重命名时可按选项联动重命名后代次级图层renamePrimaryLayer()lc_layertreemodel.cpp单个图层删除删除指定图层doRemoveLayers层级感知删除删除图层及其子图层或仅子图层doRemoveLayersFromSource(source, removeChildrenOnly)lc_layertreewidget.cpp添加指定类型的子图层为普通图层添加标注/信息/替代位置子层addDimensionalLayerForSelectedItem等改变图层类型普通 ↔ 标注/信息/替代位置互转convertLayerTypeToXxx冻结除选中图层外的所有图层Freeze OthershideOtherThanSelectedLayers复制图层层级感知复制层级结构并拷贝属性不复制实体doCreateLayersCopy(..., false)复制图层层级感知复制结构属性并同时复制源图层上的实体doCreateLayersCopy(..., true)移除空图层删除不含实体的图层removeEmptyLayers其中复制与复制含内容的区别值得展开doCreateLayersCopy()先通过m_layerTreeModel-createLayersCopy()生成结构副本再在LC_DocumentModificationBatch事务内逐个copyLayerAttributes()复制属性若duplicateEntities为真则遍历文档实体将源图层上的实体clone()后设置到副本图层duplicateLayerEntities()见 lc_layertreewidget.cpp。属性复制覆盖构造/转换/打印标志、画笔的颜色/宽度/线型/透明度/屏幕宽度/虚线偏移等并同步冻结状态。3.7 实体操作Operations With Entities选择图层实体层级感知选中图层含子层上的实体移动当前选中实体到图层moveSelectionToLayer复制当前选中实体到图层duplicateSelectionToLayer。两者最终都进入doMoveSelectionToLayer(layerItem, duplicate, resolvePens)lc_layertreewidget.cpp通过undoableModify事务克隆实体并设置目标图层移动模式额外从文档移除原实体resolvePenstrue时还会把By Layer/By Block的画笔解析为具体值保证实体迁移到目标图层后外观不变。3.8 右键上下文菜单onCustomContextMenu()lc_layertreewidget.cpp根据点击对象动态生成菜单虚拟图层添加子图层、重命名、移除子树、复制结构子树、复制内容子树、选择实体子树实际普通图层编辑图层属性、移除图层、添加标注/信息/替代位置子图层仅在该类型子层尚不存在时出现、移除子图层、类型转换无子层时、选择图层实体、创建图层副本、复制含内容图层、移动/复制当前选中实体到该图层空白区域添加图层全局动作对所有场景冻结其他图层、解冻所有图层、隐藏除当前外图层、锁定/解锁所有图层、启用/禁用所有图层打印、导出单个图层/图层子树/可见图层、查找并移除空图层。四、命名约定与配置项Customization Options这是控件最核心的可配置部分。所有选项由LC_LayerTreeModelOptions结构体承载见 lc_layertreemodel_options.h并通过load()/save()持久化到 LibreCAD 设置文件的Widget.LayerTree组见 lc_layertreemodel_options.cpp。4.1 命名约定Naming Convention配置项源码成员持久化键名默认值作用layerLevelSeparatornamingLayerSeparator-图层层级的分隔子串用于切分图层名各级informationalLayerNameSuffixnamingInfoSuffix_meta标识信息图层注释/草图的后缀dimensionalLayerNameSuffixnamingDimSuffix标识标注图层的后缀alternatePositionLayerNameSuffixnamingAltSuffix_pos标识替代位置图层的后缀copiedNamePathPrefixnamingCopyPrefix(Copy自动生成副本名前缀防止名称冲突copiedNamePathSuffixnamingCopySuffix)自动生成副本名后缀与序号组合举个直观例子图层名Walls-Outer-North会被解析为层级Walls→Outer→NorthWalls-Inner_meta则成为Walls-Inner的信息子图层Walls-Outer-South_pos是Walls-Outer-South的替代位置子图层。这一推导逻辑与 tests/lc_layertreemodel_tests.cpp 中的测试数据完全一致测试用Doors、Doors、Walls-Inner、Walls-Inner_meta、Walls-Outer-North、Walls-Outer-South_pos构建了三层深度组Walls与Walls-Outer以及Doors、Walls-Inner下的次级图层。4.2 显示选项Display Settings配置项持久化键名默认值作用showIndentedNameshowIndentedNametrue图层名按层级缩进identSizeindentSize4缩进宽度像素级间距showToolTipsshowToolTipstrue悬停时显示完整图层名提示renameSecondaryLayersOnPrimaryRenamerenameSecondaryOnPrimarytrue主图层重命名时联动重命名次级图层hideLayerTypeIconshideLayerTypeIconsfalse是否隐藏图层类型图标dragDropEnableddragDropEnabledtrue是否允许拖放重组showGridshowGridtrue树视图中是否显示网格线4.3 颜色Colors配置项持久化键名默认值浅色作用matchedItemColor跟随loadDefaultsblue正则匹配项的高亮颜色virtualLayerBgColorvirtualLayerBgColorrgb(245,245,245)虚拟图层背景色selectedItemBgColorselectedItemBgColorrgb(245,245,245)选中项背景色activeLayerBgColoractiveLayerBgColorwhite活动图层背景色注意loadDefaults(bool isDark)会根据当前配色方案是否为深色自动切换默认值——深色方案下虚拟/选中/活动图层的背景取自系统QPaletteAlternateBase/Highlight/Mid见 lc_layertreemodel_options.cpp。4.4 每种图层类型的默认画笔Default Pens配置项持久化键名默认值说明defaultPenNormalNormalLayer黑色、Width00、实线普通图层创建对话框中的默认画笔defaultPenDimensionalDimensionalLayer蓝色、Width02、实线标注图层defaultPenInformationalInfoLayer品红、Width02、实线信息图层defaultPenAlternatePositionAltPosLayer青色、Width00、实线替代位置图层getDefaultPen(layerType)按类型返回对应画笔图层创建对话框会将该画笔预置为初始值见 lc_layertreemodel_options.cpp。画笔通过RS_Settings::writePen/readPen持久化可在图层树设置对话框中修改。4.5 设置对话框上述绝大多数配置均可通过过滤框右侧的设置按钮invokeSettingsDialog打开设置对话框进行可视化调整其 UI 定义位于 lc_layertreeoptionsdialog.ui。保存时会调用LC_LayerTreeModelOptions::save()写入上述持久化键。五、控件的注册与使用方式图层树控件以停靠窗口QDockWidget形式集成在主程序中。LC_WidgetFactory::createLayerTreeWidget()见 lc_widgetfactory.cpp创建名为Layers Treelayer_tree_dockwidget的停靠窗口并实例化LC_LayerTreeWidgetQDockWidget* dock createDockWidget(tr(Layers Tree), layer_tree_dockwidget, tr(Layers Tree)); const auto widget new LC_LayerTreeWidget(actionHandler, dock, Layer Tree); dock-setWidget(widget);因此使用方式非常直接在 LibreCAD 主界面的 View/窗口菜单中找到Layers Tree停靠面板打开即可它可与传统的Layers列表面板QG_LayerWidget见同文件 lc_widgetfactory.cpp并行使用二者数据源一致。LC_LayerTreeWidget实现了RS_LayerListListener接口监听图层列表的增删改、激活与冻结/锁定/打印/构造标志变化见 lc_layertreewidget.h保证树视图与文档状态实时同步。六、实现说明Implementation Notes与架构评价原文档对实现思路给出了坦诚的说明纯 UI 实现不触及图层的内部结构或底层存储格式原始平面图层列表不受影响两个控件可并行最小化重构尽量少改动既有代码避免引入回归零新增依赖仅使用纯 C/Qt 代码实现隔离性实现高度自包含但也因此在架构层面略显游离文档指出未来可能重构的候选对象包括动作类actions、实体操作代码、以及原始图层列表RS_LayersList。从源码观察可以补充两点佐证RS_Layer新增的m_layerType是瞬态字段仅由 LayerTreeWidget 更新不会写入 DXF这正是不影响底层存储格式的直接体现见 rs_layer.h图层树模型的内存管理已纳入测试覆盖tests/lc_layertreemodel_tests.cpp通过堆探针验证模型与控件销毁后不留内存泄漏并复现了文档描述的树构建行为6 个图层 2 个虚拟组 8 行与 100 次循环构建后堆不再增长的结论见 lc_layertreemodel_tests.cpp。七、本地化Localization控件中所有可见字符串均通过tr()包裹具备完整的本地化能力实际翻译值由各语言翻译文件.ts提供。例如过滤框提示Filter、按钮提示Show all layers、Add Dimensions Layer等均可在 librecad/ts 目录下的语言文件中找到对应条目。八、最佳实践小结结合原文档与源码实现使用图层树控件时建议遵循以下约定统一层级分隔符全图使用同一个分隔子串默认-组织层级如Chassis-Frame-Bracket主图层先创建由于次级图层会自动挂到同名主图层之下应确保主图层如Doors先于其辅助层如Doors存在按后缀自动分类尺寸标注统一使用后缀、注释统一使用_meta、替代位置统一使用_pos即可自动归入对应子图层并享受分组标志操作善用正则过滤高亮模式下用正则快速定位过滤模式下只保留目标图层适合超多图层的图纸充分利用分组操作对虚拟图层组执行冻结/锁定/打印切换、移除、复制等操作可一次性作用于整棵子树用 Copy 与 Duplicate 区分需求仅要结构拷贝用Create Layer Copy连实体一起复制用Duplicate Layer With Content命名与层级调整通过拖放重组层级、批量重命名次级图层renameSecondaryLayersOnPrimaryRename可随时修正命名约定无需手工逐层修改。结语Layer Tree View 以极低侵入的方式解决了 DXF 无图层层级这一历史约束全部依赖命名约定纯 UI 层实现不修改底层存储同时把图层管理从手工前缀分组升级为可折叠树 类型子层 正则过滤 分组批量操作的完整工作流。无论你是处理数百图层的复杂装配图还是希望统一管理尺寸与注释都可以直接在主界面打开 Layers Tree 面板投入使用。赞分享桌面应用图形学【免费下载链接】LibreCADLibreCAD is a cross-platform 2D CAD program. It can read DXF/DWG, and write DXF/DWG/PDF/SVG files. It supports point/line/circle/ellipse/parabola/hyperbola/spline primitives. The GUI is highly customizable, and has dozens of translations.项目地址https://gitcode.com/gh_mirrors/li/LibreCAD点击查看免费下载相关推荐LeetCode-Go 题解199. Binary Tree Right Side View —— 基于层序遍历的二叉树右视图LeetCode Go 题解199. Binary Tree Right Side View —— 基于层序遍历的二叉树右视图 导读 本文讲解 LeetCod示例工程LeetCode-Go 题解 0199二叉树右视图Binary Tree Right Side View层序遍历实现详解LeetCode Go 题解 0199二叉树右视图Binary Tree Right Side View层序遍历实现详解 本文以 LeetCode Go示例工程Angel 计算图中的层Layer体系详解输入层、线性层、Join 层与损失层Angel 计算图中的层Layer体系详解输入层、线性层、Join 层与损失层 本文以 Angel 的 计算图AngelGraph https://l人工智能机器学习分布式训练图计算后端上一篇ROS-LLM 开源项目教程下一篇DeskGap安全最佳实践保护你的桌面应用免受威胁创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

AscendC Reg 矢量计算比较与选择(Compare/Compares/Select/Squeeze)API 实战指南

AscendC Reg 矢量计算比较与选择(Compare/Compares/Select/Squeeze)API 实战指南

人工智能深度学习算子库CANNAscend 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址&…

📅 2026/10/15 1:52:43
Qiling 框架架构全解析:分层设计、执行流程、Hook 系统与混合内核扩展

Qiling 框架架构全解析:分层设计、执行流程、Hook 系统与混合内核扩展

逆向工程网络安全虚拟化物联网 【免费下载链接】qiling A True Instrumentable Binary Emulation Framework 项目地址: https://gitcode.com/gh_mirrors/qi/qiling 点击查看 免费下载 导读 本文围绕开源仓库根目录下的 ARCHITECTURE.md 展开,系统讲解 …

📅 2026/10/15 1:52:43
Swoft 开源贡献指南:从 fork 到 Pull Request 的完整流程与代码规范

Swoft 开源贡献指南:从 fork 到 Pull Request 的完整流程与代码规范

后端微服务 【免费下载链接】swoft 🚀 PHP Microservice Full Coroutine Framework 项目地址: https://gitcode.com/gh_mirrors/sw/swoft 点击查看 免费下载 本指南以仓库根目录的 CONTRIBUTING.md 为骨架,系统讲解 Swoft 项目的开源协作方式…

📅 2026/10/15 1:52:43
MORE NEWS

更多资讯

📰

广义Hough变换的自适应阈值区间:解决投票累积的调参难题

简介:《基于自适应阈值区间的广义Hough变换图形识别算法》是一篇面向图像处理与模式识别研究人员的学术论文,由宋晓宇等人撰写。文章针对传统霍夫变换计算量大、阈值设定困难及易产生误检等问题,提出基于自适应阈值区间的改进算法&#xff0c…

📰

ChatGPT指令集实战:从PDF拆解到角色扮演稳定输出

简介:这份PDF文档聚焦ChatGPT提示词(Prompt)的系统讲解,面向K12教育场景以及人工智能、深度学习、自然语言处理爱好者,帮助读者理解并运用指令设计来获取高质量AI回复。文档从Prompt是什么切入,介绍其在智能…

📰

基于MP2642GR-Z与MK24FN256VDC12的2S电池主动均衡BMS设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

DeepSeek职场落地实战:结构化提示语与轻量部署指南

简介:本资源是一份聚焦DeepSeek大模型职场落地实践的深度技术解析PDF,面向具备一定编程与AI基础的研发人员、产品经理、设计师及关注人机协同的职场技术从业者,旨在解决LLM提示工程应用浅、模型选型难、智能体开发缺路径等现实问题。内容系统…

📰

海康机器人算法SDK实战:从跑通Demo到工业级部署

简介:本资源是面向工业视觉开发工程师与自动化系统集成人员的海康机器人VisionMaster算法SDK配套Demo详解文档,聚焦图像处理、算法调用与二次开发实践,助力快速掌握工业相机场景下的缺陷检测、定位识别等核心能力。压缩包为1个1.85MB的PDF文件…

📰

覆盖索引与超长分页优化

什么是覆盖索引覆盖索引是指:查询用到的列(包括 SELECT 返回的列、WHERE / ORDER BY / GROUP BY 用到的列),全部都能在同一个索引中找到,从而不用回表。用 id(主键)查询时,直接走聚簇…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬