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

Автор Тема: Вставка блока из другого файла  (Прочитано 36003 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого файла
« Ответ #15 : 13-08-2014, 14:35:54 »
На всякий случай создал тему:
Документация по ActiveX/COM модели AutoCAD
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДамирАвтор темы

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Re: Вставка блока из другого файла
« Ответ #16 : 13-08-2014, 16:22:39 »
Алексей Кулик и Александр Ривилис,  спасибо за подсказку.

Сделал так:
Код - Visual Basic [Выбрать]
  1. for each lay in doc2.Layouts
  2.     if lay.name <> "Модель" and lay.name <> "Model" then
  3.           Set entRef = lay.block.InsertBlock(conv1, strBlockName, 1, 1, 1, 0)
  4.      end if
  5.    next

Сработало.

Далее буду привязываться к форматам. Отпишу по результатам и вопросам. Спасибо!
« Последнее редактирование: 13-08-2014, 21:38:48 от Дамир »
Сколько голов, столько умов. Но голов больше

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого файла
« Ответ #17 : 13-08-2014, 18:18:43 »
Универсальнее (чтобы не зависеть от языка локализации AutoCAD) будет так:
Код - Visual Basic [Выбрать]
  1. for each lay in doc2.Layouts
  2.    if lay.Block.Name <> doc2.ModelSpace.Name then
  3.        Set entRef = lay.Block.InsertBlock(conv1, strBlockName, 1, 1, 1, 0)
  4.    end if
  5. next
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДамирАвтор темы

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Re: Вставка блока из другого файла
« Ответ #18 : 13-08-2014, 21:16:08 »
Александр Ривилис, спасибо. Согласен.
Появились новые вопросы. Как разберусь - отпишу
Сколько голов, столько умов. Но голов больше

Оффлайн ДамирАвтор темы

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Re: Вставка блока из другого файла
« Ответ #19 : 14-08-2014, 10:42:08 »
Продолжение битвы.
Теперь занимаюсь поиском координат для вставки блока-подписи. Сразу скажу, что блок-подпись будет помещаться относительно блока-штампа (стандартный проектный штамп с должностями и фамилиями). Есть две идеи:


1. К примеру в блоке-штампе есть примитив "ГИП", если узнать его точку вставки (относительно начала координат всего чертежа, а не блока), то блок-подпись я помещу напротив примитива "ГИП" с небольшим шагом.
Вопрос: точку вставки примитива я определяю так:


Код - Visual Basic [Выбрать]
  1. coor = objBlock.item(1).InsertionPoint

Однако, выясняется, что это точка вставки относительно блока, а не начала координат чертежа.
Как определить точку вставки примитива в блоке относительно начала координат чертежа?

2. Если первая идея не реализуема, тогда:
Определить точку вставки блока, однако, и тут проблема: в методах AcadBlock я не нашел ничего похожего на InsertionPoint, зато есть Origin. Но Origin  дает всегда 0,0,0 (точка вставки блока-штампа не равна 0,0,0).  В справке AutocAD написано"Specifies the origin of the UCS, block, layout, or raster image in WCS coordinates" - я понимаю это как координаты точки вставки блока-штампа относительно начала координат чертежа, но Origin дает 0,0,0 в любом случае.

Как определить координаты точки вставки блока-штамп относительно начала координат чертежа? Только блок является AcadBlock, а не AcadBlockReference.


Заранее премного благодарен!
Сколько голов, столько умов. Но голов больше

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Вставка блока из другого файла
« Ответ #20 : 14-08-2014, 10:54:07 »
Примитива "ГИП" не существует в принципе. Скорее всего, это атрибут (точнее, AttrbuteReference). Соответственно надо смотреть его свойства.
Далее. Разберись с описанием блока и вхождением блока - разница принципиальная.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого файла
« Ответ #21 : 14-08-2014, 11:16:01 »
Только блок является AcadBlock, а не AcadBlockReference.
AcadBlock - это описание блока, а AcadBlockReference - это вставка блока. В общем случае может быть несколько вставок блока для одного описания блока. Например, блоки-штампы на разных листах могут быть вставками одного и того-же блока. Между вставкой блока и его описанием есть взаимосвязь - имена совпадают. Если блок динамический, то все несколько сложнее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого файла
« Ответ #22 : 14-08-2014, 11:27:20 »
Примитива "ГИП" не существует в принципе. Скорее всего, это атрибут (точнее, AttrbuteReference).
А мне кажется, что это скорее или Text или MText -  так как это постоянный текст, то его делать атрибутом нелогично.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Вставка блока из другого файла
« Ответ #23 : 14-08-2014, 11:28:33 »
Может быть :) Вариантов масса.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн ДамирАвтор темы

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Re: Вставка блока из другого файла
« Ответ #24 : 14-08-2014, 11:35:31 »
1. В моем случае это "ГИП" текст-примитив, а не атрибут. Он действительно постоянный и менять не нужно


