huahuaji 发表于 2018-2-6 12:44:06

路线缓和曲线绘制,可以实现非对称缓和曲线绘制,可以根据自己需要重新绘图

本帖最后由 huahuaji 于 2018-2-6 12:48 编辑


程序是结合明经cad中的画缓和曲线的程序自己加了一些功能,如下:
1、可以自己输入圆半径或者点选途中的圆获取圆半径
2、可以绘制非对称缓和曲线
3、画出缓和曲线之后,如果觉得不适合,可以重新绘制
存在的几点不足:
1、以后希望能够绘制出不同颜色的直、曲、圆
2、希望能实现纬地中的智能布线的功能,交互工作。
3、编写DCL,实现界面化
如有好的解决方法,相互讨论哇

竹斜影 发表于 2018-8-22 01:13:17

软件很好用如果可以有默认的选项的话就更好了。

skg123 发表于 2024-6-13 22:32:56

修改了一下,可用了,精度未验证



;http://bbs.mjtd.com/forum.php?mod=viewthread&tid=176586&extra=&highlight=%BB%BA%BA%CD%C7%FA%CF%DF&page=1
;多义线摹拟缓和曲线。
;;输入起止直线、半径、缓和曲线长或设计车速。
;;命令:HH
(defun com_p (/)
(setq l   0)
(command "ucs" "o" (list (- 0 x1) 0 0));;设置自定义坐标原点
        (setvar "cecolor" "3");设置对象颜色
(command "pline" (list 0 0 0) "w" "0" "";;画多段线
    (repeat M
      (setq l (+ l (/ Ls M))
            x (+ (- l (/ (* l l l l l) 40 C C)) (/ (* l l l l l l l l l) 3456 C C C C))
            y (* id__ (+ (- (/ (* l l l) 6 C) (/ (* l l l l l l l) 336 C C C)) (/ (* l l l l l l l l l l l) 42240 C C C C C)))
      );setq end
      (command (list x y 0))
    );repaet end
);commandend
(setq pt5 (trans (list x y 0) 1 0));(trans 点 原位置 新位置[位移]) 返回:转换坐标系统值
       
);com_p end


