找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: ysq101

[每日一码] 感谢版主们的鼓励,新手写了个小程序望指点

[复制链接]

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-9-13 00:02:02 | 显示全部楼层
newer 发表于 2013-9-12 20:56
在那个帖子里面,我都把程序给你写完了,建议也给你了,要想快,用矩阵变换,你在仔细看看那个程序,就简 ...

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

使用道具 举报

已领礼包: 9814个

财富等级: 富甲天下

发表于 2013-9-13 08:26:24 | 显示全部楼层
  1. (defun c:111()
  2. (setvar "cmdecho" 0)
  3.    ; 1 获取点位表
  4. (setq ss (ssget '((0 . "LWPOLYLINE"))))
  5. (if (< 300 (sslength ss))
  6.   (exit (princ "\n所选对象太多"))
  7. )
  8. (setq lst-pt1 '()          ;建立空表
  9.        lst-pt3 '()          ;建立空表
  10.        i 0)
  11. (repeat (sslength ss)      ;选择集长度
  12.   (setq e1(ssname ss i))    ;返回第几个对象的图元名
  13.   (setq s1 (vlax-ename->vla-object e1))
  14.   (vla-getboundingbox s1 'minpoint 'maxpoint)
  15.   (setq pt9 (vlax-safearray->list maxpoint)                       ;取得 右上角 点
  16.         pt1 (reverse(cdr(reverse(vlax-safearray->list minpoint))));取得 左下角 点
  17.         pt3 (list(car pt9)(cadr pt1))                             ;取得 右下角 点
  18.         lst-pt1 (cons pt1 lst-pt1)      ;取得 左下角 点表  
  19.         lst-pt3 (cons pt3 lst-pt3)      ;取得 右下角 点表
  20.         i (1+ i))
  21. )   ;end repeat
  22. (setq lst-pt1 (reverse lst-pt1))
  23. (setq lst-pt3 (reverse lst-pt3))
  24. (command ".UNDO" "BE")
  25.    ; 2 开始排位
  26. (setq ss1 (ssadd))
  27. (setq i 0)
  28. (repeat (1- (sslength ss))
  29.   (setq e1 (ssname ss i))    ;返回第几个对象的图元名
  30.   (ssadd e1 ss1)            ;将它加到ss1选择集中
  31.   (command "move" ss1 "" (nth i  lst-pt1)  (nth (setq i (1+ i)) lst-pt3))
  32. );end repeat
  33. (command ".UNDO" "e")
  34. (princ "\n程序运行完毕")
  35. (princ)
  36. )   ;end defun

点评

用了CONS快了不少 还有我为什么就没想到先把点表反转过来再MOVE处理呢 又想学到些东东了  详情 回复 发表于 2013-9-13 15:31
谢谢你的帮助。。上次你也帮我写了一,这些又帮我优化  详情 回复 发表于 2013-9-13 14:50

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

发表于 2013-9-13 10:56:56 | 显示全部楼层
用 Move 这样写,循环太多了自然影响效率
  1. (defun c:111 (/ ss i sl e pl bp)
  2.   ;;获取实体的左下角点、右下角点
  3.   (defun GetEntBox (e / obj p1 p2)
  4.     (setq obj (vlax-ename->vla-object e))
  5.     (vla-getboundingbox obj 'p1 'p2)
  6.     (setq p1 (safearray-value p1)
  7.           p2 (safearray-value p2)
  8.     )
  9.     (list p1 (list (car p2) (cadr p1) 0.))
  10.   )
  11.   (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
  12.     (progn
  13.       (setq i  -1
  14.             sl (sslength ss)
  15.       )
  16.       (repeat sl
  17.         (setq e (ssname ss (setq i (1+ i))))
  18.         (setq pl (getentbox e))
  19.         (if (not bp)
  20.           (setq bp (cadr pl));_第一次基点
  21.           (progn
  22.             (vl-cmdf
  23.               ".move"
  24.               (list e (car pl));_拾取实体表
  25.               ""
  26.               "_none"
  27.               (car pl)
  28.               "_none"
  29.               bp
  30.             )
  31.             (setq bp (mapcar '+ bp (mapcar '- (cadr pl) (car pl))));_设置下一次的目标点
  32.           )
  33.         )
  34.       )
  35.     )
  36.   )
  37.   (princ)
  38. )

点评

高手就是高手。。。同样也用了COMMAND 10000个对象处理起来也是很快的。。。。有空解剖你的程序 看从中学到些什么不 感谢你的热心帮忙  详情 回复 发表于 2013-9-13 15:29
我试试如何。。感谢了  详情 回复 发表于 2013-9-13 14:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-9-13 11:31:51 来自手机 | 显示全部楼层
下一个的目标点是上一个的右下角点,cad命令接受选择集的都接受拾取,这个格式是(ent point)这个点是任意的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-9-13 14:50:14 | 显示全部楼层
Free-Lancer 发表于 2013-9-13 10:56
用 Move 这样写,循环太多了自然影响效率

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

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-9-13 14:50:58 | 显示全部楼层

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

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-9-13 15:29:44 | 显示全部楼层
Free-Lancer 发表于 2013-9-13 10:56
用 Move 这样写,循环太多了自然影响效率

高手就是高手。。。同样也用了COMMAND  
10000个对象处理起来也是很快的。。。。有空解剖你的程序{:soso_e113:}  看从中学到些什么不
感谢你的热心帮忙
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-9-13 15:31:07 | 显示全部楼层

用了CONS快了不少   
还有我为什么就没想到先把点表反转过来再MOVE处理呢
又想学到些东东了

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-13 18:17:37 | 显示全部楼层
ysq101 发表于 2013-9-13 15:31
用了CONS快了不少   
还有我为什么就没想到先把点表反转过来再MOVE处理呢
又想学到些东东了

这不,你就学到了嘛。程序要多写,只看也不行。

点评

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

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-9-13 23:30:25 | 显示全部楼层
newer 发表于 2013-9-13 18:17
这不,你就学到了嘛。程序要多写,只看也不行。

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-9-14 10:33:02 | 显示全部楼层
用 xdapi 就这样写
  1. (defun c:tt (/ ss mat e box bp)
  2.   (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
  3.     (progn
  4.       (setq mat (xdrx_matrix_identity 3))
  5.       (xdrx_setsstodb ss 0)
  6.       (while (setq e (xdrx_getentdata 0))
  7.         (setq box (xdrx_entity_box e))
  8.         (if bp
  9.            (setq bp (list (caadr box) (cadar box) 0.))
  10.            (progn
  11.              (xdrx_entity_transform e (xdrx_matrix_settranslation mat (mapcar '- (car box) bp)))
  12.              (setq bp (polar bp 0. (- (caadr box) (caar box)) ))
  13.            )
  14.         )
  15.       )
  16.      )
  17.    )
  18.   (princ)
  19. )

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-14 12:51:59 | 显示全部楼层
st788796 发表于 2013-9-14 10:33
用 xdapi 就这样写


                               
登录/注册后可看大图


以前用API已经帮他写过一个了。

  1. (defun c:tt()
  2.    (if (and (setq ss (ssget))
  3.             (setq pt (getpoint "\n插入点<退出>:"))
  4.        )
  5.       (progn
  6.          (setq ss (XD::Pickset:TableSort ss 0 0 '< '<))
  7.          (setq mat0 (xdrx_matrix_identity 3))
  8.          (foreach n (apply 'append ss)
  9.            (setq box (xdrx_entity_box n)
  10.                  p1 (car box)
  11.                  mat (xdrx_matrix_setTransLation mat0 (mapcar '- pt p1))
  12.                  pt (mapcar '+ pt (list (distance p1 (cadr box)) 0 0)) ;;基点改为当前盒子的右下点,作为下一个盒子插入的基点,以便实体挨着
  13.            )
  14.            (xdrx_entity_transform n mat)            
  15.            (apply 'xdrx_grdraw (cons 6 (cons 1 (xdrx_entity_box n)))) ;;品红画向量
  16.          )
  17.       )
  18.    )
  19.    (princ)
  20. )





点评

请教一下,如何才能达到按面积的大小的来排列呢?? 前提:不用API 不是不给力,是太给力,还没学会怎么用  详情 回复 发表于 2013-9-14 15:23
选个基准实体可能更好  详情 回复 发表于 2013-9-14 13:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-9-14 13:56:46 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2013-9-14 14:07 编辑
newer 发表于 2013-9-14 12:51
以前用API已经帮他写过一个了。


选个基准实体可能更好
楼主可能更追求纯V/Alisp,完全没必要

点评

newer 确实帮我写了一个了 其实不是追求纯V/Alisp 只是新手想自己动手把自己的问题解决,不懂的再来请教大师们  详情 回复 发表于 2013-9-14 15:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-9-14 15:20:10 | 显示全部楼层
st788796 发表于 2013-9-14 13:56
选个基准实体可能更好
楼主可能更追求纯V/Alisp,完全没必要

newer 确实帮我写了一个了
其实不是追求纯V/Alisp    只是新手想自己动手把自己的问题解决,不懂的再来请教大师们
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-9-14 15:23:14 | 显示全部楼层
newer 发表于 2013-9-14 12:51
以前用API已经帮他写过一个了。

请教一下,如何才能达到按面积的大小的来排列呢??

前提:不用API      不是不给力,是太给力,还没学会怎么用{:soso_e100:}

点评

(vl-sort '(lambda (e1 e1) (> (vlax-curve-getarea e1) (vlax-curve-getarea e2))) entlst) 这个和api无关  详情 回复 发表于 2013-9-14 15:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 07:31 , Processed in 0.212601 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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