При копировании объектов из одного чертежа в другой не наследуются слои объектов

Автор Тема: При копировании объектов из одного чертежа в другой не наследуются слои объектов  (Прочитано 7570 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй такое:
Код - C# [Выбрать]
  1. [CommandMethod("syncdrawings"/*, CommandFlags.Session*/)]
  2. public static void SynchronizeDrawings()
  3. {
  4.   Drawing originDrawing = new Drawing();
  5.   var originDrawings = originDrawing.GetDrawingDatabases(@"E:\sync\");
  6.  
  7.   // Get the current document and database
  8.   Document acDoc = Application.DocumentManager.MdiActiveDocument;
  9.   Database acCurDb = acDoc.Database;
  10.   ObjectId idMSpace = ObjectId.Null;
  11.   using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  12.   {
  13.     BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  14.     idMSpace = acBlkTbl[BlockTableRecord.ModelSpace];
  15.     acTrans.Commit();
  16.   }
  17.  
  18.   foreach (var db in originDrawings)
  19.   {
  20.     using (IdMapping idMap = new IdMapping())
  21.     {
  22.       db.WblockCloneObjects(originDrawing.GetObjects(db), idMSpace, idMap, DuplicateRecordCloning.Ignore, false); // !!!!
  23.     }
  24.   }
  25.   //acCurDb.Save();
  26.  
  27. }

Но в любом случае программу нужно всю переделать для того, чтобы открывать чертежи и копировать из них поочередно.
« Последнее редактирование: 23-09-2019, 23:35:43 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 24-09-2019, 22:43:10

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Но в любом случае программу нужно всю переделать для того, чтобы открывать чертежи и копировать из них поочередно.
Вот так будет лучше:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using System.IO;
  9.  
  10. [assembly: CommandClass(typeof(DrawingSynchronizer.Synchronizer))]
  11.  
  12. namespace DrawingSynchronizer
  13. {
  14.   public class Synchronizer
  15.   {
  16.     [CommandMethod("syncdrawings"/*, CommandFlags.Session*/)]
  17.     public static void SynchronizeDrawings()
  18.     {
  19.       List<string> fileNames = GetDrawingsPath(@"E:\sync\");
  20.  
  21.       // Get the current document and database
  22.       Document acDoc = Application.DocumentManager.MdiActiveDocument;
  23.       Database acCurDb = acDoc.Database;
  24.       ObjectId idMSpace = ObjectId.Null;
  25.       using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  26.       {
  27.         BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  28.         idMSpace = acBlkTbl[BlockTableRecord.ModelSpace];
  29.         acTrans.Commit();
  30.       }
  31.  
  32.       foreach (string fileName in fileNames)
  33.       {
  34.         using (Database db = new Database(false, true))
  35.         {
  36.           db.ReadDwgFile(fileName, FileOpenMode.OpenForReadAndAllShare, false, null);
  37.           using (IdMapping idMap = new IdMapping())
  38.           {
  39.             db.WblockCloneObjects(GetObjects(db), idMSpace, idMap, DuplicateRecordCloning.Ignore, false); // !!!!
  40.           }
  41.         }
  42.       }
  43.       //acCurDb.Save();
  44.  
  45.     }
  46.  
  47.     public static List<string> GetDrawingsPath(string path)
  48.     {
  49.       List<string> paths = new List<string>();
  50.       try
  51.       {
  52.         DirectoryInfo d = new DirectoryInfo(path);
  53.         FileInfo[] Files = d.GetFiles("*.dwg");
  54.  
  55.         foreach (FileInfo file in Files)
  56.         {
  57.           string filePath = path + Path.GetFileName(file.FullName);
  58.           paths.Add(filePath);
  59.         }
  60.       }
  61.       catch (System.Exception ex)
  62.       {
  63.         Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  64.       }
  65.  
  66.       return paths;
  67.     }
  68.  
  69.     public static ObjectIdCollection GetObjects(Database db)
  70.     {
  71.       ObjectIdCollection objectIdCollection = new ObjectIdCollection();
  72.  
  73.       using (Transaction tr = db.TransactionManager.StartTransaction())
  74.       {
  75.         BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false, false);
  76.         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
  77.  
  78.         foreach (var item in btr)
  79.         {
  80.           Entity ent = (Entity)tr.GetObject(item, OpenMode.ForRead);
  81.  
  82.           if (Synchronizer.CheckEntityLayer(ent))
  83.           {
  84.             objectIdCollection.Add(ent.ObjectId);
  85.           }
  86.         }
  87.  
  88.         tr.Commit();
  89.       }
  90.  
  91.       return objectIdCollection;
  92.     }
  93.  
  94.     public static bool CheckEntityLayer(Entity entity)
  95.     {
  96.       if (Utilities.BasicLayers.layersToSync.Contains(entity.Layer))
  97.       {
  98.         return true;
  99.       }
  100.       else
  101.       {
  102.         return false;
  103.       }
  104.     }
  105.  
  106.   }
  107.  
  108. }
  109.  
  110. namespace Utilities
  111. {
  112.   public static class BasicLayers
  113.   {
  114.     public const string Titles = "-10-Titles";
  115.     public const string Equipment = "-10-Equipment";
  116.     public const string Auxiliary = "-10-Auxiliary";
  117.     public const string Adapter1C = "-10-Adapter1C";
  118.     public const string Cabins = "-10-Cabins";
  119.     public const string FrameRulers = "-10-FrameRulers";
  120.     public const string Dimensions = "-10-Dimensions";
  121.     public const string Doors = "-10-Doors";
  122.     public const string Coverings = "-10-Coverings";
  123.     public const string Openings = "-10-Openings";
  124.     public const string Hull = "-10-Hull";
  125.     public const string Ladders = "-10-Ladders";
  126.     public const string Manholes = "-10-Manholes";
  127.     public const string FrameGrid = "-10-FrameGrid";
  128.     public const string PhantomLines = "-10-PhantomLines";
  129.     public const string Projections = "-10-Projections";
  130.     public const string Railing = "-10-Railings";
  131.     public const string RemovableFloors = "-10-RemovableFloors";
  132.     public const string SpaceDesignations = "-10-SpaceDesignations";
  133.     public const string BulkheadsAndDecks = "-10-Bulkheads&Decks";
  134.     public const string BulkheadsAndDecksThin = "-10-Bulkheads&DecksThin";
  135.     public const string Stiffeners = "-10-Stiffeners";
  136.     public const string SystemTraces = "-10-SystemTraces";
  137.     public const string Text = "-10-Text";
  138.     public const string Viewports = "-10-Viewports";
  139.     public const string Windows = "-10-Windows";
  140.     public const string ServiceAreas = "-10-ServiceAreas";
  141.     public const string HVAC = "-10-HVAC";
  142.     public const string Bioshield = "-10-Bioshield";
  143.  
  144.     public static List<string> layersToSync = new List<string>
  145.             {
  146.                 BulkheadsAndDecks, BulkheadsAndDecksThin, SpaceDesignations
  147.             };
  148.   }
  149. }
На всех твоих трёх чертежах у меня работает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
На всех твоих трёх чертежах у меня работает.
Спасибо огромное! У меня тоже работает. А в чем была ошибка, почему я хватал fatal error? Как мне этого избежать в других проектах?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А в чем была ошибка, почему я хватал fatal error?
idMap не чистился при очередном db.WblockCloneObjects и соответственно в нём были объекты, которые ссылались на Database, который был удалён (после вызова db.Dispose()).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение