增加参数保存功能,修复这个功能bug,现在可以用了

This commit is contained in:
sladro 2025-12-31 16:01:26 +08:00
parent 2a4894657f
commit fed5a15745

View File

@ -264,11 +264,71 @@ namespace CadParamPluging.Cad
{ {
public int Score; public int Score;
public string Kind; public string Kind;
public ObjectId TargetId; // Added for persistence tracking
public string PlainText; public string PlainText;
public string OriginalContents; public string OriginalContents;
public Action<string> Apply; public Action<string> Apply;
} }
/// <summary>
/// 在实体扩展字典中保存原始模板文本,以便下次重新生成时可以再次使用
/// </summary>
private static void SetNoteTemplateData(Transaction tr, ObjectId id, string template)
{
if (string.IsNullOrEmpty(template)) return;
var ent = tr.GetObject(id, OpenMode.ForWrite) as Entity;
if (ent == null) return;
if (ent.ExtensionDictionary.IsNull)
{
ent.CreateExtensionDictionary();
}
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));
var xrec = new Xrecord { Data = rb };
if (dict.Contains(DictName))
{
var oldId = dict.GetAt(DictName);
var oldXrec = (Xrecord)tr.GetObject(oldId, OpenMode.ForWrite);
oldXrec.Data = rb;
}
else
{
dict.SetAt(DictName, xrec);
tr.AddNewlyCreatedDBObject(xrec, true);
}
}
private static string GetNoteTemplateData(Transaction tr, ObjectId id)
{
var ent = tr.GetObject(id, OpenMode.ForRead) as Entity;
if (ent == null || ent.ExtensionDictionary.IsNull) return null;
var dict = (DBDictionary)tr.GetObject(ent.ExtensionDictionary, OpenMode.ForRead);
const string DictName = "CadParamPluging_NoteData";
if (!dict.Contains(DictName)) return null;
var xrec = (Xrecord)tr.GetObject(dict.GetAt(DictName), OpenMode.ForRead);
var rb = xrec.Data;
if (rb == null) return null;
foreach (var tv in rb)
{
if (tv.TypeCode == (int)DxfCode.Text)
{
return tv.Value as string;
}
}
return null;
}
public static NoteApplyResult ApplyNoteTemplate(CadContext ctx, string layoutName, bool scanModelSpace, TemplateSchemaDefinition schema, ParamBag bag) public static NoteApplyResult ApplyNoteTemplate(CadContext ctx, string layoutName, bool scanModelSpace, TemplateSchemaDefinition schema, ParamBag bag)
{ {
if (ctx == null) if (ctx == null)
@ -291,8 +351,8 @@ namespace CadParamPluging.Cad
return new NoteApplyResult { Applied = false, Message = "未配置附注绑定,跳过。" }; return new NoteApplyResult { Applied = false, Message = "未配置附注绑定,跳过。" };
} }
var tr = ctx.Transaction;
var db = ctx.Database; var db = ctx.Database;
var tr = ctx.Transaction;
var space = GetTargetSpace(tr, db, layoutName, scanModelSpace); var space = GetTargetSpace(tr, db, layoutName, scanModelSpace);
if (space == null) if (space == null)
@ -300,6 +360,29 @@ namespace CadParamPluging.Cad
return new NoteApplyResult { Applied = false, Message = "未找到目标空间,跳过附注替换。" }; return new NoteApplyResult { Applied = false, Message = "未找到目标空间,跳过附注替换。" };
} }
// 1. 优先查找已经标记过的 Note Entity (重生成场景)
foreach (ObjectId id in space)
{
var storedTemplate = GetNoteTemplateData(tr, id);
if (!string.IsNullOrEmpty(storedTemplate))
{
// 找到了之前的附注,使用存储的模板重新渲染
var effectiveStored = NoteTemplateEngine.BuildEffectiveValueKeyBindings(schema.NoteBindings);
var renderedStored = NoteTemplateEngine.Render(storedTemplate, effectiveStored, bag.GetString);
ApplyNoteTextToObject(tr, id, "ExistingTaggedNote", renderedStored, null);
return new NoteApplyResult
{
Applied = true,
TargetKind = "ExistingTaggedNote",
PlaceholderCountInDwg = 0,
RenderedText = renderedStored,
Message = "已更新现有附注 (基于存储的模板)。"
};
}
}
var candidates = new List<NoteCandidate>(); var candidates = new List<NoteCandidate>();
var visitedBlocks = new HashSet<ObjectId>(); var visitedBlocks = new HashSet<ObjectId>();
foreach (ObjectId id in space) foreach (ObjectId id in space)
@ -368,13 +451,16 @@ namespace CadParamPluging.Cad
space.AppendEntity(mt); space.AppendEntity(mt);
tr.AddNewlyCreatedDBObject(mt, true); tr.AddNewlyCreatedDBObject(mt, true);
// 关键:标记该实体,保存模板文本
SetNoteTemplateData(tr, mt.ObjectId, schema.NoteTemplateText);
return new NoteApplyResult return new NoteApplyResult
{ {
Applied = true, Applied = true,
TargetKind = "CreatedMText", TargetKind = "CreatedMText",
PlaceholderCountInDwg = 0, PlaceholderCountInDwg = 0,
RenderedText = renderedForCreation, RenderedText = renderedForCreation,
Message = "未找到附注定位,已自动创建 (左下角对齐)。" Message = "未找到附注定位,已自动创建并标记。"
}; };
} }
} }
@ -405,13 +491,18 @@ namespace CadParamPluging.Cad
var rendered = NoteTemplateEngine.Render(templateText, effective, bag.GetString); var rendered = NoteTemplateEngine.Render(templateText, effective, bag.GetString);
best.Apply(rendered); best.Apply(rendered);
if (!best.TargetId.IsNull)
{
SetNoteTemplateData(tr, best.TargetId, templateText);
}
return new NoteApplyResult return new NoteApplyResult
{ {
Applied = true, Applied = true,
TargetKind = best.Kind, TargetKind = best.Kind,
PlaceholderCountInDwg = placeholderCount, PlaceholderCountInDwg = placeholderCount,
RenderedText = rendered, RenderedText = rendered,
Message = "附注已替换。" Message = "附注已替换并标记。"
}; };
} }
@ -533,6 +624,7 @@ namespace CadParamPluging.Cad
{ {
Score = score, Score = score,
Kind = kind, Kind = kind,
TargetId = id, // Store ID
PlainText = plainText, PlainText = plainText,
OriginalContents = originalContents, OriginalContents = originalContents,
Apply = rendered => ApplyNoteTextToObject(tr, id, kind, rendered, originalContents) Apply = rendered => ApplyNoteTextToObject(tr, id, kind, rendered, originalContents)