找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2744|回复: 28

[求助] 表循环生成图元

[复制链接]

已领礼包: 449个

财富等级: 日进斗金

发表于 2013-5-21 21:43:10 | 显示全部楼层 |阅读模式

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

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

×
(entmake ((0 . "LINE") (10 0 0 ) (11 10 10 )))
(entmake ((0 . "LINE") (10 5 4 ) (11 15 18 )))
这二个是线的最少生成图元~!通过比较知道变的只有起点和终点.我想用循环函数.通过增加(10 X X)和(11 X X)的组码来生成图元.这样就会比command的快而且写的代码也会少一点.让人家一看就懂!以前只注重交互和调用系统本身的命令来搞!实在错!所以现在想学学表函数!这问题有点小白了.但是这是我血的教训啊.呵呵
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-5-21 22:55:49 | 显示全部楼层
xtdwynij 发表于 2013-5-21 22:36
(defun c:tt ()
  (setq pt1 (getpoint "\n111:"))
  (setq xpt1 (car pt1))

你还是没有说清要画什么形,下面是按你的程序修改的
[pcode=lisp,true]
(defun c:tt (/ mkln p1 p2 p3 p4) ;_ 变量一定要回收
  ;;(setq pt1 (getpoint "\n111:"))
  ;;(setq xpt1 (car pt1))
  ;;(setq ypt1 (cadr pt1))
  ;;(setq aa (list (list xpt1 ypt1) (list (+ xpt1 6) (+ ypt1 8)))) ;_创建起点
  (defun mkln (sp ep) ;_经常用的做成子函数
    (entmake (list '(0 . "Line")
                   '(100 . "AcDEntity")
                   '(100 . "AcDbLine")
                   (cons 10 sp)
                   (cons 11 ep)
             )
    )
  )
  (while (setq p1 (getpoint "\nPoint: ")) ;_如果有拾取动作才执行下面代码,避免出错,while 循环
    (progn
      ;;(setq bb (list (list (+ xpt1 3) ypt1) (list (+ xpt1 15) (+ ypt1 12)))) ;_创建终点
      (setq p2 (mapcar '+ p1 '(6. 8. 0.))
            p3 (mapcar '+ p1 '(3. 0. 0.))
            p4 (mapcar '+ p1 '(15. 12. 0.))
      )
      ;|(setq i        0    new      ()    )
      (repeat (length aa)
        (setq new (entmake (append (list (cons 0 "LINE")))
                           (append '(10) (nth 0 aa))
                           (append '(11) (nth 0 bb))
                  )
        ) ;_提取起点和终点并合表
        (setq i (1+ i))
      )
      (mapcar '(lambda (x y) (mkln x y))
              (list p1  p3)
              (list p2  p4)
      )|;
      (mkln p1 p2)
      (mkln p3 p4)
    )
  )
  (princ) ;_抑制回显
)
[/pcode]
[pcode=lisp,true]
(defun c:tt (/ mkln p1 p2 p3 p4)
  (defun mkln (sp ep)
    (entmake (list '(0 . "Line")
                    '(100 . "AcDEntity")
                    '(100 . "AcDbLine")
                    (cons 10 sp)
                    (cons 11 ep)
      )
    )
  )
  (while (setq p1 (getpoint "\nPoint: "))
    (setq p2 (mapcar '+ p1 '(6. 8. 0.))
          p3 (mapcar '+ p1 '(3. 0. 0.))
          p4 (mapcar '+ p1 '(15. 12. 0.))
    )
    (mkln p1 p2)
    (mkln p3 p4)
  )
  (princ)
)[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-5-21 22:52:29 | 显示全部楼层
xtdwynij 发表于 2013-5-21 22:10
foreach这个只有一个变量也可以么?这个我就搞不大懂.mapcar函数的倒可以生成.只不过好像要二层循环的.我 ...

  1. (defun c:tt(/ ls n)
  2.   (setq ls '(((10 1 2 0) (11 3 4 0)) ((10 5 6 0) (11 7 8 0))))
  3.   (foreach n ls (entmake (cons '(0 . "LINE") n)))
  4. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 9806个

财富等级: 富甲天下

发表于 2013-5-21 21:53:15 | 显示全部楼层
1、(entmake '((0 . "LINE") (10 0 0) (11 10 10)))
2、(entmake (list '(0 . "LINE") '(10 0 0) '(11 10 10)))
3、(entmake (list (cons 0 "LINE") (cons 10 (list 0 0)) (cons 11 (list 10 10)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-5-21 22:02:44 | 显示全部楼层
zxq0220 发表于 2013-5-21 21:53
1、(entmake '((0 . "LINE") (10 0 0) (11 10 10)))
2、(entmake (list '(0 . "LINE") '(10 0 0) '(11 10  ...

谢谢zxq0220的解答.但我想要的是增加组码为10(起点)和11(终点)来生成图元.比如(entmake '((0 . "LINE") (10 0 0) (11 10 10)))  (entmake '((0 . "LINE") (10 0 0) (11 10 10))) (entmake '((0 . "LINE") (10 0 0) (11 10 10))) (entmake '((0 . "LINE") (10 0 0) (11 10 10))) 我要生成很多线.其他生成条件不变
,变的始终只有起点和终点.我想通过循环函数来增加起点和终点来增加生成图元.


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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-5-21 22:07:07 | 显示全部楼层
研究一下函数mapcar和foreach。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-5-21 22:09:45 来自手机 | 显示全部楼层
在这个最小表一般加上(100 . "AcDbEntity")(100 . "AcDbLine"),另外把你的循环代码贴上来,用图说明执行结果
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-5-21 22:10:39 | 显示全部楼层
ll_j 发表于 2013-5-21 22:07
研究一下函数mapcar和foreach。

foreach这个只有一个变量也可以么?这个我就搞不大懂.mapcar函数的倒可以生成.只不过好像要二层循环的.我循环基本上学过就没有用过!表函数也是一个样.所以烂.foreach函数长老能给个例子不?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9806个

财富等级: 富甲天下

发表于 2013-5-21 22:21:57 | 显示全部楼层
(defun c:tt ()
(if (setq pt1 (getpoint "\n第一点: "))
  (while (setq pt2 (getpoint pt1 "\n下一点: "))
   (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
   (setq pt1 pt2)
  )
)
(princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-21 22:28:37 | 显示全部楼层
本帖最后由 Lispboy 于 2013-5-21 22:30 编辑
xtdwynij 发表于 2013-5-21 22:10
foreach这个只有一个变量也可以么?这个我就搞不大懂.mapcar函数的倒可以生成.只不过好像要二层循环的.我 ...

foreach 没啥难的啊,提取表的每个元素,省去很多如  (setq i (1+ i)) ...(nth i list)  这样的代码了

比如:
   [pcode=lisp,true]
      (setq el (list 1 2 3 4))
      (setq len (length el))      (setq i 0)
      (repeat len
          (setq e (nth i el))
          ....
          (setq i (1+ i))
       )
    [/pcode]

用FOREACH简单明了
    [pcode=lisp,true]
         (setq el (list 1 2 3 4))
         (foreach n el
              ....
         )
     [/pcode]

上面两个等价。

点评

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

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-5-21 22:36:52 | 显示全部楼层
Lispboy 发表于 2013-5-21 22:28
foreach 没啥难的啊,提取表的每个元素,省去很多如  (setq i (1+ i)) ...(nth i list)  这样的代码了

...

[pcode=lisp,true]
(defun c:tt ()
  (setq pt1 (getpoint "\n111:"))
  (setq xpt1 (car pt1))
  (setq ypt1 (cadr pt1))
  (setq aa (list (list xpt1 ypt1) (list (+ xpt1 6) (+ ypt1 8)))) ; 创建起点
  (setq bb (list (list (+ xpt1 3) ypt1) (list (+ xpt1 15) (+ ypt1 12)))) ; 创建终点
  (setq i 0
        new ()
  )
  (repeat (length aa)
    (setq new (entmake (append
                         (list (cons 0 "LINE"))
                       ) (append
                           '(10)
                           (nth 0 aa)
                         ) (append
                             '(11)
                             (nth 0 bb)
                           )
              )
    )                                       ; 提取起点和终点并合表
    (setq i (1+ i))
  )
)
[/pcode]


上面是代码.我是一名绘图员!不是编程员!所以现在想实现的功能是参 数化绘图的功能!点是我在里面内定好的!上面是代码.但是错的很厉害!呵呵.害羞了
QQ图片20130521213222.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-21 22:37:31 | 显示全部楼层
xtdwynij 发表于 2013-5-21 22:10
foreach这个只有一个变量也可以么?这个我就搞不大懂.mapcar函数的倒可以生成.只不过好像要二层循环的.我 ...

mapcar 的意思是 对表的每个元素去作为一个函数的参数运算求值后,在原来表中原位替代那个元素,代码更简洁了,省去很多CONS,APPEND的操作。

[pcode=lisp,true]
(mapcar '(lambda(x)(cons 1 x))(list 1 2 3 4))
[/pcode]

[pcode=lisp,true]
(foreach n (list 1 2 3 4)
   (setq el (append el (list (cons 1 n))))
)

[/pcode]

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-21 22:39:12 | 显示全部楼层
xtdwynij 发表于 2013-5-21 22:36
上面是代码.我是一名绘图员!不是编程员!所以现在想实现的功能是参 数化绘图的功能!点是我在里面内定好的! ...

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

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-5-21 22:40:04 | 显示全部楼层
Lispboy 发表于 2013-5-21 22:28
foreach 没啥难的啊,提取表的每个元素,省去很多如  (setq i (1+ i)) ...(nth i list)  这样的代码了

...

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-21 22:55:07 | 显示全部楼层

你想要的,看看,不要X,Y分开,在加啊,减的,用MAPCAR

理解下

[pcode=lisp,true]
(defun c:tt ()
  (setq pt1 (getpoint "\n111:"))
  (setq pt2 (mapcar '+ pt1 (list 6 8 0.0))
        pt3 (mapcar '+ pt1 (list 15 12 0.0))
        pt4 (mapcar '+ pt1 (list 3 0.0 0.0))
        aa  (list pt1 pt2)
        bb  (list pt4 pt3)
   )
   (mapcar
    '(lambda (x)
       (entmake (list (cons 0 "line") (cons 10 (car x)) (cons 11 (cadr x))))
     )
     (list aa bb)
   )
)
[/pcode]

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

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

 楼主| 发表于 2013-5-21 22:55:33 | 显示全部楼层

多谢长老出手!下面是我自己搞的代码呵呵!相对比起来没脸见人了.不过也要贴上来.假如后来有人和我一样菜可学习.代码如下:
(defun c:tt ()
  (setq pt1 (getpoint "\n111:"))
  (setq xpt1 (car pt1))
  (setq ypt1 (cadr pt1))
  (setq aa (list (list xpt1 ypt1) (list (+ xpt1 6) (+ ypt1 8))));创建起点
  (setq bb (list (list (+ xpt1 3) ypt1) (list (+ xpt1 15) (+ ypt1 12))));创建终点
  (setq i 0 new ())
  (repeat (length aa)
    (setq new (entmake (list (cons 0 "LINE")  (append '(10) (nth i aa)) (append '(11) (nth i bb)))));提取起点和终点并合表
    (setq i (1+ i))
)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 19:21 , Processed in 0.258835 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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