明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7711|回复: 25

[基础] 沿着指定的路径曲线阵列问题?

  [复制链接]
发表于 2011-7-2 20:45 | 显示全部楼层 |阅读模式
本帖最后由 cumtjh 于 2011-7-3 16:35 编辑

曾经很火的晓东CAD论坛上有沿着指定的路径曲线阵列,现在只能从百度快照中搜寻它的影子了(http://cache.baidu.com/c?m=9d78d513d9d437ac4f9b9e690c66c0171c43f4102ba6a40209a08449e3732d465012e2ac56210772d1d27c1656fc1806a1e47132690c7af1dd8a9f4baea68f6d6acd30340756d01041850eafbc1a72873dc407a9e846fafbaa6fd6e88893880705dd537238dab29c5b7456972eb64f67f4a7ef43175b13bb&p=c06ac54ad2c019e60be2900c5442&user=baidu&fm=sc&query=%D1%D8%C7%FA%CF%DF%D5%F3%C1%D0+eachy&qid=9cb4a2ee027696c0&p1=3

把使用源码展示出来,相信论坛上很多朋友都想实现沿任意路径阵列
1、路径阵列对话框版 (无源码)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=42551&highlight=%D5%F3%C1%D0
2、 [原创]沿曲线路径阵列程序(无源码)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=66190&highlight=%D5%F3%C1%D0
3、[讨论] 如何在曲线上实现阵列 (提问,无结果)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=85955&highlight=%D5%F3%C1%D0
4、[资源] 动态阵列(强烈推荐)(不是我想要的)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=85014&highlight=%D5%F3%C1%D0
5、[基础] 求助,那位大侠帮忙编一个方框阵列程序
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=66333&highlight=%D5%F3%C1%D0
6、[趣味] 动态阵列
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=85752&highlight=%D5%F3%C1%D0
7、[函数] [已解决]请高手帮忙做个简单的等分工具
http://bbs.mjtd.com/thread-87683-5-1.html


转入正题:  沿着指定的路径曲线阵列问题,有源码,说需要配合配合XDRX_API B11208以上版本使用,不明白什么意思(哪里找XDRX_API B11208,这是个什么东西 会不会有cad版本限制)直接运行下面的Lsp会出错,不知道错误原因在哪里? 请大虾们帮忙看下  小弟初学,在此先谢啦
源码如下:


  1. ;|
  2. 修改一个路径阵列的lisp [转贴 2005-10-10 21:24:41]   
  3. 命令:XDTB_ArrayByPath
  4. 功能:沿着指定的路径曲线(line,polyline,lwpolyline,spline,arc,circle,ellipse)
  5. 阵列选择的实体(选择集),可以保持实体相对路径的位置。

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

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

  8. |;

  9. (defun c:XDTB_ArrayByPath (/    $get_point    $remake_l
  10.       ss    curve   dist    tf    num
  11.       maxnum  pnt    pntl    vect    xform
  12.       vT1    vT2    mMat1   mMat2   mRot
  13.       m0    mMat
  14.      )
  15.   ;;构造曲线上点pnt至曲线结束点间间隔为dist的点表,和曲线方向有关系;
  16.   ;;对ARC沿逆时针方向的起点才是起始点,阵列时注意选择集的相对位置。
  17.   (defun $get_point (curve pnt dist / ptl pt dist1)
  18.     (setq dist1 #xarray_dist);#xarray_dist 默认间隔
  19.     ;从曲线起点dist1距离起计算一定间隔的点
  20.     (while (setq pt (xdrx_curve_getpointatdist curve (+ dist dist1)))
  21.       (setq dist1 (+ dist1 #xarray_dist)
  22.      ptl   (cons (trans pt 1 0) ptl)
  23.       )
  24.     )
  25.     (reverse ptl)
  26.   )
  27.   ;;取出表l中起始的num个原子
  28.   (defun $remake_l (l num / ptl tf i)
  29.     (setq ptl (reverse l))
  30.     (if (< num (length l))
  31.       (progn
  32. (setq ptl nil)
  33. (setq tf t)
  34. (setq i 0)
  35. (while tf
  36.    (if (< i num)
  37.      (setq ptl (cons (nth i l) ptl)
  38.     i   (1+ i)
  39.      )
  40.      (setq tf nil)
  41.    )
  42. )
  43.       )
  44.     )
  45.     (reverse ptl)
  46.   )
  47.   (prompt "\n请选取要沿路径阵列的实体<退出>")
  48.   (if (and
  49. (setq ss (ssget))
  50. (setq curve (car (xdrx_entsel
  51.       "\n点取一个路径(曲线)<退出>:"
  52.       '
  53.        ((0 . "*line,arc,circle,ellipse"))
  54.     )
  55.       )
  56. )
  57.       )
  58.     (progn
  59.       (xdrx_begin)
  60.       (xdrx_ucson)
  61.       (if (not #xarray_dist)
  62. (setq #xarray_dist 100)
  63.       )
  64.       (redraw curve 3)
  65.       (initget 6)
  66.       (if (setq dist (getreal (strcat "\n阵列距离<"
  67.           (rtos #xarray_dist 2 2)
  68.           ">:"
  69.          )
  70.        )
  71.    )
  72. (setq #xarray_dist dist)
  73.       )
  74.       (setq box      (xdrx_entity_box ss) ;选择集包围盒
  75.      cen      (xdrx_midp (car box) (caddr box)) ;cen包围盒中心
  76.      ;;包围盒中心cen至曲线上最近点pnt
  77.      pnt      (xdrx_curve_getClosestPoint curve cen)
  78.      ;;pnt点的切向量
  79.      vec1     (xdrx_curve_getFirstDeriv curve pnt)
  80.      pnt      (trans pnt 1 0) ;pnt(WCS)
  81.      ;;点pnt至曲线起点的距离
  82.      baseDist (xdrx_curve_GetDistAtPoint curve pnt)
  83.      pntl     ($get_point curve pnt baseDist)
  84.       )
  85.       (initget 6)
  86.       (setq maxnum (length pntl)
  87.      tf    t
  88.       )
  89.       (while tf
  90. (setq num (getint (strcat "\n输入数量(该路径上最大允许数量"
  91.       (itoa maxnum)
  92.       ")<"
  93.       (itoa maxnum)
  94.       ">:"
  95.      )
  96.     )
  97.        num (if (not num)
  98.       maxnum
  99.       num
  100.     )
  101.        tf  (if (> num maxnum)
  102.       t
  103.       nil
  104.     )
  105. )
  106.       )
  107.       (setq pntl  ($remake_l pntl num);构造指定数量的曲线间隔点表
  108.      m0   (xdrx_matrix_identity)
  109.      xForm (mapcar
  110.       '(lambda (x) ;构造每个曲线点的矩阵
  111.          (setq vFDeriv (xdrx_curve_GetFirstDeriv
  112.            curve
  113.            (trans x 0 1)
  114.          ) ;点的切向量(WCS)
  115.         mRot    (xdrx_vector_rotateTo vec1 vFDeriv);pnt向量旋转
  116.         vT1     (mapcar '-
  117.           (trans '(0 0 0) 0 1)
  118.           (trans pnt 0 1)
  119.          ) ;pnt位移向量
  120.         vT2     (mapcar '- (trans x 0 1) (trans '(0 0 0) 0 1));点的偏移向量
  121.         mMat1   (xdrx_matrix_setTranslation m0 vT1);pnt偏移矩阵
  122.         mMat2   (xdrx_matrix_setTranslation m0 vT2);点的偏移矩阵
  123.         mMat    (xdrx_matrix_product mRot mMat1);pnt处旋转
  124.         mMat    (xdrx_matrix_product mMat2 mMat);矩阵相乘
  125.          )
  126.        )
  127.       pntl
  128.     )
  129.       )
  130.       ;;xForm-曲线上点与点pnt转换的矩阵表
  131.       (mapcar
  132. '(lambda (x)
  133.     (xdrx_entity_transformedcopy ss x) ;构造选择集拷贝
  134.   )
  135. xForm
  136.       )
  137.       (redraw curve 4)
  138.       (xdrx_ucsoff)
  139.       (xdrx_end)
  140.     )
  141.   )
  142.   (princ)
  143. )
  144. ;说明中说:这个lisp是eachy的作品,很好用,但是必需要和XDRX_API使用,arx是根据版本不同,加载不一样的
  145. ;arx,太麻烦了,打算把这里里面调用arx的修改掉,重新改一个不用调用的lisp。

在晓东工具箱中找到一个xdrx_api16.arx,加载到AutoCAD2006 失败


20110703修改======================================================
经过发帖咨询,才知道上面代码不能直接用了,因为XDRX.ARX没有更新,而且即使更新,受版本限制通用性也比较差。只能另寻他路。但实现思想基本上是一样的,求大侠们帮我们解解。
想要实现下面的效果。
阵列对象:红色锚杆  阵列路径:外圆弧(这只是个例子,还有其他形状曲线,总之是圆弧曲线)等分数:根据间距确定等分数 例如确定间距为16(1:50比例下标注为800),等分数为4600*3.14/800/2 四舍五入结果为9,阵列数为10。
预期效果图如下:


希望能实现路径阵列对话框版中的基本功能。
路径阵列对话框版
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=42551&fromuid=269329
即:1、选择对象、路径、点选。
2、确定间距 由等分数确定或者等分间距确定。
3、随曲线。使用路径阵列对话框版输入的角度为-90度。这个角度-90是如何定义的我也没搞明白,试验得出结论。
4、该程序中其他功能就不需要了,只要前面三个基本功能。肯定大虾们出手相助,相信此贴必火。

该贴已经同步到 cumtjh的微博




本帖子中包含更多资源

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

x
发表于 2019-11-23 20:20 | 显示全部楼层
有才华啊,我也在研究中。。
发表于 2020-6-24 17:59 | 显示全部楼层
留下脚印,慢慢研究!!!
发表于 2019-6-13 03:02 来自手机 | 显示全部楼层
希望楼主找到答案
发表于 2011-7-2 21:34 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2011-7-3 08:51 编辑

程序调试通过。
游客,本帖隐藏的内容需要发帖数高于 5 才可浏览,你当前发帖数只有 0

 楼主| 发表于 2011-7-2 22:00 | 显示全部楼层
本帖最后由 cumtjh 于 2011-7-2 22:04 编辑
ZZXXQQ 发表于 2011-7-2 21:34
程序未经调试。
[/post]


运行 没有达到要求 屏幕上面都是点点
好像也没有选基点,已经是否随曲线 阵列
代码说真的没大看懂,只了解基本原理利用measure 其他就不知道了

例子 沿着圆弧拱阵列


本帖子中包含更多资源

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

x
发表于 2011-7-2 23:09 | 显示全部楼层
XDRX_API B11208 这是传说中的晓东工具箱中的函数。有版本限制。好像04之后就没新版本了。
 楼主| 发表于 2011-7-2 23:12 | 显示全部楼层
本帖最后由 cumtjh 于 2011-7-3 15:11 编辑
zhynt 发表于 2011-7-2 23:09
XDRX_API B11208 这是传说中的晓东工具箱中的函数。有版本限制。好像04之后就没新版本了。


zhynt大侠能不能把我改写个,参照您帮人做的这个简单等分例子 http://bbs.mjtd.com/thread-87683-4-1.html
因为我选择的路径对象主要是半圆拱、圆弧拱、三星拱 (特点都是圆弧形状的),本身对lisp不熟悉,目前处于能看懂基本语法的代码的程度上,麻烦您出手相助下。
发表于 2011-7-3 08:54 | 显示全部楼层
“沙发”程序调试好了。
 楼主| 发表于 2011-7-3 15:04 | 显示全部楼层
本帖最后由 cumtjh 于 2011-7-3 15:43 编辑
ZZXXQQ 发表于 2011-7-3 08:54
“沙发”程序调试好了。


Z版主,感谢您的调试,程序已经明显改善。但功能还没有实现,麻烦您再修改下:
1、图上没有实现等分曲线,这个我问题我不知道是怎么产生的,曲线被分的不均匀。比如我下图中阵列距离给的16  但1:50量出来有的是749 ,有的791 ,还有1个1584 是其他的两倍。如下图所示产生不均匀阵列:

操作说明:阵列对象:选红色锚杆 路径:外圆弧 间距:16
Z版主,你看能不能这样实现等分,输入阵列间距后,计算下等分数n=取整(曲线长度/间距),取整函数满足四舍五入要求。最后将曲线等分成n,间距就与输入间距相近,沿曲线阵列后,图形满足对称。
预期效果:



2、沿阵列时没有指定阵列对象的基点,图上需要指定路径和阵列对象的焦点(也是这个阵列块对象的基点)作为阵列的基点。当前程序好像是以阵列对象的最左边点作为基点,然后将对象依次复制到路径分段点上。
3、阵列过程中,阵列对象没有随着曲线旋转。希望能够实现阵列对象随曲线旋转逆时针旋转,阵列对象与路径方向夹角为90度。
要求有点多,难度也比较大,目的就一个沿着路径阵列。麻烦高手再帮忙啊
再次感谢Z版主,祝您愉快!


本帖子中包含更多资源

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

x
发表于 2011-7-3 22:14 | 显示全部楼层
我完全是的按照原来的程序改写的,原程序未要求对曲线等分。
如果要等分曲线,将定长画点改成定数等分divide就行。
原程序未见与曲线相切的计算,因此程序未写。这部分请自行搜索下论坛,有曲线切线的程序。
发表于 2011-7-3 22:28 | 显示全部楼层
其实不用xdcad的函数,用vlax-curve函数处理起来也相当简单的
 楼主| 发表于 2011-7-4 12:15 | 显示全部楼层
ZZXXQQ 发表于 2011-7-3 08:54
“沙发”程序调试好了。

老大,麻烦你抽空回头看看啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 17:48 , Processed in 0.257893 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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