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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > lisp и фильтры слоев

lisp и фильтры слоев

Ответ
Поиск в этой теме
Непрочитано 22.10.2010, 09:23 #1
lisp и фильтры слоев
Mikka
 
Регистрация: 05.08.2008
Сообщений: 155

Доброго времени суток народ. Я только начинаю программировать на LISP/ Объясните пожалуйста куда копать, чтобы на LISP добраться до списка слоев, в текущем фильтре слоев ?
з.ы как найти текущий фильтр слоев уже раскопал...
Просмотров: 2798
 
Непрочитано 22.10.2010, 09:33
1 | #2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Offtop:
Цитата:
Измерь микрометром, отметь мелом, отруби топром!
По аналогии с топром копай лоптой.
Profan вне форума  
 
Непрочитано 22.10.2010, 10:14
1 | #3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Mikka Посмотреть сообщение
Я только начинаю программировать на LISP/ Объясните пожалуйста куда копать
Копать в направлении книг Н.Н.Полещука, заворачивая в сторону оглавлений, в которых расставлены тематические указатели дальнейших направлений движения.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 22.10.2010 в 10:20.
hwd вне форума  
 
Непрочитано 22.10.2010, 10:41
1 | #4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


layer-filters-status-change
Код:
[Выделить все]
 
;|=====================================================================================
* Ф-ция layer-filters-status-change
* На основе  https://www.caduser.ru/forum/topic1194.html
* Для https://www.caduser.ru/forum/topic20414.html
* Arguments [Type]:
   lstnames = String — имя группового фильтра. Например "ONOFF"
                       Строка имен групповых фильтров, разделенных <,>
                       Например "ONOFF,AT" или "AT*"
  или
   lstnames = List of String - список имен групповых слоевю Например ("ONOFF" "AT")
* Возвращает [Type]:
   nil
* Принцип работы
* Если хотя бы один слой группового фильтра выключен, то слои фильтра (ов) включаются
=======================================================================================|;
(defun layer-filters-status-change
       (lstnames / vla:lrs vla:xdic vla:dic vla:spsc name datatype datavalue onoff sps)
  (defun massoc (key alist / x nlist)(foreach x alist
   (if (eq key (car x))(setq nlist (cons (cdr x) nlist))))(reverse nlist))
  (vl-load-com)(if (= (type lstnames) 'STR)(setq lstnames (list lstnames)))
  (if (= (type lstnames) 'LIST)(setq lstnames(apply 'strcat(mapcar '(lambda(x)(strcase(strcat x ","))) lstnames))))
  (setq vla:lrs (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
  (if (= (vla-get-hasextensiondictionary vla:lrs) :vlax-true)
    ;; при наличии словаря требуется детальная проверка
    (progn (setq vla:xdic (vla-getextensiondictionary vla:lrs))
      (setq vla:dic nil)
      ;; поиск фильтров версии 2005
      (if (progn (vlax-for item   vla:xdic
         (if (= (vla-get-name item) "ACLYDICTIONARY")(setq vla:dic item))) ;_  vlax-for
       vla:dic) ;_  progn
   (progn (vlax-for vla:spsc vla:dic (if (progn (setq name (vla-get-name vla:spsc))
      (vla-getxrecorddata vla:spsc 'datatype 'datavalue)
      (wcmatch (strcase (vlax-variant-value (vlax-safearray-get-element datavalue
                 (vl-position 300 (vlax-safearray->list datatype)))))
              lstnames);_  wcmatch
      ) ;_  progn
      (progn (setq sps (entget(vlax-vla-object->ename vla:spsc))
            sps (massoc 330 (member (assoc 300 sps) sps))
            sps (vl-remove-if 'null (mapcar 'entget sps))
            sps (mapcar '(lambda (x)(cons (cdr(assoc 2 x))(cdr(assoc 62 x)))) sps))
      (if (vl-member-if '(lambda (x)(minusp (cdr x))) sps)(setq onoff :vlax-true) ;_Хотя бы один слой выключен
        (setq onoff :vlax-false))
       (setq sps (mapcar '(lambda (x)(vla-Item vla:lrs x)) (mapcar 'car sps)))
       (mapcar '(lambda (x)(vla-put-layeron x onoff)) sps)))) ;_  vlax-for
     (vlax-release-object vla:dic))) ;_ if
      (vlax-release-object vla:xdic))) ;_  if
  (vlax-release-object vla:lrs)(princ))
(defun C:LFSC ( / fname )
  (setq fname (getstring "\nИмена групповых фильтров, разделенных запятой(,) <выход>: "))
  (if (/= Fname "")(layer-filters-status-change fname))
  (princ))
;|Возможные макросы на кнопку
Если в чертеже есть групповые фильтры с именами AT и ONOFF
^C^C(layer-filters-status-change "AT,ONOFF")
^C^CLFSC;AT,ONOFF
^C^CLFSC;AT
С запросом в командной строке имени фильтра (фильтров)
^C^CLFSC;
|;
Цитата:
Пояснения.
1. Не рассматривается вопрос загрузки кода. Считается, что ф-ция layer-filters-status-change и команда C:LFSC Загружены.
2. Предположим в рисунке есть групповые фильтры с именами AT, AT1, AT2, ONOFF
3.
- Кнопка ^C^CLFSC;AT,ONOFF - изменит видимость слоев фильтров AT и ONOFF
- Кнопка ^C^CLFSC;AT* - изменит видимость слоев фильтров AT AT1 AT2
4. Использование кнопки без ^C^C позволит применять команду прозрачно
- Кнопка 'LFSC;AT* - изменит видимость слоев фильтров AT AT1 AT2 не прерывая текущую команду (например ваполнение команды отрезок)
- Кнопка 'LFSC; - приостановит действие текущей команды, запросит перечень фильтров, изменит видимость слоев, продолжит выполнение команды.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 25.02.2021 в 13:55. Причина: В пост добавлен код по ссылке
VVA вне форума  
 
Непрочитано 22.10.2010, 11:20
#5
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Mikka, речь идёт о групповом фильтре или о фильтре по свойствам?
Makswell вне форума  
 
Автор темы   Непрочитано 22.10.2010, 11:22
#6
Mikka


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


О групповом фильтре...
Mikka вне форума  
 
Непрочитано 22.10.2010, 11:49
1 | #7
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Функция фозвращает список имён слоев текущего группового фильтра:
Код:
[Выделить все]
(defun test (/ a ent lst)
  (foreach
	    item
		(vl-remove-if-not
		  '(lambda (x) (= (car x) 350))
		  (dictsearch
		    (vlax-vla-object->ename
		      (vla-GetExtensionDictionary
			(vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object)))
		      )
		    )
		    "ACLYDICTIONARY"
		  )
		)
    (if	(assoc 290 (entget (cdr item)))
      (setq a (entget (cdr item))
      )
    )
  )
  (foreach item	(vl-remove-if-not '(lambda (x) (= (car x) 330)) a)
    (if	(= (cdr (assoc 0 (setq ent (entget (cdr item))))) "LAYER")
      (setq lst (cons (cdr (assoc 2 ent)) lst))
    )
  )
  lst
)
Makswell вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > lisp и фильтры слоев

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Unreconciled new layers при Xref Red Nova AutoCAD 17 10.01.2019 13:00
Как программно переключать фильтры слоев? kp+ Программирование 12 03.02.2012 12:15
Layer Notification Warning Jerald AutoCAD 4 14.03.2008 00:05
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19
Фильтры слоев Vova AutoCAD 12 03.12.2004 16:38