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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить vla-объект, который находится в блоке или как с помощью Lisp поменять видимость в дин. блоке?

Как получить vla-объект, который находится в блоке или как с помощью Lisp поменять видимость в дин. блоке?

Ответ
Поиск в этой теме
Непрочитано 27.12.2010, 18:39 #1
Как получить vla-объект, который находится в блоке или как с помощью Lisp поменять видимость в дин. блоке?
Shraybicus
 
Регистрация: 05.12.2010
Сообщений: 104

Добрый вечер всем профессионалам в Lisp'е!

Подскажите пожалуйста, как в блоке (через Model, а не через редактор блоков) получить ссылку на vla-объект (например, другой блок), который находится в этом блоке?

Последний раз редактировалось Shraybicus, 28.12.2010 в 14:35.
Просмотров: 3925
 
Непрочитано 27.12.2010, 21:59
#2
Кулик Алексей aka kpblc
Moderator

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


Получить указатель на описание блока, пройтись по его составу и отфильтровать ненужное.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.12.2010, 23:23
#3
Shraybicus


 
Регистрация: 05.12.2010
Сообщений: 104


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Получить указатель на описание блока, пройтись по его составу и отфильтровать ненужное.
А не подскажешь как получить указатель, с помощью какого метода? Я просто новичок в этом, и много чего не понятно.
Shraybicus вне форума  
 
Непрочитано 27.12.2010, 23:32
#4
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(vl-load-com)

;;; Запросить у пользователя указать на блок
(setq ent (vlax-ename->vla-object (car (entsel "\nSelect block : "))))

;;; Получить vla-указатель на описание блока
(setq block_def (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                          (vla-get-effectivename ent)
                          ) ;_ end of vla-item
      ) ;_ end of setq

;;; Получить список всех примитивов, входящих в блок
(setq block_cont ((lambda (/ res)
                    (vlax-for sub block_def
                      (setq res (cons sub res))
                      ) ;_ end of vlax-for
                    (reverse res)
                    ) ;_ end of lambda
                  )
      ) ;_ end of setq

;;; Отфильтровать все примитивы, из состава указанного блока, которые не являются блоком
(setq result_ent (vl-remove-if-not
                   (function
                     (lambda (x)
                       (= (vla-get-objectname x) "AcDbBlockReference")
                       ) ;_ end of lambda
                     ) ;_ end of function
                   block_cont
                   ) ;_ end of vl-remove-if-not
      ) ;_ end of setq
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.12.2010, 23:42
#5
Shraybicus


 
Регистрация: 05.12.2010
Сообщений: 104


Спасибо! Буду ковырять.

Теперь становится ясней.

А можно получить vla-указатель на описание блока другим способом.

Твой:
Код:
[Выделить все]
;;; Получить vla-указатель на описание блока
(setq block_def (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                          (vla-get-effectivename ent)
                          ) ;_ end of vla-item
      ) ;_ end of setq
