找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1480|回复: 6

[求助] [求助]:谁来帮助简化一下这个lisp程序

[复制链接]
发表于 2006-11-15 18:01:59 | 显示全部楼层 |阅读模式

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

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

×
求助:
1. 如何简化下面的程序,(因为是我自己写的,不太会.)
2. 为什么我运行完以后就出现"未知命令“OO”。按 F1 查看帮助。"
3. 就是当"(= nil ss) "的时候出现:"选择对象:  ; 错误: 参数类型错误: lselsetp nil" 不知道怎么解决.(就是想如果没有选中物体就退出的效果.)


  1.   [FONT=courier new]
  2. ;**********************************************双向偏移oo
  3.   (prompt "***c:oo***")
  4.   (defun c:oo()
  5.         (setq orig_blip (getvar "blipmode"))
  6.         (setq orig_cmd (getvar "cmdecho"))
  7.         (setq orig_os (getvar "osmode"))
  8.         (setvar "blipmode" 0)                ; blipmode = 0
  9.         (setvar "cmdecho" 0)                ; cmdecho = 0
  10.         (setvar "osmode" 0)                ; osmode = 0
  11.   
  12.   (initget 6 "S")
  13.   (setq dis (getdist (strcat "\n>>Offset distance or Through [Setting(S)]<100>:")))
  14. ;*********************************************(= dis 回车)
  15.   (if (= nil dis) (setq dis 100 k 1))  
  16.   (while (= k 1)
  17.       (setq ss (ssget))
  18.       (setq na (ssname ss 0))
  19.       (setq data (entget na))
  20.       (setq pt_1st (cdr (assoc '10 data)))
  21.       (setq pt_2nd (cdr (assoc '11 data)))
  22.       (setq ml_ss (ssadd))
  23.       (command "mline" "j" "z" "s" (* 2 dis) pt_1st pt_2nd "")
  24.       (ssadd (entlast) ml_ss)
  25.       (command "EXPLODE" ml_ss"")
  26.       (if (= nil ss)
  27.       (progn
  28.       (setq k 0)
  29.       (princ "error: haven't selceted.")
  30.       (exit)
  31.       ))
  32.    )
  33. ;*********************************************(= dis 输入距离)
  34.       (if (and (/= nil dis) (/= "S" dis)) (setq k 11))  
  35.   (while (= k 11)
  36.       (setq ss (ssget))
  37.       (setq na (ssname ss 0))
  38.       (setq data (entget na))
  39.       (setq pt_1st (cdr (assoc '10 data)))
  40.       (setq pt_2nd (cdr (assoc '11 data)))
  41.       (setq ml_ss (ssadd))
  42.       (command "mline" "j" "z" "s" (* 2 dis) pt_1st pt_2nd "")
  43.       (ssadd (entlast) ml_ss)
  44.       (command "EXPLODE" ml_ss"")
  45.       (if (= nil ss)
  46.       (progn
  47.       (setq k 0)
  48.       (princ "error: haven't selceted.")
  49.       (exit)
  50.       ))
  51.    )
  52. ;*********************************************(= dis 输入S)

  53.   (if (= dis "S") (setq k 2))
  54.   (if (= k 2)
  55.     (progn
  56.       (initget 1 "C E")
  57.       (setq sett (getkword "\n>>[change the layer(C)/erase the line of orign(E)]: "))
  58.   ))
  59. ;*********************************************双向偏移后图层变了。

  60.   (if (= sett "C")
  61.   (progn
  62.      (setq cla (getvar "clayer"))
  63.      (setq k 3)
  64.      (setq tc (getstring (strcat "\n>>change the layer of line after offset <" cla "> :")))
  65.      (if (= nil tc) (setq tc cla))
  66.   ))

  67.   (while (= k 3)
  68.       (setq dis (getdist (strcat "\n>>Offset distance or Through<100>:")))
  69.       (if (= nil dis) (setq dis 100))
  70.       (setq ss (ssget))
  71.       (setq na (ssname ss 0))
  72.       (setq data (entget na))
  73.       (setq pt_1st (cdr (assoc '10 data)))
  74.       (setq pt_2nd (cdr (assoc '11 data)))
  75.       (setq ml_ss (ssadd))
  76.       (setvar "clayer" tc)
  77.       (command "mline" "j" "z" "s" (* 2 dis) pt_1st pt_2nd "")
  78.       (ssadd (entlast) ml_ss)
  79.       (command "EXPLODE" ml_ss"")
  80.       (setvar "clayer" cla)
  81.       (if (= nil ss)
  82.       (progn
  83.       (setq k 0)
  84.       (princ "error: haven't selceted.")
  85.       (exit)
  86.       ))
  87.    )

  88. ;*********************************************双向偏移后原来的线删除了。
  89.   (if (= sett "E") (setq k 4))
  90.    
  91.   (while (= k 4)
  92.       (setq dis (getdist (strcat "\n>>Offset distance or Through<100>:")))
  93.       (if (= nil dis) (setq dis 100))
  94.       (setq ss (ssget))
  95.       (setq na (ssname ss 0))
  96.       (setq data (entget na))
  97.       (setq pt_1st (cdr (assoc '10 data)))
  98.       (setq pt_2nd (cdr (assoc '11 data)))
  99.       (setq ml_ss (ssadd))
  100.       (command "mline" "j" "z" "s" (* 2 dis) pt_1st pt_2nd "")
  101.       (ssadd (entlast) ml_ss)
  102.       (command "EXPLODE" ml_ss"")
  103.       (command "ERASE" ss"")
  104.      (if (= nil ss)
  105.       (progn
  106.       (setq k 0)
  107.       (princ "error: haven't selceted.")
  108.       (exit)
  109.       ))
  110.    )
  111.      
  112.       (setvar "blipmode" orig_blip)                 
  113.       (setvar "cmdecho" orig_cmd)
  114.       (setvar "osmode" orig_cmd)
  115.   (prin1)
  116. )

  117.   [/FONT]


其中后面2和3两个问题是我以前都碰到过,却不知道怎么解决的.
大家帮忙一下.先谢了.尽量提供点想法.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-11-15 18:24:16 | 显示全部楼层
出现"未知命令“OO”,是因为COMMAND里面有多余的“”,出现 “错误: 参数类型错误: lselsetp nil”是因为选择为空时,程序还会继续执行下面的语句,应该加个排断。另外,如果自偏移一个选择对象的话,建议用entsel。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-15 19:08:55 | 显示全部楼层
1."排断"是什么意思,我是初学的.不太懂,是指切断while的语句出错了吗???
2.用entsel,我也想过,只是觉得用ssget选择的时候会比较方便.呵.看来还是改entsel.谢谢楼上.
3.COMMAND里面有多余的“”,我真的不知道去哪里找,怎么检验出来??是一句一句检验吗?
感激啊~~~.受教了~~谢谢楼上.
只是问题还不知道怎么解决.呵:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-16 21:23:51 | 显示全部楼层
建议你这样写:
(if ss
   (为条件成立时的动作,试试吧!)
(progn
    (alert "haven't selected!")
    (vl-exit-with-value 0)
)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-17 00:10:55 | 显示全部楼层
那个我已经找到解决的办法了。现在又遇到新的问题
在这个贴上http://www.xdcad.net/forum/showthread.php?s=&threadid=604789
可惜都没人回复。~~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-17 00:27:20 | 显示全部楼层
你累不累。set 选项下的c、e直接放在第一个选项下不是更直接?
你后面的mline-e命令都差不多,应该归拢到一起,
然后cond,按条件接着处理。
这个程序只能针对line,太局限了,你可以参考坛里的offset方式的程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-18 11:29:48 | 显示全部楼层
6楼的。说的是啊。我也觉得。所以我已经改了,不过,只能在line 和pline,还是局限啊。
看来得去看看其它贴啊。
初学,很多想法都太简单。呵。~~~见笑了~!。
还有,谢谢喽~!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 02:35 , Processed in 0.380673 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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