马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×

- ;|
- 命令:XDTB_ArrayByPath
- 功能:沿着指定的路径曲线(line,polyline,lwpolyline,spline,arc,circle,ellipse)
- 阵列选择的实体(选择集),可以保持实体相对路径的位置。
- 说明:程序计算出沿着指定路径可以阵列的最大数量,请输入小于等于这个最大值的数。
- 配合XDRX_API B11208以上版本使用
- 该程序演示了API 关于向量和矩阵转换的操作。
- 演示了如何把转换矩阵作用在实体上生成实体的拷贝
- 关于该程序的改进建议请到“晓东CAD空间” “开发论坛” 留言
- [url]http://www.chat001.com/forum/xdapply/index.html[/url]
- |;
- (defun c:XDTB_ArrayByPath (/ $get_point $remake_l
- ss curve dist tf num
- maxnum pnt pntl vect xform
- vT1 vT2 mMat1 mMat2 mRot
- m0 mMat
- )
- ;;构造曲线上点pnt至曲线结束点间间隔为dist的点表,和曲线方向有关系;
- ;;对ARC沿逆时针方向的起点才是起始点,阵列时注意选择集的相对位置。
- (defun $get_point (curve pnt dist / ptl pt dist1)
- (setq dist1 #xarray_dist);#xarray_dist 默认间隔
- ;从曲线起点dist1距离起计算一定间隔的点
- (while (setq pt (xdrx_curve_getpointatdist curve (+ dist dist1)))
- (setq dist1 (+ dist1 #xarray_dist)
- ptl (cons (trans pt 1 0) ptl)
- )
- )
- (reverse ptl)
- )
- ;;取出表l中起始的num个原子
- (defun $remake_l (l num / ptl tf i)
- (setq ptl (reverse l))
- (if (< num (length l))
- (progn
- (setq ptl nil)
- (setq tf t)
- (setq i 0)
- (while tf
- (if (< i num)
- (setq ptl (cons (nth i l) ptl)
- i (1+ i)
- )
- (setq tf nil)
- )
- )
- )
- )
- (reverse ptl)
- )
- (prompt "\n请选取要沿路径阵列的实体<退出>")
- (if (and
- (setq ss (ssget))
- (setq curve (car (xdrx_entsel
- "\n点取一个路径(曲线)<退出>:"
- '
- ((0 . "*line,arc,circle,ellipse"))
- )
- )
- )
- )
- (progn
- (xdrx_begin)
- (xdrx_ucson)
- (if (not #xarray_dist)
- (setq #xarray_dist 100)
- )
- (redraw curve 3)
- (initget 6)
- (if (setq dist (getreal (strcat "\n阵列距离<"
- (rtos #xarray_dist 2 2)
- ">:"
- )
- )
- )
- (setq #xarray_dist dist)
- )
- (setq box (xdrx_entity_box ss) ;选择集包围盒
- cen (xdrx_midp (car box) (caddr box)) ;cen包围盒中心
- ;;包围盒中心cen至曲线上最近点pnt
- pnt (xdrx_curve_getClosestPoint curve cen)
- ;;pnt点的切向量
- vec1 (xdrx_curve_getFirstDeriv curve pnt)
- pnt (trans pnt 1 0) ;pnt(WCS)
- ;;点pnt至曲线起点的距离
- baseDist (xdrx_curve_GetDistAtPoint curve pnt)
- pntl ($get_point curve pnt baseDist)
- )
- (initget 6)
- (setq maxnum (length pntl)
- tf t
- )
- (while tf
- (setq num (getint (strcat "\n输入数量(该路径上最大允许数量"
- (itoa maxnum)
- ")<"
- (itoa maxnum)
- ">:"
- )
- )
- num (if (not num)
- maxnum
- num
- )
- tf (if (> num maxnum)
- t
- nil
- )
- )
- )
- (setq pntl ($remake_l pntl num);构造指定数量的曲线间隔点表
- m0 (xdrx_matrix_identity)
- xForm (mapcar
- '(lambda (x) ;构造每个曲线点的矩阵
- (setq vFDeriv (xdrx_curve_GetFirstDeriv
- curve
- (trans x 0 1)
- ) ;点的切向量(WCS)
- mRot (xdrx_vector_rotateTo vec1 vFDeriv);pnt向量旋转
- vT1 (mapcar '-
- (trans '(0 0 0) 0 1)
- (trans pnt 0 1)
- ) ;pnt位移向量
- vT2 (mapcar '- (trans x 0 1) (trans '(0 0 0) 0 1));点的偏移向量
- mMat1 (xdrx_matrix_setTranslation m0 vT1);pnt偏移矩阵
- mMat2 (xdrx_matrix_setTranslation m0 vT2);点的偏移矩阵
- mMat (xdrx_matrix_product mRot mMat1);pnt处旋转
- mMat (xdrx_matrix_product mMat2 mMat);矩阵相乘
- )
- )
- pntl
- )
- )
- ;;xForm-曲线上点与点pnt转换的矩阵表
- (mapcar
- '(lambda (x)
- (xdrx_entity_transformedcopy ss x) ;构造选择集拷贝
- )
- xForm
- )
- (redraw curve 4)
- (xdrx_ucsoff)
- (xdrx_end)
- )
- )
- (princ)
- )
|