夜雨聆风学习资料网

ARTICLE · 981237

系统图插件LSP转C#bug修复记录:变配电室箱

系统图插件LSP转C#bug修复记录:变配电室箱

1出图报错 eNotApplicable(含 Regen 误报)

绘制运行 ZMBOX/ZMBD 出图时抛"出图失败:eNotApplicable"

问题现象

互投箱/风机箱在 AutoCAD 中绘制中断,命令栏报 eNotApplicable。

根因

两处叠加:① 单行文字 DBText 先设 AlignmentPoint、后设 Horizontal/Vertical 模式违反 API 顺序;② Editor.Regen() 放在出图 try-catch 内部,被命令事务上下文抛出的 eNotApplicable 误判为"出图失败"。

解决过程

  • TextLeftCenter
     改为先设对齐模式、再设 AlignmentPoint;其余文字方法一并校核顺序。
  • Regen
     移出主出图 try-catch,转由收尾的 FinishRender() 调,仅用于触发负荷表公式计算。
  • 动态块属性访问包 try-catch:非动态块访问 DynamicBlockReferencePropertyCollection 会抛异常,拦截后返回错误信息而不中断整张出图。

结果:出图不再误报失败,动态块(含非动态块)都能安全参与绘制,命令可完成提交。

2多行文字高度错误(TextHeight)

绘制多行文字显示高度随行数变化、偏大

问题现象

出线末端/注释 MText 的"高度"属性不对,多行时总高随行数变。

根因

写的是 MText.Height——它是整个多行文字对象的总体高度(随行数变化),并非字高;字高应写 MText.TextHeight(标称字高,可写)。

解决过程

按 Autodesk 官方约定(_gile、Norman Yuan)改用 TextHeight = h;"定义的宽度"用 Width 独立设置。

结果:MText 字高稳定为标称高度,不再随行数拉伸。

3出线 PL 线:缺失 / 画成 L 线

绘制互投箱所有出线回路的 PL 引线全部缺失,部分被画成细线

问题现象

每个出线回路(照明/插座/备用/至风机箱)本应有"母线→开关→末端"两根宽 40 的引线,实际一根都没有;偶见极细的"L 线"。

根因

两处叠加:① DrawingContext.Line 用 Line 实体,无线宽属性,传入宽度被丢弃 → 画成细线;② 通用回路绘制器 DrawCircuitRows根本没有画 PL1/PL2,只画了开关/线缆/编号/末端文字。

解决过程

  • Line
     改为2 顶点 LWPOLYLINE(起末点 = 线宽,宽 0 退化为细线),线宽得以保留;母线/线缆/控制线全部按 PL 宽度绘制。
  • 按基础数据 §0.7.2 出线骨架,在 DrawCircuitRows 为每个出线回路画 PL1(母线→开关) 与 PL2(开关→末端):PL1 长 1500、PL2 3000→9500、宽 40、图层 E-SYS-线缆。
  • PL 几何做成数据驱动:箱级默认(box-catalog.json → box.pl),回路可覆盖,模板化而非硬编码。

结果:9 个出线回路均画出符合规格的宽 40 PL 引线,母线为宽 100、控制线为宽 20,各图层正确。

4SPD 回路三处错误

回路SPD 画成了普通出线回路,不符合基础数据 0.4.6

① 末段文字

回路上显示了 "SPD" 末端标签 —— 不应有。② 插入点开关块被插入到 bx+1500,应插在回路基准点(母线处)。③ PL 线SPD 也被画了两段引线,应无 PL。

根因

BOX 生成时把 SPD 当普通出线回路统一处理(有标签、偏移插入、画 PL)。基础数据 0.4.6 规定 SPD 块内自包含全部图形:插于回路基准点、无 PL、无标注。

解决过程

在目录与渲染器落地 SPD 语义三开关,模板化表达而非特判函数:

  • noPl:true
     —— 不画任何 PL 引线
  • insertAtBase:true
     —— 块插于回路基准点(母线处),忽略 PL1 终点偏移
  • noEndLabel:true
     —— 抑制末端文字/标签,块内自包含

结果:SPD 行只画 XT-SPD 块(可见性 D-Ⅱ)位于母线处,无 PL、无"SPD"文字,顺序仍垫底。

5box-catalog.json 新增字段被解析器丢弃(部署不生效)

数据新文件已拷入测试目录,但 PL/SPD 依然毫无改进

问题现象

DLL 与 JSON 都已更新部署,运行结果却与旧版完全一致(PL 仍缺、SPD 仍显示标签)。

根因

不是没拷对文件,而是加载器没读字段:BoxCatalogJson.ParseBox/ParseCircuit 未解析新增的 pl/noPl/insertAtBase/noEndLabel,于是运行时 box.Pl 恒为 null、三开关恒为 false → 所有修复形同未生效。

解决过程

  • 补齐 ParsePl() 及回路四项字段的取值映射。
  • 在 ZmSystem.Core.SmokeTest 增加回归断言:锁定 ZM_BD 箱级 PL 与 SPD 三开关,加载器一旦再漏读即 [FAIL]。
  • 把"新增 JSON 字段必须同步解析器 + 加断言"沉淀为工程铁规则,写入系统图代码编写规则文档。

结果:冒烟测试确认解析生效:箱级 PL(pl1Len=1500/pl2Start=3000/pl2End=9500/width=40);SPD noPl/insertAtBase/noEndLabel 全为 true。此后再加 JSON 字段不会无声回归。

6其余出线关联问题(同轮修复)

cosφ 缺"φ"

负荷表标签写成 cos,希腊字母 φ 不显示。

解决:标签统一为 cosφ。

负荷表结果未被取两位小数

公式字段无数值格式。

解决:数值列设 DataFormat = "%lu2%pr2",公式结果保留两位小数。

箱名/箱型文字对正

用了左中对齐。

解决:互投箱/风机箱箱名、箱型改用 TextMiddleCenter 正中(此 API 版无 TextMiddle,以 TextCenter+TextVerticalMid 双居中等价实现)。

末段多行文字"定义的宽度"

原为 2100。

解决:按需求统一改为 Width = 2000。

出图流程:先互投箱后风机箱

改为分步独立事务——先拾取互投箱基点、立即画互投箱并提交,再拾取风机箱基点、画风机箱;避免一次拿两个点后一次画两块导致顺序/坐标系错乱。

7关键文件与口令

文件
要点
ZmSystem.Drawing/DrawingContext.cs
Line
 改用带线宽的 Polyline;MText.TextHeight(非 Height);TextMiddleCenter;DataFormat=%lu2%pr2;对齐先设模式后设点位
ZmSystem.Drawing/BoxRenderer.cs
DrawCircuitRows
 画 PL1/PL2、SPD 三开关、末端文字抑制
ZmSystem.Core/Catalog/BoxCatalog*.cs
新增 PlDef、noPl/insertAtBase/noEndLabel、ParsePl 解析
box-catalog.json
箱级 pl 默认;SPD 回路三项开关;变配电室出线 9 回路定义
tests/…/SmokeTest
解析器字段回归断言

相关学习资料