Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Петренко Дмитрий от 22-01-2017, 11:47:18

Название: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 11:47:18
При копировании объектов из одного dwg файла в другой размеры не копируются. Почему? Насколько я понимаю они тоже объекты.
Текст кода ниже.
Заранее спасибо за ответ.

Код - Visual Basic [Выбрать]
  1. Dim sourceDb As Database = New Database(False, True)
  2.         Dim acObjIdCollsource As ObjectIdCollection = New ObjectIdCollection()
  3.         Try
  4.             Using tr As Transaction = sourceDb.TransactionManager.StartTransaction()
  5.                 sourceDb.ReadDwgFile(Me.ListBox1.SelectedItem, FileOpenMode.OpenForReadAndReadShare, True, "")
  6.                 sourceDb.CloseInput(True)
  7.                 Dim acBlkTblSourceDoc As BlockTable
  8.                 acBlkTblSourceDoc = tr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, False, False)
  9.                 '' Open the Block table record Model space for read
  10.                Dim acBlkTblRecSourceDoc As BlockTableRecord
  11.                 acBlkTblRecSourceDoc = tr.GetObject(acBlkTblSourceDoc(BlockTableRecord.ModelSpace), OpenMode.ForRead, False, True)
  12.                 For Each ObjId As ObjectId In acBlkTblRecSourceDoc
  13.                     acObjIdCollsource.Add(ObjId)
  14.                 Next
  15.                 tr.Commit()
  16.  
  17.             End Using
  18.  
  19.             Dim Doc As Document = Application.DocumentManager.MdiActiveDocument
  20.             Dim currentDb As Database = Doc.Database
  21.             Dim ed As Editor = Doc.Editor
  22.             Using acLckDocCur As DocumentLock = Doc.LockDocument()
  23.                 Using tr = Doc.TransactionManager.StartTransaction()
  24.                     '' Open the Block table for read
  25.                    Dim acBlkTblCurrentDoc As BlockTable
  26.                     acBlkTblCurrentDoc = tr.GetObject(currentDb.BlockTableId, OpenMode.ForWrite, False, False)
  27.                     '' Open the Block table record Model space for read
  28.                    Dim acBlkTblRecCurrentDoc As BlockTableRecord
  29.                     acBlkTblRecCurrentDoc = tr.GetObject(acBlkTblCurrentDoc(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False, True)
  30.                     '' Clone the objects to the new database
  31.                    Dim bobject As Entity = Nothing
  32.                     For Each ObjId As ObjectId In acBlkTblRecCurrentDoc
  33.                         bobject = tr.GetObject(ObjId, OpenMode.ForWrite, False, True)
  34.                         bobject.Erase(True)
  35.                     Next
  36.                     Dim acIdMap As IdMapping = New IdMapping()
  37.                     sourceDb.WblockCloneObjects(acObjIdCollsource, acBlkTblRecCurrentDoc.ObjectId, acIdMap, DuplicateRecordCloning.Replace, False)
  38.                     currentDb.UpdateExt(True)
  39.                     '' Save the copied objects to the database
  40.                    tr.Commit()
  41.                 End Using
  42.                 acObjIdCollsource.Dispose()
  43.                 '' Unlock the document
  44.            End Using
  45.  
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Пекшев aka Modis от 22-01-2017, 12:19:14
Копирование нужно делать методом sourceDb.WblockCloneObjects. Вот пример (http://through-the-interface.typepad.com/through_the_interface/2006/08/import_blocks_f.html).
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 12:48:31
dmitry15,
Приветствую на форуме!
Прочитай у меня в подписи как следует форматировать код на форуме и следуй в дальнейшем этому правилу.
При копировании объектов из одного dwg файла в другой размеры не копируются. Почему?
В действительности они копируются. Но для них (после копирования) нужно выполнить метод Dimension.RecomputeDimensionBlock
Ну и в добавок currentDb.BlockTableId и acBlkTblCurrentDoc(BlockTableRecord.ModelSpace) не нужно открывать ForWrite, а вполне достаточно ForRead, так как ни то ни другое не модифицируется.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 13:03:50
dmitry15,
Еще могу порекомендовать вынести sourceDb.WblockCloneObjects(...) за рамки транзакции.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 17:34:36
Спасибо за оперативный ответы.
В дальнейшем буду форматировать код, не разобрался в первый раз.
Посмотрел ссылку Александра Пекшева ничего нового оттуда не подчерпнул все то же, что у меня уже реализовано.

По рекомендациям Александра Ривилиса
- если несложно можно поподробней про Dimension.RecomputeDimensionBlock т.к. в инете скудная информация, попробовал использовать в коде под AutoCad 2010 вариант RecomputeDimensionBlock у Dimension отсутствует. Если что не судите строго так как только начинаю программировать под AutoCad.
- currentDb.BlockTableId и acBlkTblCurrentDoc(BlockTableRecord.ModelSpace) открыты для записи, так как в файле в который копирую объекты перед этим те объекты, что там находятся я удаляю.
-  попробовал вынести за транзакцию sourceDb.WblockCloneObjects(...) компилятор ругается, что переменная  acBlkTblRecCurrentDoc не объявлена, может что то не то делаю.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 17:44:45
попробовал использовать в коде под AutoCad 2010 вариант RecomputeDimensionBlock у Dimension отсутствует
Плохо искал. Проверил в AutoCAD 2010 - есть такой метод:
Код - C# [Выбрать]
  1. // Autodesk.AutoCAD.DatabaseServices.Dimension
  2. public void RecomputeDimensionBlock([MarshalAs(UnmanagedType.U1)] bool forceUpdate);

- currentDb.BlockTableId и acBlkTblCurrentDoc(BlockTableRecord.ModelSpace) открыты для записи, так как в файле в который копирую объекты перед этим те объекты, что там находятся я удаляю.
Ну и что? Ты видимо не понимаешь. Факт удаления объекта никак не связан ни с BlockTable, ни с BlockTableRecord. Открывать их на запись нужно только тогда, когда непосредственно они модифицируются.
-  попробовал вынести за транзакцию sourceDb.WblockCloneObjects(...) компилятор ругается, что переменная  acBlkTblRecCurrentDoc не объявлена, может что то не то делаю.
Конечно не определена. Но она и не нужна. Нужен её ObjectId, который нужно было получить в транзакции, а использовать вне транзакции.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Пекшев aka Modis от 22-01-2017, 17:56:41
Копирование нужно делать методом sourceDb.WblockCloneObjects. Вот пример (http://through-the-interface.typepad.com/through_the_interface/2006/08/import_blocks_f.html).
Хоть убейте, но я уверен, что когда писал этот ответ, то в вопросе в коде не было WblockCloneObjects! Поэтому и написал. Может старею уже?  :o ;D
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 18:00:56
Хоть убейте, но я уверен, что когда писал этот ответ, то в вопросе в коде не было WblockCloneObjects! Поэтому и написал. Может старею уже?  :o ;D
Скорее это всё из-за форматирования (точнее его отсутствия). Ну и из-за "языка гоблинов" (VB.NET), как любит писать Андрей Бушман.  :)
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 19:01:09
Реализовал все рекомендации Александра Ривилиса (во всяком случае я так считаю), но результат нулевой, ничего не изменилось, размеров как не было так и нет.
Ниже фрагмент кода, который изменил.

Код - vb.net [Выбрать]
  1.     Dim Doc As Document = Application.DocumentManager.MdiActiveDocument
  2.             Dim currentDb As Database = Doc.Database
  3.             Dim ed As Editor = Doc.Editor
  4.            
  5.             Using acLckDocCur As DocumentLock = Doc.LockDocument()
  6.  
  7.                 Dim acBlkTblCurrentDoc As BlockTable
  8.                 Dim acBlkTblRecCurrentDoc As BlockTableRecord
  9.                 Dim bobject As Entity = Nothing
  10.  
  11.                 Using tr = Doc.TransactionManager.StartTransaction()
  12.                     '' Open the Block table for write
  13.                     acBlkTblCurrentDoc = tr.GetObject(currentDb.BlockTableId, OpenMode.ForWrite, False, False)
  14.                     '' Open the Block table record Model space for write
  15.                     acBlkTblRecCurrentDoc = tr.GetObject(acBlkTblCurrentDoc(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False, True)
  16.                     '' Clone the objects to the new database
  17.                     For Each ObjId As ObjectId In acBlkTblRecCurrentDoc
  18.                         bobject = tr.GetObject(ObjId, OpenMode.ForWrite, False, True)
  19.                         bobject.Erase(True)
  20.                     Next
  21.                     tr.Commit()
  22.                 End Using
  23.  
  24.                 Dim acIdMap As IdMapping = New IdMapping()
  25.                 sourceDb.WblockCloneObjects(acObjIdCollsource, acBlkTblRecCurrentDoc.ObjectId, acIdMap, DuplicateRecordCloning.Replace, False)
  26.  
  27.                 Using tr = Doc.TransactionManager.StartTransaction()
  28.                     '' Open the Block table for read
  29.                     acBlkTblCurrentDoc = tr.GetObject(currentDb.BlockTableId, OpenMode.ForRead, False, False)
  30.                     '' Open the Block table record Model space for read
  31.                     acBlkTblRecCurrentDoc = tr.GetObject(acBlkTblCurrentDoc(BlockTableRecord.ModelSpace), OpenMode.ForRead, False, True)
  32.  
  33.                     For Each ObjId As ObjectId In acBlkTblRecCurrentDoc
  34.                         bobject = tr.GetObject(ObjId, OpenMode.ForRead, False, True)
  35.                         If TypeOf bobject Is Dimension Then
  36.                             Dim dimen As Dimension = bobject
  37.                             dimen.RecomputeDimensionBlock(True)
  38.                             dimen.RecordGraphicsModified(True)
  39.                         End If
  40.                     Next
  41.                     '' Save the copied objects to the database
  42.                     tr.Commit()
  43.                 End Using
  44.  End Using
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Пекшев aka Modis от 22-01-2017, 19:32:29
'' Clone the objects to the new database
                    For Each ObjId As ObjectId In acBlkTblRecCurrentDoc
                        bobject = tr.GetObject(ObjId, OpenMode.ForWrite, False, True)
                        bobject.Erase(True)
                    Next
Ну а где копирование???
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 19:34:15
Извиняюсь забыл удалить этот комментарий из кода.
Копирование ниже по коду.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Пекшев aka Modis от 22-01-2017, 19:37:02
Копирование ниже по коду.
Я к тому, что Вы в своем коде не "наполняете" коллекцию acObjIdCollsource. В первой транзакции Вы только удаляете объекты
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 19:39:28
Наполнение коллекции можно посмотреть в коде который привел в начале этой темы.
Сейчас я выложил только фрагмент, который менял по рекомендациям.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Пекшев aka Modis от 22-01-2017, 19:51:27
Поменял это:
sourceDb.WblockCloneObjects(acObjIdCollsource, acBlkTblRecCurrentDoc.ObjectId, acIdMap, DuplicateRecordCloning.Replace, False)
на это:
Код - vb.net [Выбрать]
  1. sourceDb.WblockCloneObjects(acObjIdCollsource, currentDb.CurrentSpaceId, acIdMap, DuplicateRecordCloning.Replace, false);
Копирует и даже RecomputeDimensionBlock не нужно
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 20:11:24
Проверил у себя, не помогло, никаких изменений.
А разве currentDb.CurrentSpaceId и acBlkTblRecCurrentDoc.ObjectId не одно и то же? Просто интересно для собственного развития.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 20:15:43
Реализовал все рекомендации Александра Ривилиса (во всяком случае я так считаю)
Это тебе только кажется.
1. Ты используешь acBlkTblRecCurrentDoc.ObjectId в том месте, где первая транзакция завершена и acBlkTblRecCurrentDoc уже закрыт. Так что использовать acBlkTblRecCurrentDoc.ObjectId нельзя.
2. Во второй транзакции не нужно (открывать) ни acBlkTblCurrentDoc ни acBlkTblRecCurrentDoc. Всё что тебе нужно есть в acIdMap.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 20:30:14
Чем дальше в лес тем толще партизаны. :)
Может я чего то не понимаю (скорее всего), но если "acBlkTblRecCurrentDoc уже закрыт" почему в текущий активный чертеж копируются из коллекции все объекты кроме размеров?
Как я уже писал после замены acBlkTblRecCurrentDoc.objectid на currentDb.CurrentSpaceId абсолютно ничего не изменилось.
По поводу acIdMap мне разбираться еще день или два поэтому пока что есть то есть.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 20:35:03
Как я уже писал после замены acBlkTblRecCurrentDoc.objectid на currentDb.CurrentSpaceId абсолютно ничего не изменилось.
Тебе очень повезло. Мог словить в лучшем случае Exception, в худшем Fatal Error. Нельзя использовать объекты/примитивы открытые в транзакции вне этой транзакции.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Пекшев aka Modis от 22-01-2017, 20:36:19
Код - C# [Выбрать]
  1. using System.IO;
  2. using System.Windows.Forms;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Runtime;
  7.  
  8. namespace CopyDimensions
  9. {
  10.     public class Class1
  11.     {
  12.         [CommandMethod("test")]
  13.         public void Test()
  14.         {
  15.             try
  16.             {
  17.                 Document Doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  18.                 Database currentDb = Doc.Database;
  19.                 Editor ed = Doc.Editor;
  20.                 Database sourceDb = new Database(false, true);
  21.                 var acObjIdCollsource = new ObjectIdCollection();
  22.                 var opf = new Autodesk.AutoCAD.Windows.OpenFileDialog("title", "", "dwg", "name",
  23.                     Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags.AllowAnyExtension);
  24.                 if (opf.ShowDialog() == DialogResult.OK)
  25.                 {
  26.                     sourceDb.ReadDwgFile(opf.Filename, FileShare.Read, true, "");
  27.                 }
  28.  
  29.                 using (var tr = sourceDb.TransactionManager.StartTransaction())
  30.                 {
  31.                     var acBlkTblCurrentDoc = tr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false, false) as BlockTable;
  32.                     var acBlkTblRecCurrentDoc = tr.GetObject(acBlkTblCurrentDoc[BlockTableRecord.ModelSpace], OpenMode.ForRead, false, true) as BlockTableRecord;
  33.                     foreach (ObjectId ObjId in acBlkTblRecCurrentDoc)
  34.                     {
  35.                         acObjIdCollsource.Add(ObjId);
  36.                     }
  37.                     tr.Commit();
  38.                 }
  39.                 using (var tr = currentDb.TransactionManager.StartTransaction())
  40.                 {
  41.                     var bt = tr.GetObject(currentDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  42.                     var btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  43.                     IdMapping acIdMap = new IdMapping();
  44.                     sourceDb.WblockCloneObjects(
  45.                         acObjIdCollsource,
  46.                         btr.ObjectId,
  47.                         acIdMap, DuplicateRecordCloning.Replace, false);
  48.                     tr.Commit();
  49.                 }
  50.             }
  51.             catch (Exception exception)
  52.             {
  53.                 Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(exception.Message + exception.StackTrace);
  54.             }
  55.         }
  56.     }
  57. }
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Пекшев aka Modis от 22-01-2017, 20:37:30
Еще могу порекомендовать вынести sourceDb.WblockCloneObjects(...) за рамки транзакции.
Как оказалось - плохой совет (http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-E02A8AAF-61FF-4C72-8960-0AEEBBEC2594) ))
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 21:12:43
Еще могу порекомендовать вынести sourceDb.WblockCloneObjects(...) за рамки транзакции.
Как оказалось - плохой совет (http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-E02A8AAF-61FF-4C72-8960-0AEEBBEC2594) ))
Если ты думаешь, что пример из справки - это истина в последней инстанции, то ты ошибаешься. И на этом форуме неоднократно наталкивались на ошибки в примерах и проблемы с WblockCloneObjects внутри транзакций.

