Files
2026-07-17 17:45:56 +08:00
..
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00
2026-07-17 17:45:56 +08:00

二维图查错工具流程

四类查错流程的边界见:../DIAGNOSTIC_FLOW_BOUNDARIES.md。本目录只负责二维零件图和二维装配图相关流程;三维零件/装配体的 B-rep 提取、接触功能语义和规则判定在 tools/model-diagnostics 下处理。

本目录是二维工程图查错相关工具。当前确定采用的主流程是:

  1. 用 AutoCAD 提取学生 DWG 的主视图几何签名。
  2. 用 SolidWorks 从三维模型生成 24 个候选主视图,并逐个导出为 DWG。
  3. 再用 AutoCAD 串行提取这 24 个候选 DWG 的几何签名。
  4. 用类型、尺寸数值、方向信息、相对中点坐标等特征排序,确定学生主视图对应的 SolidWorks 视角。

当前保留工具

AutoCadDwgExtractor

位置:AutoCadDwgExtractor

连接 AutoCAD,读取 DWG 实体并输出结构化 JSON。它负责:

  • 提取 linecirclearcpolylinehatch、文字、尺寸、公差、粗糙度等对象。
  • 将 polyline 展开成基础线段/圆弧。
  • 对共线、连续、重叠或部分重叠的线段做强合并和重叠关系记录。
  • 选择主视图并输出主视图几何。
  • 生成用于匹配的 main-view-signature.json

主视图选择有两种有效模式:

  • 默认模式:用于学生 DWG。先排除图框,从 minX 最小、同等情况下 maxY 最大的线段作为左上角种子线,按几何连通关系扩展,再吸收包围盒内部孤立圆孔/圆弧。
  • --main-view-seed-mode solidworks-candidate:用于 SolidWorks 导出的单候选 DWG。先找外框边线,扩展出图框和标题栏连通块并排除,剩余几何作为候选视图。

签名里关键字段:

  • primitive_counts:图元类型数量。
  • line_direction_counts:水平、竖直、斜线数量。
  • line_length_histogram:线长直方图。
  • circle_radius_histogramarc_radius_histogramarc_length_histogram:圆和圆弧特征。
  • relative_line_coordinates:相对坐标特征。原点取主视图中最左侧竖直线段的最上点,每条直线记录相对于该原点的中点坐标。

SolidWorksViewCandidateGenerator

位置:SolidWorksViewCandidateGenerator

从 SolidWorks 零件或装配体生成 24 个候选主视图:

  • 6 个观察方向:+X-X+Y-Y+Z-Z
  • 每个方向绕屏幕法向旋转 090180270 度。

当前只保留推荐用法:--export-candidate-dwgs-sequential。它会在当前工程图中每次只放置一个候选视图,按 1:1 比例导出一个 DWG,随后删除该视图,再处理下一个候选。这样不会打开 24 个工程图窗口,也不会让候选视图互相重叠。

输出:

  • candidate-result.json:执行结果。
  • candidate-views.json:24 个候选视图的方向、旋转角、DWG 路径、保存状态。
  • candidate-dwgs/:逐个导出的候选 DWG。

ExtractCandidateDwgsSequential.ps1

位置:SolidWorksViewCandidateGenerator/ExtractCandidateDwgsSequential.ps1

读取 candidate-views.json,逐个打开候选 DWG,调用 AutoCadDwgExtractor 提取签名,然后关闭当前 DWG。脚本会先构建一次提取器,再运行编译后的 DLL,避免每个候选都 dotnet run 导致速度和 AutoCAD COM 稳定性问题。

RankExtractedCandidateDwgs.ps1

位置:SolidWorksViewCandidateGenerator/RankExtractedCandidateDwgs.ps1

读取学生主视图签名和 24 个候选签名,输出排序文件:

  • 默认输出:candidate-ranking-relative.json
  • 当前权重:
    • primitive_counts: 0.15
    • line_direction_counts: 0.15
    • line_length_histogram: 0.15
    • circle_radius_histogram: 0.03
    • arc_radius_histogram: 0.03
    • arc_length_histogram: 0.04
    • relative_midpoint_histogram: 0.30
    • relative_feature_histogram: 0.15

相对中点坐标是现在区分旋转方向的关键特征。之前只靠类型、长度和方向时,前几名分数太接近。

DwgSheetFrameAligner

