Files
mech-ai/tools/drawing-diagnostics/ASSEMBLY_TOLERANCE_DIAGNOSTIC_FLOW.md
T
2026-07-17 17:45:56 +08:00

20 KiB
Raw Blame History

装配二维图公差/粗糙度查错流程规范

本文规范装配体二维图查错中,如何利用已经保存的三维接触功能语义,判断二维装配图中的尺寸公差、配合公差和粗糙度标注是否合理。

四类查错流程边界见:../DIAGNOSTIC_FLOW_BOUNDARIES.md。本文只规范二维装配图中的公差/粗糙度专项,不覆盖三维零件查错、三维装配体查错或二维零件图格式查错。

权威主流程如下:

  1. 输入学生二维图路径,以及三维接触语义结果路径。
  2. 后端抽取学生 DWG 中的尺寸、公差、粗糙度、形位公差、基准和几何图元。
  3. 调用已有标准视图/线条归属流水线,完成候选视图、主视图和其他视图的生成、对齐、上色和归属提取,生成与学生图对应的标准视图证据。
  4. 读取该流水线产物,获得上色二维图、各视图线条归属信息和线条两侧零件候选。
  5. 对学生图中每条公差标注,识别其作用于哪两条二维线条或哪组几何边界。
  6. 结合线条归属、线条位置和视图信息,判断该公差对应的是哪两个零件之间的哪一个二维分界/配合边界。
  7. 用二维边界对应的零件对、名义尺寸、位置和视图信息,匹配三维接触语义中的 B-rep 接触面。
  8. 汇总不同视图上的同一接口标注,避免把主视图、剖视图、侧视图中的同一配合割裂成多个独立问题。
  9. 形成二维公差与三维接触功能的唯一或候选对应关系。
  10. 如果二维公差存在但无法对应任何三维接触接口,判为“疑似多标/无效标注”候选。
  11. 如果三维接触接口存在且按功能需要公差,但无法对应任何二维公差,判为“疑似漏标”候选。
  12. 如果二维公差与三维接触接口唯一对应,再把二维标注、三维接触功能、连接方式和固定公差知识一起交给 AI 判定是否错标。

核心目标不是让 AI 直接“看图猜公差”,而是先把二维标注、二维线条、二维线条归属、视图来源、三维 B-rep 接触面、接触功能、连接方式和公差知识组织成闭合证据包,再交给 AI 判定。

公差知识相对固定,应优先作为内置提示词/规则说明进入 AI 判定提示,不依赖实时检索;只有后续知识库规模扩大或需要引用标准原文时,才引入检索。

1. 总原则

  1. 公差判断必须以装配关系为核心。单个零件的几何形状不足以决定配合公差。
  2. 三维信息必须区分两类语义:
    • 零件功能:零件在装配体中的整体作用。
    • 接触功能:某一对接触面/配合面承担的定位、支撑、传力、导向、密封、固定、运动等作用。
  3. 接触不等于固定。判断公差时必须考虑连接方式:
    • 是否允许相对运动。
    • 是否承受径向/轴向/扭矩载荷。
    • 是否有螺钉、键、销、挡圈、肩部、胶接、焊接等其他正向固定。
    • 如果没有其他固定方式且要求固定,才需要考虑过盈/压入类配合。
  4. 二维标注不能只按文字和直径判断,必须绑定到学生 DWG 图纸几何、标准视图线条归属和三维 B-rep 接触面。
  5. 内部接触不参与当前二维装配图查错,除非后续显式打开内部接触分析范围。
  6. 不同视图上的同一接口标注必须汇总,不能按视图割裂判断。
  7. 几何证据只能给出候选和置信度,最终正确/错误必须结合固定公差知识和三维接触功能语义。

2. 输入资料

2.1 外部输入

用户启动二维装配图公差查错时,必须提供:

student_dwg_path              学生二维装配图 DWG 路径
mechanical_context_dir        已保存的三维接触语义结果路径
ownership_context_dir         可选;如果为空,流程应重新生成二维线条归属
output_dir                    可选;查错输出目录

其中 mechanical_context_dir 不是普通三维模型路径,而是三维查错/接触分析阶段已经保存好的接触功能语义结果目录。它必须能提供每个外部接触接口的 B-rep face 级几何、接触功能描述和连接方式判断。

2.2 学生 DWG 提取结果

