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
程序调试通过。


真心想要个像湘源里面种行道树的小命令啊,可惜那个不能对其,有莫有高手拔刀相助啊……
页: 1 [2] 3
查看完整版本: 沿着指定的路径曲线阵列问题?