位置:DwgSheetFrameAligner

将学生 DWG 的整张图纸平移到 SolidWorks 图纸坐标系下。工具会:

  • 从 SolidWorks 导出的参考 DWG 中识别图框内圈中心。
  • 从学生 DWG 中识别图框内圈中心。
  • 计算两个中心的差值。
  • 复制学生 DWG 到输出路径。
  • 对输出副本中的 ModelSpacePaperSpace 全部实体执行整体平移。

注意:它不是只移动图框内框,而是移动学生图纸中的所有对象,包括外框、内框、标题栏、视图、标注、文字、块参照等。

SolidWorksHoverProbe

位置:SolidWorksHoverProbe

保留的独立调试工具。它连接当前打开的 SolidWorks 工程图,监听鼠标悬停和动态高亮事件,打印预选对象、选择对象、视图和组件归属信息。它只用于人工排查 SolidWorks 悬停对象来源,不参与当前主流程的 DWG 导出、DWG 签名比较、图框中心对齐或主视图平移。

网格读取模式:

dotnet run --project tools\drawing-diagnostics\SolidWorksHoverProbe\SolidWorksHoverProbe.csproj -- `
  --grid `
  --step-mm 1 `
  --output "D:\CSharpProjects\agent4\runtime\solidworks-hover-grid\grid-ownership.jsonl"

默认按当前工程图 sheet 尺寸以 1 mm 间隔扫描,尝试选择 EDGE,EXTSKETCHSEGMENT,SKETCHSEGMENT,ANNOTATION,只输出命中的点。需要输出空白点时加 --include-empty;调试时可加 --max-points 1000 限制扫描点数。

如果只想扫描模型视图范围,跳过标题栏、图框等空白区域:

dotnet run --project tools\drawing-diagnostics\SolidWorksHoverProbe\SolidWorksHoverProbe.csproj -- `
  --grid `
  --views-only `
  --step-mm 1 `
  --types EDGE,EXTSKETCHSEGMENT,SKETCHSEGMENT `
  --output "D:\CSharpProjects\agent4\runtime\solidworks-hover-grid\grid-ownership-views.jsonl"

悬停读取模式会先调用 SolidWorks ViewZoomtofit2() 执行整屏显示全图,再读取 sheet 到屏幕的线性映射,然后移动鼠标读取 GetPreSelectedObject()

执行 --hover-grid--print-sheet-origin 前,工具会先调用 SetFeatureManagerWidth(0) 隐藏左侧 FeatureManager/特征树边栏,再执行整屏显示全图,避免左侧边栏影响绘图区坐标映射。

dotnet run --project tools\drawing-diagnostics\SolidWorksHoverProbe\SolidWorksHoverProbe.csproj -- `
  --hover-grid `
  --views-only `
  --step-mm 1 `
  --hover-delay-ms 80 `
  --zoom-fit-delay-ms 500 `
  --output "D:\CSharpProjects\agent4\runtime\solidworks-hover-grid\hover-grid-views.jsonl"

校准工程图原点和主视图屏幕矩形:

dotnet run --project tools\drawing-diagnostics\SolidWorksHoverProbe\SolidWorksHoverProbe.csproj -- `
  --print-sheet-origin `
  --zoom-fit-delay-ms 500

标准执行流程

1. 提取学生 DWG 主视图

dotnet run --project tools\drawing-diagnostics\AutoCadDwgExtractor\AutoCadDwgExtractor.csproj -- `
  --drawing-path "D:\Desktop\新建文件夹\毕设\二维图\A2_肘关节装配.DWG" `
  --output-dir "D:\CSharpProjects\agent4\runtime\dwg-main-view\A2_肘关节装配_relative_signature" `
  --visible true `
  --close-after-extract true

重点检查:

  • main-view-selection.json
  • main-view-normalized-geometry.json
  • main-view-merged-lines.json
  • main-view-signature.json

2. 用 SolidWorks 导出 24 个候选 DWG

要求:SolidWorks 已经打开三维模型和一个工程图,工程图纸尺寸按需要设为 A2。

dotnet run --project tools\drawing-diagnostics\SolidWorksViewCandidateGenerator\SolidWorksViewCandidateGenerator.csproj -- `
  --model "D:\Desktop\新建文件夹\毕设\建模\小臂肘关节装配\小臂肘关节.SLDASM" `
  --use-active-drawing `
  --export-candidate-dwgs-sequential `
  --output-dir "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1"