来源:由 student_dwg_path 通过 AutoCAD/DWG 抽取器生成。

关键文件:

  • dimensions.json:全部尺寸标注。
  • dimensional-tolerances.json:解析出的尺寸/配合公差。
  • geometry.jsonDWG 线、圆、圆弧等几何图元。
  • roughness.json:粗糙度标注。
  • geometric-tolerances.json:形位公差。
  • datums.json:基准。

尺寸标注必须包含:

  • handle:尺寸标注自身的 DWG 图元 ID。
  • text / raw_text:标注文本。
  • nominal_size_mm / interface_diameter_mm:名义尺寸。
  • fit_code:如 H7/js6H6/f5n6
  • xline1_pointxline2_point:尺寸实际指向的两个定义点。
  • dim_line_point:尺寸线位置点。

如果 xline1_point/xline2_point 缺失,不能做可靠的二维几何绑定,只能降级为 text_positionbbox 附近归属。

2.3 标准工程图视图和二维线条零件归属

来源:后端打开三维工程图/三维模型后,执行已有的标准视图生成、对齐、上色和线条归属流水线。

注意:这一块不是简单的“主视图放置/对齐”。它包含学生 DWG 主视图签名提取、SolidWorks 候选视图生成、候选 DWG 抽取、候选排序、图框中心对齐、主视图原点对齐、剖视图/其他视图区域分析与对齐、上色图生成、hover/grid 采样和所有视图线条归属汇总等细步骤。

权威细节见:

  • tools/drawing-diagnostics/README.md
  • tools/drawing-diagnostics/SolidWorksViewCandidateGenerator/README.md
  • tools/drawing-diagnostics/DRAWING_GEOMETRY_NORMALIZATION.md

典型来源目录:

runtime/current-standard-flow/41-all-view-ownership

当前优先使用:

all-views-hover-grid-3mm-250ms-view-calibrated-complete.jsonl

用途:

  • 判断尺寸文字/定义点附近属于哪个零件。
  • 判断 DWG 线条两侧分别属于哪个零件。
  • 为“二维线条是两个零件的分界线”提供证据。
  • 标记线条属于哪个视图,支撑多视图汇总。

注意:二维归属是投影采样证据,不是最终 B-rep face 身份。

2.4 三维外部接触功能语义结果

来源:mechanical_context_dir

示例目录:

runtime/2/external_interface_recheck_v3_fast

必须包含:

  • 外部接触面列表。
  • face_a/face_b
  • FaceKindA/FaceKindB
  • 圆柱面的 RadiusAmm/RadiusBmm、axis、center、bbox。
  • 平面接触的 center、bbox、overlap、gap。
  • component_function_profiles
  • interface_function_profiles
  • connection_assessment

三维接触结果必须保留 B-rep face 级证据:

{
  "component_a": "...",
  "component_b": "...",
  "face_a": 31,
  "face_b": 567,
  "surface_kind": "cylinder",
  "diameter_mm": 70,
  "axis_a": [0, -1, 0],
  "axis_b": [0, 1, 0],
  "center_a_mm": [...],
  "center_b_mm": [...],
  "bbox_a_mm": [...],
  "bbox_b_mm": [...]
}

3. 证据收集流程

3.0 标准视图与归属证据生成

如果没有传入可用的 ownership_context_dir,后端必须先调用已有的标准视图/线条归属子流程生成证据。本文不重写该子流程的内部步骤,避免和现有实现脱节。

该子流程的产物必须至少能回答:

  • 每条标准视图线条属于哪个视图。
  • 每条线条两侧分别可能属于哪个零件。
  • 一条线是否是两个零件之间的分界线。
  • 学生 DWG 中的几何线条能否与标准视图线条建立位置对应。

这一步是二维公差绑定三维接触功能的前置条件,不能跳过。

3.1 解析二维公差标注

dimensional-tolerances.json 读取每条公差:

  1. 解析名义尺寸。
  2. 解析配合代号。
  3. 标记完整性:
    • hole_and_shaft_pair
    • single_designation
    • parse_warning
  4. 保留尺寸定义点:
    • xline1_point
    • xline2_point
    • dim_line_point

输出到上下文:

"dwg_annotation": {
  "handle": "ADE",
  "text": "Φ60H7/f6",
  "interface_diameter_mm": 60,
  "fit_code": "H7/f6",
  "xline1_point": [...],
  "xline2_point": [...]
}

