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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ACAD 2013XP2 - создание фильтров слоев

ACAD 2013XP2 - создание фильтров слоев

Ответ
Поиск в этой теме
Непрочитано 25.12.2020, 15:32 #1
ACAD 2013XP2 - создание фильтров слоев
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 38,120

Никак не получается корректно создать фильтр слоев по именам.
Суть в том, что фильтр вроде бы создается, но а) его не активировать и б) после срабатывания кода в выпадающем списке слоев вообще ничего не показывается.
Лечится только ручным созданием любого (!) фильтра слоев.
Покопавшись, выяснил, что я создавал записи только в словаре ACAD_LAYERFILTERS, без обработки ACLYDICTIONARY. Ок, добавил - эффект нулевой. Попытки добавления в XRecord для ACAD_LAYERFILTERS -3 группы с перечислением имен фильтруемых слоев ситуацию не решило от слова совсем.

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

(defun test (filter-list / adoc filter-list layer_dict layer_filters ly_dict n rec rec_data)
            ;|
(setq lst '(("filtername" . "LayerX") ("layername" . "Layer*")))
(test lst)
|;
  (setq adoc          (vla-get-activedocument (vlax-get-acad-object))
        layer_dict    (vla-getextensiondictionary (vla-get-layers adoc))
        layer_filters (vla-addobject layer_dict "ACAD_LAYERFILTES" "AcDbDictionary")
        ly_dict       (vla-addobject layer_dict "ACLYDICTIONARY" "AcDbDictionary")
  ) ;_ end of setq
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          (function (lambda () (vla-item layer_filters (cdr (assoc "filtername" filter-list)))))
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of vl-catch-all-error-p
    (progn (setq rec      (vla-addxrecord layer_filters (cdr (assoc "filtername" filter-list)))
                 rec_data (list (cons 1 (cdr (assoc "filtername" filter-list)))
                                (cons 1 (cdr (assoc "layername" filter-list)))
                                '(1 . "*")
                                '(1 . "*")
                                '(70 . 0)
                                '(1 . "*")
                                '(1 . "*")
                          ) ;_ end of list
           ) ;_ end of setq
           (vla-setxrecorddata rec
                               (vlax-make-variant
                                 (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger (cons 0 (1- (length rec_data))))
                                                      (mapcar (function car) rec_data)
                                 ) ;_ end of vlax-safearray-fill
                               ) ;_ end of vlax-make-variant
                               (vlax-make-variant
                                 (vlax-safearray-fill (vlax-make-safearray vlax-vbvariant (cons 0 (1- (length rec_data))))
                                                      (mapcar (function cdr) rec_data)
                                 ) ;_ end of vlax-safearray-fill
                               ) ;_ end of vlax-make-variant
           ) ;_ end of vla-setxrecorddata
           (setq n 1)
           (while (not (vl-catch-all-error-p
                         (vl-catch-all-apply (function (lambda () (vla-item ly_dict (strcat "*A" (itoa n))))))
                       ) ;_ end of VL-CATCH-ALL-ERROR-P
                  ) ;_ end of not
             (setq n (1+ n))
           ) ;_ end of while
           (setq rec      (vla-addxrecord ly_dict (strcat "*A" (itoa n)))
                 rec_data (list '(1 . "AcLyLayerFilter")
                                '(90 . 1)
                                (cons 300 (cdr (assoc "filtername" filter-list)))
                                (cons 301 (strcat "NAME==\"" (cdr (assoc "layername" filter-list)) "\""))
                          ) ;_ end of list
           ) ;_ end of setq
           (vla-setxrecorddata rec
                               (vlax-make-variant
                                 (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger (cons 0 (1- (length rec_data))))
                                                      (mapcar (function car) rec_data)
                                 ) ;_ end of vlax-safearray-fill
                               ) ;_ end of vlax-make-variant
                               (vlax-make-variant
                                 (vlax-safearray-fill (vlax-make-safearray vlax-vbvariant (cons 0 (1- (length rec_data))))
                                                      (mapcar (function cdr) rec_data)
                                 ) ;_ end of vlax-safearray-fill
                               ) ;_ end of vlax-make-variant
           ) ;_ end of vla-setxrecorddata
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun

Попутно, конечно, возникли вопросы по контролю и модифицировании имеющихся фильтров, но это можно будет и потом поковырять. Сейчас бы с созданием разобраться.

Помогите, кто может. Кто может, помогите

Благодарствую.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 885
 
Непрочитано 25.12.2020, 17:02
#2
skkkk


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


Я использую код отсюда.
Размещу тут на всякий.

Код:
[Выделить все]
 (defun Make_Layer_Filterit (/ FILTLST LFILTOBJ SAFECODE SAFEFILT)
(vl-load-com)
(setq FILTLST (list
;;name Lay col lt flags lw plot
(list "Arch..Detail" "A-DETL*" "*" "*" 0 "*" "*")
(list "Arch..Annotation" "*NOTE*" "*" "*" 0 "*" "*")
(list "Arch..Dimensions" "*DIMS*" "*" "*" 0 "*" "*")
(list "Arch..Symbols" "*SYM*" "*" "*" 0 "*" "*")
(list "Arch..Sheet" "*WSHTT*" "*" "*" 0 "*" "*")

(list "Eng...Civil" "C-*" "*" "*" 0 "*" "*")
(list "Eng...Structural" "S-*" "*" "*" 0 "*" "*")
(list "Eng...Mechanical" "M-*" "*" "*" 0 "*" "*")
(list "Eng...Electrical" "E-*" "*" "*" 0 "*" "*")
(list "Eng...Plumbing" "P-*" "*" "*" 0 "*" "*")
)
LFILTOBJ (vla-addobject
(vla-GetExtensionDictionary
(vla-Get-Layers
(vla-Get-ActiveDocument
(vlax-Get-Acad-Object)
)
)
)
"ACAD_LAYERFILTERS"
"AcDbDictionary"
)
SAFECODE (vlax-make-safearray 2 '(0 . 6))
SAFEFILT (vlax-make-safearray 12 '(0 . 6))
)
(vlax-safearray-fill SAFECODE (list 1 1 1 1 70 1 1))
(foreach
SUBLST FILTLST
(vlax-safearray-fill
SAFEFILT
(mapcar '(lambda (X) (vlax-make-variant X 8)) SUBLST)
)
(vla-addxrecord LFILTOBJ (nth 0 SUBLST))
(vla-setxrecorddata
(vla-item LFILTOBJ (nth 0 SUBLST))
SAFECODE
SAFEFILT
)
)
(prin1)
(princ "\n* All Layer Filters have been created........... *")
)
skkkk вне форума  
 
Автор темы   Непрочитано 25.12.2020, 17:18
#3
Кулик Алексей aka kpblc
Moderator

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


Именно в 2013 код работает некорректно.


Но стоит вручную создать хотя бы один (!) фильтр - хоть пустой - как тут же все работает нормально:

Там явно надо дополнительно данные дозаписывать в ACLYDICTIONARY, но у меня эффекта и это не дало
Миниатюры
Нажмите на изображение для увеличения
Название: 2020-12-25_17-13-02.png
Просмотров: 108
Размер:	45.7 Кб
ID:	232992  Нажмите на изображение для увеличения
Название: 2020-12-25_17-14-48.png
Просмотров: 99
Размер:	17.6 Кб
ID:	232993  Нажмите на изображение для увеличения
Название: 2020-12-25_17-16-32.png
Просмотров: 99
Размер:	22.4 Кб
ID:	232994  
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.12.2020, 18:01
#4
skkkk


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


На 2011-м все работает как надо. Проверил сейчас на 2015-м - тоже не реагирует на переключение, пока вручную какой-нибудь фильтр не создать.
Такое ощущение, что какая-то переменная пошаливает. Прогнал через "сравниватель" списки системных переменных из обоих версий - все переменные по маскам *LAY* и *FILT* совпадают. Пока мысли закочились.
skkkk вне форума  
 
Автор темы   Непрочитано 25.12.2020, 18:11
#5
Кулик Алексей aka kpblc
Moderator

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


Я ковырял через ArxDbMgd - и тоже не нашел разницы. Скорее всего, не там смотрел
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.12.2020, 20:26
#6
skkkk


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


А что это за зверь - ArxDbMgd? Поначалу прочитал как ArxDbg и хотел в нем поковырять. Сравнить набор свойств до ручного создания фильтра и после. Но что-то там не удалось у меня найти словарь "ACAD_LAYERFILTERS". Попробовал через entget подобраться - вскипятил мозг.
Удалось установить, что после перезагрузки файла все начинает работать. А также при создании какого-либо фильтра слоев командным методом. Но думаю, это для тебя не новость. Полагаю, тебя не устраивает командный подход, иначе бы и тема не родилась.

----- добавлено через ~4 мин. -----
Вот тут у человека такая же проблема была. Не ответили.
skkkk вне форума  
 
Автор темы   Непрочитано 26.12.2020, 07:53
#7
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
А что это за зверь - ArxDbMgd?
Я ошибся - ARXDBG. Брать тут: https://adn-cis.org/forum/index.php?topic=7274.0
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ACAD 2013XP2 - создание фильтров слоев

Реверс. Автоматическая пакетная печать множества рамок (форматов) из пространства модели и листов
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание слоев в автокад sae.prc AutoCAD 4 23.11.2019 22:57
создание слоев ( Layer ) gabrin Программирование 7 28.02.2017 15:28
Создание группы слоев, из слоев с различными свойствами nikolakrg AutoCAD 1 03.04.2014 17:59
создание геоцентрической СК в ACAD MAP. Как? mankurt Вертикальные решения на базе AutoCAD 5 24.11.2011 13:24
Создание КЭ моделей. Способы и средства. Особенности. (GMSH, Лир-Визор, ACAD и др.) Kinzer Расчетные программы 10 16.01.2011 18:41