带窗口的手动绘图
你好我编写了一个LISP例程,并附带了一个脚本,允许用户选择一个窗口并使用所有默认设置进行打印。它工作得很好,但是它没有标准AutoCAD窗口选择附带的框,因此有时很难看到您是否正在打开所需的窗口。这是我的。
LISP例程:
(defun c:plot-w ()
(setq osmode (getvar "osmode"))
(setvar "osmode" 1)
(Alert "Select Window to Print!")
(setq pt1 (getpoint "\First Window Point: "))
(setq pt2 (getpoint "\Second Window Point: "))
(SETVAR "osmode" osmode)
(command "_.SCRIPT" "PLOT-W") (prin1)
)
-------
脚本文件:
-view
w
plot-w
!pt1
!pt2
-plot
Y
MODEL
\\GRICHARDS-W7\Phaser 8560N PS
LEGAL
INCHES
LANDSCAPE
NO
V
PLOT-W
FIT
CENTER
YES
.
YES
AS
NO
YES
Y
--------
谢谢 这是一个更大的lisp的一部分,但我删掉了它,这样你就可以知道你可以做什么。
grread和grdraw学习起来很有趣。
(defun c:woo ( / )
(setq whl t)
(setvar "cmdecho" 0)
(if (setq pntlst (list (getpoint "Select first point: ")))
(progn
(princ "\nSelect next point: ")
(while (and (setq gr (grread t))
whl)
(cond
((and (= (car gr) 5)
(member nil (mapcar '(lambda (x y) (= x y)) (last pntlst) (cadr gr)))
(member nil (mapcar '(lambda (x y) (= x y)) (cadr (reverse pntlst)) (cadr gr))))
(command "redraw")(command)
(grvmk (append pntlst (cdr gr))))
((and (= (car gr) 5)
(member nil (mapcar '(lambda (x y) (= x y)) (last pntlst) (cadr gr)))
(< (length pntlst) 3))
(command "redraw")(command)
(grvmk (append pntlst (cdr gr))))
((and (= (car gr) 3)
(member nil (mapcar '(lambda (x y) (= x y)) (last pntlst) (cadr gr)))
(member nil (mapcar '(lambda (x y) (= x y)) (cadr (reverse pntlst)) (cadr gr))))
(setq pntlst (append pntlst (cdr gr)))
(setq whl nil))
((and (= (car gr) 3)
(member nil (mapcar '(lambda (x y) (= x y)) (last pntlst) (cadr gr)))
(< (length pntlst) 3))
(setq pntlst (append pntlst (cdr gr)))
(setq whl nil))
((or (= (car gr) 25)
(and (= (car gr) 11)
(not (= (cadr gr) -1))))
(command "redraw")
(setq whl nil)))))
)
)
(defun grvmk (lst / 1lst 1lst)
(setq 1lst (car lst)
2lst (cadr lst))
(grdraw 1lst (list (car 1lst) (cadr 2lst)) 1)
(grdraw (list (car 1lst) (cadr 2lst)) 2lst 1)
(grdraw 2lst (list (car 2lst) (cadr 1lst)) 1)
(grdraw (list (car 2lst) (cadr 1lst)) 1lst 1)
)
Eww公司
我知道你在做什么,我想我理解它是如何工作的,但这是我头脑中的许多代码。。我以后得看一看,谢谢! 请阅读代码发布指南并编辑您的帖子,将代码包含在代码标签中。
抱歉。。固定的另外,请注意,打开增强编辑器的说明已经过时,我花了一段时间才弄明白=)
谢谢 dpolsky,试试下面这个。GETCORNER是您想要的。
(defun c:plot-w (/ osmode pt1 pt2 *error* )
(defun *error* ( msg )
(setvar 'osmode osmode)
(if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
(princ (strcat "\nError: " msg))
)
(princ)
)
(setq osmode (getvar 'osmode))
(setvar 'osmode 1)
(Alert "Select Window to Print!")
(if
(setq pt1 (getpoint "\First Window Point: ")
pt2 (getcorner pt1 "\Second Window Point: "))
(command "_.SCRIPT" "PLOT-W")
)
(setvar'osmode osmode)
(princ)
)
很 完美!
这正是我所需要的,现在我的例程看起来和感觉都像一个真正的AutoCAD命令!我想我实际上可以把它融入到我的一些其他例程中,是否有类似的命令用于绘制线条和其他各种事情。我有一个LISP例程,它将一个点直接放在两条线的中点之间,其他一些例程则表示,如果让幻影线与光标一起单独拖动就好了。
再次感谢!
-丹尼尔
而且
我看到你在我的日常生活中加入了错误捕捉,谢谢。这是我尚未解决的问题,前几天我曾想过要解决它,但对我来说还是有点复杂。如果在命令执行过程中取消,我应该使用它来修复OSMODE问题。 欢迎光临。
查找grread和grdraw函数,然后使用entmake创建实体。
你可以在这里找到一些灵感http://www.theswamp.org/index.php?topic=12813.165
很高兴为您服务,丹尼尔。我修改了上面的代码并放了一个if语句。
关于虚拟线拖动,请按照Commandobill的建议查看grread和grdraw函数。
搜索“用法示例GRREAD”,它在沼泽地上。
干杯 太好了,谢谢!
我完全理解(我可以把它添加到我的其他例程中),
(defun *error* ( msg )
(setvar 'osmode osmode)
(if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
(princ (strcat "\nError: " msg))
)
(princ)
)
这是通用的错误陷阱代码,我在这里设置了所有变量,就像osmode在我的LISP例程中更改一样,我希望确保更改回原来的状态:层、cmdecho等等。
当您键入“osmode…”。。。这与键入“osmode”相同吗?
你能给我解释一下这句台词是什么吗
(setvar 'osmode osmode)
是否在错误陷阱中?我也不太明白接下来的几行,但看起来你只是告诉错误陷阱在中断、取消和退出时关闭?当我取消命令时,我没有收到错误消息。我应该吗?
对不起,我想知道我在做什么,而不仅仅是复制/粘贴!
谢谢
丹尼尔
页:
[1]
2