raimo 发表于 2011-6-20 17:33:58

[已解决]请高手帮忙做个简单的等分工具

本帖最后由 raimo 于 2011-6-25 00:28 编辑

经常需要用到线段等分,每次都是算来算去的.如果有这样的工具就好了
因为我不会弄,只能提出想法,所以只能请高手帮帮手拉.感谢为先!

如图所示..我考虑程序的大致思路是
1.选择绿色的两条平行线,确定距离(这里也可以从白色线入手确定起始距离,然后选择绿色线确定长度)
2.指定间距,图中红色线段的间距
3.指定等分数量,比如图中就是等分6段
4.最后得到如图的效果..



zhynt 发表于 2011-6-24 02:18:43

本帖最后由 zhynt 于 2011-6-24 02:41 编辑

更新内容:
1、修改了几处错误。
2、修改了文件读取方式(文件对话框直接到文件所在目录)。
3、修改了数据格式。
4、增加顺时针分弧和逆时针分弧功能,对应的命令是huz和huf。

userzhl 发表于 2011-6-20 20:33:14

是不是这样的效果?

00放飞梦想00 发表于 2020-3-25 13:03:10

198526 发表于 2011-6-20 19:22
粗略的写了下
(defun c:tt ()
(setq PL1 (entsel "\n请选取第一条直线:")


如果能在范围内等分就好了

198526 发表于 2011-6-20 17:40:49

你外面两条绿线和两条白线都是已知的吗?
如果说长度不是刚好等分要怎么处理?

raimo 发表于 2011-6-20 18:18:00

198526 发表于 2011-6-20 17:40 static/image/common/back.gif
你外面两条绿线和两条白线都是已知的吗?
如果说长度不是刚好等分要怎么处理?

范围肯定是已知的..
都说是等分啦,没有限制等分长度的情况下,怎么会出现不是刚好等分的情况...

zhynt 发表于 2011-6-20 18:28:21

这个不难,只是一系列点的计算。

hao3ren 发表于 2011-6-20 19:13:08

我也不会,参照论坛那个三等份改了一个
(defun c:Test ()
(setq num (getint "/n数量:" ))
(setq ss (ssget '((0 . "LINE"))))
   (setq ee1 (ssname ss 0)
         ee2 (ssname ss 1)
            pa (cdr (assoc 10 (entget ee1)))
            pb (cdr (assoc 11 (entget ee1)))
            pc (cdr (assoc 10 (entget ee2)))
            pd (cdr (assoc 11 (entget ee2)))
            px (inters pa pb pc pd T)
   )
   (if px
       (setq px pc pc pd pd px)
   )
   (setq dd1 (/ (distance pa pc) num)
         dd2 (/ (distance pb pd) num)
         vv1 (angle pa pc)
         vv2 (angle pb pd)
            pe (polar pa vv1 dd1)
            pf (polar pb vv2 dd2)
   )
   (command "Line" "none" pe "none" pf "")
(repeat (- num 1)
(setq pg (polar pe vv1 dd1)
      ph (polar pf vv2 dd2)
      pe pg
      pf ph
)
(command "Line" "none" pe "none" pf "")
)
(princ)
)

198526 发表于 2011-6-20 19:22:55

粗略的写了下
(defun c:tt ()
(setq PL1 (entsel "\n请选取第一条直线:")
       PL2 (entsel "\n请选取第二条直线:")
       j-j (GETREAL "\n请指定间距:")
       OFW (GETINT "\n指定等分数量:")
       n 1)
(if (< j-j 0)(progn(princ "指定间距小于0,按0计算")(setq j-j 0)))
(if (< OFW 2)(progn(princ "指定等分数量小于2,按2计算")(setq OFW 2)))
(Setq pl1p1 (cdr (assoc 10 (entget (car pl1))))
        pl1p2 (cdr (assoc 11 (entget (car pl1))))
        pl2p1 (cdr (assoc 10 (entget (car pl2))))
        pl2p2 (cdr (assoc 11 (entget (car pl2))))
        )
(if (< (DISTANCE pl1p1 pl2p1) (DISTANCE pl1p1 pl2p2))
    (setq jl (DISTANCE pl1p1 pl2p1)
          jd (ANGLE pl1p1 pl2p1))
    (setq jl (DISTANCE pl1p1 pl2p2)
          jd (ANGLE pl1p1 pl2p2))
    )
(while (< n ofw)
    (entmake (list '(0 . "line")'(62 . 1)(cons 10 (polar pl1p1 jd (- (* n (/ jl ofw)) (/ j-j 2.))))(cons 11 (polar pl1p2 jd (- (* n (/ jl ofw)) (/ j-j 2.))))) )
    (if (/= j-j 0)
      (entmake (list '(0 . "line")'(62 . 1)(cons 10 (polar pl1p1 jd (+ (* n (/ jl ofw)) (/ j-j 2.))))(cons 11 (polar pl1p2 jd (+ (* n (/ jl ofw)) (/ j-j 2.))))) )
      )
    (setq n (+ 1 n))
    )
)

ljpnb 发表于 2011-6-20 20:30:12

6#计算有点错误
(defun c:tt ()
(setq        PL1 (entsel "\n请选取第一条直线:")
        PL2 (entsel "\n请选取第二条直线:")
        j-j (GETREAL "\n请指定间距:")
        OFW (GETINT "\n指定等分数量:")
        n   1
)
(if (< j-j 0)
    (progn (princ "指定间距小于0,按0计算") (setq j-j 0))
)
(if (< OFW 2)
    (progn (princ "指定等分数量小于2,按2计算") (setq OFW 2))
)
(Setq        pl1p1 (cdr (assoc 10 (entget (car pl1))))
        pl1p2 (cdr (assoc 11 (entget (car pl1))))
        pl2p1 (cdr (assoc 10 (entget (car pl2))))
        pl2p2 (cdr (assoc 11 (entget (car pl2))))
)
(if (< (DISTANCE pl1p1 pl2p1) (DISTANCE pl1p1 pl2p2))
    (setq jl (DISTANCE pl1p1 pl2p1)
          jd (ANGLE pl1p1 pl2p1)
    )
    (setq jl (DISTANCE pl1p1 pl2p2)
          jd (ANGLE pl1p1 pl2p2)
    )
)
(setq dis(/ (- jl (* j-j (1- OFW))) OFW))
(while (< n ofw)
    (entmake
      (list '(0 . "line")
          '(62 . 1)
          (cons 10 (polar pl1p1 jd (+ (* dis n) (* j-j (1- n)))))
          (cons 11 (polar pl1p2 jd (+ (* dis n) (* j-j (1- n)))))
      )
    )
    (if        (/= j-j 0)
      (entmake
        (list '(0 . "line")
              '(62 . 1)
              (cons 10 (polar pl1p1 jd (+ (* dis n) (* j-j n))))
              (cons 11 (polar pl1p2 jd (+ (* dis n) (* j-j n))))
        )
      )
    )
    (setq n (+ 1 n))
)
)

zhynt 发表于 2011-6-20 21:05:55

本帖最后由 zhynt 于 2011-6-21 00:44 编辑

也来凑个热闹(改了一下)
修改了一下,相对完美了一些。

raimo 发表于 2011-6-21 05:16:20

首先感谢大家热心的帮助!!!

5楼的没有判断部分,选择操作容易出错
6楼的计算有点问题
7楼的好用,是按照第一种选择方式来做的..从使用方便的角度更直观一些
8楼的功能看挺强大的,但不是我想要的效果,而且只能算重新绘制,不是等分
9楼的也好用,程式上看更严谨清晰,是按照第二种选择方式来做的..我个人更喜欢这种选择方式..


楼上的每一位都深表感谢啦!
页: [1] 2 3 4 5 6 7
查看完整版本: [已解决]请高手帮忙做个简单的等分工具