找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5543|回复: 8

[教学] [API应用]:矩阵应用-路径阵列详解。

  [复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-3-6 17:58:16 | 显示全部楼层 |阅读模式

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

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

×


  1. ;|
  2. 命令:XDTB_ArrayByPath
  3. 功能:沿着指定的路径曲线(line,polyline,lwpolyline,spline,arc,circle,ellipse)
  4. 阵列选择的实体(选择集),可以保持实体相对路径的位置。

  5. 说明:程序计算出沿着指定路径可以阵列的最大数量,请输入小于等于这个最大值的数。

  6. 配合XDRX_API B11208以上版本使用

  7. 该程序演示了API 关于向量和矩阵转换的操作。
  8. 演示了如何把转换矩阵作用在实体上生成实体的拷贝

  9. 关于该程序的改进建议请到“晓东CAD空间” “开发论坛” 留言
  10. [url]http://www.chat001.com/forum/xdapply/index.html[/url]
  11. |;

  12. (defun c:XDTB_ArrayByPath (/           $get_point           $remake_l
  13.                            ss           curve   dist           tf           num
  14.                            maxnum  pnt           pntl           vect           xform
  15.                            vT1           vT2           mMat1   mMat2   mRot
  16.                            m0           mMat
  17.                           )
  18.   ;;构造曲线上点pnt至曲线结束点间间隔为dist的点表,和曲线方向有关系;
  19.   ;;对ARC沿逆时针方向的起点才是起始点,阵列时注意选择集的相对位置。
  20.   (defun $get_point (curve pnt dist / ptl pt dist1)
  21.     (setq dist1 #xarray_dist);#xarray_dist 默认间隔
  22.     ;从曲线起点dist1距离起计算一定间隔的点
  23.     (while (setq pt (xdrx_curve_getpointatdist curve (+ dist dist1)))
  24.       (setq dist1 (+ dist1 #xarray_dist)
  25.             ptl          (cons (trans pt 1 0) ptl)
  26.       )
  27.     )
  28.     (reverse ptl)
  29.   )
  30.   ;;取出表l中起始的num个原子
  31.   (defun $remake_l (l num / ptl tf i)
  32.     (setq ptl (reverse l))
  33.     (if        (< num (length l))
  34.       (progn
  35.         (setq ptl nil)
  36.         (setq tf t)
  37.         (setq i 0)
  38.         (while tf
  39.           (if (< i num)
  40.             (setq ptl (cons (nth i l) ptl)
  41.                   i   (1+ i)
  42.             )
  43.             (setq tf nil)
  44.           )
  45.         )
  46.       )
  47.     )
  48.     (reverse ptl)
  49.   )
  50.   (prompt "\n请选取要沿路径阵列的实体<退出>")
  51.   (if (and
  52.         (setq ss (ssget))
  53.         (setq curve (car (xdrx_entsel
  54.                            "\n点取一个路径(曲线)<退出>:"
  55.                            '
  56.                             ((0 . "*line,arc,circle,ellipse"))
  57.                          )
  58.                     )
  59.         )
  60.       )
  61.     (progn
  62.       (xdrx_begin)
  63.       (xdrx_ucson)
  64.       (if (not #xarray_dist)
  65.         (setq #xarray_dist 100)
  66.       )
  67.       (redraw curve 3)
  68.       (initget 6)
  69.       (if (setq        dist (getreal (strcat "\n阵列距离<"
  70.                                       (rtos #xarray_dist 2 2)
  71.                                       ">:"
  72.                               )
  73.                      )
  74.           )
  75.         (setq #xarray_dist dist)
  76.       )
  77.       (setq box             (xdrx_entity_box ss) ;选择集包围盒
  78.             cen             (xdrx_midp (car box) (caddr box)) ;cen包围盒中心
  79.             ;;包围盒中心cen至曲线上最近点pnt
  80.             pnt             (xdrx_curve_getClosestPoint curve cen)
  81.             ;;pnt点的切向量
  82.             vec1     (xdrx_curve_getFirstDeriv curve pnt)
  83.             pnt             (trans pnt 1 0)        ;pnt(WCS)
  84.             ;;点pnt至曲线起点的距离
  85.             baseDist (xdrx_curve_GetDistAtPoint curve pnt)
  86.             pntl     ($get_point curve pnt baseDist)
  87.       )
  88.       (initget 6)
  89.       (setq maxnum (length pntl)
  90.             tf           t
  91.       )
  92.       (while tf
  93.         (setq num (getint (strcat "\n输入数量(该路径上最大允许数量"
  94.                                   (itoa maxnum)
  95.                                   ")<"
  96.                                   (itoa maxnum)
  97.                                   ">:"
  98.                           )
  99.                   )
  100.               num (if (not num)
  101.                     maxnum
  102.                     num
  103.                   )
  104.               tf  (if (> num maxnum)
  105.                     t
  106.                     nil
  107.                   )
  108.         )
  109.       )
  110.       (setq pntl  ($remake_l pntl num);构造指定数量的曲线间隔点表
  111.             m0          (xdrx_matrix_identity)
  112.             xForm (mapcar
  113.                     '(lambda (x)        ;构造每个曲线点的矩阵
  114.                        (setq vFDeriv (xdrx_curve_GetFirstDeriv
  115.                                        curve
  116.                                        (trans x 0 1)
  117.                                      )        ;点的切向量(WCS)
  118.                              mRot    (xdrx_vector_rotateTo vec1 vFDeriv);pnt向量旋转
  119.                              vT1     (mapcar '-
  120.                                              (trans '(0 0 0) 0 1)
  121.                                              (trans pnt 0 1)
  122.                                      )        ;pnt位移向量
  123.                              vT2     (mapcar '- (trans x 0 1) (trans '(0 0 0) 0 1));点的偏移向量
  124.                              mMat1   (xdrx_matrix_setTranslation m0 vT1);pnt偏移矩阵
  125.                              mMat2   (xdrx_matrix_setTranslation m0 vT2);点的偏移矩阵
  126.                              mMat    (xdrx_matrix_product mRot mMat1);pnt处旋转
  127.                              mMat    (xdrx_matrix_product mMat2 mMat);矩阵相乘       
  128.                        )
  129.                      )
  130.                     pntl
  131.                   )
  132.       )
  133.       ;;xForm-曲线上点与点pnt转换的矩阵表
  134.       (mapcar
  135.         '(lambda (x)
  136.            (xdrx_entity_transformedcopy ss x) ;构造选择集拷贝
  137.          )
  138.         xForm
  139.       )
  140.       (redraw curve 4)
  141.       (xdrx_ucsoff)
  142.       (xdrx_end)
  143.     )
  144.   )
  145.   (princ)
  146. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-12-13 21:28:02 | 显示全部楼层
一直想要这个功能,EACHY版主,你真是太伟大了。
**
能否象3DS MAX那样,做偏移阵列:第二个对象比前一个偏移X/Y距离(或旋转X角度)?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-4-13 10:22:57 | 显示全部楼层
cad的measure命令就可以沿路径阵列啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-12 19:51:50 | 显示全部楼层
要是能在CAD中调试就好了,用MEASURE 还要做块太麻烦了。能否帮个忙做个cad中能用的LISP
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-14 18:39:32 | 显示全部楼层
看了上面的,才知道自己的CAD懂的真的好少啊,惭愧啊!咳
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 18:26 , Processed in 0.459592 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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