乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 11|回复: 3

[编程交流] 视口层冻结/解冻

[复制链接]

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 18:41:05 | 显示全部楼层 |阅读模式
我发现这个lisp冻结了视口中的图层
 
  1. ;;;   vpf.lsp     Viewport Layer Freeze
  2. ;;;
  3. ;;; ARGUMENTS
  4. ;;; none
  5. ;;;
  6. ;;; USAGE
  7. ;;; vpf
  8. ;;;
  9. ;;; PLATFORMS
  10. ;;; 2000+
  11. ;;;
  12. ;;; AUTHOR
  13. ;;; Copyright© 2005-2007 Charles Alan Butler
  14. ;;; TheSwamp.org
  15. ;;;
  16. ;;; VERSION
  17. ;;; 3.2 May 17, 2006
  18. ;;;
  19. ;;;  This routine will Freeze the layer of a selected entity in ALL tabs
  20. ;;;  and ALL viewports except the active viewport , selected layers are
  21. ;;;  frozen while selecting & restored in the active viewport
  22. ;;;
  23. ;;;  If you run the routine in model space it will freeze in ALL viewports
  24. ;;;
  25. ;;; YOU MAY USE THIS CODE ONLY FOR *NON-COMMERCIAL*
  26. ;;; PURPOSES AND ONLY IF YOU RETAIN
  27. ;;; THIS HEADER COMPLETE AND UNALTERED
  28. ;;; you must contact me if you want to use it commercially
  29. ;;;
  30. ;;======  Main Lisp Routine  =======
  31. (defun c:vpf (/ oldcmd vpflag sel-vport entvport pik str laylist ms layout c-tab *error*)
  32.   ;; error function
  33.   (defun *error* (msg)
  34.    (if (not (member msg
  35.       '("console break" "Function cancelled" "quit / exit abort"))
  36.     )
  37.     (princ (strcat "\nError: " msg))
  38.    )
  39.    (if (/= laylist "")
  40.     (if ms
  41.      (command ".-layer" "thaw" laylist "")
  42.      (command ".vplayer" "t" laylist "All" "" ; reset selectd layers
  43.               ".pspace")
  44.     )
  45.    )
  46.    (setvar "CMDECHO" oldcmd)
  47.    (princ)
  48.   ) ;end error function
  49. (setq oldcmd (getvar "CMDECHO")
  50.        c-tab  (getvar "ctab"))
  51. (setvar "CMDECHO" 0)
  52. (if (= (getvar "TileMode") 1) ; in model space
  53.    ;;------------------------------------------------
  54.    (progn
  55.      (prompt "\n****  Layers chosen will be frozen in all viewports.")
  56.      (setq ms t)
  57.    )
  58.    ;;------------------------------------------------
  59.    (progn ;else in a layout
  60.      (setq vpflag (getvar "cvport")) ; get viewport #
  61.      (while (= vpflag 1) ; No active viewport, Loop until one is picked
  62.        (setq sel-vport (car (entsel "\nSelect view port: ")))
  63.        (if (= sel-vport nil)
  64.          (alert "You must select a viewport\n    --=<  Try again!  >=--")
  65.          (progn
  66.            (setq entvport (entget sel-vport))
  67.            (if (= (cdr (assoc 0 entvport)) "VIEWPORT")
  68.              (progn
  69.                (setq vpflag (cdr (assoc 69 entvport))
  70.                )
  71.                (command ".mspace")
  72.                (setvar "cvport" vpflag)
  73.              ) ;  endif  viewport
  74.            )
  75.          )
  76.        ) ;  endif cond  sel-vport
  77.      ) ;endwhile (= vpFlag 1)
  78.    )
  79.    ;;------------------------------------------------
  80. ) ; endif
  81. ;;================================
  82. ;;  Get Entity and Freeze Layer   
  83. ;;================================
  84. (command "undo" "begin")
  85. (while (setq pik (entsel "\nSelect an item whose layer to freeze: "))
  86.    (setq str (cdr (assoc 8 (entget (car pik)))))
  87.    (if laylist
  88.      (setq laylist (strcat laylist "," STR))
  89.      (setq laylist str)
  90.    )
  91.    ;;  Freeze selected layers for visual feedback
  92.    (if ms
  93.      (if (= str (getvar "clayer"))
  94.        (alert "Layer current, will be frozen in viewports.")
  95.        (command ".-layer" "freeze" str "")
  96.      )
  97.      (command ".vplayer" "f" str "All" "")
  98.    )
  99. )
  100. (cond
  101.    ((/= laylist "") ;  Freeze layers in ALL viewports and ALL TABs
  102.     (setvar "TileMode" 0) ;  Force Paper Space
  103.     (foreach layout (vl-remove c-tab (layoutlist))
  104.      (setvar "ctab" layout)
  105.      (command ".vplayer" "f" laylist "All" "")
  106.     )
  107.    
  108.     (if ms
  109.       (progn
  110.         (setvar "TileMode" 1) ;  Back to Model Space
  111.         (command ".-layer" "thaw" laylist "")
  112.       )
  113.       (progn
  114.         (setvar "ctab" c-tab)
  115.         (setvar "cvport" vpflag)
  116.         (command ".vplayer" "t" laylist "Current" "") ; restore working VP
  117.       )
  118.     )
  119.    )
  120.    ((/= laylist "")
  121.     (command ".vplayer" "t" laylist "Current" "") ; restore working VP
  122.    )
  123. ) ; end cond stmt
  124. (command "undo" "end")
  125. (setvar "CMDECHO" oldcmd)
  126. (princ)
  127. ) ;  end defun
  128. (prompt "\nType VPF to run")
  129. (prin1)

 
我试着把它换成解冻层
 
  1. (defun c:vpt (/ oldcmd vpflag sel-vport entvport pik str laylist ms layout c-tab *error*)
  2.   ;; error function
  3.   (defun *error* (msg)
  4.    (if (not (member msg
  5.       '("console break" "Function cancelled" "quit / exit abort"))
  6.     )
  7.     (princ (strcat "\nError: " msg))
  8.    )
  9.    (if (/= laylist "")
  10.     (if ms
  11.      (command ".-layer" "thaw" laylist "")
  12.      (command ".vplayer" "t" laylist "All" "" ; reset selectd layers
  13.               ".pspace")
  14.     )
  15.    )
  16.    (setvar "CMDECHO" oldcmd)
  17.    (princ)
  18.   ) ;end error function
  19. (setq oldcmd (getvar "CMDECHO")
  20.        c-tab  (getvar "ctab"))
  21. (setvar "CMDECHO" 0)
  22. (if (= (getvar "TileMode") 1) ; in model space
  23.    ;;------------------------------------------------
  24.    (progn
  25.      (prompt "\n****  Layers chosen will be frozen in all viewports.")
  26.      (setq ms t)
  27.    )
  28.    ;;------------------------------------------------
  29.    (progn ;else in a layout
  30.      (setq vpflag (getvar "cvport")) ; get viewport #
  31.      (while (= vpflag 1) ; No active viewport, Loop until one is picked
  32.        (setq sel-vport (car (entsel "\nSelect view port: ")))
  33.        (if (= sel-vport nil)
  34.          (alert "You must select a viewport\n    --=<  Try again!  >=--")
  35.          (progn
  36.            (setq entvport (entget sel-vport))
  37.            (if (= (cdr (assoc 0 entvport)) "VIEWPORT")
  38.              (progn
  39.                (setq vpflag (cdr (assoc 69 entvport))
  40.                )
  41.                (command ".mspace")
  42.                (setvar "cvport" vpflag)
  43.              ) ;  endif  viewport
  44.            )
  45.          )
  46.        ) ;  endif cond  sel-vport
  47.      ) ;endwhile (= vpFlag 1)
  48.    )
  49.    ;;------------------------------------------------
  50. ) ; endif
  51. ;;================================
  52. ;;  Get Entity and Freeze Layer   
  53. ;;================================
  54. (command "undo" "begin")
  55. (while (setq pik (entsel "\nSelect an item whose layer to thaw: "))
  56.    (setq str (cdr (assoc 8 (entget (car pik)))))
  57.    (if laylist
  58.      (setq laylist (strcat laylist "," STR))
  59.      (setq laylist str)
  60.    )
  61.    ;;  Freeze selected layers for visual feedback
  62.    (if ms
  63.      (if (= str (getvar "clayer"))
  64.        (alert "Layer current, will be thaw in viewports.")
  65.        (command ".-layer" "thaw" str "")
  66.      )
  67.      (command ".vplayer" "t" str "All" "")
  68.    )
  69. )
  70. (cond
  71.    ((/= laylist "") ;  Freeze layers in ALL viewports and ALL TABs
  72.     (setvar "TileMode" 0) ;  Force Paper Space
  73.     (foreach layout (vl-remove c-tab (layoutlist))
  74.      (setvar "ctab" layout)
  75.      (command ".vplayer" "t" laylist "All" "")
  76.     )
  77.    
  78.     (if ms
  79.       (progn
  80.         (setvar "TileMode" 1) ;  Back to Model Space
  81.         (command ".-layer" "thaw" laylist "")
  82.       )
  83.       (progn
  84.         (setvar "ctab" c-tab)
  85.         (setvar "cvport" vpflag)
  86.         (command ".vplayer" "f" laylist "Current" "") ; restore working VP
  87.       )
  88.     )
  89.    )
  90.    ((/= laylist "")
  91.     (command ".vplayer" "f" laylist "Current" "") ; restore working VP
  92.    )
  93. ) ; end cond stmt
  94. (command "undo" "end")
  95. (setvar "CMDECHO" oldcmd)
  96. (princ)
  97. ) ;  end defun
  98. (prompt "\nType VPT to run")
  99. (prin1)

 
用一个lisp文件做这两件事有没有更快的方法?
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 19:02:00 | 显示全部楼层
我会在例行程序开始时使用getkword
 
 
然后将命令函数中的“冻结”或“解冻”替换为CMD
 
 
gr.Rlx
 
 
ps我看到例程提示解冻xx层的冻结xx层,所以可能会为此制作一个cmd\u txt
 
 
  1. (if (= kw "Freeze")
  2. (setq CMD"Freeze" cmd_txt "Frozen")
  3. (setq CMD "Thaw" cmd_txt "Thawed"))
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 19:27:05 | 显示全部楼层
你好,rlx。你能更新代码吗,因为我不擅长lisp?
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 19:41:07 | 显示全部楼层
只需将此代码添加到原始的vpf例程中
 
  1. 4

 
使用ftvp调用命令(冻结/解冻视口)
 
gr.Rlx
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 13:32 , Processed in 0.439751 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表