cy956
发表于 2011-7-4 14:18:03
本帖最后由 cy956 于 2011-7-4 14:19 编辑
你这个等分是距离等分还是线长等分?
线长等分好办,现成的vl函数;
距离等分我用的还是圆(程序没校验)。
(defun cy_pl_p0_dp(e-pl p0 d / E-CIR PB);;由p0点求pl上的距离为d的点表
(#m_cir p0 d "0" -1)
(setq e-cir(entlast)
pb(cy_get_inters e-cir e-pl ACEXTENDNONE))
(entdel e-cir)
pb
)
(defun cy_list_jjsz(b a0);;表内数同时加a0
(setq b1'())
(foreach x b
(setq b1(cons (+ x a0) b1)))
(setq b1(reverse b1))
)
(defun cy_list_zfzj(b a0 / B-F B-Z B1 FS ZS);;求正负最近的数,即负数最大及正数最小
(setq b1(cy_list_jjsz b (- a0))
b-z'() b-f'())
(foreach x b1
(cond
((equal x 0) )
((< x 0)(setq b-f(cons x b-f)))
(t (setq b-z(cons x b-z)))
)
)
(if (and(setq fs(apply 'max b-f)) (/= fs 0))
(setq fs(+ fs a0))
(setq fs nil)
)
(if (and (setq zs(apply 'min b-z)) (/= zs 0))
(setq zs(+ zs a0))
(setq zs nil)
)
(list fs zs)
)
;;;(cy_list_zfzj '(7 5 9 5 4 -6 -4) -15)
(defun cy_pl_get_p0_k(CURVE e0 p0 d0 k / D DB DI0 DMIN-MAX P PB X);;k=0为负向点,k=1为正向点
(setq pb(cy_pl_p0_dp e0 p0 d0)
di0(vlax-curve-getdistatpoint CURVE p0))
(if pb(progn
(setq db(mapcar '(lambda (x) (vlax-curve-getdistatpoint CURVE x)) pb)
dmin-max(cy_list_zfzj db di0))
(cond
((and (= k 0)(car dmin-max))
(setq d(car dmin-max)
p(vlax-curve-getpointatdist CURVE d)))
((and (= k 1)(cadr dmin-max))
(setq d(cadr dmin-max)
p(vlax-curve-getpointatdist CURVE d)))
(t (setq p nil))
)
) )
p
)
(defun cy_pl_get_pl-zfb(e0 p0 d0 / CURVE E0 K P P000 PBF PBZ);;;获得按距离分点正负表
(setq CURVE (vlax-ename->vla-object e0)
p0(vlax-curve-getClosestPointTo CURVE p0)
k t pbz(list p0) pbf(list p0)
p000 p0)
;;;pbz
(while k
(setq p(cy_pl_get_p0_k CURVE e0 p0 d0 1))
(if p
(setq pbz(append pbz (list p))
p0 p)
(setq k nil)
)
)
;;;pbf
(setq k t p0 p000)
(while k
(setq p(cy_pl_get_p0_k CURVE e0 p0 d0 0))
(if p
(setq pbf(append pbf (list p))
p0 p)
(setq k nil)
)
)
(list pbf pbz)
)
(defun c:pldf(/ CURVE D0 E0 P0 P000 PBF PBZ PBZF STARTP);;曲线按直线距离分点
(undo_begin)
(cy_get_sysmode '(("cmdecho""pickbox""aperture""osmode""blipmode") (1 4 4 544 1)))
(setq e0(car (entsel "\n选择一条要进行距离分点的曲线:")))
(setq CURVE (vlax-ename->vla-object e0)
startp(vlax-curve-getstartpoint CURVE)
p0(pri1 getpoint startp "\n输入分点起始点" startp)
d0(pri1 getdist p0 "\n输入分点距离:" 500)
p000 p0)
(setq pbzf(cy_pl_get_pl-zfb e0 p0 d0)
pbf(car pbzf) pbz (cadr pbzf))
(if pbz (#m_pl2 0 0 0 pbz "0" 1))
(if pbf (#m_pl2 0 0 0 pbf "0" 3))
(cy_set_sysmode)
(undo_end)(princ)
)
没整理也没查内部函数,看个思路。
zyb1223
发表于 2011-7-30 10:15:49
呵呵 不够5贴
gst6826
发表于 2011-9-9 23:25:31
只可惜我是新手,还有好多不懂的地方要学习。
fuyongli
发表于 2011-9-11 10:16:53
学习中的一员
cadauto
发表于 2011-9-20 19:49:49
留名学习一下~
MENGZE
发表于 2012-2-3 12:41:17
能这样沿指定路径排列吗?本人从事道路设计,经常需要,希望有个这样的LISP
MENGZE
发表于 2012-2-3 12:59:02
就是这样的
daiguafan
发表于 2012-3-16 16:28:22
一直在思考沿曲线阵列的问题,看到这个终于有些想法了
dfdfsdfsvnnk
发表于 2012-3-16 21:47:24
留个脚印,以后有用
dnedved
发表于 2012-12-11 16:23:33
ZZXXQQ 发表于 2011-7-2 21:34 static/image/common/back.gif
程序调试通过。
真心想要个像湘源里面种行道树的小命令啊,可惜那个不能对其,有莫有高手拔刀相助啊……