Repository navigation
渐进色显示、块内弧线Z值和凸度定位、曲线虚线、属性文字与块参照的图层/颜色/字体修复 - #35
Merged
Merged
Conversation
上游 CHMOSE023/MiniCAD 只有格式层:MiniDWG 能读写组码 450~470,但导入时把 渐变整条降级成「单色实心」(pattern.Solid = IsSolid || GradientColor.Enabled), 那两个蓝→黄的渐变(LINEAR 与 SPHERICAL)在图上只画出一块纯色。核心层 HatchEntity 没有渐变概念,IDrawSink 只有三顶点同色的 FillTriangle。 本次补齐整条链路: - 数据模型:HatchEntity 增加 HatchGradient(类型 / 角度 / 位移 / 单色 / 色调 / 颜色停靠点),单色渐变的另一端按 ColorTint 提亮或压暗;随 JSON / .mcad 序列化, 旧文件没有 gradient 键读回仍是普通填充 - 渲染:IDrawSink 增加 FillTriangleColored(逐顶点着色)。顶点格式 Vertex_P3_C4 本来就有逐顶点颜色、TRIANGLELIST 天然插值,所以各渲染后端无需改动; ClipDrawSink / TransformDrawSink 两个包装器补上转发(不补的话块参照与 XCLIP 路径下的渐变会退化成平均色实心) - 非线性渐变必须细分:扫描线在矩形上只切出 2 个三角形,球面 / 柱面的明暗点 不存在,整片会被拉成线性甚至单色(实测 SPHERICAL 退化成纯黄)。CYLINDER / SPHERICAL / HEMISPHERICAL / 反相按 24×16 网格细分 - 导入导出:CadExchange 双向映射组码 450~470,停靠点按 Value 升序排 - 特性面板:「图案」显示成「渐变(SPHERICAL)」,另加渐变类型 / 渐变角度两行 (走 N_() 接入多语言) - Color4 补 operator==:停靠点往返与单测需要逐通道比较 与上游 92a8bea 的差异:本分支在这些文件上已有较大演进(活动边表扫描填充、 NoteInput / ToColor 记录、N_() 多语言),所以是按上游设计重写适配而非照搬 diff。 回归:HatchPatternTests 补 31 项(单色提亮压暗、停靠点求值、类型名解析、 线性 2 个三角形且逐顶点异色、球面细分、选中态降级、序列化往返、与图案互不干扰)。 MiniCADTests 1855 通过 / 3 失败,失败项与改动前的基线逐项相同(.pat GBK、 两个字体的字形测试,均与渐变无关)。 构建:out/release 全部 23 个链接 MiniCAD.lib 的目标重编通过(含 GUI 主程序)。
本次修的都是「曲线离散绘制」与「块参照解析规则」两类问题,全部由真实图纸 (test0.dwg、test_天正.dwg、0土方清表初步方案.dwg、1清表后至室外道路面下 0.07m处-土方初步方案.dwg)的数据定位,并加了回归用例。 一、曲线线型显示(圆 / 圆弧 / 椭圆 / 多段线) - 新增 IDrawSink::DrawPath:曲线离散成小段后相位跨段累计,不再每段从图案 相位 0 重铺。逐段 DrawLine 在 $LTSCALE 大到一个周期超过小段长度时,每段只 画得出第一个 dash 片、gap 走不到,整条曲线显示成实线(实测 DASH 圆弧 16 段 每段 132.5 < 周期 350:实线占比 100% → 71.7%)。 - 多段线的直线段与圆弧段串成一条路径经 DrawPath,细线与带宽度两条分支都走; 带宽度时用另一个重载(逐点宽度,段内线性插值成锥形段,EmitSolidTapered)。 - ClipDrawSink / TransformDrawSink 转发 DrawPath(块内与被裁剪的曲线同样生效)。 - 取舍与 EmitStyled 一致:只有超过 kStaticMaxDashes(200) 个周期的长虚线才按 像素退化;且 4px 判断按**整条**做 —— 逐段调用时每段只有「总周期数 ÷ 段数」 个周期,永远达不到 200,缩小时会铺满不到 1 像素的密集 dash,光栅化随机丢 三角形,整条看起来一段一段的空缺(用户报「缩小时部分消失」)。 - 隐藏线宽模式(SetThinLines)下逐点宽度一并归零。 二、块参照的 AutoCAD 解析规则(以前只对块内实体生效) - 属性 ATTRIB 在图层 0 上时随插入所在图层:InsertEntity::Draw 判可见性前换算。 图纸里图层 "0" 常被关闭(实测 73 个图层里 28 个 IsOn=0,含 "0"),此前属性 被整批跳过,块内 W= 画得出来、属性 VW=120.00 消失。 - 属性 ByBlock 颜色/线宽/线型继承块参照:绘制前把解析后的属性临时写回实体 (AttribBase::Draw 取色走自己的 m_attr,只设 sink 上下文无效),画完还原。 此前属性一律画成纯白(实测插入色 ACI 61 青,线条 (223,255,127)、属性 (255,255,255))。 - 属性文字样式按自己的组码 7(AttribBase::m_styleId,导入 LookupStyle、 序列化存 styleId、导出写回):此前硬编码 Standard,属性用 TTF 粗体、块内 文字用 SHX 单线,字宽因宽度因子 0.70 丢失也对不上。 - 块参照自身所在图层关闭不等于整块不画:块参照的图层只决定块内 0 层实体的 归属,具名图层上的实体按自己的开关。Editor::isShown 对 InsertEntity 改走 InsertEntity::HasVisibleContentOnAnyLayer(递归查嵌套块 + 属性按 0 层解析)。 此前整块被跳过(实测 A1 图签模板在关闭的图层 0 上、块内嵌套块在打开的 _WHADI_LAYER 上,AutoCAD 显示整张图框)。 三、DWG/DXF 交换(随曲线问题一并定位) - ARC 圆心是 OCS:法向与 +Z 反向时换算到 WCS,角度区间镜像成 (π−end, π−start)。 - ELLIPSE 法向 -Z 时参数区间镜像成 (-e, -s)。 - LWPOLYLINE 顶点 OCS → WCS,镜像时凸度取反。 测试:MiniCADTests 1908 项、MiniCADCadPreserveTests 15 项、 MiniCADDrawingOpenTests 13 项全通过;新增回归用例覆盖上述每一条 (含真实图纸数据:凸度 0.414214 的 90° 弧、闭合粗多段线 1670、 属性 VW=120.00、插入 ACI 61、A1 图签模板块)。 其余 25 项 ctest 里 8 项失败(0xC0000409 与 MiniGUIGolden / MiniDWGTests) 经 stash 对比确认在本次改动之前就存在,与本次无关。
PropertyTable.cpp 把「渐变(LINEAR)」用 std::string 拼接,中文字面量没包 Tr / N_,tools/i18n_extract.py --lint 报 1 处漏网的中文、CI 的「Lint untranslated text」步骤随之失败(PR 到 main 时 Windows / Web 两项都跑它)。
改为 TrF("渐变({0})", type),与 NodeGraph/Value.cpp 里 TrF("曲线({0})", ...) 同一写法;顺带跑 i18n_extract.py 把这 2 条新原文补进 4 个翻译文件。
验证:--lint 0 处漏网、--check 0 个错误;MiniCADTests 1908 项通过。
CHMOSE023
added a commit
that referenced
this pull request
Nov 5, 2026
渐进色显示、块内弧线Z值和凸度定位、曲线虚线、属性文字与块参照的图层/颜色/字体修复; 另含修复:法向 -Z 曲线另存后镜像、去掉真实图纸数据、补翻译 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.