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

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

Фильтры слоев

Ответ
Поиск в этой теме
Непрочитано 01.08.2004, 20:41 #1
Фильтры слоев
Vova
 
Engineer
 
New-York
Регистрация: 05.09.2003
Сообщений: 10,288

Попадаются файлы, где есть огромное количество фильтров слоев. В одном таком файле у меня оказалось 11564 фильтра, подавляющее большинство пустые. В результате команда Layer (в 2005)задерживается на минуты, то есть им невозможно пользоваться. В 2004 появилась кнопка Delete All. Но для ее запуска надо сначала открыть менеджер слоев. (А задерживается ли он в 2004 я не проверял)
В 2002 менеджер слоев выходит без задержек. Фильтры можно удалять но поштучно, (но кому это надо, если фильтры не мешают?). Я раскопал LISP который уничтожает все фильтры и если надо могу поделиться. В упомянутом файле после уничтожения фильтров вес с 3.5мег снизился до 2.4.(!)
Вопрос: поскольку маловероятно, что кто-то специально создает 11500 фильтров то как они образуются? Ведь все имеют имена. Сталкивался ли кто-нибудь с этой проблемой? Кто и как использует фильтры слоев?
Просмотров: 7583
 
Непрочитано 01.08.2004, 20:53
#2
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Фильтры слоев тащатся из других чертежей, если использовать copy-paste. Вот так, если источников было много - то вполне может такая ерунда получиться. Притом, если притащенные примитивы даже и будут удалены, то фильтры все равно останутся.

А вот если тащить к примеру блоки через дизайн-центр, то фильтры не добавляются

