- UID
- 342636
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2005-10-27
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
;|
命令:XDTB_ArrayByPath
功能:沿着指定的路径曲线(line,polyline,lwpolyline,spline,arc,circle,ellipse)
阵列选择的实体(选择集),可以保持实体相对路径的位置。
说明:程序计算出沿着指定路径可以阵列的最大数量,请输入小于等于这个最大值的数。
配合XDRX_API B11208以上版本使用
该程序演示了API 关于向量和矩阵转换的操作。
演示了如何把转换矩阵作用在实体上生成实体的拷贝
关于该程序的改进建议请到“晓东CAD空间” “开发论坛” 留言
http://www.chat001.com/forum/xdapply/index.html
|;
(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)
|
|