Создание листов

Автор Тема: Создание листов  (Прочитано 19684 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Николай КоломоецАвтор темы

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Создание листов
« : 20-05-2015, 12:05:49 »
Добрый день всем гуру программирования.

Есть модуль, который делает следующее:
1. создает набор листов, импортируя их с заранее заданного шаблона
2. создает на каждом новом листе видовой экран, с определенным содержимым

Суть проблемы: листы создаются, видовые экраны вроде бы как тоже создаются. Проблема заключается в следующем:
после создания листов, происходит фатальная ошибка при попытке сделать данный лист активным.

Если выполнить функцию отдельно для создания листов, отдельно для размещения видовых экранов на этих листах, и вторую функцию вызвать после закрытия чертежа с сохранением и повторного открытия, - все работает.

Ниже привожу код функции импорта листа с шаблона.
Код взят отсюда http://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-NET/files/GUID-5FA86EF3-DEFD-4256-BB1C-56DAC32BD868-htm.html.
Добавление в него как раз и фаталит:

Код - C# [Выбрать]
  1. public ObjectId ImportLayout(String fileName, ref String layName, ref String paperName, ref ObjectId newViewPortId, int paperNo)
  2.         {
  3.             // Get the current document and database
  4.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             Database acCurDb = acDoc.Database;
  6.  
  7.             // Specify the layout name and drawing file to work with
  8.             string layoutName = layName;
  9.             string filename = fileName;
  10.  
  11.             // Create a new database object and open the drawing into memory
  12.             Database acExDb = new Database(false, true);
  13.             acExDb.ReadDwgFile(filename, FileOpenMode.OpenForReadAndAllShare, true, "");
  14.  
  15.             ObjectId layId = ObjectId.Null;
  16.  
  17.             using (DocumentLock dLock = acDoc.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true))
  18.             // Create a transaction for the external drawing
  19.             {
  20.                 using (Transaction acTransEx = acExDb.TransactionManager.StartTransaction())
  21.                 {
  22.                     // Get the layouts dictionary
  23.                     DBDictionary layoutsEx =
  24.                         acTransEx.GetObject(acExDb.LayoutDictionaryId,
  25.                                             OpenMode.ForRead) as DBDictionary;
  26.                  
  27.                     // Check to see if the layout exists in the external drawing
  28.                     if (layoutsEx.Contains(layoutName) == true)
  29.                     {
  30.                         // Get the layout and block objects from the external drawing
  31.                         Layout layEx =
  32.                             layoutsEx.GetAt(layoutName).GetObject(OpenMode.ForRead) as Layout;
  33.                         BlockTableRecord blkBlkRecEx =
  34.                             acTransEx.GetObject(layEx.BlockTableRecordId,
  35.                                                 OpenMode.ForRead) as BlockTableRecord;
  36.                            
  37.                         // Get the objects from the block associated with the layout
  38.                         ObjectIdCollection idCol = new ObjectIdCollection();
  39.                         foreach (ObjectId id in blkBlkRecEx)
  40.                         {  
  41.                             idCol.Add(id);
  42.                         }
  43.                            
  44.                         // Create a transaction for the current drawing
  45.                         using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  46.                         {
  47.                             // Get the block table and create a new block
  48.                             // then copy the objects between drawings
  49.                            
  50.                             BlockTable blkTbl =
  51.                                 acTrans.GetObject(acCurDb.BlockTableId,
  52.                                                   OpenMode.ForWrite) as BlockTable;
  53.                                
  54.                             using (BlockTableRecord blkBlkRec = new BlockTableRecord())
  55.                             {
  56.                                 int layoutCount = layoutsEx.Count - 1;
  57.  
  58.                                 blkBlkRec.Name = paperName + paperNo + layoutsEx.Count.ToString();
  59.                                 blkTbl.Add(blkBlkRec);
  60.                                 acTrans.AddNewlyCreatedDBObject(blkBlkRec, true);
  61.                                 acExDb.WblockCloneObjects(idCol,
  62.                                                           blkBlkRec.ObjectId,
  63.                                                           new IdMapping(),
  64.                                                           DuplicateRecordCloning.Ignore,
  65.                                                           false);
  66.  
  67.                                 // Create a new layout and then copy properties between drawings
  68.                                 DBDictionary layouts =
  69.                                     acTrans.GetObject(acCurDb.LayoutDictionaryId,
  70.                                                       OpenMode.ForWrite) as DBDictionary;
  71.  
  72.                                 // Добавка к коду
  73.                                 LayoutManager layMan = LayoutManager.Current;
  74.  
  75.                                 using (Layout lay = new Layout())
  76.                                 {
  77.                                     lay.LayoutName = paperName + paperNo;
  78.                                     lay.AddToLayoutDictionary(acCurDb, blkBlkRec.ObjectId);
  79.                                     acTrans.AddNewlyCreatedDBObject(lay, true);
  80.                                     lay.CopyFrom(layEx);
  81.  
  82.                                        
  83.                                     layId = lay.Id;
  84.                                     newViewPortId = lay.Initialize();
  85.  
  86.                                     // Тут ловим фатальную ошибку - Unhandled exception writing 0x0340
  87.                                     //layMan.CurrentLayout = lay.LayoutName;
  88.  
  89.                                     DBDictionary plSets =
  90.                                     acTrans.GetObject(acCurDb.PlotSettingsDictionaryId,
  91.                                                           OpenMode.ForRead) as DBDictionary;
  92.  
  93.                                     // Check to see if a named page setup was assigned to the layout,
  94.                                     // if so then copy the page setup settings
  95.                                     if (lay.PlotSettingsName != "")
  96.                                     {
  97.                                         // Check to see if the page setup exists
  98.                                         if (plSets.Contains(lay.PlotSettingsName) == false)
  99.                                         {
  100.                                             plSets.UpgradeOpen();
  101.                                                
  102.                                             using (PlotSettings plSet = new PlotSettings(lay.ModelType))
  103.                                             {
  104.                                                 plSet.PlotSettingsName = lay.PlotSettingsName;
  105.                                                 plSet.AddToPlotSettingsDictionary(acCurDb);
  106.                                                 acTrans.AddNewlyCreatedDBObject(plSet, true);
  107.                                                    
  108.                                                 DBDictionary plSetsEx =
  109.                                                         acTransEx.GetObject(acExDb.PlotSettingsDictionaryId,
  110.                                                                         OpenMode.ForRead) as DBDictionary;
  111.  
  112.                                                 PlotSettings plSetEx =
  113.                                                     plSetsEx.GetAt(lay.PlotSettingsName).GetObject(
  114.                                                                    OpenMode.ForRead) as PlotSettings;
  115.                                                    
  116.                                                 plSet.CopyFrom(plSetEx);
  117.                                             }
  118.                                         }
  119.                                     }
  120.                                 }
  121.                             }
  122.                            
  123.                             // Regen the drawing to get the layout tab to display
  124.                             //acDoc.Editor.Regen();
  125.                                
  126.                             // Save the changes made
  127.                             acTrans.Commit();
  128.                             acTrans.Dispose();
  129.                         }
  130.                    
  131.                     }
  132.                     else
  133.                     {
  134.                         // Display a message if the layout could not be found in the specified drawing
  135.                         acDoc.Editor.WriteMessage("\nLayout '" + layoutName +
  136.                                                   "' could not be imported from '" + filename + "'.");
  137.                     }
  138.  
  139.                     // Discard the changes made to the external drawing file
  140.                     acTransEx.Abort();
  141.                 }
  142.            
  143.  
  144.                 // Close the external drawing file
  145.                 acExDb.Dispose();
  146.             }
  147.             return layId;
  148.         }

