zilong136 发表于 2024-5-26 13:49:39

如何用代码实现布局视口裁剪?

本帖最后由 zilong136 于 2024-5-27 06:23 编辑

在布局视口经常要放大样,常用的命令是视口裁剪(vpclip),如果是输入这个命令的话,就只能绘制裁剪的路径,我们习惯是先绘制这个路径,然后右键选择视口对象~视口裁剪~选择事先绘制好的路径。

[*](Defun C:vv12 ()
[*](prompt "\n vv12:剪裁视口")
[*](command "vpclip" )
[*](princ)
[*])

你有种再说一遍 发表于 2024-5-26 18:38:18

大家好像还没有发现你用少量代码换完整功能

zilong136 发表于 2024-5-26 20:53:11

你有种再说一遍 发表于 2024-5-26 18:38
大家好像还没有发现你用少量代码换完整功能

没办法,目前只会最简单的代码。

moranyuyan 发表于 2024-5-27 15:53:00

期待大神出手

e2002 发表于 2024-5-28 17:54:04

本帖最后由 e2002 于 2024-5-28 17:55 编辑

vpclip 命令,先是选择需要裁剪的视口对象,然后提示选择裁剪的边界曲线对象,此时输入命令选项P,则可以临时绘制一个边界对象。

我猜测你的习惯是: 先绘制一个多段线,然后再选择要裁剪的视口对象。
这就是个人喜好的问题,而默认的命令的操作方式和你习惯的思维和操作方式并不符合,所以希望能有个更加符合你操作习惯的等价功能命令。

抽空写了个简单的版本,待后续和大家一起逐步改进。

(defun C:VpClipUser ( / enlast0 en el g70 v70 bLoop esl enVP elVP sType)
(if (and (= (getvar "TILEMODE") 0)
         (= (getvar "CVPORT") 1)
      )
    (progn
      (setq enlast0 (entlast)
            bLoop T
      )
      (command "_.pline")
      (while bLoop
      (if (= (getvar "CMDACTIVE") 1)
          (command PAUSE)
          (progn
            (command)
            (setq bLoop nil)
          )
      );__2_fi
      );_while
      (setq en (entlast))
      (if (not (equal enlast0 en))
      (progn
          (setq el (entget en)
                g70 (assoc 70 el)
                v70 (cdr g70)
          )
          (if (member v70 '(0 128))
            (progn
            (setq el (subst (cons 70 (+ v70 1)) g70 el))
            (entmod el)
            (entupd en)
            )
          );_3_fi
          (setq bLoop T)
          (while bLoop
            (if (setq esl (entsel "\nSpecify the viewport object for clip:"))
            (progn
                (setq enVP(car esl)
                      elVP(entget enVP)
                      sType (cdr (assoc 0 elVP))
                )
                (if (= sType "VIEWPORT")
                  (progn
                  (setq bLoop nil)
                  (vl-cmdf "_.vpclip" enVP en)
                  )
                  (princ "\nNot VIEWPORT object.")
                );_5_fi
            );_4_then
            (progn
                (setq bLoop nil)
                (princ "\nNot pick an object!")
            );_4_else
            );_4_fi
          );_while
      );__progn
      (princ "\nCreate a bounding object canceled!")
      );__fi
    );_progn
    (princ "\nOnly use in PaperSpace!")
);_if
);_defun

zilong136 发表于 2024-5-29 01:21:04

本帖最后由 zilong136 于 2024-5-29 01:36 编辑

e2002 发表于 2024-5-28 17:54
vpclip 命令,先是选择需要裁剪的视口对象,然后提示选择裁剪的边界曲线对象,此时输入命令选项P,则可以临 ...
是这个意思,但命令能不能用圆、矩形等来绘制,不能局限于多段线。

e2002 发表于 2024-5-29 16:21:58

还可以设计为另一种操作方式:

在右键菜单中增加一个自定义项:“使用此对象裁剪视口”,操作过程为:点击曲线对象,右击出现对象编辑弹出菜单,选择“使用此对象裁剪视口”,按提示点选视口对象,完成。

有空我再搞一下。

e2002 发表于 2024-5-29 16:29:38

本帖最后由 e2002 于 2024-5-29 16:31 编辑

Viewport对象的右键对象编辑菜单,显然已经有了 VPClip:



zilong136 发表于 2024-6-5 04:35:54

e2002 发表于 2024-5-29 16:21
还可以设计为另一种操作方式:

在右键菜单中增加一个自定义项:“使用此对象裁剪视口”,操作过程为:点 ...

默认右键有这个功能,就是想用LISP把这个功能写出来。
页: [1]
查看完整版本: 如何用代码实现布局视口裁剪?