feat: add ortho annotation removal and package integrity manifest
This commit is contained in:
@@ -53,6 +53,7 @@ public sealed class EntryPoint : IExtensionApplication
|
||||
[CommandMethod("PXP-IE")] public void InsertElevationCommand() => ElevationCommands.RunManual();
|
||||
[CommandMethod("PXP-COV")] public void CheckOrthoViewportCommand() => OrthoMaintenanceCommands.CheckViewport();
|
||||
[CommandMethod("PXP-UOB")] public void UpdateOrthoViewBlocksCommand() => PRecAnnot.Plant3D2026.UpdateOrthoViewBlocksCommand.Run();
|
||||
[CommandMethod("PXP-RA", CommandFlags.Session)] public void RemoveOrthoAnnotationsCommand() => OrthoAnnotationRemovalCommand.Run();
|
||||
[CommandMethod("PXP-AC", CommandFlags.UsePickSet)] public void SwapAttributesCommand() => PRecAnnot.Plant3D2026.SwapAttributesCommand.Run();
|
||||
[CommandMethod("PXP-IOD", CommandFlags.Session)] public void UpdateOrthoDrawingsCommand() => PRecAnnot.Plant3D2026.UpdateOrthoDrawingsCommand.Run();
|
||||
[CommandMethod("mto-ma")] public void ShowManualAnnotationPaletteCommand() => ManualAnnotationPalette.Show();
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
using Autodesk.AutoCAD.ApplicationServices;
|
||||
using Autodesk.AutoCAD.DatabaseServices;
|
||||
using Autodesk.AutoCAD.EditorInput;
|
||||
using Autodesk.ProcessPower.P3dProjectParts;
|
||||
using Autodesk.ProcessPower.PlantInstance;
|
||||
using PRecAnnot.Abstractions;
|
||||
using AcadApplication = Autodesk.AutoCAD.ApplicationServices.Core.Application;
|
||||
|
||||
namespace PRecAnnot.Plant3D2026;
|
||||
|
||||
// Source port of OrthoAutoAnnotate.Commands.RemoveAnnotations (PXP-RA).
|
||||
// The modern writer records the viewport identity in PXP-OA XData, allowing
|
||||
// deterministic removal without depending on the historical named-dictionary scan.
|
||||
internal static class OrthoAnnotationRemovalCommand
|
||||
{
|
||||
private const string ApplicationName = "PXP-OA";
|
||||
|
||||
public static void Run()
|
||||
{
|
||||
var document = AcadApplication.DocumentManager.MdiActiveDocument;
|
||||
if (document is null) return;
|
||||
try
|
||||
{
|
||||
var options = new PromptEntityOptions("\nSelect Ortho viewport: ");
|
||||
options.SetRejectMessage("\nA viewport is required.");
|
||||
options.AddAllowedClass(typeof(Viewport), true);
|
||||
var selected = document.Editor.GetEntity(options);
|
||||
if (selected.Status != PromptStatus.OK) return;
|
||||
var viewport = Resolve(document, selected.ObjectId);
|
||||
|
||||
using var documentLock = document.LockDocument();
|
||||
using var transaction = document.Database.TransactionManager.StartTransaction();
|
||||
var blocks = (BlockTable)transaction.GetObject(document.Database.BlockTableId, OpenMode.ForRead);
|
||||
var paper = (BlockTableRecord)transaction.GetObject(blocks[BlockTableRecord.PaperSpace], OpenMode.ForRead);
|
||||
var removed = 0;
|
||||
foreach (ObjectId id in paper)
|
||||
{
|
||||
var entity = transaction.GetObject(id, OpenMode.ForRead) as Entity;
|
||||
if (entity is null || !OwnedByViewport(entity, viewport.Id)) continue;
|
||||
entity.UpgradeOpen();
|
||||
entity.Erase();
|
||||
removed++;
|
||||
}
|
||||
transaction.Commit();
|
||||
document.Editor.WriteMessage($"\nPXP-RA: removed={removed}; native AutoCAD UNDO is available.");
|
||||
RuntimeDiagnostics.Write("OrthoAnnotationRemovalCompleted", commandName: "PXP-RA", resultStatus: "Completed", document: document, details: new Dictionary<string, object?> { ["Removed"] = removed, ["Viewport"] = viewport.Id });
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
RuntimeDiagnostics.Write("OrthoAnnotationRemovalFailed", "ERROR", commandName: "PXP-RA", resultStatus: exception.Message, exception: exception, document: document);
|
||||
document.Editor.WriteMessage("\nPXP-RA: " + exception.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private static OrthoViewportInfo Resolve(Document document, ObjectId selectedId)
|
||||
{
|
||||
using var transaction = document.Database.TransactionManager.StartOpenCloseTransaction();
|
||||
var selected = (Viewport)transaction.GetObject(selectedId, OpenMode.ForRead);
|
||||
var project = PlantApplication.ProjectPart("Ortho") as OrthoProject ?? throw new InvalidOperationException("ORTHO_PROJECT_UNAVAILABLE");
|
||||
var matches = new PlantOrthoViewportReader(project, document.Name).ReadViewports(CancellationToken.None)
|
||||
.Where(x => Math.Abs(x.CenterX - selected.CenterPoint.X) < .001 && Math.Abs(x.CenterY - selected.CenterPoint.Y) < .001 && Math.Abs(x.Width - selected.Width) < .001 && Math.Abs(x.Height - selected.Height) < .001)
|
||||
.ToArray();
|
||||
return matches.Length == 1 ? matches[0] : throw new InvalidOperationException(matches.Length == 0 ? "ORTHO_VIEW_NOT_FOUND" : "ORTHO_VIEW_AMBIGUOUS");
|
||||
}
|
||||
|
||||
private static bool OwnedByViewport(Entity entity, string viewportId)
|
||||
{
|
||||
using var data = entity.GetXDataForApplication(ApplicationName);
|
||||
var values = data?.AsArray().Where(value => value.TypeCode == (int)DxfCode.ExtendedDataAsciiString).Select(value => value.Value?.ToString()).ToArray();
|
||||
return values is { Length: >= 2 } && string.Equals(values[0], "VIEWPORT", StringComparison.Ordinal) && string.Equals(values[1], viewportId, StringComparison.Ordinal);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user