乐筑天下

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

[编程交流] 带窗口的手动绘图

[复制链接]

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:17:03 | 显示全部楼层 |阅读模式
你好
 
我编写了一个LISP例程,并附带了一个脚本,允许用户选择一个窗口并使用所有默认设置进行打印。它工作得很好,但是它没有标准AutoCAD窗口选择附带的框,因此有时很难看到您是否正在打开所需的窗口。这是我的。
 
LISP例程:
  1. (defun c:plot-w ()
  2. (setq osmode (getvar "osmode"))
  3. (setvar "osmode" 1)
  4. (Alert "Select Window to Print!")
  5. (setq pt1 (getpoint "\First Window Point: "))
  6. (setq pt2 (getpoint "\Second Window Point: "))
  7. (SETVAR "osmode" osmode)
  8.    (command "_.SCRIPT" "PLOT-W") (prin1)
  9. )

 
-------
 
脚本文件:
 
  1. -view
  2. w
  3. plot-w
  4. !pt1
  5. !pt2
  6. -plot
  7. Y
  8. MODEL
  9. \\GRICHARDS-W7\Phaser 8560N PS
  10. LEGAL
  11. INCHES
  12. LANDSCAPE
  13. NO
  14. V
  15. PLOT-W
  16. FIT
  17. CENTER
  18. YES
  19. .
  20. YES
  21. AS
  22. NO
  23. YES
  24. Y

--------
 
谢谢
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 06:23:44 | 显示全部楼层
这是一个更大的lisp的一部分,但我删掉了它,这样你就可以知道你可以做什么。
 
