Обновление вхождений блоков на чертеже (как?)

Автор Тема: Обновление вхождений блоков на чертеже (как?)  (Прочитано 7087 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Всем привет!
Достаточно долго мучаюсь с обновлением вхождений блоков на чертеже, пока не получается, прошу помощи.
Имеется каталог с dwg-файлами формата "My_block_1.dwg" (для примера). В каждом таком файле создан блок с именем "My-block-1". Некоторые из блоков на днях были переделаны в динамические, так что появилась задача в существующих чертежах (с старыми блоками) обновить их вхождения.

Тестовый код на примере одного блока:
Код - Auto/Visual Lisp [Выбрать]
  1.  (setq vl-blk (car (entsel))); выбираем старый блок на чертеже
  2.  (setq block_name (vla-get-EffectiveName (vlax-ename->vla-object vl-blk))); извлекаем имя блока
  3.  (setq block_filename (vl-string-translate "-" "_" block_name)); получаем имя файла для этого блока
  4.  (setq block_path_filename (findfile (strcat block_filename ".dwg"))); путь до файла с блоком
  5. ;Вставка нового блока (файла!) с переопределением:
  6.  (vl-cmdf "_insert" (strcat block_filename "=" block_path_filename ))
  7.  (command)
А дальше, если всё было правильно до этого, нужно переопределить все вхождения "My-block-1" на новые, которые содержатся внутри "My_block_1".

Отмечено как Решение Macondo 26-05-2017, 01:12:32

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Похоже у тебя ошибка в логике работы. Ты создаёшь блок My_block_1 вставляя в текущий чертеж файл My_block_1.dwg. Но в My_block_1.dwg  есть блок My_block_1, так что переопределение будет рекурсивным. Думаю что вставлять нужно с другим именем. И мне совсем непонятно зачем нужно хранить по одному блоку в файле, если можно обойтись без блоков, а всё что нужно находится непосредственно в пространстве модели.
Вот в этом случае как раз (vl-cmdf "_insert" (strcat block_filename "=" block_path_filename )) переопределит блок block_filename. Ну а после этого _ATTSYNC. Впрочем этого может быть недостаточно для динамических блоков и придётся найти все вставки блока block_filename и переопределить их (получить все динамические параметры, удалить вставку, вставить новый блок и установить сохраненные динамические параметры).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Но в My_block_1.dwg  есть блок My_block_1, так что переопределение будет рекурсивным.
Не совсем: в My_block_1.dwg есть блок с именем My-block-1 (дефис вместо нижнего подчёркивания).
зачем нужно хранить по одному блоку в файле, если можно обойтись без блоков, а всё что нужно находится непосредственно в пространстве модели
Обычно я вставляю на рабочий чертёж сначала сам файл:
(command "_insert" block_path_filename nil)
А затем уже сам блок:
(vl-cmdf"_-insert" block_name pause 1 1 "")
"Один файл — один блок" — это просто система хранения библиотеки блоков.

Ещё один вопрос возник: можно ли как-то менять параметр динамического блока ДО его вставки? Чтобы, допустим, при вставке на курсоре "висел" блок с разными диаметрами окружности внутри блока (диаметры окружности динамические)?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
можно ли как-то менять параметр динамического блока ДО его вставки?
Нет, если воспринимать вопрос буквально. Параметры есть у вставки блока, а не у описания блока. Поэтому параметры можно менять только после вставки блока. Средствами ObjectARX и AutoCAD .NET API используя Jig-технологию можно организовать то, что тебе нужно, когда блок вставляется, меняются его параметры, а затем он таскается за курсором. Возможно это можно сделать и средствами VisulLisp, используя функцию (grread) и/или комбинацию команд _MOVE/_ROTATE/_SCALE, но это неоправданно сложно (IMHO).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Александр Ривилис, спасибо. А что насчёт переопределения вхождений блоков? Всё-таки имена файлов и содержащихся в них блоков разные ("-" и "_"). Надо как-то сначала обновить блоки-файлы, а уже в них будут содержаться обновлённые блоки, которыми нужно заменить все вхождения на чертеже.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Всё-таки имена файлов и содержащихся в них блоков разные ("-" и "_")
Но ты же присваиваешь при вставке им имена, которые соответствуют имени блока внутри вставляемого файла.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Но ты же присваиваешь при вставке им имена, которые соответствуют имени блока внутри вставляемого файла.
Не так: я сначала вставляю блоки-dwg ("My_block_1.dwg"), а уже потом блоки из них "My-block-1". В результате в базе чертежа хранятся и "My_block_1", и "My-block-1" (первый удаляется через PURGE). Может, это не лучший вариант библиотеки блоков. Но с учётом этой особенности можно переопределить блоки?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Что-то ты меня совсем пытаешься запутать. Я не поленился и создал файл "My_block_1.dwg", который содержит блок "My-block-1". В пустой чертеж пытаюсь вставить этот файл. Результат именно тот, о котором я уже выше несколько раз говорил (блок ссылается сам на себя):




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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Понятно. Способ хранения библиотеки блоков был выбран неверно. Нужно было вместо того, чтобы сохранять объекты в блок "My-block-1", после чего сохраняя файл с именем "My_block_1.dwg", просто выносить объекты в блок-файл командой _WBLOCK. Правильно?
Отсюда и ошибки.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Понятно. Способ хранения библиотеки блоков был выбран неверно. Нужно было вместо того, чтобы сохранять объекты в блок "My-block-1", после чего сохраняя файл с именем "My_block_1.dwg", просто выносить объекты в блок-файл командой _WBLOCK. Правильно?
Отсюда и ошибки.
Именно! Или просто рисовать в пустом чертеже (в пространстве модели) и сохранять его (_SAVEAS) под именем "My-block-1".
« Последнее редактирование: 26-05-2017, 11:01:40 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение