找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4417|回复: 35

[求助] 求高一点效率的均匀布置

[复制链接]

已领礼包: 2874个

财富等级: 家财万贯

发表于 2014-11-15 08:21:58 | 显示全部楼层 |阅读模式

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

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

×
输入最大间距,选择需要布置的实体,待指定对齐基准点,指定开始布置的起点和终点。要求在布置的起点和终点之间均匀布置实体,下面代码效率很低,求效率高一点的。 gaollg0.GIF
  1. (Defun C:Uniform-Layout ( / An Ang Devi Dis Msg P0 Pte Pts Sn Spac Ss)
  2.   (Setq Msg (Getdist  "最大中距@≤<1500>:")
  3.         Devi (If Msg Msg  1500)
  4.   (Princ "\N选择要布置的对象: ")
  5.   (Setq Ss (Ssget)
  6.         P0 (Getpoint "\N指定对齐点: ")
  7.   )
  8. (If (And Ss  P0)
  9.   (While (And
  10.     (Setq Pts (Getpoint P0  "\N起始点: "))
  11.     (Setq Pte (Getpoint Pts "\N终止点: "))
  12.       )
  13.   (Setq Dis (Distance Pts Pte)
  14.         Ang (Angle    Pts Pte)
  15.         Sn (Fix (+ (/ Dis Devi) 0.9999))
  16.         Spac (/ Dis Sn)
  17.         An (/ (* Ang 180) Pi)
  18.   )

  19.       (Vl-Cmdf "_.Rotate" Ss "" P0 An)
  20.     (Repeat Sn
  21.       (Setq  Pte (Polar Pts Ang (* Spac Sn))
  22.              Sn  (1- Sn))
  23.       (Vl-Cmdf "_.Copy" Ss  "" P0  Pte  "")
  24.     )
  25.       (Vl-Cmdf "_.Copy" Ss  "" P0  Pts  "")
  26.    (Vl-Cmdf "_.Rotate" Ss "" P0 (- 0 An))
  27.       )
  28.   )
  29.   (princ)
  30. )
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-15 08:54:15 | 显示全部楼层
构造矩阵
  1. (defun c:tt (/ ss p1 p2 spa an n mat p0)
  2.   (if (and (setq p0 (getpoint "\n基点: "))
  3.            (setq ss (ssget))
  4.            (setq spa (getdist p0 "\n间距: "))
  5.       )
  6.     (while (and        (setq p1 (getpoint "\n第一点: "))
  7.                 (setq p2 (getpoint p1 "\n第二点: "))
  8.            )
  9.       (setq an        (angle p1 p2)
  10.             n        (fix (+ (/ (distance p1 p2) spa) 0.5))
  11.             mat        (xdrx_matrix_identity)
  12.             pts        (xd::pnts:divide p1 p2 n)
  13.       )
  14.       (mapcar '(lambda (x)
  15.                  (xdrx_entity_transformedcopy
  16.                    ss
  17.                    (xdrx_matrix_product
  18.                      (xdrx_matrix_setrotation
  19.                        mat
  20.                        an
  21.                        '(0.0 0.0 1.0)
  22.                        x
  23.                      ) ;_旋转
  24.                      (xdrx_matrix_settranslation mat (mapcar '- x p0)) ;_平移
  25.                    )
  26.                  )
  27.                )
  28.               pts
  29.       )
  30.     )
  31.   )
  32.   (princ)
  33. )

点评

还可以简化代码哦, 用 LISP函数库 对齐矩阵XD::MATRIX:ALIGN 加上 getsamplePoints 等分点  详情 回复 发表于 2014-11-15 12:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8612个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-11-15 11:45:48 | 显示全部楼层
据说用高飞的矩阵效率可以很高

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 12:51:35 | 显示全部楼层

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-15 13:09:20 | 显示全部楼层
newer 发表于 2014-11-15 12:51
还可以简化代码哦, 用  LISP函数库 对齐矩阵XD::MATRIX:ALIGN 加上 getsamplePoints 等分点

那就简化一下
  1. (defun c:tt (/ p0 ss spa ge p1 p2 an pts)
  2.   (if (and (setq p0 (getpoint "\n基点: "))
  3.            (setq ss (ssget))
  4.            (setq spa (getdist p0 "\n间距: "))
  5.       )
  6.     (progn
  7.       (setq ge (xdge::constructor "kLineSeg3d"))
  8.       (while (and (setq p1 (getpoint "\n第一点: "))
  9.                   (setq p2 (getpoint p1 "\n第二点: "))
  10.              )
  11.         (xdge::setpropertyvalue ge "set" p1 p2)
  12.         (setq an  (angle p1 p2)
  13.               pts (xdge::getpropertyvalue
  14.                     ge
  15.                     "getSamplePoints"
  16.                     (fix (+ (/ (distance p1 p2) spa) 0.5))
  17.                   )
  18.         )
  19.         (mapcar
  20.           '(lambda (x)
  21.              (xdrx_entity_transformedcopy
  22.                ss
  23.                (xd::matrix:align
  24.                  p0
  25.                  p0
  26.                  x
  27.                  (polar p0 0.0 1.0)
  28.                  (polar x an 1.)
  29.                )
  30.              )
  31.            )
  32.           pts
  33.         )
  34.       )
  35.     )
  36.   )
  37.   (xdge::free)
  38.   (princ)
  39. )

点评

(xdge::constructor "kLineSeg3d") ; 错误: ADS 请求错误  详情 回复 发表于 2014-11-20 14:18
大师,应用要更广些的话,那个曲线不一定要直线哦,我又想起来几个函数,看看是否能更简洁 曲线等分点,每个点求一阶导数得到向量,和对齐第一点第二点向量求夹角,然后直接用 xdrx_entity_rotate一次,然后用 xdrx  详情 回复 发表于 2014-11-15 13:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 13:29:45 | 显示全部楼层

大师,应用要更广些的话,那个曲线不一定要直线哦,我又想起来几个函数,看看是否能更简洁
曲线等分点,每个点求一阶导数得到向量,和对齐第一点第二点向量求夹角,然后直接用 xdrx_entity_rotate一次,然后用 xdrx_entity_copy 到其他点过去,这样就能避免那些对矩阵不熟悉的人迷糊。 都是ACAD基本ROTATE命令,COPY命令的ARX直接实现。

点评

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

使用道具 举报

已领礼包: 2874个

财富等级: 家财万贯

 楼主| 发表于 2014-11-15 13:30:43 | 显示全部楼层
本帖最后由 viphappy 于 2014-11-15 13:36 编辑

纯纯Lips效率真是很低,要布置的实体如果再大点就更慢了。多谢各位的大力支持,什么高飞的矩阵~~,什么对齐矩阵~~真心:dizzy:受教了

点评

对了,问你下,你那个基本实体只选了一次基点,那个旋转角度你怎么默认定的? 基本实体是块吗? 一个基点定不了旋转多少角度啊。  详情 回复 发表于 2014-11-15 13:39
你不让讲效率嘛,矩阵是效率最高的了,任何曲线编辑的高级命令,最底层都是要变动矩阵进行几何变换的,现在直接让你用最底层的方法去操作,不明白要学习啊,这样才能提高自己嘛。 你等一会,ST会给你用我上面说的  详情 回复 发表于 2014-11-15 13:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 13:33:46 | 显示全部楼层
viphappy 发表于 2014-11-15 13:30
多谢各位的大力支持,什么高飞的矩阵~~,什么对齐矩阵~~真心受教了

你不让讲效率嘛,矩阵是效率最高的了,任何曲线编辑的高级命令,最底层都是要变动矩阵进行几何变换的,现在直接让你用最底层的方法去操作,不明白要学习啊,这样才能提高自己嘛。

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 13:39:29 | 显示全部楼层
viphappy 发表于 2014-11-15 13:30
纯纯Lips效率真是很低,要布置的实体如果再大点就更慢了。多谢各位的大力支持,什么高飞的矩阵~~,什么对齐 ...

对了,问你下,你那个基本实体只选了一次基点,那个旋转角度你怎么默认定的? 基本实体是块吗? 一个基点定不了旋转多少角度啊。

点评

基本实体不是块,就是在后面做了2次旋转,先转到直线所成的角,COPY后又转回原来的角,笨笨的办法  详情 回复 发表于 2014-11-15 13:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2874个

财富等级: 家财万贯

 楼主| 发表于 2014-11-15 13:52:40 | 显示全部楼层
newer 发表于 2014-11-15 13:39
对了,问你下,你那个基本实体只选了一次基点,那个旋转角度你怎么默认定的? 基本实体是块吗? 一个基点 ...

基本实体不是块,就是在后面做了2次旋转,先转到直线所成的角,COPY后又转回原来的角,笨笨的办法{:soso_e120:}

点评

你默认的基本实体的角度是0度啊? 你的代码效率慢,就是多做了好几次旋转和拷贝,你在循环体外旋转一次,在循环体内直接就COPY,另外你想用多次,先直接复制一个实体,用副本去操作。省得再转回来了。 矩阵之  详情 回复 发表于 2014-11-15 14:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 14:03:06 | 显示全部楼层
viphappy 发表于 2014-11-15 13:52
基本实体不是块,就是在后面做了2次旋转,先转到直线所成的角,COPY后又转回原来的角,笨笨的办法{:soso_ ...

你默认的基本实体的角度是0度啊?

你的代码效率慢,就是多做了好几次旋转和拷贝,你在循环体外旋转一次,在循环体内直接就COPY,另外你想用多次,先直接复制一个实体,用副本去操作。省得再转回来了。

矩阵之所以快,因为这些旋转,COPY,不管中间你进行多少种变换,这些变换都最终可以用一个组合矩阵来表达,矩阵作用一次,就达到你的所有目的了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-15 14:20:42 | 显示全部楼层
newer 发表于 2014-11-15 13:33
你不让讲效率嘛,矩阵是效率最高的了,任何曲线编辑的高级命令,最底层都是要变动矩阵进行几何变换的,现 ...

用 Rotate 和 Copy 就这样
API 版
  1. (defun c:tt (/ ss p1 p2 spa an n p0)
  2.   (if (and (setq p0 (getpoint "\n基点: "))
  3.            (setq ss (ssget))
  4.            (setq spa (getdist p0 "\n间距: "))
  5.       )
  6.     (progn
  7.       (while (and (setq p1 (getpoint "\n第一点: "))
  8.                   (setq p2 (getpoint p1 "\n第二点: "))
  9.              )
  10.         (if an
  11.           (xdrx_entity_rotate ss (- an) p0) ;_先转正
  12.         )
  13.         (setq an  (angle p1 p2)
  14.               n          (fix (+ (/ (distance p1 p2) spa) 0.5))
  15.               pts (xd::pnts:divide p1 p2 n)
  16.         )
  17.         (xdrx_entity_rotate ss an p0) ;_旋转到和线一个角度
  18.         (mapcar        '(lambda (x)
  19.                    (xdrx_entity_copy ss p0 x) ;_复制
  20.                  )
  21.                 pts
  22.         )
  23.       )
  24.       (if an
  25.         (xdrx_entity_rotate ss (- an) p0) ;_先转正
  26.       )
  27.     )
  28.   )
  29.   (princ)
  30. )

Autolisp command
  1. (defun c:tt (/ ss p1 p2 spa an n p0)
  2.   (defun r2d (a) (* 180. (/ a pi)))
  3.   (if (and (setq p0 (getpoint "\n基点: "))
  4.            (setq ss (ssget))
  5.            (setq spa (getdist p0 "\n间距: "))
  6.       )
  7.     (progn
  8.       (setvar "cmdecho" 0)
  9.       (while (and (setq p1 (getpoint "\n第一点: "))
  10.                   (setq p2 (getpoint p1 "\n第二点: "))
  11.              )
  12.         (if an
  13.           (vl-cmdf ".rotate" ss "" p0 (- (r2d an))) ;_先转正
  14.         )
  15.         (setq an  (angle p1 p2)
  16.               n          (fix (+ (/ (distance p1 p2) spa) 0.5))
  17.               pts (xd::pnts:divide p1 p2 n)
  18.         )
  19.         (vl-cmdf ".rotate" ss "" p0 (r2d an)) ;_旋转到和线一个角度
  20.         (vl-cmdf ".copy" ss "" "o" "m" "_none" p0)
  21.         (foreach x pts (command "_none"  x))
  22.         (command "")
  23.       )
  24.       (if an
  25.         (vl-cmdf ".rotate" ss "" p0 (- (r2d an))) ;_先转正
  26.       )
  27.     )
  28.   )
  29.   (princ)
  30. )

点评

确实都是运行错误  详情 回复 发表于 2014-11-20 14:22
ST大师,热心人啊  发表于 2014-11-19 16:25
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 41个

财富等级: 招财进宝

发表于 2014-11-18 14:05:53 | 显示全部楼层
好像还没一个程序能用:L:L:L:L:L:L
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-18 17:14:55 | 显示全部楼层
bai2000 发表于 2014-11-18 14:05
好像还没一个程序能用

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 06:39 , Processed in 0.278549 second(s), 70 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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