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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Доработка кодя для скрытия объектов блока (LISP)

Доработка кодя для скрытия объектов блока (LISP)

Ответ
Поиск в этой теме
Непрочитано 22.09.2014, 12:52 #1
Доработка кодя для скрытия объектов блока (LISP)
AndruxaZ
 
Регистрация: 07.05.2013
Сообщений: 48

Всем, доброго дня. Очень помогает в работе код Алексея aka kpblc по этой ссылке http://forum.dwg.ru/showpost.php?p=289342&postcount=63, скрытие объектов блока из пространства модели.
Код:
[Выделить все]
 (defun hide-in-block
       (select / adoc *error* ent blk_def blk_def_sel lst fun_put-vis)
       ;|
*    Скрытие элементов блока
*    Параметры вызова:
	select	указывать блок (t) или обрабатывать все / любые блоки файла (nil)
*    Примеры вызова:

(hide-in-block t)	; скрывать указанные примитивы, с контролем вхождения внутрь
			; одного блока
(hide-in-block nil)	; то же, но без контроля принадлежности примитивов одному блоку
|;
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (defun fun_put-vis (ent value)
    (vl-catch-all-apply
      '(lambda ()
	 (vla-put-visible
	   ent
	   (cond
	     ((or value (= value :vlax-true)) :vlax-true)
	     (t :vlax-false)
	     ) ;_ end of cond
	   ) ;_ end of vla-put-visible
	 ) ;_ end of lambda
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if select
    (progn
      (while
	(and
	  (= (type (setq ent
			  (vl-catch-all-apply
			    '(lambda ()
			       (car (nentsel "\nУкажи скрываемый примитив <Отмена> : "))
			       ) ;_ end of lambda
			    ) ;_ end of vl-catch-all-apply
			 ) ;_ end of setq
		   ) ;_ end of type
	     'ename
	     ) ;_ end of =
	  (setq ent (vlax-ename->vla-object ent))
	  (if blk_def
	    (equal blk_def (vla-objectidtoobject adoc (vla-get-ownerid ent)))
	    (setq blk_def (vla-objectidtoobject adoc (vla-get-ownerid ent)))
	    ) ;_ end of if
	  ) ;_ end of and
	 (setq lst (cons ent lst))
	 ) ;_ end of while
      (foreach item lst
	(fun_put-vis item nil)
	) ;_ end of foreach
      ) ;_ end of progn
    (progn
      (while
	(and
	  (= (type (setq ent
			  (vl-catch-all-apply
			    '(lambda ()
			       (car (nentsel "\nУкажи скрываемый примитив <Отмена> : "))
			       ) ;_ end of lambda
			    ) ;_ end of vl-catch-all-apply
			 ) ;_ end of setq
		   ) ;_ end of type
	     'ename
	     ) ;_ end of =
	  (setq ent (vlax-ename->vla-object ent))
	  ) ;_ end of and
	 (setq lst (cons ent lst))
	 ) ;_ end of while
      (foreach item lst
	(fun_put-vis item nil)
	) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  (vla-regen adoc acallviewports)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun


Всё работает прекрасно, но хотелось бы доработать код - сделать скрытие размеров внутри блока. Этим же кодом скрываются только элементы размера - текст, линии, солиды и т.д. Просил консультации у VVA куда копать, он сказал "копать" в сторону определения DXF-пары (2."*D....") размера и пройтись по определениям в таблице блоков. Что-то я пробовал, но застопорился.
Во-первых пробовал добраться до размеров через nentsel (чтобы узнать DXF параметры размера), но он соотвественно также выделяет элементы блока, хотя у них у всех одинаковая DXF-пара 330
Сам блок у меня динамический с несколькими параметрами Visibility Set-ов (спасибо Supermax-у, Кулик Алексей aka kpblc).
В принципе размеры в блоке у меня только "повернутые", но могут иметь одинаковое значение (думал проходиться по 42-ой DXF-паре).
Помогите гуру LISPа.
Просмотров: 1910
 
Непрочитано 22.09.2014, 14:07
#2
Лиспер


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


Как вариант:
Код:
[Выделить все]
(defun hide-in-block (select dim / _kpblc-objectidtoobject adoc *error* ent blk_def blk_def_sel lst fun_put-vis)
                     ;|
*    Скрытие элементов блока
*    Параметры вызова:
	select	указывать блок (t) или обрабатывать все / любые блоки файла (nil)
	dim     обрабатывать объекты размеров отдельно (t) или скрывать объект размера целиком (nil)
*    Примеры вызова:
(hide-in-block t t) 	; скрывать указанные примитивы, с контролем вхождения внутрь
			; одного блока
(hide-in-block nil t)	; то же, но без контроля принадлежности примитивов одному блоку
|;
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (defun _kpblc-objectidtoobject (obj id)
    ;; http://autolisp.ru/2014/09/16/objectid_x32x64_cad2015/
    ;|
*    получение объекта по его ID
*    параметры вызова:
  obj    указатель на объект документа
  id    значение ID получаемого объекта
|;
    (if (and (> (vl-string-search "x64" (getvar "platform")) 0)
             (vlax-method-applicable-p obj 'objectidtoobject32)
             ) ;_ end of and
      (vla-objectidtoobject32 obj id)
      (vla-objectidtoobject obj id)
      ) ;_ end of if
    ) ;_ end of defun

  (defun fun_put-vis (ent value / blk)
    (vl-catch-all-apply
      (function
        (lambda ()
          (vla-put-visible
            ent
            (cond
              ((or value (= value :vlax-true)) :vlax-true)
              (t :vlax-false)
              ) ;_ end of cond
            ) ;_ end of vla-put-visible
          ) ;_ end of lambda
        ) ;_ end of function
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if select
    (progn
      (while
        (and
          (= (type (setq ent
                          (vl-catch-all-apply
                            '(lambda ()
                               (car (nentsel "\nУкажи скрываемый примитив <Отмена> : "))
                               ) ;_ end of lambda
                            ) ;_ end of vl-catch-all-apply
                         ) ;_ end of setq
                   ) ;_ end of type
             'ename
             ) ;_ end of =
          (setq ent (vlax-ename->vla-object ent))
          (if blk_def
            (equal blk_def (_kpblc-objectidtoobject adoc (vla-get-ownerid ent)))
            (setq blk_def (_kpblc-objectidtoobject adoc (vla-get-ownerid ent)))
            ) ;_ end of if
          ) ;_ end of and
         (setq lst (cons ent lst))
         ) ;_ end of while
      ) ;_ end of progn
    (progn
      (while
        (and
          (= (type (setq ent
                          (vl-catch-all-apply
                            '(lambda ()
                               (car (nentsel "\nУкажи скрываемый примитив <Отмена> : "))
                               ) ;_ end of lambda
                            ) ;_ end of vl-catch-all-apply
                         ) ;_ end of setq
                   ) ;_ end of type
             'ename
             ) ;_ end of =
          (setq ent (vlax-ename->vla-object ent))
          ) ;_ end of and
         (setq lst (cons ent lst))
         ) ;_ end of while
      ) ;_ end of progn
    ) ;_ end of if
  (foreach item lst
    (if
      (and
        (wcmatch (strcase (vla-get-objectname (setq blk_def (_kpblc-objectidtoobject adoc (vla-get-ownerid item)))))
                 "*BLOCK*"
                 ) ;_ end of wcmatch
        (wcmatch (strcase (vla-get-name blk_def)) "`*D*")
        dim
        ) ;_ end of and
       (vlax-for subent blk_def
         (fun_put-vis subent nil)
         ) ;_ end of vlax-for
       (fun_put-vis item nil)
       ) ;_ end of if
    ) ;_ end of foreach
  (vla-regen adoc acallviewports)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 22.09.2014, 14:27
#3
AndruxaZ


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


Спасибо, сейчас проверю.

----- добавлено через ~2 мин. -----
Супер !!! Работает! Ещё раз огромной спасибо.

----- добавлено через ~41 мин. -----
Цитата:
Сообщение от Лиспер Посмотреть сообщение
Как вариант:]
А возможен выбор нескольких объектов, а потом соотвественно их скрытие? Ведь nentsel позволяет выбрать только один объект.
Попробовал разобраться в Express-овском коде "Copy Nested Objects" (там выбирается несколько объектов с подсветкой их) - для меня как японский язык
AndruxaZ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Доработка кодя для скрытия объектов блока (LISP)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поворот блока в котором два из трёх объектов поворачиваются в другую сторону. ТР5 Программирование 8 28.05.2010 23:14
AutoCAD 2008, программное удаление объектов RTEXT из состава блока Кулик Алексей aka kpblc Программирование 3 28.04.2009 08:48
Lisp: Обработка объектов и получение списка свойств (координаты точек) Nanotronic LISP 2 23.04.2009 23:07
LISP. Распределение по слоям объектов dim.,hatch,text Суханова LISP 5 28.08.2008 13:31
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35