Получить имя блока, открытого в текущий момент в Block editor'е
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получить имя блока, открытого в текущий момент в Block editor'е

Получить имя блока, открытого в текущий момент в Block editor'е

Ответ
Поиск в этой теме
Непрочитано 22.07.2010, 15:50 #1
Получить имя блока, открытого в текущий момент в Block editor'е
Ax3
 
Programming, automation, CADs, GISs. "Теплоком"
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 306

Привет, братья по каду.
В хелпе по AutoCAD 2008 (в разделе для разработчика) вообще нет упоминания про Block editor.
А мне нужно в нем выполнять некоторые программы, модифицирующие редактируемый блок. Надо программно получить хотя бы имя блока, открытого в Block editor'е.
Есть такая возможность?
__________________
На LISPе можно мыслить!
Просмотров: 4243
 
Непрочитано 22.07.2010, 16:58
1 | #2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Ax3 Посмотреть сообщение
Надо программно получить хотя бы имя блока, открытого в Block editor'е.
Есть такая возможность?
Начиная с AutoCAD 2010 при помощи ObjectARX с помощью недокументированной функции acedGetBlockEditBlockName
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 23.07.2010, 00:59
#3
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Засада... в 2008-м надо. Может, хоть как-то, хоть через одно место - все-таки можно? Сильно надо...
Хотя, можно написать свое окно с выбором редактируемого блока, и вызывать блок едитор программно... Тогда-то уж точно будет известно, какой блок открыт. Но это крайний вариант
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 23.07.2010, 01:07
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Ax3, а что конкретно требуется внутри редактора блоков? Может, есть другие варианты решения?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.07.2010, 07:50
#5
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Привет, Алексей.
Требуется заполнять/редактировать значения по умолчанию скрытых атрибутов блока, как-то: название блока по ГОСТ, информация об исполнителе, дате исполнения и версии, границах применения и т.п. В принципе это могут быть расширенные данные, но скрытые атрибуты предпочтительней, поскольку пользователь в любой момент может их просмотреть в том же редакторе блоков
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 23.07.2010, 08:58
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


А зачем так заморочено-то делать? Ведь получить атрибуты вхождения (равно как и описания) блока не так уж и сложно. Во, как пример:
Код:
[Выделить все]
(vl-load-com)


