ADN Club > AutoCAD .NET API

Вставка листов из стороннего чертежа

(1/1)

Atomohod:
Здравствуйте.
Пишу код для вставки листов (пространств) из чертежа на диске в текущий. В итоге работы метода получаю фатал. Не знаю как исправить код. Кто-нибудь может подсказать где у меня ошибка? Акад 2019

--- Код - C# [Выбрать] ---using System;using System.Collections.Generic;using System.IO; using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.Runtime; public class Commands{    /// <summary>    /// Copies all layouts from a specified source DWG file into the current drawing,    /// including all objects within each layout while preserving their positions.    /// If a layout name already exists in the current drawing, a suffix is appended to avoid conflicts.    /// </summary>    [CommandMethod("22CopyLayoutsFromDwg")]    public void CopyLayoutsFromDwg()    {        Document currentDocument = Application.DocumentManager.MdiActiveDocument;        Database destinationDatabase = currentDocument.Database;        Editor editor = currentDocument.Editor;        // Prompt the user for the source DWG file using a file dialog        PromptOpenFileOptions options = new PromptOpenFileOptions("\nSelect the source DWG file:");        options.Filter = "Drawing files (*.dwg)|*.dwg";        options.PreferCommandLine = false;        PromptFileNameResult promptResult = editor.GetFileNameForOpen(options);        if (promptResult.Status != PromptStatus.OK)        {            return;        }        string sourceFilePath = promptResult.StringResult;        // Validate the file existence        if (!File.Exists(sourceFilePath))        {            editor.WriteMessage("\nThe specified file does not exist.");            return;        }        // Open the source database in read-only mode        using (Database sourceDatabase = new Database(false, true))        {            sourceDatabase.ReadDwgFile(sourceFilePath, FileOpenMode.OpenForReadAndAllShare, true, null);            sourceDatabase.CloseInput(true);            // Start transactions for both databases            using (Transaction sourceTx = sourceDatabase.TransactionManager.StartTransaction())            using (Transaction destTx = destinationDatabase.TransactionManager.StartTransaction())            {                // Access layout dictionaries                DBDictionary sourceLayouts = (DBDictionary)sourceTx.GetObject(sourceDatabase.LayoutDictionaryId, OpenMode.ForRead);                DBDictionary destinationLayouts = (DBDictionary)destTx.GetObject(destinationDatabase.LayoutDictionaryId, OpenMode.ForWrite);                LayoutManager layoutManager = LayoutManager.Current;                foreach (DBDictionaryEntry layoutEntry in sourceLayouts)                {                    // Skip the Model layout                    if (layoutEntry.Key == "Model")                    {                        continue;                    }                    Layout sourceLayout = (Layout)sourceTx.GetObject(layoutEntry.Value, OpenMode.ForRead);                    // Determine a unique name for the new layout                    string newLayoutName = layoutEntry.Key;                    int suffix = 1;                    while (destinationLayouts.Contains(newLayoutName))                    {                        newLayoutName = layoutEntry.Key + "_" + suffix++;                    }                    // Create the new layout using LayoutManager                    ObjectId destinationLayoutId = layoutManager.CreateLayout(newLayoutName);                    // Open the new layout for write                    Layout destinationLayout = (Layout)destTx.GetObject(destinationLayoutId, OpenMode.ForWrite);                    // Copy properties from source layout                    destinationLayout.CopyFrom(sourceLayout);                    // Get source and destination block table records                    BlockTableRecord sourceBlockTableRecord = (BlockTableRecord)sourceTx.GetObject(sourceLayout.BlockTableRecordId, OpenMode.ForRead);                    BlockTableRecord destinationBlockTableRecord = (BlockTableRecord)destTx.GetObject(destinationLayout.BlockTableRecordId, OpenMode.ForWrite);                    // Collect objects to clone and track viewports for freeze settings                    ObjectIdCollection objectsToClone = new ObjectIdCollection();                    Dictionary<ObjectId, List<string>> viewportFrozenLayers = new Dictionary<ObjectId, List<string>>();                    foreach (ObjectId objectId in sourceBlockTableRecord)                    {                        using (DBObject obj = sourceTx.GetObject(objectId, OpenMode.ForRead))                        {                            if (obj is Viewport viewport && viewport.Number == 1)                            {                                continue; // Skip the paper space viewport to avoid duplication and corruption                            }                            objectsToClone.Add(objectId);                            // Capture frozen layers only for non-paper space viewports                            if (obj is Viewport vp && vp.Number != 1)                            {                                List<string> frozenLayerNames = new List<string>();                                ObjectIdCollection frozenLayerIds = vp.GetFrozenLayers();                                foreach (ObjectId layerId in frozenLayerIds)                                {                                    LayerTableRecord layer = (LayerTableRecord)sourceTx.GetObject(layerId, OpenMode.ForRead);                                    frozenLayerNames.Add(layer.Name);                                }                                viewportFrozenLayers.Add(objectId, frozenLayerNames);                            }                        }                    }                    if (objectsToClone.Count > 0)                    {                        IdMapping idMapping = new IdMapping();                        destinationDatabase.WblockCloneObjects(objectsToClone, destinationBlockTableRecord.ObjectId, idMapping, DuplicateRecordCloning.Replace, false);                        // Reapply frozen layers to cloned viewports                        LayerTable lt = (LayerTable)destTx.GetObject(destinationDatabase.LayerTableId, OpenMode.ForRead);                        foreach (var kvp in viewportFrozenLayers)                        {                            ObjectId sourceVpId = kvp.Key;                            List<string> frozenNames = kvp.Value;                            IdPair pair = idMapping.Lookup(sourceVpId);                            if (pair != null)                            {                                ObjectId destVpId = pair.Value;                                Viewport destViewport = (Viewport)destTx.GetObject(destVpId, OpenMode.ForWrite);                                ObjectIdCollection destLayerIds = new ObjectIdCollection();                                foreach (ObjectId layerId in lt)                                {                                    LayerTableRecord ltr = (LayerTableRecord)destTx.GetObject(layerId, OpenMode.ForRead);                                    if (frozenNames.Contains(ltr.Name))                                    {                                        destLayerIds.Add(layerId);                                    }                                }                                destViewport.FreezeLayersInViewport(destLayerIds.GetEnumerator());                            }                        }                    }                }                destTx.Commit();                // sourceTx.Commit() not needed as no writes, dispose will handle            }        }        editor.WriteMessage("\nLayouts copied successfully.");    }}

Навигация

[0] Главная страница сообщений

Перейти к полной версии