明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2381|回复: 14

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

[复制链接]
发表于 2018-2-6 12:44:06 | 显示全部楼层 |阅读模式
本帖最后由 huahuaji 于 2018-2-6 12:48 编辑


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

本帖子中包含更多资源

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

x
发表于 2018-8-22 01:13:17 | 显示全部楼层
软件很好用如果可以有默认的选项的话就更好了。
回复 支持 1 反对 0

使用道具 举报

发表于 2024-6-13 22:32:56 | 显示全部楼层
修改了一下,可用了,精度未验证



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


  21. (defun ll_d()  
  22.   (setq os (getvar "osmode"))
  23.   (setvar "osmode" 0)  
  24.   (setq Ls ls1
  25.         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))
  26.         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))
  27.               pt1 (cdr (assoc 10 (entget (car p1))))
  28.         pt2 (cdr (assoc 11 (entget (car p1))))
  29.         pt10 (polar pt1 (angle pt1 pt2) (/ (distance pt1 pt2) 2))
  30.         pt3 (cdr (assoc 10 (entget (car p2))))
  31.         pt4 (cdr (assoc 11 (entget (car p2))))
  32.         pt20(polar pt3 (angle pt3 pt4) (/ (distance pt3 pt4) 2))
  33.               jd  (inters pt1 pt2 pt3 pt4 nil);求交点
  34.         alf1(angle pt10 jd)
  35.         alf2(angle pt20 jd)
  36.         alf (- (angle jd pt20) alf1)       
  37.   );setq
  38.   (setq Ls ls2
  39.               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))
  40.         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))
  41.         )
  42.   (if (or (> alf pi) (and (< alf 0) (> alf (- 0 pi))))
  43.     (progn
  44.       (setq id__ -1)
  45.       (if (> alf pi) (setq alf (- (+ pi pi) alf)) (setq alf (abs alf)))
  46.     );progn
  47.     (progn
  48.       (setq id__ 1)
  49.       (if (<= alf (- 0 pi)) (setq alf (+ pi pi alf)))
  50.     );progn
  51.   );if
  52.   (setq  C   (* ls1 R)
  53.                ls ls1
  54.          x0  (-(/ (* (+ pp1 R) (sin(/ alf 2.0))) (cos(/ alf 2.0)))(/(- pp1 pp2) (sin alf)) )
  55.          x1  (+ x0 qq1);切线长
  56.          C1  (+ (*  alf R) Ls);曲线长
  57.          E   (- (/ (+ R pp1) (cos(/ alf 2))) R);外矢距
  58.   );setq  
  59.   (command "ucs" "o" jd)
  60.   (command "ucs" "z" (/ (* 180 alf1) pi))
  61.   (com_p)
  62.   (setq pt6 pt5)
  63.   (setq ppt1 (list x1 0 0))  
  64.   (command "ucs" "")
  65.   (if (> (abs(distance jd pt1)) (abs(distance jd pt2)))
  66.     (setq ptt1 pt1)
  67.     (setq ptt1 pt2)
  68.     );if
  69.   (setq ptt2 (polar jd alf1 (- 0 x1)))  
  70.   (thh p1 ptt1 10)
  71.   (thh p1 ptt2 11)
  72.   (command "ucs" "o" jd)
  73.   (command "ucs" "z" (/ (* 180 alf2) pi))
  74.   (setq id__ (- 0 id__))
  75.   (setq C (* ls2 R)
  76.               ls ls2
  77.         x0  (+(/ (* (+ pp2 R) (sin(/ alf 2.0))) (cos(/ alf 2.0))) (/(- pp1 pp2) (sin alf)))
  78.         x1  (+ x0 qq2);切线长
  79.         Cl  (+ (*  alf R) Ls);曲线长
  80.         E   (- (/ (+ R pp2) (cos(/ alf 2))) R);外矢距
  81.   );setq  
  82.   (com_p)
  83.   (setq ppt2 (list x1 0 0))  
  84.   (command "ucs" "")
  85.   
  86.   (if (> (abs(distance jd pt3)) (abs(distance jd pt4)))
  87.     (setq ptt3 pt3)
  88.     (setq ptt3 pt4)
  89.     );if
  90.   (setq ptt4 (polar jd alf2 (- 0 x1)))
  91.   (thh p2 ptt3 10)
  92.   (thh p2 ptt4 11)
  93.         (setvar "cecolor" "1");设置对象颜色
  94.   (if (= id__ 1) (command "arc" pt5 "e" pt6 "r" R) (command "arc" pt6 "e" pt5 "r" R))
  95.   (setq alfd (angf alf))
  96.   (setvar "osmode" os)  
  97.   (command "cmdecho" "1")
  98.         (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)     ) );曲线要素
  99.         (setq pt (getpoint "\n指定曲线要素位置: "))
  100.                                 (entmake (list '(0 . "MTEXT")
  101.                                                           '(100 . "AcDbEntity")
  102.                                                     '(100 . "AcDbMText")
  103.                                                                  '(62 . 3)
  104.                                                                  (cons 1 strcat_QXYS ) ;
  105.                                                                    (cons 10  pt )
  106.                                                                   (cons 40 5 )
  107.                                                                  '(71 . 1)
  108.                                                            '(72 . 5)
  109.                                                                  (cons 50 0)
  110.                                                              (cons 8 "中心")
  111.                                                         )         
  112.                           )        ;;书写曲线要素
  113.                                                                                                                                          (entmake (list '(0 . "LINE")
  114.                                                                                                                                                         (cons 10 Pt1 )
  115.                                                                                                                                                         (cons 11 Pt2 )
  116.                                                                                                                                                         (cons 8 "中心")
  117.                                                                                                                                                         (cons 62 6)
  118.                                                                                                                                                 )
  119.                                                                                                                                  )
  120.                                                                                                                                          (entmake (list '(0 . "LINE")
  121.                                                                                                                                                         (cons 10 Pt3 )
  122.                                                                                                                                                         (cons 11 Pt4 )
  123.                                                                                                                                                         (cons 8 "中心")
  124.                                                                                                                                                         (cons 62 6)
  125.                                                                                                                                                 )
  126.                                                                                                                                  )       
  127.                 (setvar "cecolor" "7");设置颜色
  128. );ll_d

  129. ;(defun ll_v()
  130.   ;(setq V   (getreal "\n输入速度(km/h):")
  131.        ; Ls1 (* V 0.85)
  132.        ; Ls2 (/ (* 0.0357 V V V) R)
  133.        ; Ls  (max Ls1 Ls2 (/ R 9))
  134.         ;Ls  (* (fix (/ Ls 10)) 10.0)
  135.   ;);setq
  136.   ;(if (> Ls R) (setq Ls R))
  137.   ;(ll_d)
  138. ;)ll_v

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


  151. (defun ND()
  152.   (setq newdraw (getstring "\n重画输入 hh,绘制下一段曲线:"))
  153.   (if(= newdraw "hh")
  154.     (c:hh)
  155.     )
  156. )


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


  173.                                 (or ls1_old
  174.                                         (setq ls1_old 80)
  175.                                 )
  176.                                  (princ "\n输入第一段缓和曲线段长度(Ls1)<")
  177.                                  (princ ls1_old)
  178.                                 (if        (setq tmp (getreal ">: "))
  179.                                         (setq ls1_old tmp)
  180.                                 )  
  181.                                  (setq ls1 ls1_old);第一段       
  182.        
  183.                                 (or ls2_old
  184.                                         (setq ls2_old 120)
  185.                                 )
  186.                                  (princ "\n输入第二缓和曲线段长度(Ls2)<")
  187.                                  (princ ls2_old)
  188.                                 (if        (setq tmp (getreal ">: "))
  189.                                         (setq ls2_old tmp)
  190.                                 )  
  191.                                  (setq ls2 ls2_old);第二段               
  192.        
  193.                                 (or M_old
  194.                                         (setq M_old 100)
  195.                                 )
  196.                                  (princ "\n输入缓和曲线分段数<")
  197.                                  (princ M_old)
  198.                                 (if        (setq tmp (getint ">: "))
  199.                                         (setq M_old tmp)
  200.                                 )  
  201.                                  (setq M M_old);       
  202.        
  203.   ;(if (= p3 "V") (ll_v) (progn))
  204.   (ll_d)
  205.   (ND)
  206.   (princ)
  207. );eline


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

本帖子中包含更多资源

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

x
发表于 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-7-8 21:12:10 | 显示全部楼层
命令: HH
拾取第一条直线:
拾取第二条直线:
点取圆(1)or输入圆半径(2):10
输入缓和曲线长度(Ls1):
输入缓和曲线长度(Ls2):
输入缓和曲线精度:
参数类型错误: numberp: nil
好像最后才错误,是不是我操作出错了?
发表于 2018-8-8 18:26:47 | 显示全部楼层
不知道缓和曲线精度是什么东东?
发表于 2018-8-22 01:09:28 | 显示全部楼层
下载来试试。
发表于 2023-2-3 15:19:37 | 显示全部楼层
如此计算,缓和曲线精度有限。
分享一个关于缓和曲线精确计算的通用函数:https://mp.weixin.qq.com/s/nggqbDkpnFajkHiQFCSdFg
发表于 2023-2-3 15:22:20 | 显示全部楼层
如此计算,缓和曲线精度有限。


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



本帖子中包含更多资源

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

x
发表于 2023-4-19 22:39:24 | 显示全部楼层
这个缓和曲线能像PL线那样就好了。而不是样条曲线。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 16:37 , Processed in 0.176042 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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