AutoCAD LISP 圖層的性質與群組篩選方法

不想要一個一個手動新增,可以做成巨集或是LISP來快速新增圖層的性質 (Property) 與群組 (Group) 篩選 (Filter) 分類。


 方法1:使用指令(-LAYER)

範例1:新增圖層的性質篩選(名稱:凍結圖層,性質:凍結圖層)

1. 輸入指令:-LAYER

輸入選項 [?/建立(M)/設定(S)/新建(N)/更名(R)/打開(ON)/關閉(OFF)/顏色(C)/線型(L)/線粗(LW)/透明度(TR)/材料(MAT)/出圖(P)/凍結(F)/解凍(T)/鎖住(LO)/解鎖(U)/狀態(A)/描述(D)/調和(E)/外部參考(X)]:

2. 輸入:filter (此未顯示在指令選項中,為隱藏)

輸入圖層篩選選項 [新建(N)/設定(S)/更名(R)/編輯(E)/刪除(D)/結束(X)]:

3. 輸入:N (新建)

選取圖層篩選類型 [群組(G)/性質(P)]:

4. 輸入:P (性質)

輸入父系圖層篩選 <全部>:

5. 輸入:直接按下Enter鍵 (此為不在任何分支之下;如果要在已有篩選之子項要輸入此項)

輸入性質篩選定義:

6. 輸入:frozen=="true" (此為凍結圖層)(如果多條件要同時輸入在此處)

輸入圖層篩選的名稱:

7. 輸入:凍結圖層 (此為決定篩選名稱,不能空白或重複名稱)

輸入圖層篩選選項 [新建(N)/設定(S)/更名(R)/編輯(E)/刪除(D)/結束(X)]:

8. 輸入:直接按下Enter鍵結束指令 (如果沒有要繼續輸入)

這樣就新增圖層篩選完成


巨集:

^C^C-layer;filter;n;p;;frozen=="true";凍結圖層;;

LISP:

(Command "-layer" "filter" "n" "p" "" "frozen==\"true\"" "凍結圖層" "")


補充性質篩選定義

關閉:OFF,true/false

凍結:frozen,true/false

鎖住:locked,true/false

顏色:COLOR,顏色代號

線型:LINETYPE,線型名稱

線粗:LINEWEIGHT,線粗數值

透明度:TRANSPARENCY,數值

出圖:plottable,true/false

新視埠凍結:NEWVPFROZEN,true/false

視埠顏色:VPCOLOR,顏色代號

視埠線型:VPLINETYPE,線型名稱

視埠線粗:VPLINEWEIGHT,線粗數值

視埠透明度:VPTRANSPARENCY,數值


同一行條件(同時達成):AND  分隔

下一行條件:OR 分隔


有空再補其他範例


方法2:使用LISP對字典(DICTIONARY)進行修改

字典 ACAD_LAYERFILTERS:顯示圖層性質篩選

字典 ACLYDICTIONARY:顯示圖層篩選(包含性質和群組篩選)

物件標籤:AcLyLayerFilter 圖層性質篩選

                    AcLyLayerGroup 圖層群組篩選


;;;刪除所有圖層性質篩選(LAYER FILTERS)
(defun C:DelLyrFlt ( / lyr xlist xrec filt)
   (setq lyr (tblobjname "LAYER" "0")) ;setq
   ;;在圖層的擴充字典中找到 "ACAD_LAYERFILTERS"
   (setq xlist (dictsearch
                     (cdr (assoc 360 (entget (cdr (assoc 330 (entget lyr))))))
                     "ACAD_LAYERFILTERS")
   ) ;setq
   (if xlist
      (progn
         ;;找到第一個圖層篩選的 xrecord
         (setq xrec (cdr (assoc -1 xlist))
                 filt (dictnext xrec t)
         ) ;setq
         ;;移除每一個圖層篩選的 xrecord
         (while filt
            (dictremove xrec (cdr (assoc 1 filt)))
            (setq filt (dictnext xrec t))
         ) ;while
         ;;移除 "ACAD_LAYERFILTERS" 字典
         (dictremove
            (cdr (assoc 360 (entget (cdr (assoc 330 (entget lyr))))))
            "ACAD_LAYERFILTERS"
         )
      ) ;progn
   ) ;if
   (princ)
);_defun


;;;建立圖層篩選-非外部參考圖層
(defun c:XREFNOT ( / xdict dict xrecname )
 (vl-load-com)
  ;;取得圖層擴充字典
    (setq xdict
        (vlax-vla-object->ename
            (vla-getextensiondictionary
                (vla-get-layers
                    (vla-get-activedocument (vlax-get-acad-object))
                )
            )
        )    
    )
    ;;檢查是否有 "ACAD_LAYERFILTERS" 字典,沒有則建立
    (setq dict
        (if (setq dict (dictsearch xdict "ACAD_LAYERFILTERS"))
            (cdr (assoc -1 dict))
            (dictadd xdict "ACAD_LAYERFILTERS"
                (entmakex
                   '(
                        (0 . "dictionary")
                        (100 . "AcDbDictionary")
                        (280 . 0)
                        (281 . 1)
                    )
                )
            )
        )
    )
    ;;建立圖層篩選
    (princ
        (if (dictsearch dict (setq xrecname "No_Xref_Layers"))
            (strcat
                "圖層篩選 <"
                xrecname
                "> 已經存在。"
            )
            (if
                (dictadd dict xrecname
                    (entmakex
                        (append
                           '(
                                (0 . "xrecord")
                                (100 . "AcDbXrecord")
                                (280 . 1)
                            )    
                            (list (cons 1 xrecname))
                           '(
                                (1 . "~*|*")
                                (1 . "*")
                                (1 . "*")
                                (70 . 0)
                                (1 . "*")
                                (1 . "*")
                                (-3          
                                    (   "ACAD"
                                        (1000 . "( NAME== \"~*|*\" )")
                                    )        
                                )
                            )    
                        )
                    )
                )
                (strcat
                    "建立圖層篩選 <"
                    xrecname
                    ">."
                )
               
            )    
        )    
    )    
  ;;設定當前圖層篩選為 "No_Xref_Layers"
(command ".-layer" "filter" "set" "No_Xref_Layers" "")    

    (princ)    
);_End of defun


;;;列出所有圖層群組
;;;返回一個列表,每個元素為一個圖層群組的名稱和其子群組所組成的列表
;;;作者:Lee Mac
(defun LM:grouplayerfilters nil
   (   (lambda ( foo ) (foo (entget (cdr (assoc 330 (entget (tblobjname "layer" "0")))))))
       (lambda ( enx / dic itm rtn )
           (and (setq dic (cdr (assoc 360 (member '(102 . "{ACAD_XDICTIONARY") enx))))
                (setq dic (cdr (assoc -1  (dictsearch dic "aclydictionary"))))
                (while (setq itm (dictnext dic (not itm)))
                    (if (or (= "AcLyLayerGroup" (cdr (assoc 1 itm)))
(= "AcLyLayerFilter" (cdr (assoc 1 itm))))
                        (setq rtn (cons (cons (cdr (assoc 300 itm)) (foo itm)) rtn))
                    )
                )
           )
           (reverse rtn)
       )
   )
)

;;;範例:
; _$ (LM:grouplayerfilters)
; (("Group Filter1" ("Group Filter4") ("Group Filter5")) ("Group Filter2" ("Group Filter6")) ("Group Filter3"))






留言

這個網誌中的熱門文章

AutoCAD 填充線(剖面線)樣式簡易製作產生器

AutoCAD 常用的圖塊統計方法

AutoCAD 如何自訂線型教學