grread和grdraw学习起来很有趣。
 
  1. (defun c:woo ( / )
  2. (setq whl t)
  3. (setvar "cmdecho" 0)
  4. (if (setq pntlst (list (getpoint "Select first point: ")))
  5.    (progn
  6.      (princ "\nSelect next point: ")
  7.      (while (and (setq gr (grread t))
  8.    whl)
  9. (cond
  10.   ((and (= (car gr) 5)
  11. (member nil (mapcar '(lambda (x y) (= x y)) (last pntlst) (cadr gr)))
  12. (member nil (mapcar '(lambda (x y) (= x y)) (cadr (reverse pntlst)) (cadr gr))))
  13.    (command "redraw")(command)
  14.    (grvmk (append pntlst (cdr gr))))
  15.   ((and (= (car gr) 5)
  16. (member nil (mapcar '(lambda (x y) (= x y)) (last pntlst) (cadr gr)))
  17. (< (length pntlst) 3))
  18.    (command "redraw")(command)
  19.    (grvmk (append pntlst (cdr gr))))
  20.   ((and (= (car gr) 3)
  21. (member nil (mapcar '(lambda (x y) (= x y)) (last pntlst) (cadr gr)))
  22. (member nil (mapcar '(lambda (x y) (= x y)) (cadr (reverse pntlst)) (cadr gr))))
  23.    (setq pntlst (append pntlst (cdr gr)))
  24.    (setq whl nil))
  25.   ((and (= (car gr) 3)
  26. (member nil (mapcar '(lambda (x y) (= x y)) (last pntlst) (cadr gr)))
  27. (< (length pntlst) 3))
  28.    (setq pntlst (append pntlst (cdr gr)))
  29.    (setq whl nil))
  30.   ((or (= (car gr) 25)
  31.        (and (= (car gr) 11)
  32.      (not (= (cadr gr) -1))))
  33.    (command "redraw")
  34.    (setq whl nil)))))
  35.    
  36.    )
  37. )
  38. (defun grvmk (lst / 1lst 1lst)
  39. (setq 1lst (car lst)
  40. 2lst (cadr lst))
  41. (grdraw 1lst (list (car 1lst) (cadr 2lst)) 1)
  42. (grdraw (list (car 1lst) (cadr 2lst)) 2lst 1)
  43. (grdraw 2lst (list (car 2lst) (cadr 1lst)) 1)
  44. (grdraw (list (car 2lst) (cadr 1lst)) 1lst 1)
  45. )
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:30:46 | 显示全部楼层
Eww公司
 
我知道你在做什么,我想我理解它是如何工作的,但这是我头脑中的许多代码。。我以后得看一看,谢谢!
回复

使用道具 举报

4

主题

2143

帖子

2197

银币

限制会员

铜币
-24
发表于 2022-7-6 06:33:41 | 显示全部楼层
请阅读代码发布指南并编辑您的帖子,将代码包含在代码标签中。
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:44:19 | 显示全部楼层
 
 
抱歉。。固定的另外,请注意,打开增强编辑器的说明已经过时,我花了一段时间才弄明白=)
 
谢谢
回复

使用道具 举报

0

主题

99

帖子

99

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 06:48:19 | 显示全部楼层
dpolsky,试试下面这个。GETCORNER是您想要的。
 
  1. (defun c:plot-w (/ osmode pt1 pt2 *error* )
  2. (defun *error* ( msg )
  3. (setvar 'osmode osmode)
  4. (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
  5. (princ (strcat "\nError: " msg))
  6. )
  7. (princ)
  8. )
  9. (setq osmode (getvar 'osmode))
  10. (setvar 'osmode 1)
  11. (Alert "Select Window to Print!")
  12. (if
  13. (setq pt1 (getpoint "\First Window Point: ")
  14.        pt2 (getcorner pt1 "\Second Window Point: "))
  15. (command "_.SCRIPT" "PLOT-W")
  16. )
  17. (setvar  'osmode osmode)
  18. (princ)
  19. )
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:54:59 | 显示全部楼层
 
很 完美!
 
这正是我所需要的,现在我的例程看起来和感觉都像一个真正的AutoCAD命令!我想我实际上可以把它融入到我的一些其他例程中,是否有类似的命令用于绘制线条和其他各种事情。我有一个LISP例程,它将一个点直接放在两条线的中点之间,其他一些例程则表示,如果让幻影线与光标一起单独拖动就好了。
 
再次感谢!
 
-丹尼尔
 
而且
 
我看到你在我的日常生活中加入了错误捕捉,谢谢。这是我尚未解决的问题,前几天我曾想过要解决它,但对我来说还是有点复杂。如果在命令执行过程中取消,我应该使用它来修复OSMODE问题。
回复

使用道具 举报

0

主题

99

帖子

99

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 07:00:10 | 显示全部楼层
欢迎光临。
 
查找grread和grdraw函数,然后使用entmake创建实体。
 
你可以在这里找到一些灵感http://www.theswamp.org/index.php?topic=12813.165
 
回复

使用道具 举报

0

主题

99

帖子

99

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 07:03:37 | 显示全部楼层
很高兴为您服务,丹尼尔。我修改了上面的代码并放了一个if语句。
 
关于虚拟线拖动,请按照Commandobill的建议查看grread和grdraw函数。
搜索“用法示例GRREAD”,它在沼泽地上。
 
干杯
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:06:32 | 显示全部楼层
太好了,谢谢!
 
我完全理解(我可以把它添加到我的其他例程中),
 
  1. (defun *error* ( msg )
  2. (setvar 'osmode osmode)
  3. (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
  4. (princ (strcat "\nError: " msg))
  5. )
  6. (princ)
  7. )

 
这是通用的错误陷阱代码,我在这里设置了所有变量,就像osmode在我的LISP例程中更改一样,我希望确保更改回原来的状态:层、cmdecho等等。
 
当您键入“osmode…”。。。这与键入“osmode”相同吗?
 
你能给我解释一下这句台词是什么吗
 
  1. (setvar 'osmode osmode)

 
是否在错误陷阱中?我也不太明白接下来的几行,但看起来你只是告诉错误陷阱在中断、取消和退出时关闭?当我取消命令时,我没有收到错误消息。我应该吗?
 
对不起,我想知道我在做什么,而不仅仅是复制/粘贴!
 
谢谢
丹尼尔
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 18:28 , Processed in 0.396770 second(s), 72 queries .

© 2020-2025 乐筑天下

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