From 3e9dc9014d313e1e65476ff105aa751565edf361 Mon Sep 17 00:00:00 2001 From: sladro Date: Mon, 12 Jan 2026 16:58:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=A2=E7=99=BD=E6=A1=86?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E7=9A=84=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cad/TemplateDrawingService.cs | 72 +++++++++++++++++++++++++++++++++++ UI/ParamDrawingPanel.cs | 8 ++++ 2 files changed, 80 insertions(+) diff --git a/Cad/TemplateDrawingService.cs b/Cad/TemplateDrawingService.cs index 9140627..2f48301 100644 --- a/Cad/TemplateDrawingService.cs +++ b/Cad/TemplateDrawingService.cs @@ -3396,5 +3396,77 @@ namespace CadParamPluging.Cad return true; } + + /// + /// 在红色边框与白色边框之间的左上角添加"内部资料,控制范围"文字标记 + /// + /// CAD上下文 + /// 布局名称 + /// 是否为模型空间 + /// 是否成功添加 + public static bool AddInternalMaterialLabel(CadContext ctx, string layoutName, bool isModelSpace) + { + if (ctx == null) + { + return false; + } + + var db = ctx.Database; + var tr = ctx.Transaction; + + var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); + var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); + + var allEntities = ms.Cast() + .Select(id => tr.GetObject(id, OpenMode.ForRead, false) as Entity) + .Where(e => e != null && !e.IsErased) + .ToList(); + + // 获取红色边框和白色边框范围 + var redFrameExtents = ComputeRedFrameExtents(tr, allEntities); + var whiteFrameExtents = ComputeWhiteFrameExtentsFromEntities(tr, allEntities); + + if (!redFrameExtents.HasValue || !whiteFrameExtents.HasValue) + { + return false; + } + + var redFrame = redFrameExtents.Value; + var whiteFrame = whiteFrameExtents.Value; + + // 计算插入点:在红框和白框之间的左上角 + // X: 红框左边界稍内侧 + // Y: 红框顶部和白框顶部之间,偏上方 + var insertX = redFrame.MinPoint.X + 2.0; // 距红框左边2mm + var insertY = (redFrame.MaxPoint.Y + whiteFrame.MaxPoint.Y) / 2.0; // 红框与白框顶部中间 + + var insertPoint = new Point3d(insertX, insertY, 0); + + // 创建 MText + var mt = new MText(); + // 使用宋体格式 + mt.Contents = @"{\fSimSun|b0|i0|c134|p2;内部资料,控制范围}"; + mt.Location = insertPoint; + mt.TextHeight = 3.5; + mt.Attachment = AttachmentPoint.MiddleLeft; // 左对齐,垂直居中 + mt.Width = 0; // 不换行 + mt.ColorIndex = 4; // 青色 + + // 尝试设置图层 + try + { + var layerTbl = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead); + string targetLayer = "0"; + if (layerTbl.Has("TEXT")) targetLayer = "TEXT"; + else if (layerTbl.Has("文字")) targetLayer = "文字"; + mt.Layer = targetLayer; + } + catch { } + + ms.AppendEntity(mt); + tr.AddNewlyCreatedDBObject(mt, true); + + return true; + } } } diff --git a/UI/ParamDrawingPanel.cs b/UI/ParamDrawingPanel.cs index 512cd74..ff94e58 100644 --- a/UI/ParamDrawingPanel.cs +++ b/UI/ParamDrawingPanel.cs @@ -462,6 +462,14 @@ namespace CadParamPluging.UI } } + // 添加左上角"内部资料,控制范围"标记 + var labelAdded = TemplateDrawingService.AddInternalMaterialLabel( + ctx, layoutName, isModelSpace); + if (labelAdded) + { + AppendLog("已添加内部资料标记"); + } + ctx.Commit(); try { doc.Editor.Regen(); } catch { }