FreeCAD CAM 工作台统一语言词汇表:解读 ADR-000 领域术语规范

发布时间:2026/9/10 8:20:10
FreeCAD CAM 工作台统一语言词汇表:解读 ADR-000 领域术语规范 FreeCAD CAM 工作台统一语言词汇表解读 ADR-000 领域术语规范【免费下载链接】FreeCADOfficial source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeCAD本指南以 FreeCAD 仓库中 ADR-000: Ubiquitous Language 为核心系统梳理 CAM计算机辅助制造工作台在代码、UI 与文档中统一使用的领域术语体系。读完本文你将掌握 Job、Operation、Tool Controller、Fixture、Post-Processor 等核心概念的精确含义与彼此关系能够用与维护者一致的通用语言阅读 CAM 源码、参与社区讨论或向 AI 编码代理准确描述需求从而消除因歧义导致的沟通与实现成本。1. 为什么需要一份通用语言词汇表软件系统对歧义的容忍度很低。在 FreeCAD CAM 工作台的日常开发中无论是人类开发者之间的对话还是与 AI 编码代理的协作都需要一套一致且严谨的语言否则templateBasepath这类多义词会在代码、文档与 UI 之间造成大量误解。这一理念源自 Eric Evans 在《领域驱动设计》Domain Driven Design中提出的Ubiquitous Language通用语言概念领域中的每个关键概念都应有唯一、无歧义的命名并在代码、文档、对话中保持一致。ADR-000 正是这一理念在 CAM 工作台的具体落地——它本身就是一个持续更新的词汇表文档。文档的Decision一节明确了其定位本 ADR 将承载通用语言词汇表并根据需要持续更新。也就是说这不是一份一次性的历史决议而是 CAM 团队长期维护的领域词典。它位于 src/Mod/CAM/Roadmap/ADR/ 目录下与 ADR-002、ADR-007、ADR-008、ADR-009 共同构成 CAM 工作台的架构决策记录体系。2. Job 与容器Job Containers2.1 Job加工项目Job是 CAM 文档中的顶层对象拥有并组织一个完整的加工项目。它持有以下全部内容Model模型、Stock毛坯Operations操作、Tool Controllers刀具控制器Setup Sheet设置表、Post-Processor后处理器选择Machine机床从源码看Job的核心实现位于 Path/Main/Job.py其中定义了JobTemplate类第 52 行起注释明确写着Attribute and sub element strings for template export/import——这正是下文 Job Template 序列化的实现依据。2.2 Job Template加工项目模板Job Template是 Job 配置后处理器、夹具、输出设置、设置表默认值、刀具控制器、毛坯、机床引用的已保存蓝图用于在新项目中复用。它通过JobTemplate类序列化为XML 属性字符串。必须注意Job Template 与Machine Template是两回事——两者文件格式不同、作用范围也不同。因此在代码、UI 和文档中禁止使用光秃秃的 template必须明确说Job Template或Machine Template。2.3 Job Model Group模型组Job Model Group是 Job 拥有并暴露在其Model属性上的App::DocumentObjectGroup组名固定为 Model。它持有一个或多个以Resource Clone资源克隆形式存在的Models。通过Job.Model.Group可以访问各个模型。这里有两个容易踩坑的约定避免用 Models复数名词称呼这个集合也避免用光秃秃的 Model group——规范说法永远是Job Model Group注意属性名是单数Job.Model但内容是复数——这是常见的困惑来源。单数属性持有的是组容器组容器里才装着模型。2.4 Model模型Model是被加工的零件。它被Job Model Group以Resource Clone方式引用这样原始几何不会被修改。一个Job可以携带多个Model例如多零件夹具或一起加工的装配体它们全部存放在同一个Job Model Group中。在代码和 UI 中避免使用 Partworkpiece——Model 才是规范名称。2.5 Stock毛坯Stock是Tool Bit需要切削掉的原材料。关键特性是它仅用于可视化不约束刀路。Stock 有类型区分类型含义FromBase从Model派生并带有偏移量这里的 base 指Model不是Base GeometryCreateBox创建长方体毛坯CreateCylinder创建圆柱体毛坯NoStock无毛坯避免使用 blankbilletraw 等词。2.6 Resource Clone资源克隆Resource Clone是对基础对象做的Draft.clone并打上标识其角色的PathResource属性例如Model。这样Job就拥有对几何的独立引用而不拥有该几何本身——原始模型不会被加工配置改动污染。2.7 Setup Sheet设置表Setup Sheet是Job上的一个容器保存默认值和 Job 特定的默认值快速进给速度、安全高度表达式、深度表达式、夹具等。新建的Operations从这里读取默认值。避免使用 defaults fileconfig这些是领域外的模糊说法注意这个词与行业术语 setup sheet车间里打印出来、描述如何装夹零件的纸质文档冲突。在本代码库中Setup Sheet永远指默认值容器绝不指车间文档。与行业含义最接近的是Sanity Check报告。2.8 Fixture夹具/坐标系Fixture是一个工件坐标系选择G54–G59.9一组Operations在它之下输出。一个Job可以输出多个夹具。避免WCS代码中偶尔出现、work offset、clamping这不是物理装夹注意该词与行业术语 fixture物理装夹装置冲突。在本代码库中 Fixture永远指工件坐标系。文档也坦言未来可能有倡议重新审视这个命名。3. 操作Operations3.1 Operation操作别名 OpOperation简称Op是产生Toolpath的单个加工步骤——例如一个型腔pocket、一个轮廓profile、一个钻孔循环drilling cycle。Op是同义词用作代码简写文件名、变量名、Path/Op/目录。Operation 继承自内部基类ObjectOp位于 Path/Op/Base.py由Feature标志 属性 Base Geometry 一个Tool Controller共同配置。避免使用 steptaskaction。ObjectOp 是内部命名不是领域术语。3.2 Strategy策略Strategy是在一个Operation内部的备选算法之间做具名选择这些算法共享操作框架但在运动或行为上不同。目前最具体化的例子是Drilling操作上的App::PropertyEnumeration属性Strategy取值Drilling、Tapping它取代了独立的 Tapping 操作。这一概念还非正式地扩展到其他算法选择上linking strategy连接策略决定快速进给和切入如何连接连续的切削clearing strategy清空策略在型腔内选择偏移、锯齿形、螺旋形等走刀图案。不过这些选择目前并非全部暴露为具名的Strategy属性。用词约束避免用 mode遗留属性如CutMode中可接受但 Strategy 是面向未来的规范术语避免用 pattern仅当描述几何图案本身时可用不用于算法选择也避免 kindtype。注意Strategy 与 Generator 不同——Strategy使用一个或多个 Generator 来构建运动二者不可互换。3.3 Feature操作特性标志在操作语境中Feature是一个位标志FeatureTool、FeatureDepths、FeatureHeights……Operation 通过 OR 运算组合它们声明自己支持哪些标准属性。它区别于 FreeCAD 泛化的 feature指文档对象。3.4 Base Geometry基础几何Base Geometry是用户从Model上选择的、Operation 作用的几何面、边、顶点存储在操作的Base属性上。这是规范术语——光秃秃的 Base不是领域术语只出现在代码内部命名中Path/Base/、ObjectOp.Base、FromBase。避免使用 targetselectioninput geometry以及单独使用 Base。3.5 Drillable可钻孔判定Drillable是应用于候选面的一个谓词。一个面相对于给定的Tool Bit直径和进刀向量机床姿态是可钻孔的。实现位于 Path/Base/Drillable.py该模块提供了isDrillableCylinder等分类谓词供Circular Hole操作过滤可选Base Geometry。避免说 drill candidatehole feature那是指谓词不是候选物本身。3.6 深度参数簇Depth profile大多数操作都带有一组深度相关属性规范命名如下术语含义Start Depth切削开始的 Z 高度Final Depth切削结束的 Z 高度Step Down沿刀具轴向的增量相邻深度走刀之间逐层推进。平面操作为每层 Z 递减Rotary Surface旋转面为径向递减每层使刀具更接近旋转轴。几何方向不同语义相同每层沿刀具轴推进一个步长Step Over垂直于刀具轴向沿表面的增量相邻走刀之间横向偏移。平面端面铣/型腔加工为平行走刀间距Rotary Surface为每转一圈的轴向进给螺旋螺距。语义相同每趟走刀横向偏移一个刀具径向步长Finish Depth为Finish Pass预留的材料量由操作上的FinDepth表达式或属性控制为零则无独立精加工走刀Clearance Height越过夹具的安全快速进给 Z 高度Safe Height操作内部快速进给的 Z 高度用词约定避免说 axial stepoverradial stepdown限定词冗余——Step Over 永远是沿表面方向Step Down 永远是切入材料方向。旋转类操作直接说Step Over和Step Down即可轴向/径向映射是隐含的。3.7 Finish Pass 与 Spring PassFinish Pass精加工走刀是一条跟随粗加工走刀偏移出的新刀路的最终切削走刀只去除薄而可控的材料按深度时为Finish Depth按偏移时为横向余量。目的是表面质量轻而均匀的切削比粗加工留下的不均匀余量能得到更好的表面。Finish Pass 不是前一走刀的重复——它有自己独立的几何。Spring Pass回弹走刀则是对紧邻前一条切削走刀的完全重复深度、偏移、进给均不变。目的是挠度恢复第一遍走刀因刀具和工件受力变形会留下薄薄一层未切材料重复走刀几乎不受载刀具回弹到真实位置把这层痕迹清理干净。目前 CAM 工作台尚未把它实现为一等特性但这一概念与Finish Pass截然不同。两者绝不能混用Finish Pass 跟随新刀路、带受控余量Spring Pass 重跑同一条刀路以恢复挠度。3.8 操作目录Operation catalog当前 CAM 工作台的操作类型及规范实现位置操作说明规范实现Pocket2.5D 边界内区域清空Path/Op/PocketShape.pyPath/Op/PocketBase.py 是内部共享基类Mill Facing、Engrave 也用非用户可见概念3D Pocket3D 型腔清空区别于PocketPath/Op/Pocket.pyProfile沿轮廓切削内侧/外侧/线上Path/Op/Profile.pyAdaptive恒定刀具啮合策略的高效清空Path/Op/Adaptive.pyDrilling圆孔固定循环制孔带Strategy属性选择 Drilling/TappingPath/Op/Drilling.pyTapping孔内攻丝已废弃——由 Drilling StrategyTapping取代Path/Op/Tapping.pyThreadMilling孔内螺纹铣削Path/Op/ThreadMilling.pyHelix螺旋插补进孔Path/Op/Helix.pyEngrave沿边单线雕刻Path/Op/Engrave.pyVcarve基于 Voronoi 中轴的 V 型刀雕刻Path/Op/Vcarve.pySlot槽切削Path/Op/Slot.pySurface3D 曲面精加工需要OCLPath/Op/Surface.pyWaterline恒定 Z 曲面精加工需要OCLPath/Op/Waterline.pyMill Facing毛坯顶面端面铣。规范实现为 Path/Op/MillFacing.pyPath/Op/MillFace.py 是遗留实现计划废弃Path/Op/MillFacing.pyProbe探测程序Path/Op/Probe.pyDeburr去毛刺走刀Path/Op/Deburr.pyCustom用户提供的 G 代码以路径形式注入Path/Op/Custom.py重要说明FS进给/转速子系统把这批操作归并成一套更小的切削种类词汇——OP_TYPES定义在 Path/Tool/FeedsSpeeds/types.py取值为profile、pocket、slot、drill、adaptive、surface_finish。映射是多对一的Tapping/Drilling/Helix 都映射到drillMill Facing 映射到surface_finish等等。两套词汇有意不同操作目录枚举用户可见的操作种类OP_TYPES枚举 FS 相关的切削种类。4. 刀具Tools4.1 Tool光秃秃的 Tool 不是领域术语Tool单独使用不是领域术语。必须总是消歧为Tool Bit、Tool Controller、Tool Library或Tool Shape。下面的复合名称才是唯一规范形式。4.2 Tool Controller刀具控制器别名 TCTool ControllerTC是Tool Bit与Spindle Speed、Horizontal Feed、Vertical Feed及快速进给速度的运行时配对。Operations 引用的是 Tool Controller而不是直接引用 Tool Bit。它位于Job的Tools组下。FS 值可以手工输入记为user来源也可以由Resolver通过 FS 对话框填充每个字段的来源在Feed/Speed Provenance中追踪。避免使用 tool slottool assemblyCAM 工作台代码中只允许 Tool Controller 或 TC。4.3 Tool Bit刀头/刀具本体Tool Bit是刀具本身——几何、切削刃、尺寸参数。它有Tool Shape分类器取值包括Endmill、Ballend、Bullnose、Chamfer、Drill、VBit、Dovetail、Reamer、SlittingSaw、Tap、ThreadMill、Probe、TaperedBallNose、Radius、Custom。一个 Tool Bit 可能携带一个或多个 FSPresets持久化在.fctb文件中可在 ToolBit 编辑器的 Presets 选项卡中编辑。避免说 cutterbitend mill当谈论抽象概念时——谈论具体种类时请用具体的形状名称。4.4 Tool Library刀具库Tool Library是Tool Bits的持久化集合序列化到磁盘。它独立于任何Job——刀具库在项目间共享。4.5 Tool Shape刀具形状Tool Shape是Tool Bit的几何模板定义用于渲染对某些操作也用于计算啮合的参数化形状。5. 进给与转速Feeds Speeds5.1 Spindle Speed主轴转速刀具的旋转速度单位 rpm。存储在Tool Controller的SpindleSpeed上。避免rpm单位不是名称、S-wordG 代码术语不是领域术语。5.2 Horizontal Feed水平进给XY 运动的切削进给单位 mm/min。存储在Tool Controller的HorizFeed上。避免feedrate在水平与垂直之间含糊、F-wordG 代码术语。5.3 Vertical Feed垂直进给−Z 运动的切入进给单位 mm/min。存储在Tool Controller的VertFeed上。也可以用Horizontal Feed的比值表达Preset上的Vert Feed Ratio。避免plunge rate用户向行文中可接受代码中请用Vertical Feed。5.4 Surface Speed表面速度别名 Vc切削刃上一点相对工件的速度单位 m/min。英制单位下等同于 SFMSurface Feet per Minute。主要由工件材料和刀具材料决定与刀具直径一起可推出Spindle Speedrpm (Vc × 1000) / (π × diameter_mm)避免SFM仅英制——本代码库全程使用 m/min。Cutting speed 在用户向行文中可接受代码标识符请用surface_speed。5.5 Chipload每齿进给别名 Fz每个切削刃每转去除的材料厚度单位 mm/齿。与Spindle Speed和刃数一起可推出Horizontal Feedfeed rpm × flutes × chipload避免feed per tooth可接受但啰嗦、chip thickness与切屑减薄语境中的有效切屑厚度重叠。5.6 Preset预设Preset是存储在Tool Bit上的具名 FS 记录为某个 (材料, 操作类型) 组合指定Surface Speed、Chipload和可选的垂直进给比。每把刀可有多个预设。存储是工程值导向的——原始进给mm/min和原始主轴转速rpm在使用时由预设值加刀具几何推导得出并不持久化。避免defaultrecipeprofile与 Profile 操作重叠、rulerules 是计划在 Phase 2 实现的另一个更宽泛概念。5.7 Provider提供者Provider是一个可插拔对象从单一来源一个Preset、未来的厂商目录、未来的公式给出 FS 建议。它实现suggest(tool, material, op) → PartialResult | NonePhase 1 交付ToolPresetProvider和ToolDefaultsProvider。避免sourcelookupcalculator与相邻概念冲突。5.8 Resolver解析器Resolver是纯函数resolve(tool, material, op) → FeedSpeedResult它按优先级顺序遍历Providers链并合并各方的贡献。它在边界处与 GUI 和 FreeCAD 文档解耦——可以在没有运行 FreeCAD 进程的情况下用 fixture 测试。实际实现位于 Path/Tool/FeedsSpeeds/resolver.py。从源码可以确认以下细节default_providers()给出的默认优先级链为ToolPresetProvider最佳匹配具名预设高置信度→MachinabilityProvider毛坯材料可加工性模型只贡献 surface_speed中等置信度→ToolDefaultsProvider单一ToolBit.Chipload兜底低置信度只贡献 chipload_merge()采用每个字段先到先得策略高优先级 Provider 在前后面的 Provider 只补足尚未设置的字段当 Provider 只贡献了工程值surface_speed、chipload而没有原始 rpm/进给时resolver 会调用_derive_from_engineering()用刀具几何推导默认vert_feed_ratio为 0.33若传入machine上下文且推导出的主轴转速超出[min_rpm, max_rpm]转速会被钳制到机床极限水平/垂直进给按相同比例缩放保持每齿切屑载荷不变并产生警告——surface_speed保留推荐值让用户能看到意图切削速度与机床限制现实之间的差异当没有任何 Provider 产生结果时返回字段为空的FeedSpeedResult(source, confidence0.0, warnings())调用方应将其视为无建议可用不写入任何 TC 值。避免calculatorsuggesterengine。5.9 Feed/Speed Provenance进给/转速来源追踪属性FeedSpeedProvenanceFeed/Speed Provenance是Tool Controller上的逐字段记录标识每个 FS 值的来源user表示手工输入或来自Provider的源字符串如preset:tool/aluminum-6061/profile。Resolver 绝不覆盖来源为user的字段。避免source太泛——属性名就叫FeedSpeedProvenance、origin。6. 刀路生成Toolpath Generation6.1 Toolpath刀路Toolpath是一系列运动命令G0/G1/G2/G3/……挂接在Operation上是opExecute()的输出。它是面向用户和文档的规范术语。避免trajectorymotion plan以及小写 path作名词时。6.2 Path仅命名空间Path指 Python 命名空间Path.*和源码树Path/。这是 Path → CAM 工作台改名后为向后兼容保留的旧名称。它不是领域术语——在文档或 UI 中绝不用光秃秃的 Path 表示Toolpath。PathScripts.*命名空间如PathScripts/PathUtils.py同样是遗留物正在迁入Path/请只把它当作代码内部名称。6.3 Generator生成器Generator是 Path/Base/Generator/ 中的底层运动图案函数drill、helix、tapping、spiral facing、zigzag facing、linking 等。Operations调用生成器来产生具体的运动片段。避免strategyplannerG-code generatorG 代码生成请用Post-Processor——切勿混淆两者。6.4 Dressup修饰器Dressup是一个包装对象接收Operation的Path并就地修改它保持Tags、Boundary修剪、DogboneII角部释放、Array阵列复制。一个 dressup 会替换其在Job输出序列中的子操作。避免post-modifierpath filterdecorator。6.5 Tag保持片Tag保持片是Profile上留下的一小片未切削材料桥防止零件完全切断时移动。通过TagsDressup创建。避免tab行业别名本代码库用 tag。7. 输出管线Output Pipeline7.1 Post-Processor后处理器别名 PostPost-Processor把Job的Paths转换为机床特定的 G 代码文本。按Job选择。实现位于 Path/Post/scripts/命名规则为machine_post.py。仓库中实际包含linuxcnc_post.py、grbl_post.py、centroid_post.py、mach3_mach4_post.py、fanuc_legacy_post.py、opensbp_post.py、marlin_post.py、snapmaker_legacy_post.py等数十个后处理器脚本读者可在该目录中直接查看。避免G-code generatorexporter。7.2 Machine机床Machine是对物理 CNC 机床的描述轴直线/旋转、工作台/主轴头、单位、限位加上后处理器格式化设置行号、注释风格、头文件内容。通过Machine EditorUI 配置保存为.fcm文件。机器数据模型实现于 Machine/models/machine.py。避免controller与 Tool Controller 冲突、CNC。7.3 Machine Template机床模板.fcm文件Machine Template是Machine定义的 JSON 序列化。模板随 Machine/ 目录分发加载进Job。它与Job Template不同——文件格式和作用范围都不同。避免machine configmachine profile、光秃秃的 template。7.4 Post-Processing Dialog后处理对话框生成 G 代码时显示的对话框DlgPostProcess。其Overview选项卡承载Run scope运行级Post-Processor PropertiesOptions选项卡承载Job scope项目级的属性。避免export dialogoutput dialogpost dialog。7.5 Post-Processor Property后处理器属性Post-Processor Property是Post-Processor属性模式get_full_property_schema()中的单个具名设置按名称存储在Machine的postprocessor_properties中。每个属性声明一个Property Scope。避免post argumentpost optionpost parameter那指的是遗留的--arg命令行——那是另一套机制。7.6 Property Scope属性作用域Property Scope是Post-Processor Property可被编辑的层级恰好取以下之一作用域可编辑位置特点Machine scope仅Machine Editor在Post-Processing Dialog中隐藏描述机床或控制器本身不允许随运行变化如文件扩展名、注释风格、轴精度Job scopeMachine Editor设默认值Post-Processing Dialog的 Options 选项卡可对单次运行覆盖持久化在Machine Template中通过Job.PostProcessorPropertyOverrides覆盖Run scope仅在Post-Processing Dialog的 Overview 选项卡编辑绝不在 Machine Editor 中显示也从不持久化。只作用于一次导出如试运行、仅标记开关Internal scope不在任何 UI 中呈现是推导出来的而非用户设置作用域声明的是属性在哪里可以被编辑这与在哪里声明PostProcessor 上的公共 schema 与某个后处理器自己的get_property_schema()无关。各作用域与build_configuration_bundle()中的合并层级一一对应。避免runtime property已废弃的runtime: True拼写表示Run scope、per-run flagoverride level。7.7 Sanity Check健全性检查别名 CAMSanitySanity Check是对Job的预输出校验生成一份 HTMLSanity Check 报告标记缺失刀具、未设置进给、可疑深度等问题。它是面向用户的规范术语。避免lintervalidatorpre-flight checkjob report。8. 词汇关系总览RelationshipsADR-000 用一组精确的基数关系把以上术语编织成一张关系网这是理解 CAM 工作台对象模型的关键一个Job恰好拥有一个Job Model Group内含一个或多个Models、一个Stock、一个Setup Sheet、一个Machine、一个Post-Processor以及多个Operations和Tool Controllers一个Operation引用恰好一个Tool Controller当它带有FeatureTool时一个Operation可以携带Strategy属性在其操作框架内选择备选算法一个Tool Controller引用恰好一个Tool Bit并携带Spindle Speed、Horizontal Feed、Vertical Feed和Feed/Speed Provenance一个Tool Bit属于零个或多个Tool Libraries刀具库独立于 Jobs并可携带零个或多个 FSPresets一个Dressup包装恰好一个Operation在Job输出顺序中它本身被当作一个Operation处理一个Operation使用零个或多个Generators构建其ToolpathResolver遍历Providers链为 (Tool Bit, 材料, 操作类型) 组合给出 FS 建议建议以逐字段Feed/Speed Provenance标记写入Tool Controller一个Job 一个Post-Processor 一个Machine共同产出最终 G 代码一个Post-Processor声明多个Post-Processor Properties每个恰好带一个Property Scope由它决定Machine Editor、Post-Processing Dialog或两者都不能编辑它Sanity Check对Job运行并输出报告不修改 Job。9. 词汇表如何指导实际开发对话ADR-000 最后用一段对话展示了这套术语在真实协作中的用法——这同时也是给新贡献者的最佳实践示范新贡献者我想在我的 profile 之后加一个倒角走刀。我需要再添加一个Operation吗维护者可以但如果你希望它与同一条边、同样的深度/切入数学绑定应该改用Dressup——用倒角 dressup 包装这个Profile这样它们能保持同步。新贡献者那Tool Controller呢——我要为倒角刀新建一个吗维护者要的。Tool Controller是刀具加上它的进给和转速。Tool Bit只是几何——如果你希望粗加工和精加工用不同进给可以让两个TC指向同一个倒角Tool Bit。新贡献者G54/G55 这些东西在哪里设置维护者在Job上。我们把这些叫做Fixtures——选择要输出的夹具后处理器就会为每个夹具输出一节。这段对话浓缩了本文的核心要点Operation 管刀路、Dressup 管包装修饰、Tool Controller 管刀具切削参数、Fixture 管坐标系输出。当你阅读 CAM 源码如 Path/Op/、Path/Base/、Path/Tool/、Path/Post/或撰写 CAM 相关文档时遵循这套词汇就能与维护者、其他贡献者乃至 AI 编码代理高效对齐。10. 结语与查阅指引ADR-000 的价值不在于规定了名词而在于给每个易混淆的概念划定了唯一的边界Job 与模板、Operation 与 Strategy、Tool Bit 与 Tool Controller、Step Down 与 Step Over、Fixture 与物理装夹、Finish Pass 与 Spring Pass、Generator 与 Post-Processor……每一对都曾是歧义与返工的源头。如果你正在参与 CAM 工作台开发或为它写文档建议以本文以及仓库中的 ADR-000.md 原文为术语基准在对话、PR 描述、issue 和代码注释中显式使用复合名称Job Template、Machine Template、Tool Controller避免裸用 templatetoolbasepath遇到词汇表尚未覆盖的新概念时遵循 ADR 模板 的格式补充条目保持这份通用语言持续演进。记住 ADR-000 的开篇判断软件对歧义容忍度很低而一套持续维护的通用语言正是降低歧义成本最直接的工程手段。【免费下载链接】FreeCADOfficial source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeCAD创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考