Дополнительно: в данном варианте (фатальная строка закомментирована) модуль работает, но после его выполнения чертеж ведет себя следующим образом:
1. находимся в пространстве модели - все нормально
2. переходим в пространство какого-то листа (например №5) - нормально
3. переходим в модель - нормально
4. переходим в пространство любого листа - попадаем на лист №5!!!

Конкретный вопрос - чего не хватает в коде, чтобы "финализировать" добавление листа в базу данных чертежа?
« Последнее редактирование: 20-05-2015, 12:26:59 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание листов
« Ответ #1 : 20-05-2015, 12:33:15 »
1. Прочитай мою подпись по поводу форматирования кода на форуме.
2. Давай свой файл шаблона чтобы было на чем тестировать.
3. Что касается фатальной ошибки, то lay у тебя не закрыт (транзакция не завершена), а ты пытаешься её использовать в layMan.CurrentLayout
Подозреваю, что проблема именно в этом. Вынеси этот код из транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай КоломоецАвтор темы

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Re: Создание листов
« Ответ #2 : 20-05-2015, 14:43:27 »
Думал над этим. Но такая же проблема возникает в аналогичном коде уже в другой функции. Естественно, транзакция закрыта.

Высылаю повторно функцию копирования листа, и добавляю функцию вставки видового экрана. Также привожу фрагмент кода, вызывающего эти функции.

Вкладываю файл шаблона.

