From ad9968f622fc280690277e362bae9b2d9ee502a7 Mon Sep 17 00:00:00 2001 From: sladro Date: Sat, 28 Feb 2026 08:49:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20CAD=20=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E5=9B=BE=E7=BA=B8=E6=9C=8D=E5=8A=A1=EF=BC=8C=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E6=89=93=E5=BC=80=E6=A8=A1=E6=9D=BF=E3=80=81=E6=B8=85?= =?UTF-8?q?=E7=90=86=E5=8C=B9=E9=85=8D=E5=8F=82=E6=95=B0=E6=A0=87=E6=B3=A8?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E6=8F=90=E4=BE=9B=E7=9B=B8=E5=85=B3=20UI=20?= =?UTF-8?q?=E5=92=8C=E5=AD=97=E5=85=B8=E8=BE=85=E5=8A=A9=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cad/DictionaryHelper.cs | 46 ++++++++++++++++++++++++++++++++--- Cad/TemplateDrawingService.cs | 29 +++++++++++++++++++--- Common/NoteTemplateEngine.cs | 8 +++--- UI/DrawingParamsForm.cs | 5 ++-- 4 files changed, 74 insertions(+), 14 deletions(-) diff --git a/Cad/DictionaryHelper.cs b/Cad/DictionaryHelper.cs index 323137d..2567e6b 100644 --- a/Cad/DictionaryHelper.cs +++ b/Cad/DictionaryHelper.cs @@ -48,16 +48,25 @@ namespace CadParamPluging.Cad // XRecord 本质上是一个 ResultBuffer 链表 // 我们使用 DxfCode.Text (1000) 来存储 key=value 字符串 var rb = new ResultBuffer(); + // serialize user inputs into a single text block + var fullString = ""; foreach (var item in bag.Items) { if (!string.IsNullOrWhiteSpace(item.Key)) { - // 格式: Key=Value - // 也可以分开存储,但简单的 Key=Value 字符串更紧凑 - string entry = $"{item.Key}={item.Value ?? string.Empty}"; - rb.Add(new TypedValue((int)DxfCode.Text, entry)); + fullString += $"{item.Key}={item.Value ?? string.Empty}\n"; } } + + // DxfCode.Text has a 255-character limit in AutoCAD ResultBuffer. + // We use code 301 (XTextString) and chunk the string to support any length. + var temp = fullString; + while (temp.Length > 0) + { + var chunk = temp.Length > 250 ? temp.Substring(0, 250) : temp; + rb.Add(new TypedValue(301, chunk)); // 301 = DxfCode.XTextString + temp = temp.Length > 250 ? temp.Substring(250) : ""; + } try { @@ -114,6 +123,35 @@ namespace CadParamPluging.Cad return bag; } + var sb = new System.Text.StringBuilder(); + bool hasCode301 = false; + + // Read chunks from new format + foreach (var tv in rb) + { + if (tv.TypeCode == 301) + { + hasCode301 = true; + if (tv.Value is string s) + { + sb.Append(s); + } + } + } + + if (hasCode301) + { + var fullText = sb.ToString(); + foreach (var line in fullText.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)) + { + var parts = line.Split(new[] { '=' }, 2); + if (parts.Length == 2) bag.Set(parts[0], parts[1]); + else if (parts.Length == 1) bag.Set(parts[0], ""); + } + return bag; + } + + // Fallback to read from old Code 1 format foreach (var tv in rb) { if (tv.TypeCode == (int)DxfCode.Text) diff --git a/Cad/TemplateDrawingService.cs b/Cad/TemplateDrawingService.cs index f4ef903..a7e7e31 100644 --- a/Cad/TemplateDrawingService.cs +++ b/Cad/TemplateDrawingService.cs @@ -288,8 +288,17 @@ namespace CadParamPluging.Cad var dict = (DBDictionary)tr.GetObject(ent.ExtensionDictionary, OpenMode.ForWrite); const string DictName = "CadParamPluging_NoteData"; - // XRecord - var rb = new ResultBuffer(new TypedValue((int)DxfCode.Text, template)); + // XRecord limits text to 255 characters per element. + // Split string into 250 character chunks using DxfCode.XTextString (301) + var rb = new ResultBuffer(); + var temp = template; + while (temp.Length > 0) + { + var chunk = temp.Length > 250 ? temp.Substring(0, 250) : temp; + rb.Add(new TypedValue(301, chunk)); // 301 = DxfCode.XTextString + temp = temp.Length > 250 ? temp.Substring(250) : ""; + } + var xrec = new Xrecord { Data = rb }; if (dict.Contains(DictName)) @@ -319,6 +328,20 @@ namespace CadParamPluging.Cad var rb = xrec.Data; if (rb == null) return null; + var sb = new System.Text.StringBuilder(); + bool hasCode301 = false; + foreach (var tv in rb) + { + if (tv.TypeCode == 301) + { + hasCode301 = true; + if (tv.Value is string s) sb.Append(s); + } + } + + if (hasCode301) return sb.ToString(); + + // Fallback for old code format foreach (var tv in rb) { if (tv.TypeCode == (int)DxfCode.Text) @@ -457,7 +480,7 @@ namespace CadParamPluging.Cad Func getValueW = (k) => { var val = bag.GetString(k); - if (k != null && (k.StartsWith("Hardness", StringComparison.OrdinalIgnoreCase) || k.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase))) + if (k != null && k.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase)) { if (bag.GetString(k + "_ShowInNote") == "0") return "__SKIP_NOTE__"; } diff --git a/Common/NoteTemplateEngine.cs b/Common/NoteTemplateEngine.cs index f9b6f5b..a44c1cb 100644 --- a/Common/NoteTemplateEngine.cs +++ b/Common/NoteTemplateEngine.cs @@ -248,8 +248,8 @@ namespace CadParamPluging.Common } else if (string.Equals(val, "空", StringComparison.OrdinalIgnoreCase)) { - // Exception: MarkingContent (标刻内容) should NOT cause line skip - if (key == null || !key.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase)) + // Exception: MarkingContent (标刻内容) and Hardness (硬度) should NOT cause line skip + if (key == null || !(key.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase) || key.StartsWith("Hardness", StringComparison.OrdinalIgnoreCase))) { shouldSkip = true; } @@ -303,9 +303,9 @@ namespace CadParamPluging.Common // Handle "空" value if (string.Equals(v, "空", StringComparison.OrdinalIgnoreCase)) { - if (string.Equals(key, "MarkingContent", StringComparison.OrdinalIgnoreCase)) + if (key != null && (key.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase) || key.StartsWith("Hardness", StringComparison.OrdinalIgnoreCase))) { - // MarkingContent -> render empty string + // MarkingContent / Hardness -> render empty string // (Separators will be cleaned up later) } else diff --git a/UI/DrawingParamsForm.cs b/UI/DrawingParamsForm.cs index 9b14b84..2d50571 100644 --- a/UI/DrawingParamsForm.cs +++ b/UI/DrawingParamsForm.cs @@ -427,8 +427,7 @@ namespace CadParamPluging.UI } Control finalCtrl = ctrl; - if (string.Equals(def.Key, "Hardness", StringComparison.OrdinalIgnoreCase) || - string.Equals(def.Key, "MarkingContent", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(def.Key, "MarkingContent", StringComparison.OrdinalIgnoreCase)) { var flow = new FlowLayoutPanel { @@ -657,7 +656,7 @@ namespace CadParamPluging.UI Func getValueW = (k) => { var val = tempBag.GetString(k); - if (k != null && (k.StartsWith("Hardness", StringComparison.OrdinalIgnoreCase) || k.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase))) + if (k != null && k.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase)) { if (tempBag.GetString(k + "_ShowInNote") == "0") return "__SKIP_NOTE__"; }