就差参数生成图纸了

This commit is contained in:
sladro 2025-12-16 10:21:37 +08:00
parent ea9e86f1ea
commit d4a9f092ff
3 changed files with 191 additions and 10 deletions

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
@ -10,6 +11,12 @@ namespace CadParamPluging.Cad
{
public static class TemplateDrawingService
{
private static readonly Regex MatchFieldRegex = new Regex(
@"^\s*(交付状态|工艺方法|结构特征|特殊条件)\s*[:]\s*(.+?)\s*$",
RegexOptions.Compiled);
private static readonly Regex MTextFormatRegex = new Regex(@"\\[A-Za-z]+[^;]*;", RegexOptions.Compiled);
public static Document CreateDocumentFromTemplate(TemplateInfo template)
{
var doc = Application.DocumentManager.Add(template.FilePath);
@ -17,6 +24,162 @@ namespace CadParamPluging.Cad
return doc;
}
/// <summary>
/// 移除模板中用于“匹配模板/图纸”的参数标注文本(交付状态/工艺方法/结构特征/特殊条件)。
/// 仅清理当前生成图纸中目标空间Layout 或 ModelSpace里的文本实体/块属性。
/// </summary>
public static int RemoveMatchParameterAnnotations(CadContext ctx, string layoutName, bool scanModelSpace)
{
if (ctx == null)
{
throw new ArgumentNullException(nameof(ctx));
}
var db = ctx.Database;
var tr = ctx.Transaction;
if (scanModelSpace)
{
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
return EraseMatchTextEntities(tr, ms);
}
if (string.IsNullOrWhiteSpace(layoutName))
{
return 0;
}
var layoutDict = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
ObjectId layoutId = ObjectId.Null;
foreach (DBDictionaryEntry entry in layoutDict)
{
if (string.Equals(entry.Key, layoutName, StringComparison.OrdinalIgnoreCase))
{
layoutId = entry.Value;
break;
}
}
if (layoutId.IsNull)
{
return 0;
}
var layout = (Layout)tr.GetObject(layoutId, OpenMode.ForRead);
var btr = (BlockTableRecord)tr.GetObject(layout.BlockTableRecordId, OpenMode.ForWrite);
return EraseMatchTextEntities(tr, btr);
}
private static int EraseMatchTextEntities(Transaction tr, BlockTableRecord btr)
{
if (tr == null || btr == null)
{
return 0;
}
var removed = 0;
var ids = btr.Cast<ObjectId>().ToList();
foreach (var id in ids)
{
var ent = tr.GetObject(id, OpenMode.ForWrite, false) as Entity;
if (ent == null)
{
continue;
}
if (ent is DBText t)
{
if (ContainsMatchField(t.TextString))
{
ent.Erase(true);
removed++;
}
continue;
}
if (ent is MText mt)
{
var plain = SimplifyMText(mt.Contents);
if (ContainsMatchField(plain))
{
ent.Erase(true);
removed++;
}
continue;
}
if (ent is BlockReference br)
{
foreach (ObjectId attId in br.AttributeCollection)
{
var att = tr.GetObject(attId, OpenMode.ForWrite, false) as AttributeReference;
if (att == null)
{
continue;
}
if (ContainsMatchField(att.TextString))
{
try
{
att.Erase(true);
removed++;
}
catch
{
// ignore
}
}
}
}
}
return removed;
}
private static bool ContainsMatchField(string raw)
{
if (string.IsNullOrWhiteSpace(raw))
{
return false;
}
var lines = raw
.Replace("\r\n", "\n")
.Replace("\r", "\n")
.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => (s ?? string.Empty).Trim())
.Where(s => s.Length > 0);
foreach (var line in lines)
{
if (MatchFieldRegex.IsMatch(line))
{
return true;
}
}
return false;
}
private static string SimplifyMText(string contents)
{
if (string.IsNullOrEmpty(contents))
{
return string.Empty;
}
var s = contents
.Replace("\\P", "\n")
.Replace("\\p", "\n")
.Replace("\\~", " ");
s = s.Replace("{", string.Empty).Replace("}", string.Empty);
s = MTextFormatRegex.Replace(s, string.Empty);
return s;
}
public static void KeepOnlyLayout(Document doc, string layoutName)
{
if (doc == null)

View File

@ -16,13 +16,13 @@ namespace CadParamPluging
{
private static PaletteSet _palette;
private static bool _ribbonButtonCreated;
private static bool _firstShow = true;
private const string RibbonTabId = "CadParamPlugingTab";
private const string RibbonPanelId = "CadParamPlugingPanel";
private const string RibbonButtonId = "CadParamPlugingPanelButton";
public void Initialize()
{
EnsurePaletteCreated();
CreateRibbonButton();
Application.Idle += OnApplicationIdle;
}
@ -32,7 +32,7 @@ namespace CadParamPluging
// 可在此释放资源或记录日志
}
private void EnsurePaletteCreated()
private void ShowPalette()
{
if (_palette == null)
{
@ -41,23 +41,32 @@ namespace CadParamPluging
Style = PaletteSetStyles.ShowCloseButton |
PaletteSetStyles.ShowAutoHideButton |
PaletteSetStyles.Snappable,
DockEnabled = DockSides.Right,
Dock = DockSides.Right
DockEnabled = DockSides.Left | DockSides.Right
};
var panel = new ParamDrawingPanel();
_palette.Add("Main", panel);
_palette.MinimumSize = new Size(240, 200);
}
_palette.Visible = true;
if (_firstShow)
{
_firstShow = false;
Application.Idle += OnDockToRight;
}
_palette.Activate(0);
}
private void ShowPalette()
private void OnDockToRight(object sender, EventArgs e)
{
EnsurePaletteCreated();
_palette.Dock = DockSides.Right;
_palette.Visible = true;
_palette.Activate(0);
Application.Idle -= OnDockToRight;
if (_palette != null)
{
_palette.Dock = DockSides.Right;
}
}
private void CreateRibbonButton()

View File

@ -559,6 +559,15 @@ namespace CadParamPluging.UI
using (doc.LockDocument())
using (var ctx = new CadContext(doc))
{
var removed = TemplateDrawingService.RemoveMatchParameterAnnotations(
ctx,
_selectedTemplate.LayoutName,
_selectedModelWindow.HasValue);
if (removed > 0)
{
AppendLog($"已移除模板匹配参数标注文本: {removed} 处");
}
var cadService = new CadDrawingService(ctx);
DomainFacade.DrawByParams(_selectedTemplate, drawingParams, cadService);
ctx.Commit();