Создание листа по шаблону
Код - C# [Выбрать]
  1. public ObjectId ImportLayout(String fileName, ref String layName, ref String paperName, ref ObjectId newViewPortId, int paperNo)
  2.         {
  3.             // Get the current document and database
  4.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             Database acCurDb = acDoc.Database;
  6.  
  7.             // Specify the layout name and drawing file to work with
  8.             string layoutName = layName;
  9.             string filename = fileName;
  10.  
  11.             // Create a new database object and open the drawing into memory
  12.             Database acExDb = new Database(false, true);
  13.             acExDb.ReadDwgFile(filename, FileOpenMode.OpenForReadAndAllShare, true, "");
  14.  
  15.             ObjectId layId = ObjectId.Null;
  16.  
  17.             using (DocumentLock dLock = acDoc.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true))
  18.             // Create a transaction for the external drawing
  19.             {
  20.                 using (Transaction acTransEx = acExDb.TransactionManager.StartTransaction())
  21.                 {
  22.                     // Get the layouts dictionary
  23.                     DBDictionary layoutsEx =
  24.                         acTransEx.GetObject(acExDb.LayoutDictionaryId,
  25.                                             OpenMode.ForRead) as DBDictionary;
  26.                  
  27.                     // Check to see if the layout exists in the external drawing
  28.                     if (layoutsEx.Contains(layoutName) == true)
  29.                     {
  30.                         // Get the layout and block objects from the external drawing
  31.                         Layout layEx =
  32.                             layoutsEx.GetAt(layoutName).GetObject(OpenMode.ForRead) as Layout;
  33.                         BlockTableRecord blkBlkRecEx =
  34.                             acTransEx.GetObject(layEx.BlockTableRecordId,
  35.                                                 OpenMode.ForRead) as BlockTableRecord;
  36.                            
  37.                         // Get the objects from the block associated with the layout
  38.                         ObjectIdCollection idCol = new ObjectIdCollection();
  39.                         foreach (ObjectId id in blkBlkRecEx)
  40.                         {  
  41.                             idCol.Add(id);
  42.                         }
  43.                            
  44.                         // Create a transaction for the current drawing
  45.                         using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  46.                         {
  47.                             // Get the block table and create a new block
  48.                             // then copy the objects between drawings
  49.                            
  50.                             BlockTable blkTbl =
  51.                                 acTrans.GetObject(acCurDb.BlockTableId,
  52.                                                   OpenMode.ForWrite) as BlockTable;
  53.                                
  54.                             using (BlockTableRecord blkBlkRec = new BlockTableRecord())
  55.                             {
  56.                                 int layoutCount = layoutsEx.Count - 1;
  57.  
  58.                                 blkBlkRec.Name = paperName + paperNo + layoutsEx.Count.ToString();
  59.                                 blkTbl.Add(blkBlkRec);
  60.                                 acTrans.AddNewlyCreatedDBObject(blkBlkRec, true);
  61.                                 acExDb.WblockCloneObjects(idCol,
  62.                                                           blkBlkRec.ObjectId,
  63.                                                           new IdMapping(),
  64.                                                           DuplicateRecordCloning.Ignore,
  65.                                                           false);
  66.  
  67.                                 // Create a new layout and then copy properties between drawings
  68.                                 DBDictionary layouts =
  69.                                     acTrans.GetObject(acCurDb.LayoutDictionaryId,
  70.                                                       OpenMode.ForWrite) as DBDictionary;
  71.  
  72.                                 // Добавка к коду
  73.                                 LayoutManager layMan = LayoutManager.Current;
  74.  
  75.                                 using (Layout lay = new Layout())
  76.                                 {
  77.                                     lay.LayoutName = paperName + paperNo;
  78.                                     lay.AddToLayoutDictionary(acCurDb, blkBlkRec.ObjectId);
  79.                                     acTrans.AddNewlyCreatedDBObject(lay, true);
  80.                                     lay.CopyFrom(layEx);
  81.  
  82.                                        
  83.                                     layId = lay.Id;
  84.                                     newViewPortId = lay.Initialize();
  85.  
  86.                                     // Тут ловим фатальную ошибку - Unhandled exception writing 0x0340
  87.                                     //layMan.CurrentLayout = lay.LayoutName;
  88.  
  89.                                     DBDictionary plSets =
  90.                                     acTrans.GetObject(acCurDb.PlotSettingsDictionaryId,
  91.                                                           OpenMode.ForRead) as DBDictionary;
  92.  
  93.                                     // Check to see if a named page setup was assigned to the layout,
  94.                                     // if so then copy the page setup settings
  95.                                     if (lay.PlotSettingsName != "")
  96.                                     {
  97.                                         // Check to see if the page setup exists
  98.                                         if (plSets.Contains(lay.PlotSettingsName) == false)
  99.                                         {
  100.                                             plSets.UpgradeOpen();
  101.                                                
  102.                                             using (PlotSettings plSet = new PlotSettings(lay.ModelType))
  103.                                             {
  104.                                                 plSet.PlotSettingsName = lay.PlotSettingsName;
  105.                                                 plSet.AddToPlotSettingsDictionary(acCurDb);
  106.                                                 acTrans.AddNewlyCreatedDBObject(plSet, true);
  107.                                                    
  108.                                                 DBDictionary plSetsEx =
  109.                                                         acTransEx.GetObject(acExDb.PlotSettingsDictionaryId,
  110.                                                                         OpenMode.ForRead) as DBDictionary;
  111.  
  112.                                                 PlotSettings plSetEx =
  113.                                                     plSetsEx.GetAt(lay.PlotSettingsName).GetObject(
  114.                                                                    OpenMode.ForRead) as PlotSettings;
  115.                                                    
  116.                                                 plSet.CopyFrom(plSetEx);
  117.                                             }
  118.                                         }
  119.                                     }
  120.                                 }
  121.                             }
  122.                            
  123.                             // Regen the drawing to get the layout tab to display
  124.                             //acDoc.Editor.Regen();
  125.                                
  126.                             // Save the changes made
  127.                             acTrans.Commit();
  128.                             acTrans.Dispose();
  129.                         }
  130.                    
  131.                     }
  132.                     else
  133.                     {
  134.                         // Display a message if the layout could not be found in the specified drawing
  135.                         acDoc.Editor.WriteMessage("\nLayout '" + layoutName +
  136.                                                   "' could not be imported from '" + filename + "'.");
  137.                     }
  138.  
  139.                     // Discard the changes made to the external drawing file
  140.                     acTransEx.Abort();
  141.                 }
  142.            
  143.  
  144.                 // Close the external drawing file
  145.                 acExDb.Dispose();
  146.             }
  147.             return layId;
  148.         }
  149.  

