明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: cumtjh

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

  [复制链接]
发表于 2011-7-4 14:18 | 显示全部楼层
本帖最后由 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)
)
没整理也没查内部函数,看个思路。
发表于 2011-7-30 10:15 | 显示全部楼层
呵呵 不够5贴
发表于 2011-9-9 23:25 | 显示全部楼层
只可惜我是新手,还有好多不懂的地方要学习。
发表于 2011-9-11 10:16 | 显示全部楼层
学习中的一员
发表于 2011-9-20 19:49 | 显示全部楼层
留名学习一下~
发表于 2012-2-3 12:41 | 显示全部楼层
能这样沿指定路径排列吗?本人从事道路设计,经常需要,希望有个这样的LISP
发表于 2012-2-3 12:59 | 显示全部楼层
就是这样的

本帖子中包含更多资源

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

x
发表于 2012-3-16 16:28 | 显示全部楼层
一直在思考沿曲线阵列的问题,看到这个终于有些想法了
发表于 2012-3-16 21:47 | 显示全部楼层
留个脚印,以后有用
发表于 2012-12-11 16:23 | 显示全部楼层
ZZXXQQ 发表于 2011-7-2 21:34
程序调试通过。
[/post]

真心想要个像湘源里面种行道树的小命令啊,可惜那个不能对其,有莫有高手拔刀相助啊……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 15:15 , Processed in 0.394566 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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