Я тоже в свое время писал небольшой лисп для тотальной чистки фильтров
Код:
[Выделить все]
(defun all_filters_del (/ doc ltb xdic fd f rec)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq ltb (vlax-vla-object->ename (vla-get-layers doc))) ; коллекция LAYERS
  (if (and (setq xdic (cdadr (member '(102 . "{ACAD_XDICTIONARY") (entget ltb)))) ; расширенный словарь
          (setq fd (cdadr (member '(3 . "ACAD_LAYERFILTERS") (entget xdic)))) ; словарь фильтров
          (assoc 3 (setq f (entget fd))) ;_ имеются фильтры
    ) ;_ and
    (progn
      ;; выделение списка записей
      (while (/= 3 (caar f))
          (setq f (cdr f))
      ) ;_ остался список (3 . имя_фильтра) (360 . ename_XRECORD)...
      ;; удаление записей словаря
      (while (setq xrec (cdadr f))
        (entdel xrec)
        (setq f (cddr f))
      ) ;_ while
      ;; удаление словаря фильтров
      (dictremove xdic "ACAD_LAYERFILTERS")
      (princ "\nФильтры из рисунка удалены.")
    ) ;_ progn
    (princ "\nФильтров в рисунке не обнаружено.")
  ) ;_ if
) ;_ defun
(vl-load-com)

(all_filters_del) ;_ автозапуск программы
vk вне форума  
 
Непрочитано 02.08.2004, 13:23 Фильтры слоев
#3
kirill.co.il


 
Сообщений: n/a


Vova ! очен надо ! поделись ! наболело !
[email protected]
заранее СПАСИБО !!!
 
 
Непрочитано 02.08.2004, 23:48
#4
Лентяй


 
Сообщений: n/a


Нате, пользуйтесь! Да не забывайте бдагодарить меня за то, что я есть.
Код:
[Выделить все]
(defun C:DelLayFlt (/ res obj flag i)
  (vl-catch-all-apply
     (function (lambda ()
	(setq obj (vla-item (vla-getextensiondictionary
		(vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
			"ACAD_LAYERFILTERS"));setq
	(cond ((zerop (vla-get-count obj))
	       (princ "\nno layer filters to delete"));zerop
	      (t (if (/= "" (setq res (getstring t "\nfilters to delete <*>: ")))
			(setq res (strcase res)) (setq res "*"));if
		 (setq i 0)
	         (vlax-for filter obj
		   (if (wcmatch (strcase (vla-get-name filter)) res)
			(progn (vla-delete filter) (setq i (1+ i)) (setq flag t)));if
		 );vlax-for
		 (if flag (princ (strcat "\n" (itoa i) " filters deleted"))
			  (princ "\nno matching filters found"));if
	       );t
	);cond
       );lambda
    );function
  );catch
  (princ)
);end
 
 
Автор темы   Непрочитано 03.08.2004, 03:48 Re: Фильтры слоев
#5
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


1. Kiri...co.il> Здесь еще один лисп. Можешь сравнить с первыми двумя о оценить, что лучше и почему. И если результат сравнения сообщишь всем, это будет ценно.
;|

Written by: R. Robert Bell
Purpose: Allows the user to enter a wildcard string to keep any matching filters.
Sample string: "`#*,MW*" will keep all filters beginning with a "#" or "MW"

Copyright © 2004 by R. Robert Bell

|;

(defun rrbI:LayerFiltersDelete (strKeepWC / objXDict)
;; This function insures that an Extension Dictionary exists, and works on both locations for layer filters
(vl-load-com) ; load ActiveX if needed
(vl-catch-all-apply ; trap error if no extension dictionary
(function
(lambda ()
(setq objXDict (vla-GetExtensionDictionary ; bind dictionary to variable
(vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))))))))
(cond (objXDict ; if the extension dictionary exists
(or ; use OR to return T for success
(rrbIeleteAllXRecs objXDict "ACAD_LAYERFILTERS" strKeepWC) ; pre-2005 layer filters
(rrbIeleteAllXRecs objXDict "AcLyDictionary" strKeepWC))))) ; 2005 layer filters

(defun rrbIeleteAllXRecs (objXDict dictName strKeepWC / objDict i)
;; This function performs the chore of deleting each filer that doesn't match the wildcard
(vl-catch-all-apply ; trap errors
(function
(lambda ()
(setq objDict (vla-Item objXDict dictName)) ; get layer filters dictionary
(vlax-for objXRec objDict ; loop thru all XRecords in the dictionary
(cond ((not (and strKeepWC (wcmatch (vla-Get-Name objXRec) strKeepWC))) ; if deleting all filters, or current doesn't match wildcard
(setq i (1+ (cond (i) ; increment counter
(0)))) ; initialize counter
(vla-Delete objXRec))))))) ; delete filter
(cond (i (princ (strcat "\n" (itoa i) " filters deleted."))))) ; if counter is bound, report number of filters deleted

(defun C:LFD (/ inpKeep)
;; Main command-line function
(setq inpKeep (getstring
"\nWildcard mask for filters to keep, or <Enter> to delete all: "))
(rrbI:LayerFiltersDelete (cond ((/= inpKeep "") inpKeep))) ; pass nil to subr if user hit <Enter>
(princ)) ; clean exit

2. VK> Я перенес через клипборд содержимое файла с большим количеством фильтров в новый (пустой) файл. Фильтры в новый файл не переехали. В исходном файле было ... 6270 (!) фильтров, причем имена подавляющего большинства из них были вполне логическими, например, (даю в переводе) Мебель, 7-ой этаж, архитект. Целая серия таких: Покажи все замороженные, Покажи все включенные и т. д.
Надо бы понять, как это получается. Предлагаю всем посмотреть свои файлы, особенно если они пришли к вам извне, почистить их либо лиспами, либо, если 2004-2005-то штатными средствами и посмотреть, как снизился вес файла.
Vova вне форума  
 
Непрочитано 03.08.2004, 08:23
#6
Arkady

AutoCad Development and Support
 
Регистрация: 21.08.2003
Israel
Сообщений: 183
Отправить сообщение для Arkady с помощью Skype™


Так же и на VBA.
Удаляет все фильтры.

Код:
[Выделить все]
Public Sub killfilter()
On Error Resume Next
Dim oDict As AcadDictionary

Set oDict = ThisDrawing.Layers.GetExtensionDictionary
    If Err.Number <> 0 Then Err.Clear: Exit Sub
    
Set oDict = oDict.Item("ACAD_LAYERFILTERS")
    If Err.Number <> 0 Then Err.Clear: Exit Sub
    
While oDict.Count > 0
   Call oDict.Remove(oDict.Item(oDict.Count - 1).Name)
Wend
End Sub
Arkady вне форума  
 
Непрочитано 03.08.2004, 15:44 Re: Фильтры слоев
#7
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Vova
2. VK> Я перенес через клипборд содержимое файла с большим количеством фильтров в новый (пустой) файл. Фильтры в новый файл не переехали.
Интересно-интересно!!!! А версия АКАДа какая? У меня в 2002 без "примочек" тянуцца...
Может, это имеет значение?
vk вне форума  
 
Автор темы   Непрочитано 03.08.2004, 15:53
#8
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


vk> 2004
Vova вне форума  
 
Непрочитано 03.08.2004, 20:42 Удаляет все фильтры.
#9
kirill.co.il


 
Сообщений: n/a


я дико извиняюсь - а как мне эти чудные коды превратить
в работающую команду - сохранить с окончанием .lsp
и сунуть в директорию lisp ???
сами мы не местные )
 
 
Автор темы   Непрочитано 04.08.2004, 04:22
#10
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


VK> Проверил в 2002, там действительно фильтры наследуются. А в 2004-нет!. Раскпопали еще одно неуказанное положительное отвичие!
Kirill.co.il> Скопиуй код (Ctrl+C) в новый файл Notepad (Блокнот). Заведи директорию под именем LISP. Сохрани файл здесь под именем, например, LayerFiltersDelete.lsp Далее открой автокадовский файл с фильтрами. Открой Explorer (Проводник) на директории LISP. Прижми строку где файл левой кнопкой мыши и тащи в чертеж. Тут-же смотри в командную строку. Увидишь там какую-то абревиатуру. В моем случае это LFD (от Layer Filters Delete) В других лиспаз будет свое. Это и есть имя команды, набери ее и жми Enter. Таким способом ты загрузишь лисп только в один файл и на одну сессию. Для вечной загрузки надо сделать еже манипуляци, но меня срочно зовут, кто-нибудь об-ясните пож.
Vova вне форума  
 
Непрочитано 04.08.2004, 11:25 Ctrl+C
#11
kirill.co.il


 
Сообщений: n/a


!!! спасибо !!!
 
 
Непрочитано 04.08.2004, 18:34
#12
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Vova
VK> Проверил в 2002, там действительно фильтры наследуются. А в 2004-нет!. Раскпопали еще одно неуказанное положительное отвичие!
Надеюсь, это не последнее отличие
vk вне форума  
 
Непрочитано 03.12.2004, 16:38
#13
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Изменил свою программку. Теперь работает и в 2005. Кроме того, можно оставить свои фильтры.
Код:
[Выделить все]
;; Удаление лишних фильтров слоев из чертежа
;; имена фильтров, которые требуется оставить передаются списком
;; Функция переписана с учетом особенностей версии 2005, где появился новый словарь
(defun all_filters_del (lstnames / vla:lrs vla:xdic vla:dic vla:xrec name DataType DataValue num)
  (setq vla:lrs (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
  (if (= (vla-get-hasextensiondictionary vla:lrs) :vlax-true)
    ;; при наличии словаря требуется детальная проверка
    (progn
      (setq lstnames (mapcar 'strcase lstnames))
      (setq vla:xdic (vla-getextensiondictionary vla:lrs))
      (setq num 0)
      ;; поиск и удаление фильтров версий пре-2005
      (if (progn (vlax-for item vla:xdic
                   (if (= (vla-get-name item) "ACAD_LAYERFILTERS")
                     (setq vla:dic item)
                   ) ;_  if
                 ) ;_  vlax-for
                 vla:dic
          ) ;_  progn
        (progn
          (vlax-for vla:xrec vla:dic
            (if (not (member (strcase (setq name (vla-get-name vla:xrec))) lstnames))
              (progn (vla-remove vla:dic name)
                     (vlax-release-object vla:xrec)
                     (setq num (1+ num))
              ) ;_  progn
            ) ;_  if
          ) ;_  vlax-for
          (vlax-release-object vla:dic)
          (if (zerop num)
            (princ "\nЛишних фильтров 2002 в рисунке не обнаружено.")
            (princ "\nЛишние фильтры 2002 из рисунка удалены.")
          ) ;_  if
        ) ;_ progn
      ) ;_ if
      (setq vla:dic nil)
      (setq num 0)
      ;; поиск и удаление фильтров версии 2005
      (if (progn (vlax-for item vla:xdic
                   (if (= (vla-get-name item) "ACLYDICTIONARY")
                     (setq vla:dic item)
                   ) ;_  if
                 ) ;_  vlax-for
                 vla:dic
          ) ;_  progn
        (progn
          (vlax-for vla:xrec vla:dic
            (if (progn
                  (setq name (vla-get-name vla:xrec))
                  (vla-getxrecorddata vla:xrec 'DataType 'DataValue)
                  (not (member (strcase (vlax-variant-value
                                          (vlax-safearray-get-element
                                            DataValue
                                            (vl-position 300 (vlax-safearray->list DataType))
                                          ) ;_  vlax-safearray-get-element
                                        ) ;_  vlax-variant-value
                               ) ;_  strcase
                               lstnames
                       ) ;_  member
                  ) ;_  not
                ) ;_  progn
              (progn
                (vla-remove vla:dic name)
                (vlax-release-object vla:xrec)
                (setq num (1+ num))
              ) ;_  progn
            ) ;_  if
          ) ;_  vlax-for
          (vlax-release-object vla:dic)
          (if (zerop num)
            (princ "\nЛишних фильтров 2005 в рисунке не обнаружено.")
            (princ "\nЛишние фильтры 2005 из рисунка удалены.")
          ) ;_  if
        ) ;_ progn
      ) ;_ if
      (vlax-release-object vla:xdic)
    ) ;_  progn
    (princ "\nФильтров в рисунке не обнаружено.")
  ) ;_  if
  (vlax-release-object vla:lrs)
  (princ)
) ;_ defun
(vl-load-com)

(all_filters_del '("MyFilter1" "MyFilter2" "MyFilter3")) ;_ автозапуск программы для удаления только лишних

;;;(all_filters_del '()) ;_ автозапуск программы для удаления ВСЕХ фильтров
vk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Фильтры слоев

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