夜雨聆风学习资料网

ARTICLE · 1235810

CAD分图软件开发逻辑分享

CAD分图软件开发逻辑分享

之前我们介绍了小秉助手‑分图模块:可以识别图框一键拆分图纸,自动把每张图纸 A‑1 轴网交点,支持预览、手动调整、导出校验,对原始图纸零修改。

今天我们从架构、算法、关键技术点,拆解这款CAD 分图插件的实现思路。

一、先看需求

需求
实现机制
以图框边界分图,一框一图
识别图框(块名关键词 + 标准图幅矩形)→ 嵌套去重 → 逐框导出;无图框时智能聚类兜底
A-1轴网交点作为坐标原点
找轴号“1/A”→ 匹配正交轴线 → 交点作为平移目标
分图效果能预览、能检查
脱机扫描 + 几何烘焙 + 矩阵变换的 WPF 矢量画布
输入输出必须准确
执行前校验 + 导出后读回复核(实体数、包围盒偏差)
绝不能破坏原图
所有写入都发生在新建的侧库,源库全程只读

这张表是整个项目的「骨架」。骨架定下来,代码只是填空。

二、核心架构:一次扫描,三层解耦

这是我认为整个插件里最值钱的一个设计。整条链路只有一处碰 CAD,其余全是纯内存计算。

1扫描层DrawingScanner

开一个只读事务遍历模型空间,把每个实体转成自定义数据:类型、范围、预览线段、文字。事务一关,后面再也不碰 CAD 对象。

2检测层RegionDetector + AxisOriginDetector

找图框、找区域、找基准点,全部在内存里算。不引用任何 CAD 类型,改完立刻重算,毫秒级。

3交互层:表格 + 预览 + 人工修正

显示识别结果,允许改名、改原点、勾选导出。UI 只通过一个纯托管接口回调 CAD,自己不依赖 CAD。

4导出层SplitExporter

不操作源图纸,新建空白侧库,把实体克隆到新库,做坐标平移,保存为独立 DWG

为什么不让预览直接读 CAD 对象?

因为 WPF 渲染发生在 UI 消息帧,和 CAD 事务的生命周期根本不同步。持有已关闭事务里的对象,是 .NET 二次开发最经典的崩溃源。脱水还有额外好处:缩放平移零成本重算。

三、三个最难的功能,各自怎么破

🔍 1. 图框识别:两条腿走路 + 去重

来源一:块名关键词。施工图图框几乎都是块,块名通常带「图框 / TK / TITLE / 图幅 / FRAME」,命中就取块的包围盒当外框。

来源二:标准幅面矩形。闭合、正交、四顶点的多段线,短边落在 A4~A0 基准(210/297/420/594/841)±5%,长短比 1.2~3.2 之间。

嵌套去重:按面积从大到小遍历,凡是与已保留图框「被覆盖 ≥60%」或「交并比 ≥0.5」的候选直接剔除——大框留下,标题栏子块、内外双框线、重叠重画的框全部丢掉。否则同一张图会被分出两个区域。

📍 2. 实体归属:中心点优先,重叠兜底

① 中心点落在框内 → 归该框(同时在多个框内时取面积较小的那个)

② 否则,与某框重叠面积 ≥ 实体自身面积的 25% → 归该框

③ 都不满足 → 未归属,预览里灰色显示、不导出

用「中心点」而不是「范围相交」,天然解决了一条通长线把两张图黏死的问题;重叠兜底则保证压在框线上的标注不会丢。

🎯 3. 轴网原点:容差跟着字高走

四步走:找「1」和「A」的文本 → 候选按二维距离升序逐对配对 → 给每对匹配最近的轴线 → 交点即原点(轴①的X,轴A的Y)。

两个关键细节:容差用「字高的 2.5 倍」而不是固定值(自适应 1:50 / 1:100 不同比例);平局时取更长的那条线(轴线一定比贴着它的墙线长)。

定位失败不抛异常:记一条说明,UI 提示,用户双击或拾取覆盖即可,后续导出只消费坐标数值——人工和自动走同一条路,精度等价。

四、导出环节:安全导出 + 量化校验,原图零改动

📦 用块级克隆

跨库复制要用「块级克隆」而不是普通深拷贝:图层、线型、文字样式、块定义、嵌套块会自动随行。普通深拷贝这些全要手工补,漏一项输出就丢样式。

🔁 先克隆,后变换

正确顺序:克隆到侧库 → 在侧库对新实体统一做平移矩阵。在源图上变换再复制等于改原图,还要处理撤销残留。

✅ 落盘后读回复核

从磁盘重新把文件读回来(不复用内存库,防「看着对、存错了」),比对实体数量和包围盒左下角坐标。正常偏差恒为 0.000mm。

偏差非 0 的唯一常见原因:成员里存在 GeometricExtents 异常的三方代理实体(如天正对象),此时以实体数为准并结合预览人工确认。

🛡️ 源图零修改

全程对源库只有只读事务,写入只发生在新建的侧库。用户关掉窗口,源图无任何变化、无撤销组残留。

五、WPF预览:十万级图形不卡顿

直接用原生 WPF 控件渲染几十万条 CAD 线段会直接卡死界面。预览控件PreviewCanvas做了渲染优化:

✓一次性烘焙:把每组的全部线段烘焙成冻结的矢量几何,只用做一次。

✓只画矩阵:绘制时只做一次坐标变换,然后逐组画几何。世界坐标 → 屏幕坐标的矩阵里顺带处理 Y 轴翻转。

✓笔宽补偿:变换会把线宽同倍放大,所以线宽要除以缩放系数,任何缩放级别下都恒定约 1 像素。文字和虚线则在变换弹出后按屏幕坐标画,字号不随缩放变化。

再加上一条预算意识:预览线段设上限(比如 20 万段),超限后仍然继续记录范围和文本,只是停止收集预览线段。原则是——预览可以简,数据不能缺,因为区域识别和原点定位都靠这些数据。

最后一句话总结

这类插件的本质不是「会不会调 CAD 接口」,而是能不能把图纸先变成干净的数据,再让算法和数据对话。

C# 语法、API 名称,查文档一下午就能会;真正难的是分层、容差、兜底和自证这四件事。

把这四点做扎实,换任何一个专业方向(算量、出图、批量打印、图纸审查)都能复用同一套骨架。

获取方式

● 获取 / 试用 / 反馈:公众号后台回复「分图」

● 按机器授权,默认一个月一续,机器码换机自动失效 

操作指南-CAD分图,终于可以交给工具了!

电话:16548888188/ 13294033942

邮箱:xia@bingjietech.com

地址:北京市海淀区金澳国际918室

相关学习资料