Не люблю VB.NET, но решил проверить. AutoCAD 2010 у меня нет, поэтому проверял в AutoCAD 2012.

Код - vb.net [Выбрать]
  1. Imports System
  2. Imports Autodesk.AutoCAD.Runtime
  3. Imports Autodesk.AutoCAD.ApplicationServices
  4. Imports Autodesk.AutoCAD.DatabaseServices
  5. Imports Autodesk.AutoCAD.Geometry
  6. Imports Autodesk.AutoCAD.EditorInput
  7.  
  8. <Assembly: CommandClass(GetType(Rivilis.MyCommands))>
  9.  
  10. Namespace Rivilis
  11.   Public Class MyCommands
  12.  
  13.     <CommandMethod("WBTEST", CommandFlags.Modal)>
  14.     Public Sub WbTest()
  15.       Using sourceDb As Database = New Database(False, False)
  16.         Dim acObjIdCollsource As ObjectIdCollection = New ObjectIdCollection()
  17.         Using tr As Transaction = sourceDb.TransactionManager.StartTransaction()
  18.           sourceDb.ReadDwgFile("C:\TEMP\test.dwg", FileOpenMode.OpenForReadAndReadShare, True, "")
  19.           sourceDb.CloseInput(True)
  20.           Dim acBlkTblSourceDoc As BlockTable
  21.           acBlkTblSourceDoc = tr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead)
  22.           Dim acBlkTblRecSourceDoc As BlockTableRecord
  23.           acBlkTblRecSourceDoc = tr.GetObject(acBlkTblSourceDoc(BlockTableRecord.ModelSpace), OpenMode.ForRead)
  24.           For Each ObjId As ObjectId In acBlkTblRecSourceDoc
  25.             acObjIdCollsource.Add(ObjId)
  26.           Next
  27.           tr.Commit()
  28.         End Using
  29.         Dim Doc As Document = Application.DocumentManager.MdiActiveDocument
  30.         Dim currentDb As Database = Doc.Database
  31.         Dim ed As Editor = Doc.Editor
  32.  
  33.         Using acLckDocCur As DocumentLock = Doc.LockDocument()
  34.  
  35.           Dim bobject As Entity = Nothing
  36.           Dim idModel As ObjectId = ObjectId.Null
  37.           Using tr = Doc.TransactionManager.StartTransaction()
  38.             Dim acBlkTblCurrentDoc As BlockTable =
  39.               tr.GetObject(currentDb.BlockTableId, OpenMode.ForRead)
  40.             idModel = acBlkTblCurrentDoc(BlockTableRecord.ModelSpace)
  41.             Dim acBlkTblRecCurrentDoc As BlockTableRecord =
  42.               tr.GetObject(idModel, OpenMode.ForRead)
  43.             For Each ObjId As ObjectId In acBlkTblRecCurrentDoc
  44.               bobject = tr.GetObject(ObjId, OpenMode.ForWrite)
  45.               bobject.Erase(True)
  46.             Next
  47.             tr.Commit()
  48.           End Using
  49.  
  50.           Dim acIdMap As IdMapping = New IdMapping()
  51.  
  52.           sourceDb.WblockCloneObjects(acObjIdCollsource, idModel, acIdMap, DuplicateRecordCloning.Replace, False)
  53.  
  54.           Using tr = Doc.TransactionManager.StartTransaction()
  55.             For Each pair As IdPair In acIdMap
  56.               Dim id As ObjectId = pair.Value
  57.               If (id.ObjectClass.IsDerivedFrom(RXClass.GetClass(GetType(Dimension)))) Then
  58.                 Dim d As Dimension = tr.GetObject(id, OpenMode.ForWrite)
  59.                 d.RecomputeDimensionBlock(True)
  60.               End If
  61.             Next
  62.             tr.Commit()
  63.           End Using
  64.         End Using
  65.       End Using
  66.     End Sub
  67.   End Class
  68.  
  69. End Namespace

