找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2428|回复: 11

[求助] [求助]:转换图层的问题?

  [复制链接]
发表于 2005-7-23 10:25:16 | 显示全部楼层 |阅读模式

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

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

×
这个程序是想实现,只要点击字母b+数字(>6)就可以把所选

对象转到相应的图层,我运行了一下,出错了,转换不了,

不知是哪个环节出了问题?哪位高人帮忙看看~~THX


(defun c:bbb()
(setq n 100)
(while (>= n 6)
(eval (read (strcat "(defun c:b" (itoa n) " (/ gp) (setq gp (ssget)) nil (command \"change\" gp "" \"p\" \"la\" "(itoa n)" \"color\" \"BYLAYER\" "")) \"\"))" )))
(setq n (1- n))
)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 24个

财富等级: 恭喜发财

发表于 2005-7-23 16:38:54 | 显示全部楼层
说实话,我不觉得这样做很有必要,函数开销太大,不值得。下面这个小程序只不过多了一步,并不麻烦
[php]
(defun c:aaa(/ ssg lname)
  (setq ssg (ssget))
  (setq lname (getstring "请输入层名:"))
  (command "change" ssg "" "p" "la" lname "c" "bylayer" "")
  (princ)
)
[/php]
如果你执意要按原思路进行下去,仔细看看下面的程序与你原先的区别:
[php]
(defun c:bbb ()
  (setq n 100)
  (while (>= n 6)
    (eval
      (read
           (strcat        "(defun c:b"
             (itoa n)
           " (/ gp) (setq gp (ssget)) (command \"change\" gp \"\" \"p\" \"la\" "
                 (itoa n)
                 " \"color\" \"BYLAYER\" \"\"))"
           );end strcat
      );end read
    );end eval
    (setq n (1- n))
  );end while
)
[/php]
还有一个方法可供参考,先生成一个包含一系列函数集的文件,再调用它,这样做的好处是多了一个副产品(函数集文件),以备今后再次使用。下面的程序只是一个思路,正式编程还需要加入一些错误判断:
[php]
;;生成一个包含一组函数的文件
(defun c:ccc (/ f n)
  (if (null (findfile "new.lsp"))
    (progn
      (setq f (open "new.lsp" "w"))
      (setq n 6)
      (repeat 95
            (write-line (strcat "(defun c:b" (itoa n) " (/ gp)") f)
            (write-line "  (setq gp (ssget))" f)
            (write-line
             (strcat "  (command \"change\" gp \"\" \"p\" \"la\" "
                  (itoa n)
                  " \"color\" \"BYLAYER\" \"\")"
             )
              f
           )
       (write-line "  (princ)" f)
           (write-line ")" f)
           (setq n (1+ n))
       );end repeat
       (write-line "(princ)" f)
       (close f)
      );end progn
   );end if
  ;是否加载函数文件视需要而定
  ;(load "new")
)
[/php]

通过上两个程序可以看出来,通过read-line,strcat,read和eval的组合可以替代load函数,当然大家通常不会那样去加载文件。但这恰恰就是lisp语言最迷人和强大的地方,lisp是自己解释自己的语言。下面就接着上个程序写个替代load的函数:
[php]
(defun c:ddd (/ f all_line one_line one_func)
  (setq all_line "(")
  (if (findfile "new.lsp")
    (progn
      (setq f (open "new.lsp" "r"))
      (while (setq one_line (read-line f))
            (setq all_line (strcat all_line one_line))
      )
      (setq all_line (strcat all_line ")"))
      (close f)
      (foreach one_func        (read all_line)
            (eval one_func)
      );end foreach
    );end progn
  );end if
)
[/php]

加工完善上一个程序,可以实现在任何文本文件中(不限lsp文件)加载部分lisp代码。方法是:先搜索文本中是否有“(defun”字串,然后开始计算左右括号数,当相等时,调用eval进行函数语句解释,然后再次搜索。。。(不过要注意字符串和注释段等诸多影响因素)

这里高手如云,诚惶诚恐得写了那么多代码,早已汗流夹背,请大家多批评指正。
也感谢eachy的鼓励和嘉奖,通过你的程序我学到了很多很有价值的东西,但学到的越多,发现不懂的更多。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-23 17:34:59 | 显示全部楼层
哇哦,fools兄,你太棒了,感谢,这个问题一直困扰了我好久,今天终于解决了,高兴ing...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2005-7-23 17:50:53 | 显示全部楼层
楼上的太客气了,俗话说:闻道有先后,术业有专攻!
lisp易学难精,大家一起努力吧!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-7-23 19:59:14 | 显示全部楼层
还可以这样,不用定义那么多命令,增加一个点选过程

  1. (defun c:bbb (/ e el str lay ss)
  2.   (if (and (setq e (car (entsel "\n拾取典型文字: ")))
  3.            (= (cdr (assoc 0 (setq el (entget e)))) "TEXT")
  4.            (wcmatch (setq str (cdr (assoc 1 el))) "b#,b##,b###")
  5.       )
  6.     (progn
  7.       (setq lay (substr str 2))
  8.       (if (and (tblsearch "layer" lay)
  9.                (progn
  10.                  (princ "\n选择修改对象....")
  11.                  (setq ss (ssget))
  12.                )
  13.           )
  14.         (command ".chaprop" ss "" "la" lay "c" "bylayer")
  15.       )
  16.     )
  17.   )
  18.   (princ)
  19. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-7-24 09:29:42 | 显示全部楼层
[php]
(defun c:tt(/ ss i e ent str)
  (setq ss (ssget '((0 . "TEXT")(1 . "b#,b##,b###")))
         i -1)
  (while (setq e (ssname ss (setq i (1+ i))))
     (setq ent (entget e)
           str (cdr(assoc 1 ent)))
     (entmod (subst (cons 8 (substr str 2))(assoc 8 ent)ent)
  )(princ)
)[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-7-24 11:06:43 | 显示全部楼层
大家肯定是理解错搂主的意思了.

他是要同时创建 b7 ~ b99的命令
b7就是改选到的实体到"7"层 ...

都是字符看都看不清,还是用表

  1. (defun c:bbb( /  fun  n name)
  2. (setq n 100)
  3. (while (>= n 6)
  4.   (setq name (read(strcat"c:b" (itoa n)))
  5.         fun (list 'defun
  6.                    name
  7.                   '( / gp)
  8.                   '(setq gp (ssget))
  9.                   (append '(command "change"gp"""p""la")
  10.                            (list (itoa n))
  11.                           '("color" "BYLAYER" "")
  12.                   )
  13.             )
  14.    )
  15.   (eval fun)
  16.   (setq n (1- n))
  17. )
  18. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-7-24 12:28:56 | 显示全部楼层
和aeo的类似
[php]
(defun c:tt ()
  (setq n 5)
  (while (< (setq n(1+ n)) 100)
    (eval(read(strcat "(defun c:b" (itoa n) "()(fun " (itoa n) "))")))
  )(princ)
)
(defun fun (n / ss)
  (if (setq ss (ssget))
      (command "change" ss "" "p" "la" (itoa n) "c" "bylayer" "")
  )
)[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 345个

财富等级: 日进斗金

发表于 2005-7-24 12:58:13 | 显示全部楼层
谢谢楼上,不过我都是用已作好的DWT画图的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2005-7-24 13:55:56 | 显示全部楼层
我没有理解错,是用两种方法生成一系列函数的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-7-27 20:55:16 | 显示全部楼层
看得不是太明白
看来还得多加学习了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-7-27 23:41:47 | 显示全部楼层
我更喜欢这个有比例的直箭头
(defun c:jt (/ ang h2 jtl oldcm oldos pt1 pt2 pt3 scale)
  (setq oldcm (getvar "cmdecho"))
  (setq oldos (getvar "osmode"))
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq scale (getreal "\n请输入比例<100>:"))
  (if (= scale nil)
    (setq scale 100)
  )
  (setq h2 (* 0.8 scale)
        jtl (* 4 scale)
  )
  (setq pt1 (getpoint "\n请输入第一点:"))
  (setq pt3 (getpoint pt1 "\n请输入第二点:"))
  (setq ang (angle pt1 pt3))
  (setq pt2 (polar pt1 ang jtl))
  (command "pline" pt1 "w" 0 h2 pt2 "w" 0 0 pt3)
  (setvar "cmdecho" oldcm)
  (setvar "osmode" oldos)
  (princ "\n  ")
  (princ "\n继续使用pline命令")
  (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 11:07 , Processed in 0.366291 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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