CAD Sketcher 用户界面详解:Sketcher 侧边栏、Gizmo 标注与偏好设置的实现剖析

发布时间:2026/10/13 13:21:07
CAD Sketcher 用户界面详解:Sketcher 侧边栏、Gizmo 标注与偏好设置的实现剖析 桌面应用3D建模【免费下载链接】CAD_SketcherConstraint-based geometry sketcher for blender项目地址https://gitcode.com/gh_mirrors/ca/CAD_Sketcher点击查看免费下载本文围绕 Blender 约束草图扩展 CAD Sketcher 的用户界面文档展开完整讲解 N 侧边栏Sketch Selector、Tools、Entity/Constraint Browser、约束 Gizmo 与上下文菜单的交互方式并结合 base/preferences.py 等源码逐项补充偏好设置项的默认值、取值范围与底层实现帮助开发者既会用 UI也能理解每个开关背后的代码路径。Sketcher 侧边栏总览扩展在 N 侧边栏的 Sketcher 分类下挂接了若干面板可以从中设置活动草图active sketch、访问草图属性、添加约束并通过元素浏览器browsers与几何元素交互。从 ui/init.py 的注册列表可以看到整个侧边栏的组成VIEW3D_PT_sketcherSketch Selector 面板选择/进入草图实现在 ui/panels/sketch_select.pyVIEW3D_PT_sketcher_toolsTools 面板实现在 ui/panels/tools.pyVIEW3D_PT_sketcher_entities实体浏览器实现在 ui/panels/entities_list.pyVIEW3D_PT_sketcher_constraints约束浏览器实现在 ui/panels/constraints_list.py另外还注册了VIEW3D_UL_features特征列表和若干菜单VIEW3D_MT_selected_menu、VIEW3D_MT_slvs_part等。Sketch Selector进入与离开草图没有活动草图时侧边栏会列出当前所选 part 范围内的全部草图可以从那里把某个草图设为活动状态或切换其可见性。由于草图本身是纯源数据source在视口中保持隐藏眼睛图标切换的其实是它被实体化realise到的 body——那才是屏幕上代表它的东西。一旦有草图处于活动状态UI 会切换形态出现一个醒目的按下状态的蓝色按钮用于退出草图下方显示该草图及其所在 workplane 的属性。对照 ui/panels/sketch_select.py 的sketch_selector函数无活动草图时绘制Add Sketch按钮通过StatefulOps.InvokeTool调用AddSketch工作区工具旁边还有一个下拉菜单包含较不常用的自由 3D 草图模式Add 3D Sketch算子见 operators/add_sketch_3d.py有活动草图时绘制Leave: name按钮depressTrue的SetActiveSketchsketch_name置空即离开草图并在sketch.geometry_solved为假时把整行标红告警旁边还有Update刷新按钮进入草图后还会显示求解状态若solver_state ! OKAY则显示状态名与图标否则显示自由度dof——Fully defined sketch 或 Degrees of freedom: n。_draw_workplane函数还会展示 workplane 及其 face anchor锚定在网格面上时显示mesh, face index形式的锚点名称当锚点与面脱离KEY_DETACHED时以红色 Detached from face 告警并可通过下拉菜单执行 Make Workplane Free 解除锚定。Tools Panel作用于整个草图的工具Tools 面板收纳的是作用于整个草图而非单个元素的工具Merge Points、Project Geometry以及添加约束的按钮组。不在草图内时这里改为提供 Make Part 和 Add Assembly。约束按钮有两种布局通过 Constraints 标题行右侧的图标切换紧凑的icon grid默认或带约束名称的列表。无论哪种布局尺寸约束dimensional都与几何约束geometric分开排列并且只显示适用于当前草图模式的约束。ui/panels/tools.py 的实现印证了这些细节布局开关直接切换偏好项constraint_grid_view见base/preferences.py中该属性默认True即默认网格视图。切换按钮使用wm.context_toggle算子而非普通的属性勾选框——源码注释解释得很直白勾选框会把图标染成开/关状态色白/黑而算子图标始终跟随主题网格视图下用grid_flow(columns5)排布纯图标按钮约束名仍在 tooltip 中显示尺寸约束单独成行一个网格与几何约束网格同列数同缩放保证按钮尺寸一致列表视图下则按kind.title()显示名称3D 草图sketch.is_3d下会过滤按钮只保留求解器实际派发的约束declarations.Supported3DConstraintOperators与Supported3DDimensionKinds采用隐藏而非禁用的策略让可见按钮在网格中保持无缝的合并布局面板底部还有Drawing:区域显示场景属性scene.sketcher.use_construction构造线开关。不在草图内时_draw_node_tools改为列出节点修改器工具NodeExtrude、NodeRevolve、NodeArrayLinear、NodeArrayCircular、NodeBoolean。Entity Browser 与 Constraint BrowserEntity Browserbl_label Entities列出当前全部 active entities每种类型配一个图标点击名称即可选中。从 ui/panels/entities_list.py 可以看到每行的完整结构数据直接读取草图 curve data 上的属性字段curve_id、sketch_type、visible、construction、name——如果curve_id或sketch_type缺失整个面板就不渲染行首是两个小开关Select算子modeTOGGLE按 curve_id 切换选中选中行整行标红提示和SetCurveFlag算子flagvisible切换可见性名称字段本身是RenameCurve算子点击即可重命名行首图标由icon_manager.get_entity_icon(ctype, construction)给出构造线显示虚线样式行尾是ContextMenu算子打开该实体的上下文菜单悬停时高亮实体和DeleteEntity删除按钮。Constraint Browserbl_label Constraints列出当前全部 active constraints分为 Dimensional 与 Geometric 两组——这与sketch.constraints.dimensional/sketch.constraints.geometric两个集合一一对应见 ui/panels/constraints_list.py 的draw方法。每行包含visible开关图标式勾选与约束类型图标icon_manager.get_constraint_icon_for_type可编辑的约束名称字段可编辑的数值字段。源码注释指出一个实现细节尺寸约束的数值实际存在场景自定义属性scene[slvs:c:{uid}]中列表绘制的是这个端点endpoint以此保持数值可编辑、且方便挂驱动driver求解失败的约束constraint.failed右侧显示ERROR图标行尾DeleteConstraint按钮highlight_hover与highlight_members为真悬停时同时高亮该约束及其作用的几何顶部的Show All/Hide All按钮调用SetAllConstraintsVisibility算子visibilitySHOW/HIDE一次性切换整个草图的约束 gizmo 显隐。Gizmos约束的视口标注Gizmo 用于在视口中显示约束三种尺寸约束angle、distance、diameter各有专用 gizmo 类型点击其 gizmo 可打开菜单来调整约束的设置。其余约束使用通用 gizmo显示在其依赖的实体旁边点击这样的 gizmo 要么打开约束设置菜单要么在约束没有可设置项时直接删除它。源码层面gizmos/constraint.py 与 gizmos/base.py的分工是这样的VIEW3D_GGT_slvs_constraintgizmo group 为每个尺寸约束新建一个VIEW3D_GT_slvs_constraint_valuegizmogz.type/gz.index指向具体约束并通过target_set_operator(Operators.TweakConstraintValuePos)绑定拖拽修改数值的算子。尺寸数值文本由_get_formatted_value格式化LENGTH 单位走units.format_distancediameter 约束若处于半径模式下前缀 RROTATION 单位走units.format_angle所有几何约束共享一个VIEW3D_GT_slvs_constraintgizmo。源码注释解释了动机按约束逐个建 gizmo 意味着每次重绘/移动鼠标都要做每约束一次 Python 调用。这个单一 gizmo 的test_select直接根据 drawing/constraint_icons.py 中绘出的图标位置回答命中测试每个图标是一个 part绑定到对应约束的ContextMenu算子delayedTrue等鼠标抬起再弹菜单避免点击的 RELEASE 穿透触发菜单里的 Delete尺寸 gizmo 的箭头/辅助线helpline几何只在_shape_signature变化时重建——签名涵盖数值、draw offset、basis 矩阵和视图缩放静态视口包括 modal 拖拽期间的所有重绘不会每帧重新上传 GPU batch。图标分组位于同一元素上、或在屏幕上会重叠的约束图标会被绘制成一个带计数count的图标悬停展开分组即可触达单个约束。这一行为可以在偏好设置的 Group Constraint Icons 中关闭。对应实现在 drawing/constraint_icons.py该模块头部注释说明所有几何约束图标现在用一次批量绘制从同一纹理图集texture atlas中完成——早期每个 gizmo 各自绘制一次带采样器的纹理约束很多时会在 Vulkan 后端耗尽描述符池VK_ERROR_OUT_OF_POOL_MEMORY。分组的颜色优先级为 highlight failed reference分组展开由光标悬停constraint_icons.pick驱动。Context Menu元素属性与操作上下文菜单用来访问一个元素的属性和操作有三种入口悬停某个实体后按鼠标右键点击支持该功能的约束 gizmo元素浏览器中对应的按钮。INFO:上下文菜单只使用悬停的实体忽略当前选中selection。operators/context_menu.py 的View3D_OT_slvs_context_menu.execute印证了这一点实体路径取selection.hover或显式传入的curve_id约束路径按typeindex在get_active_constraints中定位。菜单内容实体通过seed_entity_editor把实体设置名称、点坐标载入内联编辑器由element.draw_props绘制随后是分隔线和红色警示行的Delete按钮原点is_origin受保护Delete 置灰约束绘制约束的draw_props即设置再加DeleteConstraint按钮——这就是文档所说没有设置可显示时点击直接删除的来源什么都没悬停到element为 None时回退到 Blender 默认的VIEW3D_MT_selected_menu对象菜单delayedTrue时算子以 modal 方式运行鼠标抬起RELEASE才执行用于 gizmo 点击场景。另外ui/panels/entities_list.py 行尾的ContextMenu按钮把curve_id直接传给算子并设highlight_hoverTrue这就是浏览器入口的实现。Preferences偏好设置逐项解析在 Blender 中通过Edit Preferences Add-ons CAD Sketcher展开已启用的扩展即可访问偏好设置。Interface一切关于扩展在视口中如何绘制与表现淡出非绘制目标对象、将视图对齐到活动实体、实体大小、workplane、约束图标、文字与箭头的尺寸以及是否把落在同一元素上的约束图标分组合并。对照 base/preferences.pyPreferences.draw中 Interface 分组各属性及其默认值/范围如下属性含义默认值取值范围auto_hide_objects草图模式下淡出曲线/网格True—use_align_view激活草图时自动把视图对齐到 workplaneTrue—entity_scale实体绘制缩放1.0min 0.1soft_max 3.0workplane_sizeworkplane 显示大小0.4soft 0.1–1.0gizmo_scale约束图标缩放18.0min 1.0soft_max 25.0group_constraint_icons同元素约束图标合并为一个带计数的图标True—text_size数值文本字号15min 5soft_max 25arrow_scale箭头缩放1.0min 0.2soft_max 3.0其中entity_scale与gizmo_scale带有updatetheme.update回调base/theme.py修改后立即对所有 VIEW_3D 区域执行tag_redraw。淡出的实际消费点在 operators/utilities.pyfade_objects get_prefs().auto_hide_objects在进入草图时据此淡出场景对象use_align_view则在 operators/utilities.py 与 operators/workplane_anchor.py 中被读取决定是否调用view3d.view_axis对齐视图。GeometryCurve Resolution— 圆弧与圆被网格化mesh时每边的最大夹角。它是新草图的默认值每个草图在自己的 Convert modifier 上保留各自的数值见 integration。对应属性curve_angular_resolutionsubtypeANGLE默认math.radians(7.5)范围 0.1°–90°描述文本明确提示可在该草图的 CAD Sketcher Convert modifier 上按草图修改Boolean Solver— 新布尔运算使用的求解器Exact 或更快的 Manifold之后可逐布尔修改。属性boolean_solver默认Manifold选项来自 utilities/boolean_nodes.py 的SOLVER_ITEMSExact 对不完美几何稳健但慢Manifold 快得多但只处理干净的闭合网格非流形输入会被丢弃。偏好项描述提到 Manifold 约为另一求解器七倍快且遇到处理不了的输入会自行回落到 Exact。Units决定数值显示所用的精度公制小数位、英制分数、角度小数位。实现集中在 units.pydecimal_precisionIntProperty默认 3min 0soft_max 7控制_format_metric_length的小数位数按场景length_unit输出 m / cm / mm / µm / kmADAPTIVE 或use_separate时走 Blender 内置bpy.utils.units.to_stringimperial_precision枚举1/1/2/1/4/1/8/1/16/1/32/1/64由_inches_to_fraction把英寸值取整到对应分数并格式化为n-m⁄n″英尺制再加′angle_precisionIntPropertymin 0max 5默认 0format_angle按场景旋转单位输出°或rad。注意这些格式函数读取的是当前场景的单位制unit_settings.system所以公制/英制切换即时生效偏好项只是控制精度。AdvancedWhats New 对话框是否在扩展更新后显示show_whats_new默认True对应 base/whats_new.py启用 Show Debug Settingsshow_debug_settings默认False会打开一些实验性功能需谨慎使用。从 utilities/preferences.py 看is_experimental()就是读这个开关use_experimental(setting, fallback)在非实验模式下强制回退——这是实验功能进入各代码路径的统一门控日志级别logging_level枚举CRITICAL / ERROR / WARNING / INFO / DEBUG / NOTSET默认值2Warningupdate回调on_logging_level_update直接logger.setLevel。偏好面板顶部还有一组快捷链接Whats New 算子、Documentation、Source Code、Report a Bug、Request a Feature、Discord方便从面板直接跳转。Theme扩展用到的颜色都在 theme 部分定义扩展同时支持主题预设theme presets包括适配浅色视口的 light 预设。预设体系由 base/preferences.py 顶部的SKETCHER_PT_theme_presets继承PresetPanel实现preset_subdir bgs/theme、preset_operator script.execute_preset、preset_add_operator bgs.theme_preset_add——即预设以 Python 脚本形式保存在扩展资源目录下的bgs/theme子目录通过 Blender 标准的 preset 机制执行。展开偏好项里的 Theme 开关后list_props_recursiv会递归遍历theme_settingsbase/theme.py 的ThemeSettings的 RNA 属性并全部渲染出来结构上分两组ThemeSettingsEntitydefault、highlight、selected、selected_highlight、inactive、inactive_selected、fixed七种实体颜色ThemeSettingsConstraintdefault、highlight、failed、failed_highlight、reference引用测量、text、text_highlight等约束颜色。所有颜色项都带updatetheme.update回调改动即时重绘视口。约束的着色在 gizmos/utilities.py 的get_constraint_color_type与 gizmos/base.py 的_set_colors中被消费失败约束用failed色、悬停高亮叠加*_highlight色颜色按 gizmo 指针缓存_gizmo_colors只有真正变化时才写入避免每帧无谓的属性设置。主题预设脚本的存放路径可以在 Blender 的 Python 控制台执行以下语句获得bpy.utils.user_resource(SCRIPTS)小结CAD Sketcher 的 UI 是一条从面板到算子再到绘制层的完整链路侧边栏面板ui/panels/负责状态展示与算子入口gizmo 层gizmos/负责视口内的标注与命中测试偏好设置base/preferences.py提供全局行为开关并被绘制与算子代码直接读取。理解这三层各自的职责再配合 ui/selected_menu.py、operators/context_menu.py 等入口就能在修改界面行为或排查 UI 问题时快速定位到对应代码。赞分享桌面应用3D建模【免费下载链接】CAD_SketcherConstraint-based geometry sketcher for blender项目地址https://gitcode.com/gh_mirrors/ca/CAD_Sketcher点击查看免费下载相关推荐CAD_Sketcher用户界面详解从侧边栏到偏好设置CAD_Sketcher用户界面详解从侧边栏到偏好设置 侧边栏功能解析 CAD_Sketcher扩展在Blender的N面板中添加了一个名为Sketch桌面应用3D建模炉石传说HsMod插件55项功能全面解析与终极使用指南炉石传说HsMod插件55项功能全面解析与终极使用指南 HsMod是一款基于BepInEx框架开发的炉石传说多功能增强插件为玩家提供55项实用功能包括游戏游戏开发paseo Explorer 侧边栏与 Side Pane双宿主面板的契约设计、路由偏好与源码实现解析paseo Explorer 侧边栏与 Side Pane双宿主面板的契约设计、路由偏好与源码实现解析 Explorer 侧边栏Explorer sideb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询