规则:

  • 一个候选视图一个 DWG。
  • 每次只保留当前候选视图。
  • 保存成功后删除当前候选视图。
  • 默认比例是 1:1
  • 如果保存失败,会重建并重试,默认不跳过。

候选顺序:

  • 01-04+Xroll 0/90/180/270
  • 05-08-Xroll 0/90/180/270
  • 09-12+Yroll 0/90/180/270
  • 13-16-Yroll 0/90/180/270
  • 17-20+Zroll 0/90/180/270
  • 21-24-Zroll 0/90/180/270

3. 串行提取 24 个候选 DWG

powershell -ExecutionPolicy Bypass -File tools\drawing-diagnostics\SolidWorksViewCandidateGenerator\ExtractCandidateDwgsSequential.ps1 `
  -CandidateViewsJson "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\candidate-views.json" `
  -OutputRoot "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\autocad-extractions-relative" `
  -Visible

脚本会对每个候选传入:

--main-view-seed-mode solidworks-candidate
--close-after-extract true

4. 排序确定主视图视角

powershell -ExecutionPolicy Bypass -File tools\drawing-diagnostics\SolidWorksViewCandidateGenerator\RankExtractedCandidateDwgs.ps1 `
  -TargetSignaturePath "D:\CSharpProjects\agent4\runtime\dwg-main-view\A2_肘关节装配_relative_signature\main-view-signature.json" `
  -CandidateExtractionRoot "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\autocad-extractions-relative" `
  -CandidateViewsJson "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\candidate-views.json"

本次实测结果:

  • 第一名:agent4_candidate_04_px_r270
  • 方向:+X
  • 旋转:270
  • 分数:0.421348
  • 第二名:agent4_candidate_02_px_r90
  • 分差:约 0.03559

5. 在 SolidWorks 工程图中放置主视图

排序完成后,可以把第一名候选作为工程图主视图插入当前打开的 SolidWorks 工程图:

dotnet run --project tools\drawing-diagnostics\SolidWorksViewCandidateGenerator\SolidWorksViewCandidateGenerator.csproj -- `
  --model "D:\Desktop\新建文件夹\毕设\建模\小臂肘关节装配\小臂肘关节.SLDASM" `
  --use-active-drawing `
  --place-main-view `
  --ranking-json "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\autocad-extractions-relative\candidate-ranking-relative.json" `
  --output-dir "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\placed-main-view"

本次实测已放置:

  • 工程图视图名:工程图视图212
  • 命名视图:agent4_main_view_04_px_r270
  • 候选编号:4
  • 方向:+X
  • 旋转:270
  • 比例:1:1
  • 位置:图纸中心 (0.297, 0.21)

6. 对齐学生 DWG 到 SolidWorks 图框中心

用 SolidWorks 导出的候选 DWG 作为参考图纸,读取其图框内圈中心;再读取学生 DWG 的图框内圈中心,把学生 DWG 副本整体平移到一致位置:

dotnet run --project tools\drawing-diagnostics\DwgSheetFrameAligner\DwgSheetFrameAligner.csproj -- `
  --reference-dwg "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\candidate-dwgs\04_agent4_candidate_04_px_r270.dwg" `
  --student-dwg "D:\Desktop\新建文件夹\毕设\二维图\A2_肘关节装配.DWG" `
  --output-dwg "D:\CSharpProjects\agent4\runtime\aligned-student-dwg\A2_肘关节装配_aligned_to_solidworks_frame.dwg" `
  --visible true `
  --close-after-align true

本次实测:

  • SolidWorks 参考 DWG 图框内圈:x=20~584, y=10~410
  • SolidWorks 参考内框中心:(302, 210)
  • 学生 DWG 平移前内框中心:(304.5, 210)
  • 平移量:dx=-2.5, dy≈0
  • 学生 DWG 平移后内框中心:(302, 210)
  • 被整体移动实体数:1967
  • 输出副本:runtime\aligned-student-dwg\A2_肘关节装配_aligned_to_solidworks_frame.dwg
  • 对齐报告:runtime\aligned-student-dwg\A2_肘关节装配_aligned_to_solidworks_frame.align-report.json

7. 对齐 SolidWorks 主视图到学生主视图原点