2. Я понимаю что блок-штамп определяется один раз для всего чертежа (AcadBlock), а вставляться может несколько раз на разные листы - это AcadBlockReference.
В моем случае, проектировщик руками вставляет блок стандартным способом Вставка/Блок на листы, которые пожелает, при этом при обращении к блоку следующим образом:

Код - Visual Basic [Выбрать]
  1. Set objBlock = colBlocks.Item("Штамп")

у него не наблюдаю метода InsertionPoint.

Как обратиться к блоку-штампу на каждом листе? т.е. обратиться к блоку-штампу как к AcadBlockReference, к вставке блока, а не к его определению (говоря вашими словами).
« Последнее редактирование: 14-08-2014, 11:48:00 от Дамир »
Сколько голов, столько умов. Но голов больше

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого файла
« Ответ #25 : 14-08-2014, 13:09:22 »
2. Я понимаю что блок-штамп определяется один раз для всего чертежа (AcadBlock), а вставляться может несколько раз на разные листы - это AcadBlockReference.
Правильно.
В моем случае, проектировщик руками вставляет блок стандартным способом Вставка/Блок на листы, которые пожелает, при этом при обращении к блоку следующим образом:

Код - Visual Basic: [Выделить]

    Set objBlock = colBlocks.Item("Штамп")


у него не наблюдаю метода InsertionPoint.

Потому что ты обращаешься к описанию блока, а не к его вставке. Тебе уже не в первый раз об этом говорят.
Как обратиться к блоку-штампу на каждом листе? т.е. обратиться к блоку-штампу как к AcadBlockReference, к вставке блока, а не к его определению (говоря вашими словами).
Ты должен:
1) пройтись по всем листам (Layout), получить блоки для этих Loyout
2) пройтись по этим блокам и найти все AcadBlockReference, имена которых соотвествуют имени твоего блока-штампа и получить их InsertionPoint
3) А вот тут начинается самое интересное. Тебе нужно пересчитать координаты текста "ГИП" внутри твоего AcadBlock в координаты WCS с точкой вставки InsertionPoint для AcadBlockReference. В простейшем случае ничего пересчитывать не придется, если AcadBlock.Origin = (0,0,0) и AcadBlockReference не повернут и неотмасшабирован.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДамирАвтор темы

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Re: Вставка блока из другого файла
« Ответ #26 : 14-08-2014, 13:34:23 »
Цитировать
1) пройтись по всем листам (Layout), получить блоки для этих Loyout

2) пройтись по этим блокам и найти все AcadBlockReference, имена которых соотвествуют имени твоего блока-штампа и получить их InsertionPoint
Как у конкретного листа Layout получить блоки? Через:


Код - Visual Basic [Выбрать]
  1. Layout.block

? Или как то еще?


Т.е. в этом то и вопрос как найти все блоки (вставки) листа ( AcadBlockReference )
« Последнее редактирование: 14-08-2014, 13:47:43 от Дамир »
Сколько голов, столько умов. Но голов больше

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Вставка блока из другого файла
« Ответ #27 : 14-08-2014, 13:49:16 »
Пройтись по всем элементам Layout.Block и выбрать блоки, имена которых соответствуют определенному критерию.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого файла
« Ответ #28 : 14-08-2014, 13:51:54 »
Как у конкретного листа Layout получить блоки? Через:


Код - Visual Basic: [Выделить]

    Layout.block


? Или как то еще?

Именно так.
Т.е. в этом то и вопрос как найти все блоки (вставки) листа и найти их AcadBlockReference
Внутри Layout.Block делаешь:
Код - Visual Basic [Выбрать]
  1. for each en in blk
  2.   if (en.ObjectName = "AcadBlockReference") then
  3.      ' здесь проверяем имя блока
  4.     Dim blkRef as BlockReference
  5.      set blkRef = en
  6.      if (blkRef.Name = "имя нашего блока") then
  7.        ' Тут уже можно получать точку вставки и искать "ГИП"'а
  8.     end if
  9.   end if
  10. end for
Код очень условный.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДамирАвтор темы

  • ADN Club
  • **
  • Сообщений: 94
  • Карма: 1
Re: Вставка блока из другого файла
« Ответ #29 : 14-08-2014, 14:14:00 »
Спасибо Вам! Я никак не мог догадаться обратиться к Block как к коллекции блоков AcDbBlockReference через for each.


Теперь буду прорабатывать этот момент:
Цитировать
3) А вот тут начинается самое интересное. Тебе нужно пересчитать координаты текста "ГИП" внутри твоего AcadBlock в координаты WCS с точкой вставки InsertionPoint для AcadBlockReference. В простейшем случае ничего пересчитывать не придется, если AcadBlock.Origin = (0,0,0) и AcadBlockReference не повернут и неотмасшабирован.
Сколько голов, столько умов. Но голов больше