Создание видового экрана на этом листе
Код - C# [Выбрать]
  1. /*------------------------------------------------------------------------------------------------------------------*/
  2.         /* Процедура создания видового экрана, указывающего на нужный участок пространства модели, соответствующий странице */
  3.         /* Входные данные:                                                                                                  */
  4.         /* newViewPortId - идентификатор нового видового экрана                                                             */
  5.         /* newLayoutId - идентификатор листа, на котором расположен ВЭ                                                      */
  6.         /* minPoint - левая нижняя точка ВЭ в пространстве модели                                                           */
  7.         /* maxPoint - правая верхняя точка ВЭ в пространстве модели                                                         */
  8.         /* startPoint - стартовая точка ВЭ: центр видового экрана                                                           */
  9.         /*------------------------------------------------------------------------------------------------------------------*/
  10.         private void CreateViewPort(ObjectId newViewPortId, ObjectId newLayoutId, Point3d minPoint, Point3d maxPoint, Point3d startPoint)
  11.         {
  12.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  13.             DocumentLock docLock = doc.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true);
  14.             using (docLock)
  15.             {
  16.                 Database db = doc.Database;
  17.                 Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  18.                 using (Transaction trx = db.TransactionManager.StartTransaction())
  19.                 {
  20.                     LayoutManager layman = Autodesk.AutoCAD.DatabaseServices.LayoutManager.Current;
  21.                     Layout newLayout = trx.GetObject(newLayoutId, OpenMode.ForWrite) as Layout;     // лист, на котором нужно разместить видовой экран
  22.                    
  23.  
  24. // Тут фатальная ошибка.
  25. layman.CurrentLayout = newLayout.LayoutName;                                    // делаем нужный лист текущи
  26.                     BlockTableRecord btr = trx.GetObject(newLayout.BlockTableRecordId, OpenMode.ForWrite) as BlockTableRecord;
  27.                     //ObjectId layoutId = newLayoutId;
  28.                     //Viewport viewprt = trx.GetObject(newViewPortId, OpenMode.ForWrite) as Viewport;
  29.                    
  30.                     /* создание нового видового экрана  */
  31.                     Viewport viewprt = new Viewport();
  32.                     viewprt.SetDatabaseDefaults();
  33.                     ObjectId viewPortId = btr.AppendEntity(viewprt);
  34.                     trx.AddNewlyCreatedDBObject(viewprt, true);
  35.  
  36.                     // видовой экран создается на слое "_AM_ViewPort". Если такого слоя нет в текущем чертеже - он создается.
  37.                     // Цвет слоя - красный, слой - непечатаемый. Остальные значения - по умолчанию
  38.                     LayerTable layTab = trx.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; // таблица слоев
  39.                     if (!(layTab.Has("_AM_ViewPort")))
  40.                     {
  41.                         LayerTableRecord newLayer = new LayerTableRecord();
  42.                         newLayer.Name = "_AM_ViewPort";
  43.                         newLayer.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 1);
  44.                         newLayer.IsPlottable = false;
  45.                         layTab.UpgradeOpen();
  46.                         layTab.Add(newLayer);
  47.                         trx.AddNewlyCreatedDBObject(newLayer, true);
  48.                     }
  49.                     viewprt.Layer = "_AM_ViewPort";
  50.                    
  51.                     // формирование размеров видового экрана в листе
  52.                     viewprt.CenterPoint = startPoint.Add(new Vector3d(0, -0.15, 0));
  53.                     viewprt.Height = maxPoint.Y - minPoint.Y + 0.3;
  54.                     viewprt.Width = maxPoint.X - minPoint.X;
  55.                     viewprt.CustomScale = 1;    // масштаб ВЭ - 1:1.
  56.  
  57.                     // "прицеливание" ВЭ на нужный фрагмент пространства модели
  58.                     viewprt.ViewCenter = new Point2d((maxPoint.X - minPoint.X) / 2 + minPoint.X, (maxPoint.Y - minPoint.Y) / 2 + minPoint.Y).Add(new Vector2d(0, -0.15));
  59.                     viewprt.ViewHeight = maxPoint.Y - minPoint.Y + 0.3;
  60.                    
  61.                     viewprt.Locked = true;              // ВЭ блокируется
  62.                     viewprt.Draw();                     // перерисовать ВЭ
  63.                     viewprt.On = true;                  // включен и видим
  64.                     viewprt.Visible = true;
  65.                     ed.Regen();
  66.                    
  67.                     // переприсвоение свойств всех слоев на видовом экране - перевод в белый цвет
  68.                     /*foreach (ObjectId layId in layTab)
  69.                     {
  70.                         LayerTableRecord layTabRec = trx.GetObject(layId, OpenMode.ForWrite) as LayerTableRecord;
  71.                         LayerViewportProperties layVPortProps = layTabRec.GetViewportOverrides(newViewPortId);
  72.                         layVPortProps.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 7);
  73.                     }*/
  74.                     trx.Commit();
  75.                    
  76.                 }
  77.             }
  78.         }

Вложения:
AM SPDS SHT - шаблон, который содержит листы. В данном случае применяется лист "КабЖурнал_Первый" для первого листа, "КабЖурнал_Второй" - для второго и последующих.

АТХ - исходный файл. который нужно разложить на листы
АТХ после программы как должно быть - результат работы программы, который требуется.
« Последнее редактирование: 20-05-2015, 15:49:14 от Николай Коломоец »

Оффлайн Николай КоломоецАвтор темы

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Re: Создание листов
« Ответ #3 : 20-05-2015, 19:01:50 »
Немного причесал функции. по прежнему имею "Фатальная ошибка: Unhandled Access Violation Writing 0x034"

1. Функция импорта листов
Код - C# [Выбрать]
  1. public ObjectId ImportLayout(String fileName, ref String layName, ref String paperName, int paperNo)
  2.         {
  3.             // Get the current document and database
  4.             ObjectId newViewPortId = ObjectId.Null;
  5.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  6.             Database acCurDb = acDoc.Database;
  7.  
  8.             // Specify the layout name and drawing file to work with
  9.             string layoutName = layName;
  10.             string filename = fileName;
  11.  
  12.             // Create a new database object and open the drawing into memory
  13.             Database acExDb = new Database(false, true);
  14.             acExDb.ReadDwgFile(filename, FileOpenMode.OpenForReadAndAllShare, true, "");
  15.  
  16.             ObjectId layId = ObjectId.Null;
  17.  
  18.             using (DocumentLock dLock = acDoc.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true))
  19.             // Create a transaction for the external drawing
  20.             {
  21.                 using (Transaction acTransEx = acExDb.TransactionManager.StartTransaction())
  22.                 {
  23.                     // Get the layouts dictionary
  24.                     DBDictionary layoutsEx =
  25.                         acTransEx.GetObject(acExDb.LayoutDictionaryId,
  26.                                             OpenMode.ForRead) as DBDictionary;
  27.                  
  28.                     // Check to see if the layout exists in the external drawing
  29.                     if (layoutsEx.Contains(layoutName) == true)
  30.                     {
  31.                         // Get the layout and block objects from the external drawing
  32.                         Layout layEx =
  33.                             layoutsEx.GetAt(layoutName).GetObject(OpenMode.ForRead) as Layout;
  34.                         BlockTableRecord blkBlkRecEx =
  35.                             acTransEx.GetObject(layEx.BlockTableRecordId,
  36.                                                 OpenMode.ForRead) as BlockTableRecord;
  37.                            
  38.                         // Get the objects from the block associated with the layout
  39.                         ObjectIdCollection idCol = new ObjectIdCollection();
  40.                         foreach (ObjectId id in blkBlkRecEx)
  41.                         {  
  42.                             idCol.Add(id);
  43.                         }
  44.                            
  45.                         // Create a transaction for the current drawing
  46.                         using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  47.                         {
  48.                             // Get the block table and create a new block
  49.                             // then copy the objects between drawings
  50.                            
  51.                             BlockTable blkTbl =
  52.                                 acTrans.GetObject(acCurDb.BlockTableId,
  53.                                                   OpenMode.ForWrite) as BlockTable;
  54.                                
  55.                             using (BlockTableRecord blkBlkRec = new BlockTableRecord())
  56.                             {
  57.                                 int layoutCount = layoutsEx.Count - 1;
  58.  
  59.                                 blkBlkRec.Name = paperName + paperNo + layoutsEx.Count.ToString();
  60.                                 blkTbl.Add(blkBlkRec);
  61.                                 acTrans.AddNewlyCreatedDBObject(blkBlkRec, true);
  62.                                 acExDb.WblockCloneObjects(idCol,
  63.                                                           blkBlkRec.ObjectId,
  64.                                                           new IdMapping(),
  65.                                                           DuplicateRecordCloning.Ignore,
  66.                                                           false);
  67.  
  68.                                 // Create a new layout and then copy properties between drawings
  69.                                 DBDictionary layouts =
  70.                                     acTrans.GetObject(acCurDb.LayoutDictionaryId,
  71.                                                       OpenMode.ForWrite) as DBDictionary;
  72.  
  73.                                 // Добавка к коду
  74.                                 LayoutManager layMan = LayoutManager.Current;
  75.  
  76.                                 using (Layout lay = new Layout())
  77.                                 {
  78.                                     lay.LayoutName = paperName + paperNo;
  79.                                     lay.AddToLayoutDictionary(acCurDb, blkBlkRec.ObjectId);
  80.                                     acTrans.AddNewlyCreatedDBObject(lay, true);
  81.                                     lay.CopyFrom(layEx);
  82.  
  83.                                        
  84.                                     layId = lay.Id;
  85.                                     newViewPortId = lay.Initialize();
  86.  
  87.                                     DBDictionary plSets =
  88.                                     acTrans.GetObject(acCurDb.PlotSettingsDictionaryId,
  89.                                                           OpenMode.ForRead) as DBDictionary;
  90.  
  91.                                     // Check to see if a named page setup was assigned to the layout,
  92.                                     // if so then copy the page setup settings
  93.                                     if (lay.PlotSettingsName != "")
  94.                                     {
  95.                                         // Check to see if the page setup exists
  96.                                         if (plSets.Contains(lay.PlotSettingsName) == false)
  97.                                         {
  98.                                             plSets.UpgradeOpen();
  99.                                                
  100.                                             using (PlotSettings plSet = new PlotSettings(lay.ModelType))
  101.                                             {
  102.                                                 plSet.PlotSettingsName = lay.PlotSettingsName;
  103.                                                 plSet.AddToPlotSettingsDictionary(acCurDb);
  104.                                                 acTrans.AddNewlyCreatedDBObject(plSet, true);
  105.                                                    
  106.                                                 DBDictionary plSetsEx =
  107.                                                         acTransEx.GetObject(acExDb.PlotSettingsDictionaryId,
  108.                                                                         OpenMode.ForRead) as DBDictionary;
  109.  
  110.                                                 PlotSettings plSetEx =
  111.                                                     plSetsEx.GetAt(lay.PlotSettingsName).GetObject(
  112.                                                                    OpenMode.ForRead) as PlotSettings;
  113.                                                    
  114.                                                 plSet.CopyFrom(plSetEx);
  115.                                             }
  116.                                         }
  117.                                     }
  118.                                 }
  119.                             }
  120.                            
  121.                             // Save the changes made
  122.                             acTrans.Commit();
  123.                         }
  124.                    
  125.                     }
  126.                     else
  127.                     {
  128.                         // Display a message if the layout could not be found in the specified drawing
  129.                         acDoc.Editor.WriteMessage("\nLayout '" + layoutName +
  130.                                                   "' could not be imported from '" + filename + "'.");
  131.                     }
  132.  
  133.                     // Discard the changes made to the external drawing file
  134.                     acTransEx.Abort();
  135.                 }
  136.            
  137.  
  138.                 // Close the external drawing file
  139.                 acExDb.Dispose();
  140.             }
  141.             return layId;
  142.         }

