找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2589|回复: 19

[已解决] 如何将一个lisp做成选项合并到另一个lisp中去?

[复制链接]
发表于 2006-8-28 14:32:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
恳求高手们帮我改改,让我学习一下。小弟我自已嫌每次输入@矩形的尺寸太麻烦,而我自己画的衣柜,台面之类的尺寸又是固定的,所以就做了个微不足道的这个lisp。
但是我觉得不好的是占用了两个命令,而且实用过程中还是容易搞混?如何做成一个命令,并且在命令行设置选项呢?输入那个选项值的话就是画1500x600的矩形
如输入rr就是画600x1500的矩形,在命令行输入提示选项A,就是画1500x600的矩形?

谢谢!

  1. (defun po_err (s)
  2.   (setvar "cmdecho" cm)
  3.   (setvar "osmode" os)
  4.   (command "_.undo" "_e")
  5. )
  6. ;利用rectang命令绘制矩形,矩形的尺寸为1500x600
  7. (defun c:r1 ()
  8.   (princ "\n* 插入 |X*Y=1500*600| 横式矩形 *")
  9.   (setq cm (getvar "cmdecho"))
  10.   (setq os (getvar "osmode"))
  11.   (setq *error* po_err)
  12.   (setvar "cmdecho" 0)
  13.   (setvar "osmode" 4151)
  14.   (princ "\n指定矩形的插入点 <退出>:")
  15.   (setq p1 (getpoint))
  16.   (setvar "osmode" 0)
  17.   (if p1 (progn
  18.                 (command "rectang" "c" "0" "0" "e" "0" "f" "0" "t" "0" "w" "0" p1 "d" "1500" "600")
  19.                 (while (/= 0 (getvar "cmdactive"))(command pause))
  20.                 (command "draworder" "last" "" "b")
  21.          )
  22.   )
  23.   (setvar "cmdecho" cm)
  24.   (setvar "osmode" os)
  25.   (princ)
  26. )
  27. ;利用rectang命令绘制矩形,矩形的尺寸为600x1500
  28. (defun c:r2 ()
  29.   (princ "\n* 插入 |X*Y=600*1500| 立式矩形 *")
  30.   (setq cm (getvar "cmdecho"))
  31.   (setq os (getvar "osmode"))
  32.   (setq *error* po_err)
  33.   (setvar "cmdecho" 0)
  34.   (setvar "osmode" 4151)
  35.   (princ "\n指定矩形的插入点 <退出>:")
  36.   (setq p1 (getpoint))
  37.   (setvar "osmode" 0)
  38.   (if p1 (progn
  39.                 (command "rectang" "c" "0" "0" "e" "0" "f" "0" "t" "0" "w" "0" p1 "d" "600" "1500")
  40.                 (while (/= 0 (getvar "cmdactive"))(command pause))
  41.                 (command "draworder" "last" "" "b")
  42.          )
  43.   )
  44.   (setvar "cmdecho" cm)
  45.   (setvar "osmode" os)
  46.   (princ)
  47. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-8-28 16:09:01 | 显示全部楼层
试试

  1. (defun po_err (s)
  2.   (setvar "cmdecho" cm)
  3.   (setvar "osmode" os)
  4.   (command "_.undo" "_e")
  5. )

  6. (defun c:rr (/ efg)
  7.   (prompt "\n输入类型, a为1500*600:")
  8.   (setq efg (getstring))
  9.   (cond
  10.     ((= efg "")
  11.       (r1 "600" "1500")
  12.     )
  13.     ((= efg "a")
  14.       (r1 "1500" "600")
  15.     )
  16.   )
  17. )

  18. ;利用rectang命令绘制矩形,矩形的尺寸为1500x600
  19. (defun r1 (pa pb / cm os p1)
  20.   (princ "\n* 插入 |X*Y=1500*600| 横式矩形 *")
  21.   (setq cm (getvar "cmdecho"))
  22.   (setq os (getvar "osmode"))
  23.   (setq *error* po_err)
  24.   (setvar "cmdecho" 0)
  25.   (setvar "osmode" 4151)
  26.   
  27.   (princ "\n指定矩形的插入点 <退出>:")
  28.   (setq p1 (getpoint))
  29.   (setvar "osmode" 0)
  30.   (if p1 (progn
  31.                 (command "rectang" "c" "0" "0" "e" "0" "f" "0" "t" "0" "w" "0" p1 "d" pa pb)
  32.                 (while (/= 0 (getvar "cmdactive"))(command pause))
  33.                 (command "draworder" "last" "" "b")
  34.          )
  35.   )
  36.   (setvar "cmdecho" cm)
  37.   (setvar "osmode" os)
  38.   (princ)
  39. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-28 17:10:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
大哥能否解释一下改过的每句的含义呀?尤其是pa,pb找不出在哪里定义过。
我知道和这句有关系((= efg "")
      (r1 "600" "1500")
    )
    ((= efg "a")
      (r1 "1500" "600")
    )
  )
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-8-28 17:24:53 | 显示全部楼层
(r1 "600" "1500") 代表调用函数r1 就是把你原来的c:r1改成了r1,
defun c:ab() 的ab是可以直接在cad命令行中输入的命令
而defun ab()是可以直接被Lisp调用的命令
defun ab(x y)代表的函数可以在Lisp代码中用 (ab x y)来调用,其中 x y 是拿来传递变量的, 不需要定义的.
比如你运行一下后面这个代码就知道怎么回事的

(r1 "600" "1500")代表的就是把"600"赋值给pa, "1500"赋值给pb,这样子就不用写r1和r2两个不同函数的

[php]
(defun c:test ()
  (setq x (ab 6 7))
(princ "\n               x = ") (princ x);Erase_DV
(getstring "\nPress Enter to continue...");Erase_DV
  (setq x (ab 1 5))
(princ "\n               x = ") (princ x);Erase_DV
(getstring "\nPress Enter to continue...");Erase_DV
)
(defun ab (m n)
  (+ (* m 100) (* n 10))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-28 18:21:12 | 显示全部楼层
[php]
(defun c:tt ()
  (or (setq a "1500" b "600" p1 (getpoint "\n 1500*600第一角点/<600*1500>:")  )
    (setq a "600" b "1500"  p1 (getpoint "\n 600*1500第一角点:") ))
  (if p1
    (command ".rectangle" p1 (strcat "@" a "," b))
  )(princ)
) [/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-28 20:42:09 | 显示全部楼层
最初由 snoopychen 发布
[B]试试
[code]
(defun po_err (s)
  (setvar "cmdecho" cm)
  (setvar "osmode" os)
  (command "_.undo" "_e")
)

(defun c:rr (/ efg)
  (prompt "\n输入类型, a为1500*600:")
  (setq efg (getstring))
... [/B]


在搭车回来的路上,想了想。如果想程序更完美的话,最好是这样:第一次输入A,是1500*600的矩形,第二次输入A是600*1500的矩形,如果第三次输入A的话,则重复第一次结果。也就是要怎么样才能做成个循环呢?就像是专业的建筑软件一样?

如何实现呢?谢谢!

梁兄的程序很是简洁,比较新颖呀!
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2006-8-28 20:49:28 | 显示全部楼层
雨箭风刀你的程序写得太精练了,or的用法恰到好处,功夫实在深。请问“钢铁是怎样练成的?” 让菜鸟学习学习。多谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-28 22:20:54 | 显示全部楼层
andy,把rr函数改成下面这个就可以了
:)刀兄的程序一向简练
[php]
(defun c:rr (/ efg  @c)
  (if (or
        (= @a nil)
        (= @b nil)
      )
    (setq @a "600"
          @b "1500"
    )
  )
  (prompt "\n输入类型, a为改变形式:")
  (setq efg (getstring))
  (if (= efg "a")
    (setq @c @a
          @a @b
          @b @c
    )
  )
  (r1 @a @b)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-29 09:50:27 | 显示全部楼层
嘿嘿!谢谢楼上的两位超级大哥!
梁兄的程序不能随鼠标摇摆算是一种遗憾了。如回字形的一个房间,在两个竖墙的位置要插入一字形1500*600的柜子。左墙是可以用程序实现的。那右墙呢?
不知道语言表达清楚没有?可惜不能上传图片?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-29 12:42:31 | 显示全部楼层
这个和插入门窗是同样的原理,如果要功能完善一点,可以参考论坛已有的程序。至少可以搜索出几个吧,我想。
有个程序是根据鼠标对实体旋转镜像的,忘了是哪个发的了。可以用grread 判断鼠标位置
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-29 15:08:35 | 显示全部楼层
andy的原程序(1楼或者2楼)就是可以用鼠标来判断位置的,确实让我觉得挺新奇的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-14 22:49:40 | 显示全部楼层
最初由 雨箭风刀 发布
[B][php]
(defun c:tt ()
  (or (setq a "1500" b "600" p1 (getpoint "\n 1500*600第一角点/<600*1500>:")  )
    (setq a "600" b "1500"  p1 (getpoint "\n 600*1500第一角点:") ))
  (if p1
    (command ".re... [/B]




对着梁兄+lisp的帮助也写不出45/-45度的坡度线?晕死,程序的思路理解,但是对语言的用法不熟!


  1.   [FONT=courier new]
  2. (defun c:ttt ()
  3.   (or (setq a "45" p1 (getpoint "\n 45指定通过点/<-45>:")  )
  4.     (setq b "-45"  p1 (getpoint "\n -45指定通过点:") ))
  5.   (if p1
  6.     (command "xline" "a" p1  (strcat  a  b))
  7.   )(princ)
  8. )
  9.   [/FONT]



找到原因了,是strcat的问题,返回a,b,但是不用这个,用哪个呀?
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-14 23:07:15 | 显示全部楼层

  1. (defun c:ttt (/ a p1)
  2.   (or (setq a "45" p1 (getpoint "\n 45指定通过点/<-45>:")  )
  3.     (setq a "-45"  p1 (getpoint "\n -45指定通过点:") ))
  4.   (if p1
  5.     (command "xline" p1 (strcat "@100<" a ) "")
  6.   )(princ)
  7. )

可能可以吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-15 02:24:53 | 显示全部楼层
[PHP]
(defun c:tt (/ a b p1)
  (if   (or (setq a "1500" b "600" p1 (getpoint "\n 1500*600第一角点/<600*1500>:")  )
      (setq a "600" b "1500"  p1 (getpoint "\n 600*1500第一角点:") ))
    (progn (command ".rectangle" p1 (strcat "@" a "," b))
      (command ".rotate" "l" "" p1 pause);;配合极轴追踪.
    )
  )
  (princ)
)
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-15 09:04:41 | 显示全部楼层
梁兄的程序实际上是用旋转+正交开才能达到预期的效果!也就是程序设定中应该有
(setvar "orthomode" 1)
还有就是在实现旋转的过程中,最好是屏蔽osmode
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-26 12:14 , Processed in 0.451838 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表