(defun ll_d()
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(setq Ls ls1
      qq1 (- (+ (- (/ Ls 2) (/ (* Ls Ls Ls) 240 R R)) (/ (* Ls Ls Ls Ls Ls) 34560 R R R R)) (/ (* Ls Ls Ls Ls Ls Ls Ls) 8386560 R R R R R R))
      pp1 (+ (- (/ (* Ls Ls) 24 R) (/ (* Ls Ls Ls Ls) 2688 R R R)) (/ (* Ls Ls Ls Ls Ls Ls) 506880 R R R R R))
              pt1 (cdr (assoc 10 (entget (car p1))))
      pt2 (cdr (assoc 11 (entget (car p1))))
      pt10 (polar pt1 (angle pt1 pt2) (/ (distance pt1 pt2) 2))
      pt3 (cdr (assoc 10 (entget (car p2))))
      pt4 (cdr (assoc 11 (entget (car p2))))
      pt20(polar pt3 (angle pt3 pt4) (/ (distance pt3 pt4) 2))
              jd(inters pt1 pt2 pt3 pt4 nil);求交点
      alf1(angle pt10 jd)
      alf2(angle pt20 jd)
      alf (- (angle jd pt20) alf1)       
);setq
(setq Ls ls2
              qq2 (- (+ (- (/ Ls 2) (/ (* Ls Ls Ls) 240 R R)) (/ (* Ls Ls Ls Ls Ls) 34560 R R R R)) (/ (* Ls Ls Ls Ls Ls Ls Ls) 8386560 R R R R R R))
      pp2 (+ (- (/ (* Ls Ls) 24 R) (/ (* Ls Ls Ls Ls) 2688 R R R)) (/ (* Ls Ls Ls Ls Ls Ls) 506880 R R R R R))
        )
(if (or (> alf pi) (and (< alf 0) (> alf (- 0 pi))))
    (progn
      (setq id__ -1)
      (if (> alf pi) (setq alf (- (+ pi pi) alf)) (setq alf (abs alf)))
    );progn
    (progn
      (setq id__ 1)
      (if (<= alf (- 0 pi)) (setq alf (+ pi pi alf)))
    );progn
);if
(setqC   (* ls1 R)
             ls ls1
         x0(-(/ (* (+ pp1 R) (sin(/ alf 2.0))) (cos(/ alf 2.0)))(/(- pp1 pp2) (sin alf)) )
         x1(+ x0 qq1);切线长
         C1(+ (*alf R) Ls);曲线长
         E   (- (/ (+ R pp1) (cos(/ alf 2))) R);外矢距
);setq
(command "ucs" "o" jd)
(command "ucs" "z" (/ (* 180 alf1) pi))
(com_p)
(setq pt6 pt5)
(setq ppt1 (list x1 0 0))
(command "ucs" "")
(if (> (abs(distance jd pt1)) (abs(distance jd pt2)))
    (setq ptt1 pt1)
    (setq ptt1 pt2)
    );if
(setq ptt2 (polar jd alf1 (- 0 x1)))
(thh p1 ptt1 10)
(thh p1 ptt2 11)
(command "ucs" "o" jd)
(command "ucs" "z" (/ (* 180 alf2) pi))
(setq id__ (- 0 id__))
(setq C (* ls2 R)
              ls ls2
      x0(+(/ (* (+ pp2 R) (sin(/ alf 2.0))) (cos(/ alf 2.0))) (/(- pp1 pp2) (sin alf)))
      x1(+ x0 qq2);切线长
      Cl(+ (*alf R) Ls);曲线长
      E   (- (/ (+ R pp2) (cos(/ alf 2))) R);外矢距
);setq
(com_p)
(setq ppt2 (list x1 0 0))
(command "ucs" "")

(if (> (abs(distance jd pt3)) (abs(distance jd pt4)))
    (setq ptt3 pt3)
    (setq ptt3 pt4)
    );if
(setq ptt4 (polar jd alf2 (- 0 x1)))
(thh p2 ptt3 10)
(thh p2 ptt4 11)
        (setvar "cecolor" "1");设置对象颜色
(if (= id__ 1) (command "arc" pt5 "e" pt6 "r" R) (command "arc" pt6 "e" pt5 "r" R))
(setq alfd (angf alf))
(setvar "osmode" os)
(command "cmdecho" "1")
        (setq strcat_QXYS (strcat (strcat "偏  角=" alfd) "\n半  径=" (rtos R 2 2) "\n切 线 长=" (rtos x1 2 2) "\n曲 线 长=" (rtos Cl 2 2)"\n外  距=" (rtos E 2 2) "\n缓和曲线长=" (rtos Ls 2 2)   ) );曲线要素
        (setq pt (getpoint "\n指定曲线要素位置: "))
                                (entmake (list '(0 . "MTEXT")
                                                          '(100 . "AcDbEntity")
                                                    '(100 . "AcDbMText")
                                                               '(62 . 3)
                                                               (cons 1 strcat_QXYS ) ;
                                                             (cons 10pt )
                                                              (cons 40 5 )
                                                               '(71 . 1)
                                                         '(72 . 5)
                                                               (cons 50 0)
                                                         (cons 8 "中心")
                                                        )       
                          )        ;;书写曲线要素
                                                                                                                                       (entmake (list '(0 . "LINE")
                                                                                                                                                        (cons 10 Pt1 )
                                                                                                                                                        (cons 11 Pt2 )
                                                                                                                                                        (cons 8 "中心")
                                                                                                                                                        (cons 62 6)
                                                                                                                                                )
                                                                                                                               )
                                                                                                                                       (entmake (list '(0 . "LINE")
                                                                                                                                                        (cons 10 Pt3 )
                                                                                                                                                        (cons 11 Pt4 )
                                                                                                                                                        (cons 8 "中心")
                                                                                                                                                        (cons 62 6)
                                                                                                                                                )
                                                                                                                               )       
                (setvar "cecolor" "7");设置颜色
);ll_d

;(defun ll_v()
;(setq V   (getreal "\n输入速度(km/h):")
       ; Ls1 (* V 0.85)
       ; Ls2 (/ (* 0.0357 V V V) R)
       ; Ls(max Ls1 Ls2 (/ R 9))
      ;Ls(* (fix (/ Ls 10)) 10.0)
;);setq
;(if (> Ls R) (setq Ls R))
;(ll_d)
;)ll_v

(defun angf (alf)
(setq alff (angtos alf 1 4);angtos 将一个以弧度为单位的角度值转换成字符串,1表示度分秒,4表示精度
              n 1
              kk (strlen alff));(strlen 字符串)返回:字符串构成的字符数(即字符串长度)
(repeat kk
    (setq alfn (substr alff n 1));(substr字符串 起始 长度)返回:取出于字符串
    (if (= alfn "d")
      (setq nn n));if
      (setq n (+ n 1))
    );repeat
(strcat (substr alff 1 (- nn 1)) "%%" (substr alff nn))
);angf,角度弧度值变为度分秒


(defun ND()
(setq newdraw (getstring "\n重画输入 hh,绘制下一段曲线:"))
(if(= newdraw "hh")
    (c:hh)
    )
)


