При копировании объектов из одного dwg файла в другой размеры не копируются. Почему?В действительности они копируются. Но для них (после копирования) нужно выполнить метод Dimension.RecomputeDimensionBlock
попробовал использовать в коде под AutoCad 2010 вариант RecomputeDimensionBlock у Dimension отсутствуетПлохо искал. Проверил в AutoCAD 2010 - есть такой метод:
- currentDb.BlockTableId и acBlkTblCurrentDoc(BlockTableRecord.ModelSpace) открыты для записи, так как в файле в который копирую объекты перед этим те объекты, что там находятся я удаляю.Ну и что? Ты видимо не понимаешь. Факт удаления объекта никак не связан ни с BlockTable, ни с BlockTableRecord. Открывать их на запись нужно только тогда, когда непосредственно они модифицируются.
- попробовал вынести за транзакцию sourceDb.WblockCloneObjects(...) компилятор ругается, что переменная acBlkTblRecCurrentDoc не объявлена, может что то не то делаю.Конечно не определена. Но она и не нужна. Нужен её ObjectId, который нужно было получить в транзакции, а использовать вне транзакции.
Копирование нужно делать методом sourceDb.WblockCloneObjects. Вот пример (http://through-the-interface.typepad.com/through_the_interface/2006/08/import_blocks_f.html).Хоть убейте, но я уверен, что когда писал этот ответ, то в вопросе в коде не было WblockCloneObjects! Поэтому и написал. Может старею уже? :o ;D
Хоть убейте, но я уверен, что когда писал этот ответ, то в вопросе в коде не было WblockCloneObjects! Поэтому и написал. Может старею уже? :o ;DСкорее это всё из-за форматирования (точнее его отсутствия). Ну и из-за "языка гоблинов" (VB.NET), как любит писать Андрей Бушман. :)
'' 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
Копирование ниже по коду.Я к тому, что Вы в своем коде не "наполняете" коллекцию acObjIdCollsource. В первой транзакции Вы только удаляете объекты
sourceDb.WblockCloneObjects(acObjIdCollsource, acBlkTblRecCurrentDoc.ObjectId, acIdMap, DuplicateRecordCloning.Replace, False)на это:
Реализовал все рекомендации Александра Ривилиса (во всяком случае я так считаю)Это тебе только кажется.
Как я уже писал после замены acBlkTblRecCurrentDoc.objectid на currentDb.CurrentSpaceId абсолютно ничего не изменилось.Тебе очень повезло. Мог словить в лучшем случае Exception, в худшем Fatal Error. Нельзя использовать объекты/примитивы открытые в транзакции вне этой транзакции.
Еще могу порекомендовать вынести sourceDb.WblockCloneObjects(...) за рамки транзакции.Как оказалось - плохой совет (http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-E02A8AAF-61FF-4C72-8960-0AEEBBEC2594) ))
Если ты думаешь, что пример из справки - это истина в последней инстанции, то ты ошибаешься. И на этом форуме неоднократно наталкивались на ошибки в примерах и проблемы с WblockCloneObjects внутри транзакций.Еще могу порекомендовать вынести sourceDb.WblockCloneObjects(...) за рамки транзакции.Как оказалось - плохой совет (http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-E02A8AAF-61FF-4C72-8960-0AEEBBEC2594) ))
Если ты думаешь, что пример из справки - это истина в последней инстанции, то ты ошибаешься. И на этом форуме неоднократно наталкивались на ошибки в примерах и проблемы с WblockCloneObjects внутри транзакций.Я немного про другое имел ввиду. Чтобы получить acBlkTblRecCurrentDoc.ObjectId все равно нужно открывать транзакцию - вот я про что. Просто я не учел, что при этом WblockCloneObjects можно вынести за транзакцию. У меня где-то на подкороче осталось "Что произошло в транзакции - должно остаться в транзакции" :D
Раз уж зашел разговор, еще вопрос.Если не загружены модули AutoCAD Mechanical, то его объекты/примитивы будут прокси и соответственно они не будут копироваться. Поэтому попробуй перед копированием загрузить соответствующие arx/dbx-файлы (какие именно - ищи сам).
При копировании некоторых чертежей выдается сообщение eNotAllowedForThisProxy и ничего не копируется, насколько я понимаю не получается копировать объекты AutocadMechanical т.е. блоки с атрибутами так как именно оно там присутствуют в отличие от других чертежей. Возможно ли их скопировать? Какой для этого есть метод?
И еще относительно последнего кода приведенного Александра Ривилиса при к его просмотре засомневался в строчке Using sourceDb As Database = New Database(False, False), но решил тупо проверить акад выдал сообщение NoInputFiler.Это видимо баг AutoCAD 2010 (или Mechanical - если у тебя не чистый AutoCAD).
Заменил ее на Using sourceDb As Database = New Database(False, True) все заработало.
Нашел информацию о проблеме тут. Спасибо!Если не секрет, то о какой проблеме?