Другой способ:
Код:
[Выделить все]
(setq block_def (vlax-ename->vla-object (car (entsel)))
Shraybicus вне форума  
 
Непрочитано 27.12.2010, 23:50
#6
Кулик Алексей aka kpblc
Moderator

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


Shraybicus, описание блока и вхождение блока - вещи разные.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.12.2010, 00:31
#7
Shraybicus


 
Регистрация: 05.12.2010
Сообщений: 104


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Shraybicus, описание блока и вхождение блока - вещи разные.
Вот и проблема в этом, что я не различаю где, что.

Я хочу с помощью свойства Visible, зная указатель на блок в блоке сдеелать его невидимым (блока который находится в блоке - каламбур какой-то получился). Что пока не получается.

Получил список из всех примитивов. И теперь пытаюсь сделать невидимым с помощью свойства Visible. Но что то не получается.(

Последний раз редактировалось Shraybicus, 28.12.2010 в 00:52.
Shraybicus вне форума  
 
Непрочитано 28.12.2010, 08:35
#8
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Код:
[Выделить все]
(vl-load-com)

(defun dwgru-proceed-subent-visibility (block enttype visible / block_ref adoc)
                                       ;|
*    Меняет видимость примитивов указанного блока
*    Параметры вызова:
	block		указатель на вхождение блока или его имя. Если не указано,
					запрашивается у пользователя
	enttype	тип обрабатываемых примитивов. Если не указано, работа
					функции прекращается
	visible	устанавливать примитив видимым (t) либо скрывать его (nil)
*    Примеры вызова:
(dwgru-proceed-subent-visibility nil "AcDbLine" nil)
;; Скрыть все отрезки в указываемом блоке
(dwgru-proceed-subent-visibility nil "AcDbLine" t)
;; Показать все отрезки в указываемом блоке
(dwgru-proceed-subent-visibility nil "*polyline,*circle" nil)
;; Скрыть все полилинии и окружности в указываемом блоке

|;
  (cond
    ((not block)
     (if (and (= (type (setq block_ref (vl-catch-all-apply
                                         (function
                                           (lambda ()
                                             (car (entsel "\nВыберите блок <Отмена> : "))
                                             ) ;_ end of lambda
                                           ) ;_ end of function
                                         ) ;_ end of vl-catch-all-apply
                             ) ;_ end of setq
                       ) ;_ end of type
                 'ename
                 ) ;_ end of =
              (= (cdr (assoc 0 (entget block_ref))) "INSERT")
              ) ;_ end of and
       (dwgru-proceed-subent-visibility (cdr (assoc 2 (entget block_ref))) enttype visible)
       ) ;_ end of if
     )
    ((and (= (type block) 'ename)
          (member (cdr (assoc 0 (entget block))) '("INSERT" "BLOCK_RECORD"))
          ) ;_ end of and
     (dwgru-proceed-subent-visibility (cdr (assoc 2 (entget block_ref))) enttype visible)
     )
    ((and (= (type block) 'vla-object)
          (wcmatch (strcase (vla-get-objectname block)) "*BLOCK*")
          ) ;_ end of and
     (dwgru-proceed-subent-visibility (vla-get-name block))
     )
    ((and (= (type block) 'str)
          (tblobjname "block" block)
          ) ;_ end of and
     (if (and enttype (= (type enttype) 'str))
       (progn
         (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
         (setq enttype (strcase enttype)
               visible (if visible
                         :vlax-true
                         :vlax-false
                         ) ;_ end of if
               ) ;_ end of setq
         (vlax-for sub (setq block (vla-item (vla-get-blocks adoc) block))
           (if (wcmatch (strcase (vla-get-objectname sub)) enttype)
             (vl-catch-all-apply
               (function
                 (lambda ()
                   (vla-put-visible sub visible)
                   ) ;_ end of lambda
                 ) ;_ end of function
               ) ;_ end of vl-catch-all-apply
             ) ;_ end of if
           ) ;_ end of vlax-for
         (vla-regen adoc acallviewports)
         (vla-endundomark adoc)
         ) ;_ end of progn
       ) ;_ end of if
     )
    ) ;_ end of cond
  ) ;_ end of defun
Красным выделен основной код
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 28.12.2010, 14:29
#9
Shraybicus


 
Регистрация: 05.12.2010
Сообщений: 104


Лиспер, спасибо!

Получается если в чертеж вставлен блок несколько раз, и если хотя бы в одном сделать невидимым, например, отрезки, то и во всех остальных отразится изменение?

А можно как-то программно поменять видимость, только в одном? Т.е. если бы был создан дин. блок у которого есть параметр видимости и щелкая по ручке (выбирая выкл/откл) изменялся блок.
Shraybicus вне форума  
 
Непрочитано 28.12.2010, 15:03
#10
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Так это надо динамические свойства конкретного блока менять. Это совсем другая песня.
На форуме, кажется, какие-то коды по этому делу были.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 28.12.2010, 15:14
#11
Shraybicus


 
Регистрация: 05.12.2010
Сообщений: 104


Да видел эту ветку. Только там слишком умно, и идет речь о добавлении еще одного параметра видимости, вроде как то так.
Shraybicus вне форума  
 
Непрочитано 28.12.2010, 15:15
#12
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Я говорю об изменении динамических свойств блоков. Скажу честно - искать сейчас некогда.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 28.12.2010, 15:45
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Dynamic Block Functions
LISP. Изменение свойств(а) динамических блоков.
Динамич. блоки. Програмное изм. свойств
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 28.12.2010 в 15:51.
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить vla-объект, который находится в блоке или как с помощью Lisp поменять видимость в дин. блоке?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение текста, который в блоке.. xamyt AutoCAD 17 21.12.2015 13:03
Объединение дуг, линий в единый объект, Как объединить? Vladimir.P AutoCAD 41 25.01.2015 08:03
Как зная точку выбрать объект и получить его свойства? Zaghim Программирование 6 13.09.2010 09:07