Копирует всё, в том числе и размеры и что наиболее важно - размеры внутри блоков. Размеры в пространстве модели должно было копировать и так, без RecomputeDimensionBlock. Во всяком случае как раз недавно такая проблема всплыла в ObjectARX: https://forums.autodesk.com/t5/objectarx/why-the-dimensions-not-show/td-p/6777534
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 21:15:35
dmitry15
Проверь на всякий случай не заблокированы ли слои на которые должны быть скопированы размеры в текущем чертеже.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Пекшев aka Modis от 22-01-2017, 21:25:16
Если ты думаешь, что пример из справки - это истина в последней инстанции, то ты ошибаешься. И на этом форуме неоднократно наталкивались на ошибки в примерах и проблемы с WblockCloneObjects внутри транзакций.
Я немного про другое имел ввиду. Чтобы получить acBlkTblRecCurrentDoc.ObjectId все равно нужно открывать транзакцию - вот я про что. Просто я не учел, что при этом WblockCloneObjects можно вынести за транзакцию. У меня где-то на подкороче осталось "Что произошло в транзакции - должно остаться в транзакции"  :D
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 21:56:37
Ура, я это сделал, конечно не без помощи Александра Ривилиса, а именно пока не заменил свою транзакцию, в которой находится RecomputeDimensionBlock(True) на ту, которая приведена в примере Александра Ривилиса ничего не менялось, независимо от того где находится WblockCloneObjects в транзакции или вне ее.
И еще относительно последнего кода приведенного Александра Ривилиса при к его просмотре засомневался в строчке Using sourceDb As Database = New Database(False, False), но решил тупо проверить акад выдал сообщение NoInputFiler.
Заменил ее на Using sourceDb As Database = New Database(False, True) все заработало.
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Петренко Дмитрий от 22-01-2017, 22:15:34
Раз уж зашел разговор, еще вопрос.
При копировании некоторых чертежей выдается сообщение eNotAllowedForThisProxy и ничего не копируется, насколько я понимаю не получается копировать объекты AutocadMechanical т.е. блоки с атрибутами так как именно оно там присутствуют в отличие от других чертежей. Возможно ли их скопировать? Какой для этого есть метод? 
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 22-01-2017, 22:51:23
Раз уж зашел разговор, еще вопрос.
При копировании некоторых чертежей выдается сообщение eNotAllowedForThisProxy и ничего не копируется, насколько я понимаю не получается копировать объекты AutocadMechanical т.е. блоки с атрибутами так как именно оно там присутствуют в отличие от других чертежей. Возможно ли их скопировать? Какой для этого есть метод? 
Если не загружены модули AutoCAD Mechanical, то его объекты/примитивы будут прокси и соответственно они не будут копироваться. Поэтому попробуй перед копированием загрузить соответствующие arx/dbx-файлы (какие именно - ищи сам).
И еще относительно последнего кода приведенного Александра Ривилиса при к его просмотре засомневался в строчке Using sourceDb As Database = New Database(False, False), но решил тупо проверить акад выдал сообщение NoInputFiler.
Заменил ее на Using sourceDb As Database = New Database(False, True) все заработало.
Это видимо баг AutoCAD 2010 (или Mechanical - если у тебя не чистый AutoCAD).
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: exilerus от 30-05-2017, 11:38:29
Нашел информацию о проблеме тут. Спасибо!
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: Александр Ривилис от 30-05-2017, 11:46:50
Нашел информацию о проблеме тут. Спасибо!
Если не секрет, то о какой проблеме?
Название: Re: При копировании объектов из одного dwg файла в другой размеры не копируются
Отправлено: exilerus от 30-05-2017, 12:12:03
Да вот как раз об этой. Не производился пересчет размеров при копировании объектов с другого чертежа.