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

Никак не получается корректно создать фильтр слоев по именам.
Суть в том, что фильтр вроде бы создается, но а) его не активировать и б) после срабатывания кода в выпадающем списке слоев вообще ничего не показывается.
Лечится только ручным созданием любого (!) фильтра слоев.
Покопавшись, выяснил, что я создавал записи только в словаре 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

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

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

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

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 893
 
Размещение рекламы