ADN Club > VBA

Вставка блока из другого файла

(1/7) > >>

Дамир:
Друзья, приветствую!
Наша 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)
Вопрос остается открытым: какой метод исползовать для копирования объектов, блоков из чертежа в чертеж, либо вставки блока в чертеж?????????

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии