16 KiB
二维图查错工具流程
四类查错流程的边界见:../DIAGNOSTIC_FLOW_BOUNDARIES.md。本目录只负责二维零件图和二维装配图相关流程;三维零件/装配体的 B-rep 提取、接触功能语义和规则判定在 tools/model-diagnostics 下处理。
本目录是二维工程图查错相关工具。当前确定采用的主流程是:
- 用 AutoCAD 提取学生 DWG 的主视图几何签名。
- 用 SolidWorks 从三维模型生成 24 个候选主视图,并逐个导出为 DWG。
- 再用 AutoCAD 串行提取这 24 个候选 DWG 的几何签名。
- 用类型、尺寸数值、方向信息、相对中点坐标等特征排序,确定学生主视图对应的 SolidWorks 视角。
当前保留工具
AutoCadDwgExtractor
位置:AutoCadDwgExtractor
连接 AutoCAD,读取 DWG 实体并输出结构化 JSON。它负责:
- 提取
line、circle、arc、polyline、hatch、文字、尺寸、公差、粗糙度等对象。 - 将 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_histogram、arc_radius_histogram、arc_length_histogram:圆和圆弧特征。relative_line_coordinates:相对坐标特征。原点取主视图中最左侧竖直线段的最上点,每条直线记录相对于该原点的中点坐标。
SolidWorksViewCandidateGenerator
位置:SolidWorksViewCandidateGenerator
从 SolidWorks 零件或装配体生成 24 个候选主视图:
- 6 个观察方向:
+X、-X、+Y、-Y、+Z、-Z。 - 每个方向绕屏幕法向旋转
0、90、180、270度。
当前只保留推荐用法:--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.15line_direction_counts: 0.15line_length_histogram: 0.15circle_radius_histogram: 0.03arc_radius_histogram: 0.03arc_length_histogram: 0.04relative_midpoint_histogram: 0.30relative_feature_histogram: 0.15
相对中点坐标是现在区分旋转方向的关键特征。之前只靠类型、长度和方向时,前几名分数太接近。
DwgSheetFrameAligner
位置:DwgSheetFrameAligner
将学生 DWG 的整张图纸平移到 SolidWorks 图纸坐标系下。工具会:
- 从 SolidWorks 导出的参考 DWG 中识别图框内圈中心。
- 从学生 DWG 中识别图框内圈中心。
- 计算两个中心的差值。
- 复制学生 DWG 到输出路径。
- 对输出副本中的
ModelSpace和PaperSpace全部实体执行整体平移。
注意:它不是只移动图框内框,而是移动学生图纸中的所有对象,包括外框、内框、标题栏、视图、标注、文字、块参照等。
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.jsonmain-view-normalized-geometry.jsonmain-view-merged-lines.jsonmain-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:
+X,roll0/90/180/270 - 05-08:
-X,roll0/90/180/270 - 09-12:
+Y,roll0/90/180/270 - 13-16:
-Y,roll0/90/180/270 - 17-20:
+Z,roll0/90/180/270 - 21-24:
-Z,roll0/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.
- Extract the student DWG main-view signature for candidate ranking.
- Generate and rank SolidWorks candidate views to choose the main-view orientation.
- Place that main view in the currently opened SolidWorks drawing.
- Export the current SolidWorks drawing to a fresh DWG.
- Run
DwgSheetFrameAlignerwith that freshly exported SolidWorks DWG as--reference-dwg; this aligns the whole student DWG copy by inner-frame center. - Extract the aligned student DWG with
AutoCadDwgExtractorand save itsmain-view-signature.json. - Extract the freshly exported current SolidWorks drawing DWG with
AutoCadDwgExtractorand save itsmain-view-signature.json. - Run
SolidWorksViewCandidateGenerator --align-main-view-originwith:--student-signature: the aligned student DWG signature from step 6.--reference-signature: the current SolidWorks drawing DWG signature from step 7.
- 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.
- Only after both alignments pass, run
view-regions.jsonanalysis 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.