图框中心对齐后,学生 DWG 和 SolidWorks 工程图位于同一个图纸坐标框架中。下一步读取移动后学生图主视图中“最左侧竖直线段最上点”的绝对位置,并把 SolidWorks 工程图里的主视图整体平移到对应位置。

实际执行时不是移动单条线,而是修改 SolidWorks 工程图视图的 IView.Position,因此整个主视图会一起移动:

dotnet run --project tools\drawing-diagnostics\SolidWorksViewCandidateGenerator\SolidWorksViewCandidateGenerator.csproj -- `
  --model "D:\Desktop\新建文件夹\毕设\建模\小臂肘关节装配\小臂肘关节.SLDASM" `
  --use-active-drawing `
  --align-main-view-origin `
  --student-signature "D:\CSharpProjects\agent4\runtime\aligned-student-dwg\extraction-check\main-view-signature.json" `
  --reference-signature "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\autocad-extractions-relative\04_agent4_candidate_04_px_r270\main-view-signature.json" `
  --main-view-orientation-name "agent4_main_view_04_px_r270" `
  --output-dir "D:\CSharpProjects\agent4\runtime\sw_candidate_dwg_1to1\aligned-main-view-origin"

本次实测:

  • SolidWorks 工程图视图名:工程图视图212
  • 命名视图:agent4_main_view_04_px_r270
  • 学生主视图原点:(45.990114407105125, 338.275336225917) mm
  • SolidWorks 候选 04 原点:(229.50000000000037, 260.00000000000057) mm
  • 平移量:dx=-183.50988559289524 mm, dy=78.27533622591642 mm
  • 平移前视图位置:(0.297, 0.21) m
  • 平移后视图位置:(0.11349011440710474, 0.2882753362259164) m
  • 输出报告:runtime\sw_candidate_dwg_1to1\aligned-main-view-origin\candidate-result.json

已废弃方法

  • CAXA:接口能力不足,已放弃。
  • 候选 DWG 中用中心点找种子线扩展:覆盖不稳定,已废弃。
  • 候选 DWG 中显式识别右下角标题栏并删除:容易误删或漏删,已废弃。
  • 学生 DWG 的同列吸收:会把不属于主视图的线吸进来,已废弃。
  • 弱合并:会引入不可靠匹配,已废弃。

关键判断原则

匹配时不要依赖绝对起点/终点坐标,因为学生 DWG 和 SolidWorks 导出 DWG 的坐标系、插入位置可能不同。当前主要依赖:

  • 图元类型数量。
  • 线段长度分布。
  • 线段方向分布。
  • 圆和圆弧半径/弧长分布。
  • 以主视图最左侧竖直线段最上点为原点的相对中点坐标分布。

后续如果要继续增强,可以在相对坐标基础上增加局部拓扑关系,例如“某个相对位置附近有哪些长度/方向组合”,但仍应保持两侧都从 AutoCAD DWG 提取。

Canonical DWG alignment workflow

This is the required production flow. Do not use an old candidate DWG signature as the final coordinate reference.

  1. Extract the student DWG main-view signature for candidate ranking.
  2. Generate and rank SolidWorks candidate views to choose the main-view orientation.
  3. Place that main view in the currently opened SolidWorks drawing.
  4. Export the current SolidWorks drawing to a fresh DWG.
  5. Run DwgSheetFrameAligner with that freshly exported SolidWorks DWG as --reference-dwg; this aligns the whole student DWG copy by inner-frame center.
  6. Extract the aligned student DWG with AutoCadDwgExtractor and save its main-view-signature.json.
  7. Extract the freshly exported current SolidWorks drawing DWG with AutoCadDwgExtractor and save its main-view-signature.json.
  8. Run SolidWorksViewCandidateGenerator --align-main-view-origin with:
    • --student-signature: the aligned student DWG signature from step 6.
    • --reference-signature: the current SolidWorks drawing DWG signature from step 7.
  9. Export the current SolidWorks drawing to DWG again and re-extract it to verify the SolidWorks main-view origin matches the aligned student DWG origin.
  10. Only after both alignments pass, run view-regions.json analysis for section views and other orthographic views.

Candidate DWGs under runtime/sw_candidate_dwg_*/candidate-dwgs are only for orientation ranking. They are not valid references for final frame-center alignment or main-view origin alignment.