(defun _dwgru-block-get-invisible-attributes (block / _kpblc-conv-vla-to-list res)
                                             ;|
*    Получение скрытых атрибутов блока
*    Параметры вызова:
	block	указатель на вхождение блока (ename или vla-указатель). nil недопустим
*    Примеры вызова:
(setq lst (_dwgru-block-get-invisible-attributes (car (entsel))))
; '(#<VLA-OBJECT IAcadAttributeReference2 1684701c> #<VLA-OBJECT IAcadAttributeReference2 16846eec>)
(vlax-dump-Object (car lst))
;   <...>
;   Invisible = -1
;   <...>
|;

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((listp value)
       (mapcar '_kpblc-conv-vla-to-list value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (cond
    ((= (type block) 'ename)
     (setq res (_dwgru-block-get-invisible-attributes (vlax-ename->vla-object block)))
     )
    ((and (= (type block) 'vla-object)
          (= (vla-get-objectname block) "AcDbBlockReference")
          ) ;_ end of and
     (setq res (vl-remove-if
                 (function
                   (lambda (x)
                     (equal (vla-get-invisible x) :vlax-false)
                     ) ;_ end of lambda
                   ) ;_ end of function
                 (append
                   (_kpblc-conv-vla-to-list (vla-getattributes block))
                   (_kpblc-conv-vla-to-list (vla-getconstantattributes block))
                   ) ;_ end of append
                 ) ;_ end of vl-remove-if
           ) ;_ end of setq
     )
    ((and (= (type block) 'vla-object)
          (= (vla-get-objectname block) "AcDbBlockTableRecord")
          ) ;_ end of and
     (vlax-for ent block
       (if (and (wcmatch (strcase (vla-get-objectname ent)) "*ATTR*")
                (equal (vla-get-invisible ent) :vlax-false)
                ) ;_ end of and
         (setq res (cons ent res))
         ) ;_ end of if
       ) ;_ end of vlax-for
     )
    ) ;_ end of cond
  res
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.07.2010, 09:21
#7
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Ax3, а зачем для редактирования скрытых атрибутов нужно имя блока.
Может я чего не понял, но раз Вы работаете внутри редактора блоков, то можно с помощью entnext перебрать все элементы блока, выбрать нужные (например атрибуты) и делать с ними все что угодно.
TararykovDG вне форума  
 
Непрочитано 23.07.2010, 09:30
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


TararykovDG, а с какого примитива начинать "исчисление" entnext?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.07.2010, 09:50
1 | #9
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Алексей, по-моему, если открыт редактор блоков, то entnextом мы переберем только элементы составляющие наш блок, поэтому можно перебрать все элементы и выбрать нужные просто по типу примитива
Пример:
(setq obj (entnext)) - первый элемент блока
(while obj
{тело цикла}
(setq obj (entnext obj)) - следующий элемент блока
)
Повторюсь, все это, только если работаем в редакторе блоков, на DWG чертеже, естественно не получиться. Поправьте если ошибаюсь
TararykovDG вне форума  
 
Автор темы   Непрочитано 23.07.2010, 10:13
#10
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


TararykovDG, ты абсолютно прав. Только что проверил - (entnext) перебирает примитивы открытого в block editor'е блока! Спасибо за подсказку. Имя блока, кстати, можно хранить в одном из атрибутов

Алексей, тут понимаешь в чем дело - хотелось избавить пользователя от лишних указаний блоков. Скажем так, чтобы пользователь контекстно в редакторе блоков спокойно вызывал нужные функции
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 23.07.2010 в 10:18.
Ax3 вне форума  
 
Непрочитано 21.06.2014, 23:25
#11
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Вопрос не совсем в тему, но новую из-за него создавать ой как не хочется.
Помогите, пожалуйста, сообразить, как программно (на лиспе) определить, что в данный момент активен редактор блока? Проверял переменные - что в пространстве модели, что в редакторе блоков - ни одна не поменялась. Возникла мысль проверять цвет фона, но что-то свойство GraphicsWinModelBackgrndColor, как и писал Полещук, недоступно для чтения. На этом мои мысли зашли в тупик...
skkkk вне форума  
 
Непрочитано 22.06.2014, 01:45
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


skkkk, системная переменная BLOCKEDITOR
Александр Ривилис вне форума  
 
Непрочитано 22.06.2014, 13:17
#13
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Спасибо, Александр, оказывается я плохо искал, Offtop: хотя думал, что ищу хорошо и грамотно с тех пор, как узнал про команду _SYSVDLG. Сохраняю я, значит, все переменные в текстовый файл в модели, захожу в редактор блока, сохраняю еще раз, сравниваю два файла в Notepad++ - пишет "Полное соответствие". Стало быть readonly-переменные игнорируются и не пишутся в файл. Старый метод (vl-cmdf "_setvar" "?" "*") оказался надежнее. Спасибо еще раз
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получить имя блока, открытого в текущий момент в Block editor'е

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
застревает файл при копировании, в чем дело? maximas AutoCAD 4 12.11.2010 10:34
Как перенести в чертеж блок из файла библиотеки блоков Main Urod Программирование 8 03.02.2010 14:15
Перевод имени блока в имя переменной и обратно Supermax Программирование 11 14.12.2009 23:26
Не могу расчленить объекты! msuab2004 AutoCAD 6 24.04.2009 00:17
Вариация моделей в SCAD - проблемы с РСУ UIII SCAD 2 04.10.2007 13:35