3.2 绑定二维 DWG 几何图元

xline1_point/xline2_pointgeometry.json 中查找附近几何。

候选类型:

  • AcDbLine
  • AcDbCircle
  • AcDbArc
  • 必要时包括 spline/polyline 的规范化结果。

每个点输出:

"drawing_geometry_binding": {
  "point_bindings": [
    {
      "reference_point_kind": "xline1_point",
      "nearest_geometry": [
        {
          "handle": "258",
          "object_name": "AcDbLine",
          "distance_mm": 0.0,
          "match_kind": "line_segment_distance"
        }
      ]
    }
  ]
}

DWG handle 是二维图纸图元 ID,不是三维 face id。

3.3 判断线条两侧零件归属

对每个候选 DWG 线/圆弧执行边界探测:

  • 对直线:沿法向两侧偏移采样。
  • 对圆/圆弧:沿径向内外偏移采样。

采样半径默认:

probe_offset_mm = 3.0
ownership_search_radius_mm = 6.0

输出:

"boundary_ownership": {
  "status": "boundary_pair_candidates_found",
  "sides": [
    {
      "side": "normal_positive",
      "owner_candidates": [...]
    },
    {
      "side": "normal_negative",
      "owner_candidates": [...]
    }
  ],
  "component_pair_candidates": [
    {
      "component_a": "...",
      "component_b": "...",
      "confidence": "medium"
    }
  ]
}

这一步的意义是识别“这条二维线是哪两个零件的分界线”。

3.4 匹配三维 B-rep 接触接口

用二维边界零件对匹配三维接口:

drawing component pair == 3D interface component pair

同时检查名义尺寸:

DWG nominal diameter == 3D B-rep interface diameter

匹配输出:

"drawing_boundary_to_3d_interface_matches": [
  {
    "geometry_handle": "258",
    "reference_point_kind": "xline1_point",
    "drawing_component_a": "...",
    "drawing_component_b": "...",
    "interface_group_id": "cyl_interface_005",
    "diameter_mm": 60,
    "brep_binding_status": "brep_face_pair_candidate_by_boundary_pair_and_nominal_diameter",
    "brep_face_pairs": [
      {
        "face_a": 5,
        "face_b": 441,
        "center_a_mm": [...],
        "center_b_mm": [...],
        "axis_a": [...],
        "axis_b": [...]
      }
    ],
    "interface_function_descriptions": [...],
    "connection_assessment": {...}
  }
]

如果只匹配组件对,不匹配直径,必须标记为:

boundary_component_pair_match_without_nominal_diameter_match

这种只能作为作者意图证据,不能作为公差正确性证据。

3.5 归并候选,形成最佳 B-rep 绑定

强匹配不能按“证据条数”直接等价为多个答案。

正确结构应为:

"best_brep_interface_binding": {
  "interface_group_id": "cyl_interface_005",
  "diameter_mm": 60,
  "supporting_dwg_handles": ["258", "1D7", "261", "1D5", "1D9"],
  "supporting_xline_points": ["xline1_point", "xline2_point"],
  "brep_face_pairs": [...],
  "match_strength": "strong"
}

候选归并规则:

  1. 先按 interface_group_id 去重。
  2. 再按 face_a/face_b 去重。
  3. 优先同时被 xline1_pointxline2_point 支持的接口。
  4. 优先同时满足:
    • 直径匹配。
    • 二维边界零件对匹配。
    • 二维文字/定义点归属匹配。
  5. 如果同组件对、同直径出现多个不同位置接口,必须增加 B-rep 投影位置匹配,不能只靠直径和组件对。

3.6 多视图汇总

二维装配图中,同一个三维接口可能在主视图、剖视图、侧视图或局部视图中出现。公差查错不能按单个视图割裂判断。

对每个候选绑定结果,必须保留:

  • view_id:学生 DWG 标注所在视图。
  • standard_view_id:对应的标准视图/上色视图。
  • dwg_annotation_handle:学生图公差标注 handle。
  • dwg_geometry_handles:该标注作用的二维线条/圆弧/圆 handle。
  • interface_group_id:匹配到的三维接口。
  • face_a/face_b:三维 B-rep 接触面编号。

汇总规则:

  1. 先按 interface_group_id 汇总。
  2. 没有稳定 interface_group_id 时,按 component_a + component_b + face_a + face_b 汇总。
  3. 同一接口在多个视图中出现时,只能算作同一个三维接触接口的多视图证据。
  4. 同一接口有多个公差标注时,要判断它们是重复表达、补充表达,还是互相冲突。
  5. 一个二维公差如果同时匹配多个三维接口,不能直接判错,应进入 needs_review,除非位置投影能消除歧义。

3.7 多标、漏标和错标候选生成

证据绑定完成后,先生成候选,再交给 AI 判定。

3.7.1 疑似多标

如果二维图中存在公差标注,但它无法对应到任何三维接触接口,则生成:

over_annotated_or_unbound_tolerance

典型原因:

  • 标注作用线条不是两个零件的配合/接触边界。
  • 只找到了二维几何,但找不到线条两侧零件归属。
  • 找到了零件对,但三维接触语义中没有对应外部接口。
  • 名义尺寸、位置和组件对都无法支持三维接口绑定。

这类候选不能直接等价为错误,最终仍由 AI 结合图纸表达和上下文判断。

3.7.2 疑似漏标

如果三维接触语义中存在外部接触接口,并且该接口功能通常需要明确公差,但所有视图汇总后仍找不到对应二维公差,则生成:

missing_tolerance_for_3d_interface

漏标候选必须满足:

  1. 接口属于当前二维装配图表达范围。
  2. 接口不是内部接触或当前忽略范围。
  3. 接口功能与连接方式说明其需要公差控制。
  4. 多视图汇总后仍没有找到对应公差标注。

3.7.3 疑似错标

如果二维公差与三维接口能够唯一对应,则生成:

bound_tolerance_needs_ai_assessment

这类候选交给 AI 判断:

  • 公差类型是否符合接口功能。
  • 间隙/过渡/过盈方向是否合理。
  • 是否与连接方式冲突。
  • 是否与固定公差知识冲突。
  • 是否存在表达不完整或重复冲突。

4. AI 判断证据包

发送给 AI 的证据包必须包含以下层次。

4.1 二维标注证据

  • 标注文本。
  • 标注 handle。
  • 名义尺寸。
  • 公差/配合代号。
  • 是否完整表达孔轴配合。
  • xline 定义点。
  • 关联 DWG 几何 handle。

4.2 二维归属证据

  • 标注位置归属。
  • xline 点附近归属。
  • DWG 线两侧归属。
  • 归属置信度。

4.3 三维 B-rep 接触证据

  • interface group id。
  • component_a/component_b。
  • face_a/face_b。
  • surface kind。
  • radius/diameter。
  • axis/center/bbox。
  • gap/confidence/verification。

4.4 功能语义证据

必须分开提供:

  • 零件整体功能:component_function_profiles
  • 接触局部功能:interface_function_profiles
  • 连接方式评估:connection_assessment

4.5 固定公差知识

AI 不得凭几何直接猜具体公差值。公差知识相对固定,当前阶段作为内置提示词/规则说明传入 AI,不做实时检索。

固定知识至少应覆盖:

  • 配合类别选择规则。
  • 轴承/孔轴/定位/导向/过盈/间隙/过渡配合规则。
  • 粗糙度推荐规则。
  • 装配、拆卸、运动、传力场景下的公差选择原则。

AI 判定时必须同时引用:

  1. 二维标注证据。
  2. 二维线条归属和多视图汇总证据。
  3. 三维 B-rep 接触接口。
  4. 接触功能语义和连接方式。
  5. 固定公差知识。

5. AI 判定规则

AI 输出只允许以下状态:

correct
incorrect
missing
needs_review

5.1 correct

必须同时满足:

  1. 二维标注绑定到明确的三维 B-rep 接触接口。
  2. 接口功能、连接方式和固定公差知识支持该公差/粗糙度。
  3. 二维表达完整且位置正确。

5.2 incorrect

必须有明确冲突证据,例如:

  • 标注绑定到了错误接口。
  • 公差类型与功能冲突。
  • 应为间隙/过渡/过盈,标注明显相反。
  • 配合代号与固定公差知识矛盾。

5.3 missing

必须谨慎使用。只有当:

  • 三维接口功能明确要求公差/粗糙度。
  • 该接口在二维图表达范围内。
  • 未找到对应标注或全局标注不能覆盖。

才可判为 missing。

5.4 needs_review