Функция создания видового экрана
Код - C# [Выбрать]
  1.        /*------------------------------------------------------------------------------------------------------------------*/
  2.         /* Процедура создания видового экрана, указывающего на нужный участок пространства модели, соответствующий странице */
  3.         /* Входные данные:                                                                                                  */
  4.         /* newViewPortId - идентификатор нового видового экрана                                                             */
  5.         /* newLayoutId - идентификатор листа, на котором расположен ВЭ                                                      */
  6.         /* minPoint - левая нижняя точка ВЭ в пространстве модели                                                           */
  7.         /* maxPoint - правая верхняя точка ВЭ в пространстве модели                                                         */
  8.         /* startPoint - стартовая точка ВЭ: центр видового экрана                                                           */
  9.         /*------------------------------------------------------------------------------------------------------------------*/
  10.         private void CreateViewPort(ObjectId newLayoutId, Point3d minPoint, Point3d maxPoint, Point3d startPoint)
  11.         {
  12.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  13.             Database db = doc.Database;
  14.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  15.             LayoutManager layman = LayoutManager.Current;
  16.             DocumentLock docLock = doc.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true);
  17.             using (docLock)
  18.             {
  19.                 using (Transaction trx = db.TransactionManager.StartTransaction())
  20.                 {
  21.                     Layout newLayout = trx.GetObject(newLayoutId,OpenMode.ForRead) as Layout;  
  22.                     BlockTableRecord btr = trx.GetObject(newLayout.BlockTableRecordId, OpenMode.ForWrite) as BlockTableRecord;
  23.                     //ObjectId layoutId = newLayoutId;
  24.                     //Viewport viewprt = trx.GetObject(newViewPortId, OpenMode.ForWrite) as Viewport;
  25.                    
  26.                     /* создание нового видового экрана  */
  27.                     Viewport viewprt = new Viewport();
  28.                     viewprt.SetDatabaseDefaults();
  29.                     ObjectId viewPortId = btr.AppendEntity(viewprt);
  30.                     trx.AddNewlyCreatedDBObject(viewprt, true);
  31.  
  32.                     // видовой экран создается на слое "_AM_ViewPort". Если такого слоя нет в текущем чертеже - он создается.
  33.                     // Цвет слоя - красный, слой - непечатаемый. Остальные значения - по умолчанию
  34.                     LayerTable layTab = trx.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; // таблица слоев
  35.                     if (!(layTab.Has("_AM_ViewPort")))
  36.                     {
  37.                         LayerTableRecord newLayer = new LayerTableRecord();
  38.                         newLayer.Name = "_AM_ViewPort";
  39.                         newLayer.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 1);
  40.                         newLayer.IsPlottable = false;
  41.                         layTab.UpgradeOpen();
  42.                         layTab.Add(newLayer);
  43.                         trx.AddNewlyCreatedDBObject(newLayer, true);
  44.                     }
  45.                     viewprt.Layer = "_AM_ViewPort";
  46.                    
  47.                     // формирование размеров видового экрана в листе
  48.                     viewprt.CenterPoint = startPoint.Add(new Vector3d(0, -0.15, 0));
  49.                     viewprt.Height = maxPoint.Y - minPoint.Y + 0.3;
  50.                     viewprt.Width = maxPoint.X - minPoint.X;
  51.                     viewprt.CustomScale = 1;    // масштаб ВЭ - 1:1.
  52.  
  53.                     // "прицеливание" ВЭ на нужный фрагмент пространства модели
  54.                     viewprt.ViewCenter = new Point2d((maxPoint.X - minPoint.X) / 2 + minPoint.X, (maxPoint.Y - minPoint.Y) / 2 + minPoint.Y).Add(new Vector2d(0, -0.15));
  55.                     viewprt.ViewHeight = maxPoint.Y - minPoint.Y + 0.3;
  56.                    
  57.                     viewprt.Locked = true;              // ВЭ блокируется
  58.                     viewprt.Draw();                     // перерисовать ВЭ
  59.                     viewprt.On = true;                  // включен и видим
  60.                     viewprt.Visible = true;
  61.                     ed.Regen();
  62.                    
  63.                     // переприсвоение свойств всех слоев на видовом экране - перевод в белый цвет
  64.                     foreach (ObjectId layId in layTab)
  65.                     {
  66.                         LayerTableRecord layTabRec = trx.GetObject(layId, OpenMode.ForWrite) as LayerTableRecord;
  67.                         LayerViewportProperties layVPortProps = layTabRec.GetViewportOverrides(viewPortId);
  68.                         layVPortProps.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 7);
  69.                     }
  70.                     trx.Commit();
  71.                    
  72.                 }
  73.             }
  74.         }

А также фрагмент функции, которая их поочередно вызывает

