prodromosm 发表于 2022-7-5 18:41:05

视口层冻结/解冻

我发现这个lisp冻结了视口中的图层
 

;;;   vpf.lsp   Viewport Layer Freeze
;;;
;;; ARGUMENTS
;;; none
;;;
;;; USAGE
;;; vpf
;;;
;;; PLATFORMS
;;; 2000+
;;;
;;; AUTHOR
;;; Copyright© 2005-2007 Charles Alan Butler
;;; TheSwamp.org
;;;
;;; VERSION
;;; 3.2 May 17, 2006
;;;
;;;This routine will Freeze the layer of a selected entity in ALL tabs
;;;and ALL viewports except the active viewport , selected layers are
;;;frozen while selecting & restored in the active viewport
;;;
;;;If you run the routine in model space it will freeze in ALL viewports
;;;
;;; YOU MAY USE THIS CODE ONLY FOR *NON-COMMERCIAL*
;;; PURPOSES AND ONLY IF YOU RETAIN
;;; THIS HEADER COMPLETE AND UNALTERED
;;; you must contact me if you want to use it commercially
;;;


;;======Main Lisp Routine=======

(defun c:vpf (/ oldcmd vpflag sel-vport entvport pik str laylist ms layout c-tab *error*)
;; error function
(defun *error* (msg)
   (if (not (member msg
      '("console break" "Function cancelled" "quit / exit abort"))
    )
    (princ (strcat "\nError: " msg))
   )
   (if (/= laylist "")
    (if ms
   (command ".-layer" "thaw" laylist "")
   (command ".vplayer" "t" laylist "All" "" ; reset selectd layers
            ".pspace")
    )
   )
   (setvar "CMDECHO" oldcmd)
   (princ)
) ;end error function

(setq oldcmd (getvar "CMDECHO")
       c-tab(getvar "ctab"))
(setvar "CMDECHO" 0)
(if (= (getvar "TileMode") 1) ; in model space
   ;;------------------------------------------------
   (progn
   (prompt "\n****Layers chosen will be frozen in all viewports.")
   (setq ms t)
   )
   ;;------------------------------------------------
   (progn ;else in a layout
   (setq vpflag (getvar "cvport")) ; get viewport #
   (while (= vpflag 1) ; No active viewport, Loop until one is picked
       (setq sel-vport (car (entsel "\nSelect view port: ")))
       (if (= sel-vport nil)
         (alert "You must select a viewport\n    --=<Try again!>=--")
         (progn
         (setq entvport (entget sel-vport))
         (if (= (cdr (assoc 0 entvport)) "VIEWPORT")
             (progn
               (setq vpflag (cdr (assoc 69 entvport))
               )
               (command ".mspace")
               (setvar "cvport" vpflag)
             ) ;endifviewport
         )
         )
       ) ;endif condsel-vport
   ) ;endwhile (= vpFlag 1)
   )
   ;;------------------------------------------------
) ; endif

;;================================
;;Get Entity and Freeze Layer   
;;================================

(command "undo" "begin")

(while (setq pik (entsel "\nSelect an item whose layer to freeze: "))
   (setq str (cdr (assoc 8 (entget (car pik)))))
   (if laylist
   (setq laylist (strcat laylist "," STR))
   (setq laylist str)
   )
   ;;Freeze selected layers for visual feedback
   (if ms
   (if (= str (getvar "clayer"))
       (alert "Layer current, will be frozen in viewports.")
       (command ".-layer" "freeze" str "")
   )
   (command ".vplayer" "f" str "All" "")
   )
)
(cond
   ((/= laylist "") ;Freeze layers in ALL viewports and ALL TABs
    (setvar "TileMode" 0) ;Force Paper Space
    (foreach layout (vl-remove c-tab (layoutlist))
   (setvar "ctab" layout)
   (command ".vplayer" "f" laylist "All" "")
    )
   
    (if ms
      (progn
      (setvar "TileMode" 1) ;Back to Model Space
      (command ".-layer" "thaw" laylist "")
      )
      (progn
      (setvar "ctab" c-tab)
      (setvar "cvport" vpflag)
      (command ".vplayer" "t" laylist "Current" "") ; restore working VP
      )
    )
   )
   ((/= laylist "")
    (command ".vplayer" "t" laylist "Current" "") ; restore working VP
   )
) ; end cond stmt
(command "undo" "end")
(setvar "CMDECHO" oldcmd)
(princ)

) ;end defun
(prompt "\nType VPF to run")
(prin1)


 
我试着把它换成解冻层
 
(defun c:vpt (/ oldcmd vpflag sel-vport entvport pik str laylist ms layout c-tab *error*)
;; error function
(defun *error* (msg)
   (if (not (member msg
      '("console break" "Function cancelled" "quit / exit abort"))
    )
    (princ (strcat "\nError: " msg))
   )
   (if (/= laylist "")
    (if ms
   (command ".-layer" "thaw" laylist "")
   (command ".vplayer" "t" laylist "All" "" ; reset selectd layers
            ".pspace")
    )
   )
   (setvar "CMDECHO" oldcmd)
   (princ)
) ;end error function

(setq oldcmd (getvar "CMDECHO")
       c-tab(getvar "ctab"))
(setvar "CMDECHO" 0)
(if (= (getvar "TileMode") 1) ; in model space
   ;;------------------------------------------------
   (progn
   (prompt "\n****Layers chosen will be frozen in all viewports.")
   (setq ms t)
   )
   ;;------------------------------------------------
   (progn ;else in a layout
   (setq vpflag (getvar "cvport")) ; get viewport #
   (while (= vpflag 1) ; No active viewport, Loop until one is picked
       (setq sel-vport (car (entsel "\nSelect view port: ")))
       (if (= sel-vport nil)
         (alert "You must select a viewport\n    --=<Try again!>=--")
         (progn
         (setq entvport (entget sel-vport))
         (if (= (cdr (assoc 0 entvport)) "VIEWPORT")
             (progn
               (setq vpflag (cdr (assoc 69 entvport))
               )
               (command ".mspace")
               (setvar "cvport" vpflag)
             ) ;endifviewport
         )
         )
       ) ;endif condsel-vport
   ) ;endwhile (= vpFlag 1)
   )
   ;;------------------------------------------------
) ; endif

;;================================
;;Get Entity and Freeze Layer   
;;================================

(command "undo" "begin")

(while (setq pik (entsel "\nSelect an item whose layer to thaw: "))
   (setq str (cdr (assoc 8 (entget (car pik)))))
   (if laylist
   (setq laylist (strcat laylist "," STR))
   (setq laylist str)
   )
   ;;Freeze selected layers for visual feedback
   (if ms
   (if (= str (getvar "clayer"))
       (alert "Layer current, will be thaw in viewports.")
       (command ".-layer" "thaw" str "")
   )
   (command ".vplayer" "t" str "All" "")
   )
)
(cond
   ((/= laylist "") ;Freeze layers in ALL viewports and ALL TABs
    (setvar "TileMode" 0) ;Force Paper Space
    (foreach layout (vl-remove c-tab (layoutlist))
   (setvar "ctab" layout)
   (command ".vplayer" "t" laylist "All" "")
    )
   
    (if ms
      (progn
      (setvar "TileMode" 1) ;Back to Model Space
      (command ".-layer" "thaw" laylist "")
      )
      (progn
      (setvar "ctab" c-tab)
      (setvar "cvport" vpflag)
      (command ".vplayer" "f" laylist "Current" "") ; restore working VP
      )
    )
   )
   ((/= laylist "")
    (command ".vplayer" "f" laylist "Current" "") ; restore working VP
   )
) ; end cond stmt
(command "undo" "end")
(setvar "CMDECHO" oldcmd)
(princ)

) ;end defun
(prompt "\nType VPT to run")
(prin1)
 
用一个lisp文件做这两件事有没有更快的方法?

rlx 发表于 2022-7-5 19:02:00

我会在例行程序开始时使用getkword
 
 
然后将命令函数中的“冻结”或“解冻”替换为CMD
 
 
gr.Rlx
 
 
ps我看到例程提示解冻xx层的冻结xx层,所以可能会为此制作一个cmd\u txt
 
 

(if (= kw "Freeze")
(setq CMD"Freeze" cmd_txt "Frozen")
(setq CMD "Thaw" cmd_txt "Thawed"))

prodromosm 发表于 2022-7-5 19:27:05

你好,rlx。你能更新代码吗,因为我不擅长lisp?

rlx 发表于 2022-7-5 19:41:07

只需将此代码添加到原始的vpf例程中
 
4
 
使用ftvp调用命令(冻结/解冻视口)
 
gr.Rlx
页: [1]
查看完整版本: 视口层冻结/解冻