ADN Club > VBA
Вставка блока из другого файла
Дамир:
Друзья, приветствую!
Наша PDM система позволяет выполнять VBS скрипты. Необходима команда для постановки подписи в файл AutoCAD. В имеющийся файл “Наш чертеж” поместить блок из файла “Подпись”.
Руководствовался интернетом, в частности форумами. Примеры кода моих попыток:
Начало одинаковое:
--- Код - Visual Basic [Выбрать] ---Dim FileDialog, FName, AcadApp, AcadDocs, Doc, DocNewSet AcadApp = CreateObject("AutoCAD.Application") Set doc1 = AcadDocs.Open("C:\Users\damir\Downloads\Sign\Наш чертеж.dwg")Set doc2 = AcadDocs.Open("C:\Users\damir\Downloads\Sign\Подпись.dwg")
ВАРИНАТ 1
--- Код - Visual Basic [Выбрать] ---set blocks1 = doc1.Blocksset blocks2 = doc2.Blocks set oldBlock = blocks2.Item("sss") ‘ естественно блок с именем “sss” существует.insp = oldBlock.Origin redim objs(oldBlock.count)i=0 For Each obj In oldBlock set objects(i) = obj i = i + 1Next set newBlock = blocks1.add(insp, "sss")‘Далее варианты команды CopyObjectsset res = doc1.CopyObjects(obs)set res = doc1.CopyObjects(obs, newBlock)doc1.CopyObjects(obs, newBlock)
‘ в результате получаю ошибку:
"Неверный массив объектов" - ошибка AutoCAD.Applocation
хотя при обращении msgbox obs(0).ObjectName получаю имя объекта (полилиния)
_______________________________________
ВАРИАНТ 2
--- Код - Visual Basic [Выбрать] ---‘Начало то же Dim dblX, dblY, dblZ, dblRotationdim varInsertionPoint(3) varInsertionPoint(0) = Cdbl(0)varInsertionPoint(1) = Cdbl(0)varInsertionPoint(2) = Cdbl(0) dblX = Cdbl(0)dblY = Cdbl(0)dblZ = Cdbl(0)dblRotation = Cdbl(0) Set objBlockRef = doc1.ModelSpace.InsertBlock(varInsertionPoint, "C:\Users\damir\Downloads\Sign\Подпись.dwg", dblX, dblY, dblZ, dblRotation) Ничего не происходит. То есть вставку не наблюдаю. Прошелся по всему чертежу...
Возможно я использую не те методы AutoCAD. Либо допускаю ошибки. Прошу Вашей помощи в разрешении этого вопроса.
Заранее премного благодарен.
Александр Ривилис:
На VBA я не пишу совсем, но это как понимать:
--- Код - Visual Basic [Выбрать] ---redim objs(oldBlock.count)i=0 For Each obj In oldBlock set objects(i) = obj i = i + 1Next Т.е. определяешь objs, а заполняешь objects. Это как?
Второе. При таком копировании ты копируешь описание блока, а не вставку блока. Т.е в самом чертеже ты так ничего и не увидишь.
Во втором случае ты вставляешь Пространство Модели из внешнего чертежа в Пространство модели своего чертежа, а совсем не блок "sss"
Ну и если в том чертеже в Пространстве модели ничего нет, то ты ничего и не видишь.
Дамир:
Александр Ривилис, благодарю за скорый ответ!
Пройду по замечаниям. Многое осмотрел в примерах на ресурсах, посвященных этой теме.
1. По поводу obs и objects. Код был перелопачен изрядно. Видимо на форум поместил измененный фрагмент. Т.е. в рабочем коде везде obs.
--- Цитировать ---При таком копировании ты копируешь описание блока, а не вставку блока. Т.е в самом чертеже ты так ничего и не увидишь.
--- Конец цитаты ---
Вы имеете ввиду эти методы:
--- Код - Visual Basic [Выбрать] ---set newBlock = blocks1.add(insp, "sss")‘Далее варианты команды CopyObjectsset res = doc1.CopyObjects(obs)set res = doc1.CopyObjects(obs, newBlock)doc1.CopyObjects(obs, newBlock)
Получается таким способом нельзя скопировать объект из одного чертежа в другой? Наверное я что то не понимаю. В справке к AutoCAD нашел о методе CopyObjects:
--- Цитировать ---Duplicates multiple objects (deep cloning).
RetVal = object.CopyObjects(Objects [, Owner] [, IDPairs])
--- Конец цитаты ---
2.
--- Цитировать ---Во втором случае ты вставляешь Пространство Модели из внешнего чертежа в Пространство модели своего чертежа, а совсем не блок "sss"
--- Конец цитаты ---
Данный способ посмотрел в примере:
--- Код - Visual Basic [Выбрать] ---Set objBlockRef = doc1.ModelSpace.InsertBlock(varInsertionPoint, "C:\Users\damir\Downloads\Sign\Подпись.dwg", dblX, dblY, dblZ, dblRotation)По поводу копирования пространств модели спорить не буду, но во втором чертеже есть объект - сплайн. Его при копировании не наблюдаю.
3. Ну и самый главный вопрос: если перечисленные методы не подходят, то каким же пользоваться для простого копирования блока из одного чертежа в другой? Прошу Вашей помощи, ибо уж все перепробовал...
Александр Ривилис:
--- Цитата: Дамир от 12-08-2014, 09:03:53 ---По поводу копирования пространств модели спорить не буду, но во втором чертеже есть объект - сплайн. Его при копировании не наблюдаю.
--- Конец цитаты ---
А ты не обратил внимание, что у тебя в коде нулевые масштабные коэффициенты по X,Y,Z??? Я так понимаю, что они должны быть единичными.
Дамир:
Александр Ривилис, да обратил кончено.
Следующий код возвращает ошибку: "Недопустимое число элементов в Safearray" - AutoCAD.Appplication
--- Код - Visual Basic [Выбрать] ---redim startPoint(3) startPoint(0) = cdbl(1.0)startPoint(1) = cdbl(1.0)startPoint(2) = cdbl(1.0) Dim convArr1convArr1 = ThisApplication.Utility.VariantToArray(startPoint) dblX = cdbl(1.0)dblY = cdbl(1.0)dblZ = cdbl(1.0)dblRotation = cdbl(0.0) Set objBlockRef = doc1.ModelSpace.InsertBlock(convArr1, "C:\Users\damir\Downloads\Sign\Подпись.dwg", dblX, dblY, dblZ, dblRotation)
Вопрос остается открытым: какой метод исползовать для копирования объектов, блоков из чертежа в чертеж, либо вставки блока в чертеж?????????
Навигация
Перейти к полной версии