Код - C# [Выбрать]
  1. // Добавление новых листов по шаблону
  2.             for (int i = 1; i<=pages; i++)
  3.             {
  4.                 ObjectId layId;                 // идентификатор созданного листа
  5.                
  6.                 if (paperNumber == 0)           // многостраничный лист (напр. "3.4") или одностраничный (напр. "4")
  7.                     sheetNr = i.ToString();
  8.                 else
  9.                     sheetNr = paperNumber.ToString() + "." + i.ToString();
  10.                 layoutName = layDocName + i.ToString(); // имя листа
  11.                 //  копирование листа из шаблона и создание на его основе нового листа в текущем документе
  12.                 layId = ImportLayout(FILENAME, ref laySourceName, ref layNameTempl, i);
  13.  
  14.                 LayoutManager layMan = LayoutManager.Current;      
  15.                 layMan.CurrentLayout = layoutName;                             // фатальная ошибка - на ВТОРОМ ЛИСТЕ
  16.  
  17.                 // создание на листе видового экрана, указывающего на область в пространстве модели, соответствующую новому листу
  18.                 CreateViewPort(layId, curPageDownBorder, curPageUpBorder, startLayoutPoint);
  19.  
  20.                 // присвоение номера листу - заполнение атрибутов штампа
  21.                 //PaperNumeration(layId, sheetNr, sheets);
  22.  
  23.                 pageHeight = pageHeightSecPage;             // высота рабочей области второго (и последующих) листа больше, чем первого.
  24.                 curPageUpBorder = curPageDownBorder.Add(new Vector3d(pageWidth, 0, 0));
  25.                 laySourceName = layDocName + "_Второй";     // переход к шаблону второго (и последующего) листов
  26.                 curPageDownBorder = curPageUpBorder.Add(new Vector3d(-pageWidth, -pageHeight, 0));
  27.                 // уточненная точка начала листа, с учетом высоты одной строки - округляется значение так, чтобы ВЭ попадал на начало строки всегда
  28.                 startLayoutPoint = new Point3d((pageWidth / 2 + leftStampSize), (pageHeight / 2 + auxStampHeight + 20) + pageHeightSecPageDifference, 0);
  29.             }