以下情况必须保留为 needs_review

  • 同组件对、同直径有多个不同位置接口,缺少投影位置匹配。
  • 连接方式不明确,无法判断是否需要过盈。
  • 只有二维边界组件对匹配,但直径不匹配。
  • 只有文字位置匹配,缺少 xline 定义点。
  • 固定公差知识不能覆盖该特殊场景。

6. 粗糙度判断流程

粗糙度是面级要求,不是接口整体要求。

判断流程:

  1. 读取 roughness.json
  2. 绑定粗糙度符号到 DWG 几何/面。
  3. 通过二维归属和 B-rep 投影绑定到具体 face。
  4. 查三维接触功能:
    • 定位面。
    • 滑动/转动面。
    • 轴承配合面。
    • 密封面。
    • 压入面。
    • 普通贴合/非关键面。
  5. 根据固定粗糙度知识判断推荐 Ra/Rz 范围。
  6. 判断:
    • 标注是否存在。
    • 标注是否过粗/过细。
    • 全局“其余”是否足够覆盖。

注意:同一个接触中的两个 face 可能需要不同粗糙度。

7. 推荐输出结构

每条公差候选最终应输出:

{
  "candidate_id": "tolerance_ADE",
  "dwg_annotation": {...},
  "best_brep_interface_binding": {...},
  "candidate_brep_interface_bindings": [...],
  "component_function_context": [...],
  "interface_function_context": [...],
  "connection_assessment": {...},
  "fixed_tolerance_knowledge": [...],
  "ai_assessment": {
    "verdict": "needs_review",
    "reason": "...",
    "evidence_refs": [...]
  }
}

8. 当前已实现的桥接能力

当前流程已经具备:

  • DWG 尺寸公差解析。
  • xline1_point/xline2_point 提取。
  • xline 点到 DWG 几何 handle 匹配。
  • DWG 几何线两侧零件归属判断。
  • 二维边界零件对到三维接口匹配。
  • 三维接口携带 B-rep face pair、直径、center、axis、bbox、功能描述和连接方式。
  • 区分“边界匹配但直径不匹配”的弱证据。

当前仍需继续完善:

  • best_brep_interface_binding 的唯一化/排序输出。
  • 同组件对、同直径、多位置接口的 B-rep 投影位置匹配。
  • 粗糙度符号到具体 face 的绑定。
  • AI 判定前的固定公差知识提示词注入。

9. 后端接口建议

建议二维装配图公差查错拆成两个阶段。

9.1 证据构建接口

证据构建接口负责完成从学生 DWG 到三维接触接口绑定的全部确定性流程:

POST /api/drawing-assembly-diagnostics/build-interface-drawing-context

请求体建议包含:

{
  "student_dwg_path": "D:/path/student.dwg",
  "mechanical_context_dir": "D:/CSharpProjects/agent4/runtime/2/external_interface_recheck_v3_fast",
  "ownership_context_dir": "",
  "output_dir": ""
}

职责边界:

  • 抽取学生 DWG。
  • 必要时打开三维工程图,放置/对齐主视图和其他视图。
  • 生成上色二维图和线条归属。
  • 识别学生图公差作用线条。
  • 将二维线条、线条归属、视图位置和三维 B-rep 接触面绑定。
  • 汇总多视图标注。
  • 输出多标、漏标、错标候选。
  • 不直接调用 AI 判定 correct/incorrect。

输出核心文件:

interface_drawing_context.json
tolerance_assessment_context.json
roughness_assessment_context.json
unbound_tolerance_candidates.json
missing_tolerance_candidates.json
bound_tolerance_candidates.json

9.2 AI 判定接口

AI 判定应使用单独阶段:

POST /api/drawing-assembly-diagnostics/assess-tolerances
POST /api/drawing-assembly-diagnostics/assess-roughness

当前已实现 assess-tolerances:默认输出确定性多标/漏标/绑定歧义候选;请求 use_ai=true 且已配置 AI key 时,再对已绑定候选做 AI 公差错标判断。AI 阶段只读取证据构建产物和固定公差知识提示词,不重新跑 AutoCAD/SolidWorks。

这样可以避免:

  • 证据提取和 AI 判断耦合。
  • 重复调用 AutoCAD/SolidWorks。
  • 每次改 prompt 都重跑三维/二维提取。

证据构建产物应可缓存,AI 判定可重复运行。