feat: add manual annotation edit and reopen workflow
This commit is contained in:
@@ -57,7 +57,7 @@ public sealed class EntryPoint : IExtensionApplication
|
|||||||
[CommandMethod("PXP-IOD", CommandFlags.Session)] public void UpdateOrthoDrawingsCommand() => PRecAnnot.Plant3D2026.UpdateOrthoDrawingsCommand.Run();
|
[CommandMethod("PXP-IOD", CommandFlags.Session)] public void UpdateOrthoDrawingsCommand() => PRecAnnot.Plant3D2026.UpdateOrthoDrawingsCommand.Run();
|
||||||
[CommandMethod("mto-ma")] public void ShowManualAnnotationPaletteCommand() => ManualAnnotationPalette.Show();
|
[CommandMethod("mto-ma")] public void ShowManualAnnotationPaletteCommand() => ManualAnnotationPalette.Show();
|
||||||
[CommandMethod("PXP-MA")] public void ShowManualAnnotationPaletteAliasCommand() => ManualAnnotationPalette.Show();
|
[CommandMethod("PXP-MA")] public void ShowManualAnnotationPaletteAliasCommand() => ManualAnnotationPalette.Show();
|
||||||
[CommandMethod("CAC1")] public void PlaceManualAnnotationCommand() => ManualAnnotationPalette.PlaceSelected();
|
[CommandMethod("CAC1")] public void PlaceManualAnnotationCommand() => ManualAnnotationEditCommand.Run();
|
||||||
[CommandMethod("PXP-MAB")] public void InsertManualBlockCommand() => ManualBlockInsertionCommand.Run(ManualAnnotationPalette.CurrentState());
|
[CommandMethod("PXP-MAB")] public void InsertManualBlockCommand() => ManualBlockInsertionCommand.Run(ManualAnnotationPalette.CurrentState());
|
||||||
|
|
||||||
[CommandMethod("PHP_REC_AUTOMATION_START", CommandFlags.Session)]
|
[CommandMethod("PHP_REC_AUTOMATION_START", CommandFlags.Session)]
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
using Autodesk.AutoCAD.DatabaseServices;
|
||||||
|
using Autodesk.AutoCAD.EditorInput;
|
||||||
|
using Autodesk.AutoCAD.ApplicationServices;
|
||||||
|
using PRecAnnot.Core;
|
||||||
|
using AcadApplication = Autodesk.AutoCAD.ApplicationServices.Application;
|
||||||
|
|
||||||
|
namespace PRecAnnot.Plant3D2026;
|
||||||
|
|
||||||
|
internal static class ManualAnnotationEditCommand
|
||||||
|
{
|
||||||
|
private const string AppName = "P_REC_ANNOT_MANUAL";
|
||||||
|
|
||||||
|
public static void Run()
|
||||||
|
{
|
||||||
|
var document = AcadApplication.DocumentManager.MdiActiveDocument;
|
||||||
|
if (document is null) return;
|
||||||
|
var options = new PromptEntityOptions("\nSelect owned manual annotation to edit: ");
|
||||||
|
options.SetRejectMessage("\nSelect a block reference.");
|
||||||
|
options.AddAllowedClass(typeof(BlockReference), true);
|
||||||
|
var selection = document.Editor.GetEntity(options);
|
||||||
|
if (selection.Status != PromptStatus.OK) return;
|
||||||
|
|
||||||
|
using var documentLock = document.LockDocument();
|
||||||
|
using var transaction = document.Database.TransactionManager.StartTransaction();
|
||||||
|
var reference = transaction.GetObject(selection.ObjectId, OpenMode.ForWrite) as BlockReference;
|
||||||
|
if (reference is null) return;
|
||||||
|
var state = ReadState(reference);
|
||||||
|
if (state is null)
|
||||||
|
{
|
||||||
|
document.Editor.WriteMessage("\nManual annotation state is missing or invalid; no migration was performed.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
document.Editor.WriteMessage($"\nRestored {state.Kind}; datum={state.DatumMode}; offset={state.DatumOffset:0.###}.");
|
||||||
|
foreach (ObjectId attributeId in reference.AttributeCollection)
|
||||||
|
{
|
||||||
|
var attribute = transaction.GetObject(attributeId, OpenMode.ForWrite) as AttributeReference;
|
||||||
|
if (attribute is null) continue;
|
||||||
|
var prompt = new PromptStringOptions($"\n{attribute.Tag} <{attribute.TextString}>: ") { AllowSpaces = true, UseDefaultValue = true, DefaultValue = attribute.TextString };
|
||||||
|
var value = document.Editor.GetString(prompt);
|
||||||
|
if (value.Status == PromptStatus.OK) attribute.TextString = value.StringResult;
|
||||||
|
else if (value.Status is PromptStatus.Cancel or PromptStatus.Error) return;
|
||||||
|
}
|
||||||
|
reference.XData = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, AppName), new TypedValue((int)DxfCode.ExtendedDataAsciiString, state.Serialize()));
|
||||||
|
transaction.Commit();
|
||||||
|
document.Editor.WriteMessage("\nManual annotation updated; native AutoCAD UNDO is available.");
|
||||||
|
RuntimeDiagnostics.Write("ManualAnnotationEditCompleted", commandName: "CAC1", resultStatus: "Updated", document: document);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ManualAnnotationState? ReadState(BlockReference reference)
|
||||||
|
{
|
||||||
|
using var data = reference.GetXDataForApplication(AppName);
|
||||||
|
var serialized = data?.AsArray().FirstOrDefault(value => value.TypeCode == (int)DxfCode.ExtendedDataAsciiString).Value as string;
|
||||||
|
return ManualAnnotationState.Deserialize(serialized);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user