Отмечено как Решение Николай Коломоец 22-05-2015, 14:01:52

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание листов
« Ответ #4 : 20-05-2015, 19:14:44 »
Вот этот код у меня работает (вид не подбирается, но это добавишь сам). Проверь работает ли он у тебя. Если работает - сравнивай код и исправляй свой.
Код - C# [Выбрать]
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Reflection;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using AcRx = Autodesk.AutoCAD.Runtime;
  10. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  11. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  12. using AcGe = Autodesk.AutoCAD.Geometry;
  13. using AcEd = Autodesk.AutoCAD.EditorInput;
  14.  
  15. [assembly: CommandClass(typeof(Rivilis.ImportLayouts))]
  16.  
  17. namespace Rivilis
  18. {
  19.   public class ImportLayouts
  20.   {
  21.     public ObjectId ImportLayout(string fileName, ref string layoutName, ref string paperName, ref ObjectId newViewPortId, int paperNo)
  22.     {
  23.       ObjectId newLayoutId = ObjectId.Null;
  24.       using (Database templateDb = new Database(false, true) as Database)
  25.       {
  26.         templateDb.ReadDwgFile(fileName, FileOpenMode.OpenForReadAndAllShare, true, "");
  27.         Document doc = Application.DocumentManager.MdiActiveDocument;
  28.         Editor ed = doc.Editor;
  29.         Database db = doc.Database;
  30.         LayoutManager layoutManager = LayoutManager.Current;
  31.         string newLayoutName = layoutName + "_" + paperNo + "_" + (layoutManager.LayoutCount - 1);
  32.         newLayoutId = layoutManager.GetLayoutId(newLayoutName);
  33.         if (newLayoutId.IsNull)
  34.           newLayoutId = layoutManager.CreateLayout(newLayoutName);
  35.         using (Transaction trx = db.TransactionManager.StartTransaction())
  36.         {
  37.           Layout newLayout = trx.GetObject(newLayoutId, OpenMode.ForWrite) as Layout;
  38.           newViewPortId = newLayout.Initialize();
  39.           trx.Commit();
  40.         }
  41.         layoutManager.CurrentLayout = newLayoutName;
  42.         using (Transaction trx = db.TransactionManager.StartTransaction())
  43.         using (Transaction templateTrx = templateDb.TransactionManager.StartTransaction())
  44.         {
  45.           DBDictionary layoutDictionary =
  46.             trx.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
  47.           DBDictionary templateLayoutDictionary =
  48.             templateTrx.GetObject(templateDb.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
  49.           if (!(templateLayoutDictionary.Contains(layoutName)))
  50.           {
  51.             ed.WriteMessage("\nTemplate does not contain a Layout with that name.");
  52.             return newLayoutId;
  53.           }
  54.           Layout newLayout = trx.GetObject(newLayoutId, OpenMode.ForWrite) as Layout;
  55.           Layout templateLayout = templateLayoutDictionary.GetAt(layoutName).GetObject(OpenMode.ForRead) as Layout;
  56.           newLayout.CopyFrom(templateLayout);
  57.           BlockTableRecord templateLayoutBtr =
  58.             templateTrx.GetObject(templateLayout.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
  59.           ObjectIdCollection objIdColl = new ObjectIdCollection();
  60.           foreach (ObjectId id in templateLayoutBtr)
  61.             objIdColl.Add(id);
  62.           BlockTable extBt =
  63.             templateDb.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  64.           IdMapping map = new IdMapping();
  65.           db.WblockCloneObjects(objIdColl, newLayout.BlockTableRecordId, map, DuplicateRecordCloning.Replace, false);
  66.  
  67.           PlotSettingsValidator psv = PlotSettingsValidator.Current;
  68.           psv.SetZoomToPaperOnUpdate(newLayout, true);
  69.  
  70.           templateTrx.Commit();
  71.           trx.Commit();
  72.         }
  73.       }
  74.       return newLayoutId;
  75.     }
  76.  
  77.     [CommandMethod("CopyLayout")]
  78.     public void MyCommand()
  79.     {
  80.       string layoutName = "КабЖурналИмпульс_Первый";
  81.       string paperName = "";
  82.       int paperNo = 1;
  83.       AcDb.ObjectId newViewPortId = new AcDb.ObjectId();
  84.       ImportLayout(@"C:\AM SPDS SHT.dwg", ref layoutName, ref paperName, ref newViewPortId, paperNo);
  85.       // Put your command code here
  86.     }
  87.   }
  88. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Создание листов
« Ответ #5 : 20-05-2015, 22:14:20 »
Да "не чисто" что-то в автокаде с установкой текущего листа. У меня была (есть) функция которая принимает BlockTableRecord и имя - и на основании его создает и "настраивает" лист (вид) - делая его текущим. Написана она откровенно говоря крайне криво и грязно (использует TopTransaction и пр. не очень правильные вещи) - но зато ее можно вызывать из "совсем разных" кусков программы (из разных транзакций, документов и пр - не передавая их как аргумент). Так вот вылез с ней (через пол-года использования) следующий баг если вызывать ее "с кнопки" - то есть если просто с команды то работает - а из "гуя", во втором или "более старше" открытом документе (причем не важно когда dll был загружен и сколько документов открыто), то как раз на установке CurrentLayoutName - акад фаталит. Я вначале грешил, что где-то остается ссылка на документ, либо, что-то с листами в "не первом" документе не так (не инициализированны и пр.) - но нет, в этом плане все правильно. В итоге, заработала она при условии что если перед установкой CurrentLayoutName настроить plotsetting (который я изначально после настраивал), то функция работает всегда. Видимо что-то "сдвигается" после каких-либо манипуляций с листом и тогда работает - как-то так.

Оффлайн Николай КоломоецАвтор темы

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Re: Создание листов
« Ответ #6 : 22-05-2015, 12:01:27 »
Александр,
спасибо за код, стало лучше. Но по-прежнему не работает  :(

Теперь по крайней мере не фаталит, пишет ошибку eSetFailed там же, где и раньше - на попытке активировать ВТОРОЙ ЛИСТ (с первым все и работало, и работает).

Дополнительно в модели начинаются фокусы после выполнения модуля - появляется "виртуальный видовой экран в пространстве модели".
Ищу ошибки в своем коде дальше...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание листов
« Ответ #7 : 22-05-2015, 12:12:41 »
Теперь по крайней мере не фаталит, пишет ошибку eSetFailed там же, где и раньше - на попытке активировать ВТОРОЙ ЛИСТ (с первым все и работало, и работает).
Ты в одной транзакции пытаешься и создать-добавить Layout и переключится на него. Так делать нельзя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание листов
« Ответ #8 : 22-05-2015, 12:16:33 »
В моём коде замени
Код - C# [Выбрать]
  1.       ImportLayout(@"C:\AM SPDS SHT.dwg", ref layoutName, ref paperName, ref newViewPortId, paperNo);
на
Код - C# [Выбрать]
  1. for (int i = 0; i < 5; i++)
  2.       ImportLayout(@"C:\AM SPDS SHT.dwg", ref layoutName, ref paperName, ref newViewPortId, paperNo);
и проверь будет ли работать. Если работает, то очевидно, что проблема в твоём коде.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай КоломоецАвтор темы

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Re: Создание листов
« Ответ #9 : 22-05-2015, 12:37:47 »
Ну я уже додумался так проверить.
Пока что цикл ваш работает, поэтому ищу ошибку в своем коде. Проверю еще, создаются ли ВЭ в вашем варианте. Но очевидно, что должны. Спасибо в любом случае.

Да, Александр. ваш вариант полностью работоспособен. Думаю, что ошибка в моем коде вызвана вот тут
Код - C# [Выбрать]
  1. PlotSettingsValidator psv = PlotSettingsValidator.Current;
  2. psv.SetZoomToPaperOnUpdate(newLayout, true);
  3.  
В смысле, у меня этого кода нет. Очевидно. что лист не может существовать без привязки к конкретному устройству печати, а первая функция из процитированного как раз и выполняет эти настройки. Но до конца еще не уверен, буду разбираться дальше :-)
« Последнее редактирование: 22-05-2015, 14:05:51 от Николай Коломоец »

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Создание листов
« Ответ #10 : 16-10-2015, 11:58:30 »
Ты в одной транзакции пытаешься и создать-добавить Layout и переключится на него. Так делать нельзя
Александр Наумович, а вот это вот изменилось в какой-то момент? У меня есть программа, которая создаёт лист и переключается на него в рамках одной транзакции. Всё хорошо работает в автокадах 2009-2014, а вот в 2015 и 2016 начала падать с ошибкой eSetFailed в момент установки LayoutManager.CurrentLayout
Вот ссылка на сообщение об ошибке http://forum.dwg.ru/showpost.php?p=1459707&postcount=452
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание листов
« Ответ #11 : 16-10-2015, 12:50:44 »
Александр Наумович, а вот это вот изменилось в какой-то момент?
Видимо да. Не помню когда обратил на это внимание. LayoutManager.CurrentLayout неявно открывает и модифицирует листы и другие объекты базы, которые могут быть задействованы в транзакции и это может препятствовать их изменению. Поэтому я предпочитаю использовать этот метод вне транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Создание листов
« Ответ #12 : 18-10-2015, 21:41:00 »
bargool,  попробуйте, как я писал несколько сообщений выше, вначале настроить plotsetting

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание листов
« Ответ #13 : 18-10-2015, 21:44:54 »
Дима_
Он уже справился судя о отзывам на том форуме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Создание листов
« Ответ #14 : 19-10-2015, 10:24:00 »
Дима_, plotsettings у меня тоже устанавливались до перехода на лист, при создании.
Он уже справился судя о отзывам на том форуме
Да, вынес переход на лист за пределы транзакции - заработало. Таким образом, подтверждаю, что такое поведение (ну, ошибка) наблюдается начиная с 2015 автокада.
Алексей