(defun c:hh(/ p1 p2 pt1 pt2 pt3 pt4 pt5 pt6 pt10 pt20 id__RLs E ls1 ls2
                r1 x y l x0 x1 C jd alf alf1 alf2 qq1 qq2 pp1 pp2 ClM newdraw NN)
(command "ucs" "")
(setq p1 nil p2 nil)
(while (= p1 nil) (setq p1 (entsel "\n拾取第一条直线<Line>:")))
(redraw (car p1) 3)
(while (= p2 nil) (setq p2 (entsel "\n拾取第二条直线<Line>:")))
(redraw (car p2) 3)
(initget 1)
(setq NN (getint "\n点取圆(1) or 输入圆半径(2):"))
(if(= NN 1) (setq R (cdr (assoc 40 (entget (car (entsel "\n拾取圆:")))))))
(if(= NN 2) (setq R (getdist "\n请输入弯道半径 R:")))
;(initget 1 "Ls V")
;(setq ls1 (getdist "\n输入缓和曲线长度(Ls1):"))
;(setq ls2 (getdist "\n输入缓和曲线长度(Ls2): "))
;(setq M (getint "\n输入缓和曲线段数<例>:"))


                                (or ls1_old
                                        (setq ls1_old 80)
                                )
                               (princ "\n输入第一段缓和曲线段长度(Ls1)<")
                               (princ ls1_old)
                                (if        (setq tmp (getreal ">: "))
                                        (setq ls1_old tmp)
                                )
                               (setq ls1 ls1_old);第一段       
       
                                (or ls2_old
                                        (setq ls2_old 120)
                                )
                               (princ "\n输入第二缓和曲线段长度(Ls2)<")
                               (princ ls2_old)
                                (if        (setq tmp (getreal ">: "))
                                        (setq ls2_old tmp)
                                )
                               (setq ls2 ls2_old);第二段               
       
                                (or M_old
                                        (setq M_old 100)
                                )
                               (princ "\n输入缓和曲线分段数<")
                               (princ M_old)
                                (if        (setq tmp (getint ">: "))
                                        (setq M_old tmp)
                                )
                               (setq M M_old);       
       
;(if (= p3 "V") (ll_v) (progn))
(ll_d)
(ND)
(princ)
);eline


(defun thh (len pt h /);修改len的参数 len为线,pt为点,h为10 或 11
(setq en_data (entget (car len));entget获得对象的定义数据 (entget ename ) 参数 ename 要查询的图元的名称。ename 可以为图形或非图形图元。 applist 注册应用名的列表
      old_data (assoc h en_data);(assoc关键元素 联合列表)根据关键元素找寻联合列表中关系信息
              new_data (cons h pt);(cons新元素 列表)返回:将新元素添加到列表
              en (subst new_data old_data en_data)
        );setq(subst新项旧项列表)返回:替换新旧列表后的列表
(entmod en);(entmod对象列表)根据更新的信息列表更新屏幕上元体
);thh

skg123 发表于 2024-6-14 22:06:11

本帖最后由 skg123 于 2024-6-14 22:09 编辑

p-3-ianlcc 发表于 2024-6-14 09:12
謝謝您的分享!
請問這二個檔案有什麼差別呢?
還滿需要這方面的插件~~
今晚研究了,感觉精度不行。

完整缓和曲线和非完整缓和曲线交点法坐标计算应用
完整缓和曲线和非完整缓和曲线交点法坐标计算应用_不完整缓和曲线-CSDN博客
https://blog.csdn.net/starmings/article/details/126614777

测量助理专业版V3.0.221225
测量助理专业版V3.0.221225_路桥365 (luqiao365.cn)http://www.luqiao365.cn/ruanjianxiazai/106.html


声明一下,本人不认识博主,上面的链接是软件下载地址,非推销,有需要的自己研究

叮咚 发表于 2018-2-8 19:13:02

不错,支持

齐春的马甲 发表于 2018-7-8 09:27:29

感谢分享!

迷失1786 发表于 2018-7-8 21:12:10

命令: HH
拾取第一条直线:
拾取第二条直线:
点取圆(1)or输入圆半径(2):10
输入缓和曲线长度(Ls1):
输入缓和曲线长度(Ls2):
输入缓和曲线精度:
参数类型错误: numberp: nil
好像最后才错误,是不是我操作出错了?

TT510122 发表于 2018-8-8 18:26:47

不知道缓和曲线精度是什么东东?

竹斜影 发表于 2018-8-22 01:09:28

下载来试试。

zml84 发表于 2023-2-3 15:19:37

如此计算,缓和曲线精度有限。
分享一个关于缓和曲线精确计算的通用函数:https://mp.weixin.qq.com/s/nggqbDkpnFajkHiQFCSdFg

zml84 发表于 2023-2-3 15:22:20

如此计算,缓和曲线精度有限。


分享一个关于缓和曲线精确计算的通用函数:https://mp.weixin.qq.com/s/nggqbDkpnFajkHiQFCSdFg



下文没句号。 发表于 2023-4-19 22:39:24

这个缓和曲线能像PL线那样就好了。而不是样条曲线。
页: [1] 2
查看完整版本: 路线缓和曲线绘制,可以实现非对称缓和曲线绘制,可以根据自己需要重新绘图