明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1852|回复: 5

[源码] 用交点法绘制公路曲线

[复制链接]
发表于 2015-3-30 10:29:20 | 显示全部楼层 |阅读模式
在传一遍
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2015-3-30 10:36:06 | 显示全部楼层
怎么传不上去

本帖子中包含更多资源

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

x
发表于 2016-1-17 06:48:56 | 显示全部楼层
发表于 2016-1-24 20:41:57 | 显示全部楼层
下下来试试看好用不
发表于 2016-1-24 20:45:20 | 显示全部楼层
下载后,你们文件太多,楼主能否讲一下使用方法
 楼主| 发表于 2016-1-25 09:10:01 | 显示全部楼层
我也好久没用了,怎么用也不太清楚了,你看看这个链接,我后来改的。http://bbs.mjtd.com/thread-170360-1-1.html    ,相关用法见这个帖子。

  1. ;;对一个二维点集合group_point 绕 点center 旋转 ang 弧度
  2. (defun rotate_group_point (group_point ang center / lst)


  3.   (setq        group_point
  4.          (mapcar '(lambda (point)
  5.                     (list (- (car point) (car center))
  6.                           (- (cadr point) (cadr center))
  7.                     )
  8.                   )
  9.                  group_point
  10.          )
  11.   )
  12.   (setq        lst (list (list (cos ang) (* (sin ang) -1))
  13.                   (list (sin ang) (cos ang))
  14.             )
  15.   )
  16.   (setq        group_point
  17.          (mapcar '(lambda (point)
  18.                     (apply '(lambda (element_1 element_2)
  19.                               (list (+ (* (car element_1) (car point))
  20.                                        (* (cadr element_1) (cadr point))
  21.                                     )
  22.                                     (+ (* (car element_2) (car point))
  23.                                        (* (cadr element_2) (cadr point))
  24.                                     )
  25.                               )
  26.                             )
  27.                            lst
  28.                     )
  29.                   )
  30.                  group_point
  31.          )
  32.   )
  33.   (setq
  34.     group_point
  35.      (mapcar '(lambda (x)
  36.                 (list (+ (car x) (car center))
  37.                       (+ (cadr x) (cadr center))
  38.                 )
  39.               )
  40.              group_point
  41.      )
  42.   )
  43. )
  44. ;; 8888888888888888  88888888888888888888888  88888888888888888   

  45. ;;定义一个队group_data_out 数组进行群变换的函数 ,group_data_out 结构为:(Z_桩号 U ang_象限角 )  
  46. ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度
  47. (defun transformation_group_data_out
  48.                                      (group_data_out
  49.                                       reflex           data_origin
  50.                                       data_insert  /
  51.                                       group_point  quadrant_ang
  52.                                       ang_Δ           ang
  53.                                       U_origin           U_insert
  54.                                       group           i
  55.                                      )

  56.   (setq group (append (list data_origin) group_data_out))
  57.   (if (= reflex -1)
  58.     (setq group
  59.            (mapcar '(lambda (lst / Z U ang)
  60.                       (setq Z        (car lst)
  61.                             U        (cadr lst)
  62.                             ang        (caddr lst)
  63.                       )
  64.                       (list Z
  65.                             (list (car U)
  66.                                   (* (cadr U) -1)
  67.                             )
  68.                             (* ang -1)
  69.                       )
  70.                     )
  71.                    group
  72.            )
  73.     )
  74.   )                                        ; (if (= reflex -1) 函数结束
  75.   (setq        data_origin    (car group)
  76.         group_data_out (cdr group)

  77.   )
  78.   ;; 对group_data_out 数组进行平移,使得原坐标系中的U_origin点,和实际线元的起点U_insert向符合
  79.   (setq        U_origin (cadr data_origin)
  80.         U_insert (cadr data_insert)
  81.   )
  82.   (setq        group_data_out
  83.          (mapcar '(lambda (lst / Z U x y ang)
  84.                     (setq Z   (car lst)
  85.                           U   (cadr lst)
  86.                           x   (+ (- (car U) (car U_origin))
  87.                                  (car U_insert)
  88.                               )
  89.                           y   (+ (- (cadr U) (cadr U_origin))
  90.                                  (cadr U_insert)
  91.                               )
  92.                           ang (caddr lst)
  93.                     )
  94.                     (list Z (list x Y) ang)
  95.                   )
  96.                  group_data_out
  97.          )
  98.   )
  99.   ;; 对 group_data_out 数组,以线元的起点U_insert进行旋转 quadrant_ang- ang 角度操作
  100.   (setq        ang             (caddr data_origin)
  101.         quadrant_ang (caddr data_insert)
  102.   )

  103.   (setq        group_point
  104.          (mapcar 'cadr group_data_out)
  105.   )
  106.   (setq        ang_Δ            (- quadrant_ang ang)
  107.         group_point (rotate_group_point group_point ang_Δ U_insert)
  108.   )
  109.   (setq        i 0
  110.         group_data_out
  111.          (mapcar '(lambda (lst / U ang)
  112.                     (setq U   (nth i group_point)
  113.                           ang (caddr lst)
  114.                           i   (+ i 1)
  115.                     )
  116.                     (list (car lst) U (+ ang ang_Δ))

  117.                   )
  118.                  group_data_out
  119.          )
  120.   )
  121. )                                        ; (defun transformation_group_data_out 函数结束
  122. ;; (transformation_group_data_out group_data_out reflex         data_origin  data_insert)   





  123. ;;888888888888888888888888888888888888888888888888888888888888888888888888888888  
  124. ;;  人口变量, 缓和曲线参数A,  缓和曲线长L  
  125. (defun solve_transition_curve_sub (A               L           /
  126.                                    group       U           deflection
  127.                                    functon_parameter
  128.                                   )
  129.   ;; (setq L 40.0 A 200 )   
  130.   (if (> L 0.000001)
  131.     (progn
  132.       (setq L (* L 1.0)
  133.             A (* A 1.0)
  134.       )
  135.       (setq functon_parameter
  136.              '(((1 0 1.0 1)
  137.                 (5 4 40.0 -1)
  138.                 (9 8 3456.0 1)
  139.                 (13 12 599040.0 -1)
  140.                 (17 16 1.75473e+007 1)
  141.                )
  142.                ((3 2 6.0 1)
  143.                 (7 6 336.0 -1)
  144.                 (11 10 42240.0 1)
  145.                 (15 14 9.6768e+006 -1)
  146.                 (19 18 3.5301e+009 1)
  147.                )
  148.               )
  149.       )
  150.       ;; 把 L A 带入函数 进行求值  
  151.       (setq group
  152.              (mapcar '(lambda (subset)
  153.                         (mapcar        '(lambda (lst)
  154.                                    (apply '(lambda (a_1 a_2 a_3 a_4)
  155.                                              (*        (/ (expt L a_1)
  156.                                                    (* (expt A a_2) a_3)
  157.                                                 )
  158.                                                 a_4
  159.                                              )
  160.                                            )
  161.                                           lst
  162.                                    )
  163.                                  )
  164.                                 subset
  165.                         )
  166.                       )
  167.                      functon_parameter
  168.              )
  169.       )

  170.       (setq U
  171.              (mapcar '(lambda (subset)
  172.                         (apply '+ subset)
  173.                       )
  174.                      group
  175.              )
  176.       )

  177.       (setq deflection
  178.              (/ (expt L 2.0) (* (expt A 2.0) 2.0))
  179.       )                                        ;  J为弧度
  180.       (list U deflection)
  181.     )                                        ; progn函数结束
  182.     ;; 当缓和曲线长L很小时
  183.     (list '(0 0) 0)
  184.   )                                        ;  if 函数结束
  185. )
  186. ;;  输出参数为切线支距坐标复数U,偏角deflection  
  187. ;;888888888888888888888888888888888888888888888888888888888888888888888888888888888



  188. ;; 当线元是缓和曲线时, subset 数据结构为
  189. ;;  ( R_start R_end  transition_parameter    reflex         quadrant_ang    Z_start  U_insert )   
  190. (defun solve_transition_curve (group_Z           subset      /
  191.                                A           Lh               lst
  192.                                Lh_start           Lh_end      U_Z_start
  193.                                β_start           Z_end       group_data_out
  194.                                data_origin data_insert
  195.                               )
  196.   (apply
  197.     '(lambda (R_start              R_end              transition_parameter
  198.               reflex              quadrant_ang    Z_start
  199.               U_insert
  200.              )

  201.        (setq Lh             (car transition_parameter) ; 缓和曲线长度  
  202.              A             (cadr transition_parameter) ; 缓和曲线参数
  203.              R_start (* R_start 1.0)
  204.              R_end   (* R_end 1.0)
  205.        )
  206.        (if (= R_start 0)
  207.          (setq R_start (expt 10.0 30))
  208.        )
  209.        (if (= R_end 0)
  210.          (setq R_end (expt 10.0 30))
  211.        )
  212.        (if (> R_start R_end)
  213.          ;; 正向缓和曲线时  
  214.          (progn
  215.            (setq Lh_start  (/ (expt A 2) R_start) ; 起点缓和曲线长度
  216.                  lst           (solve_transition_curve_sub A Lh_start)
  217.                  U_Z_start (car lst)        ; 缓和曲线的起点切线支距坐标
  218.                  β_start  (cadr lst)        ;缓和曲线起点象限角
  219.            )
  220.            ;; 对桩号集合group_Z 进行操作
  221.            (setq group_data_out
  222.                   (mapcar '(lambda (z / L lst U_Z β_Z)
  223.                              (setq L (+ (- Z Z_start) Lh_start))
  224.                              (setq lst        (solve_transition_curve_sub A L)
  225.                                    U_Z        (car lst)
  226.                                    β_Z        (cadr lst)
  227.                              )
  228.                              (list Z U_Z β_Z)
  229.                            )
  230.                           group_Z
  231.                   )
  232.            )
  233.          )
  234.          ;; 反向缓和曲线时  
  235.          (progn
  236.            (setq Lh_start  (/ (expt A 2) R_start)
  237.                  lst           (solve_transition_curve_sub A Lh_start)
  238.                  U_Z_start (car lst)
  239.                  β_start  (cadr lst)
  240.            )
  241.            (setq Lh_end        (/ (expt A 2) R_end) ; 终点缓和曲线长度
  242.                  Z_end        (+ Z_start Lh)
  243.            )
  244.            (setq group_data_out
  245.                   (mapcar '(lambda (z / L lst U_Z β_Z)
  246.                              (setq L (+ (- Z_end Z) Lh_end))
  247.                                         ; 加桩点的缓和曲线长度,从完整缓和曲线的起点算起
  248.                              (setq lst        (solve_transition_curve_sub A L)
  249.                                    U_Z        (car lst)
  250.                                    β_Z        (cadr lst)
  251.                              )
  252.                              (list Z U_Z β_Z)
  253.                            )
  254.                           group_Z
  255.                   )
  256.            )
  257.            ;;此时生成的group_data_out与标准的正向缓和曲线线(原点0,启始方位角0,右手螺旋坐标系) 沿着X轴对称 ,
  258.            ;;所以要对group_data_ou 进行沿x轴镜像  
  259.            (setq group_data_out
  260.                                 (mapcar        '(lambda (lst / Z U ang)
  261.                                            (setq Z   (car lst)
  262.                                                  U   (cadr lst)
  263.                                                  ang (caddr lst)
  264.                                            )
  265.                                            (list Z
  266.                                                  (list (* (car U) -1)
  267.                                                        (cadr U)
  268.                                                  )
  269.                                                  (* ang -1)
  270.                                            )
  271.                                          )
  272.                                         group_data_out
  273.                                 )

  274.                  U_Z_start
  275.                                 (list (* (car U_Z_start) -1)
  276.                                       (cadr U_Z_start)
  277.                                 )

  278.                  β_start
  279.                                 (* β_start -1)
  280.            )
  281.          )

  282.        )                                ; (if (> R_start R_end)  函数结束  
  283.        ;; 创建transformation_group_data_out 函数用参数   data_origin  data_insert  
  284.        (setq data_origin (list 0 U_Z_start β_start)
  285.              data_insert (list 0 U_insert quadrant_ang)
  286.        )
  287.        ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度
  288.        (transformation_group_data_out
  289.          group_data_out
  290.          reflex
  291.          data_origin
  292.          data_insert
  293.        )
  294.      )
  295.     subset
  296.   )
  297. )
  298. ;;88888888888888888888888888888888888888888888888888888888888888888   (expt 10.0 30)   










  299. ;; 当线元是圆曲线时 subset 数据结构为
  300. ;;  ( R_start R_end  lenth    reflex         quadrant_ang    Z_start  U_insert   )   
  301. (defun solve_circular_arc (group_Z         subset               /
  302.                            i                 group_data_out
  303.                            U_center         data_origin   data_insert
  304.                           )


  305.   ;; (tang_test   group_data_out )   
  306.   (apply
  307.     '(lambda (R_start R_end lenth reflex quadrant_ang Z_start U_insert)

  308.        ;; 设定圆曲线圆心为原点(0 R_start),方向为 右手坐标系,圆曲线线起点坐标(0   0 ),切线为X轴

  309.        (setq R_start  (* R_start 1.0)
  310.              U_center (list 0 R_start)
  311.        )
  312.        (setq group_data_out
  313.               (mapcar '(lambda (Z / L β U_Z ang)
  314.                          (setq L   (- Z Z_start)
  315.                                β  (/ L R_start)
  316.                                ang (- β (/ pi 2))
  317.                                U_Z (polar U_center ang R_start)
  318.                          )
  319.                          (list Z U_Z β)
  320.                        )
  321.                       group_Z
  322.               )
  323.        )
  324.        ;; 创建transformation_group_data_out 函数用参数   data_origin  data_insert  
  325.        (setq data_origin (list 0 (list 0 0) 0)
  326.              data_insert (list 0 U_insert quadrant_ang)
  327.        )
  328.        ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度
  329.        (transformation_group_data_out
  330.          group_data_out
  331.          reflex
  332.          data_origin
  333.          data_insert
  334.        )
  335.      )
  336.     subset
  337.   )
  338. )
  339. ;;88888888888888888888888888888888888888888888888888888888888888888  





  340. ;; 当线元是直线时 subset 数据结构为
  341. ;;  ( R_start R_end  lenth    reflex         quadrant_ang    Z_start  U_insert   )   
  342. (defun solve_straightway
  343.                          (group_Z subset / group_data_out)

  344.   ;; (tang_test   group_data_out )   
  345.   (apply
  346.     '(lambda (R_start R_end lenth reflex quadrant_ang Z_start U_insert)
  347.        (setq group_data_out
  348.               (mapcar '(lambda (Z / L U_Z)
  349.                          (setq L   (- Z Z_start)
  350.                                U_Z (polar U_insert quadrant_ang L)
  351.                          )
  352.                          (list Z U_Z quadrant_ang)
  353.                        )
  354.                       group_Z
  355.               )
  356.        )
  357.      )
  358.     subset
  359.   )
  360. )
  361. ;;88888888888888888888888888888888888888888888888888888888888888888  




  362. ;; 创建一个 桩号的函数  
  363. (defun create_group_Z (Z_start Z_end Z_Δ / lst group_Z z)

  364.   (setq        group_z        (list Z_start)
  365.         Z        (+ (fix Z_start) 1)
  366.   )
  367.   (while (< Z Z_end)
  368.     (setq group_Z (cons z group_Z))
  369.     (setq z (+ z Z_Δ))
  370.   )
  371.   (setq        group_z
  372.          (reverse group_z)
  373.   )
  374.   (append group_z (list Z_end))
  375. )
  376. ;; (setq  group_Z ( create_group_Z 10784.9 10834 1)  )  







  377. (defun f_zhuanghao (Z / 桩号1 桩号2 Z_1 z_2 z_3 桩号3 桩号)
  378.   (setq        Z_1 (fix Z)
  379.         Z_2 (rem Z_1 1000)                ;整数桩号
  380.         Z_3 (/ (- Z_1 Z_2) 1000)        ;公里桩号
  381.         Z_4 (- Z Z_1)                        ;小数桩号
  382.   )
  383.   (setq        桩号1 (itoa Z_3)                ;获得整公里桩号
  384.         桩号2 (itoa Z_2)                ;获得桩号的小里程数
  385.         桩号3 (substr (rtos Z_4 2 3) 2 4) ;获得桩号的小数  
  386.   )
  387.   (cond
  388.     ((and (= Z_2 0) (= Z_4 0))
  389.      (setq 桩号 (strcat "K" 桩号1 "+000"))
  390.                                         ; 获得桩号的字符表达式如"K3+000" 的形式
  391.     )
  392.     ((and (= (rem Z_2 10) 0) (= Z_4 0))
  393.      (setq 桩号 (strcat "+" 桩号2))
  394.                                         ; 获得桩号的字符表达式如"+860" 的形式
  395.     )
  396.     (t (setq 桩号 (strcat "K" 桩号1 "+" 桩号2 桩号3)))
  397.   )
  398. )                                        ;zhuanghao函数结束
  399. ;;8888888888888888888888888888888888888888888888



  400. ;; 交点参数的文件格式, 当交点为完整缓和曲线时 :  [ ( 转点号I nil)   U_转点  ( Ls1 R Ls2 )  ] ,
  401. ;; 当交点为非完整缓和曲线交点时 :   [ ( 转点号I t)  U_转点   ( R_start  R  R_end  Ls1   Ls2) ]  
  402. ;; 输出变量turning_point_group : [ ( 转点号I nil)   U_转点  ( Ls1 R Ls2 )(α1  α2   Δ Dist_1   Dist_2 )]   
  403. (defun create_turning_point_group
  404.                                   (/            n             i              lst
  405.                                    fname    group    turning_point_group
  406.                                    f1
  407.                                    ;; 求交点距离角度时用到的参数  
  408.                                    α1            α2             Δ              Dist_1
  409.                                    Dist_2   lst_1    lst_2    lst_3
  410.                                    U_1            U_2             U_3
  411.                                   )
  412.   ;; turning_point_group 格式 [ ( 转点号I nil)   U_转点  ( Ls1 R Ls2 )  ]  , 完整缓和曲线时  
  413.   ;;  or [ ( 转点号I nil)  U_转点   ( R_start R  R_end  Ls1   Ls2) ]  , 非完整缓和曲线交点时   
  414.   (setq fname (getfiled "输入存放交点参数的文件" "" "txt" 1))
  415.   (setq f1 (open fname "r"))
  416.   (setq group nil)
  417.   (while (setq lst (read-line f1))
  418.     (setq group (cons lst group))
  419.   )                                        ; while (/= list  nil)循环函数结束
  420.   (close f1)
  421.   (setq        i 0
  422.         group_turning_point
  423.          nil
  424.         n (length group)
  425.   )
  426.   (repeat n
  427.     (setq lst                      (read (nth i group))
  428.           group_turning_point
  429.                               (cons lst group_turning_point)
  430.     )
  431.     (setq i (+ i 1))
  432.   )
  433.   (setq        group_turning_point
  434.          (vl-sort group_turning_point
  435.                   '(lambda (lst1 lst2)
  436.                      (<        (car (car lst1))
  437.                         (car (car lst2))
  438.                      )
  439.                    )

  440.          )
  441.   )
  442.   ;; 对数组group_turning_point  [ ( 转点号I nil)  U_转点 ( Ls1 R Ls2 )  ] , 加入第三项 (α1  α2   Δ Dist_1   Dist_2 )  
  443.   (setq        i 0
  444.         group nil
  445.   )
  446.   (repeat n
  447.     (cond
  448.       ;;当转点为[第二个->倒数第二个] 转点时  
  449.       ((and (/= i 0) (/= i (- n 1)))
  450.        (progn
  451.          (setq lst_1 (nth (- i 1) group_turning_point))
  452.          (setq lst_2 (nth i group_turning_point))
  453.          (setq lst_3 (nth (+ i 1) group_turning_point))
  454.          (setq U_1 (cadr lst_1)
  455.                U_2 (cadr lst_2)
  456.                U_3 (cadr lst_3)
  457.          )
  458.          (setq Dist_1 (distance U_1 U_2)
  459.                Dist_2 (distance U_2 U_3)
  460.          )
  461.          (setq α1 (angle U_1 U_2)
  462.                α2 (angle U_2 U_3)
  463.                Δ  (- α2 α1)
  464.          )
  465.          ;; 对转角Δ 使其控制在(-pi pi) 之间
  466.          (cond
  467.            ((and (>= Δ (* -1 pi))
  468.                  (< Δ pi)
  469.             )
  470.             (setq Δ Δ)
  471.            )
  472.            ((< Δ (* -1 pi))
  473.             (setq Δ (+ Δ (* 2 pi)))
  474.            )
  475.            ((> Δ pi)
  476.             (setq Δ (- Δ (* 2 pi)))
  477.            )
  478.          )
  479.          (setq lst   (list α1 α2 Δ Dist_1 Dist_2)
  480.                lst   (append lst_2 (list lst))
  481.                group (cons lst group)
  482.          )
  483.        )
  484.       )
  485.       ;;当为第一个转点时的情形 起始转点->下一转点
  486.       ((= i 0)
  487.        (progn
  488.          (setq lst_2 (nth i group_turning_point))
  489.          (setq lst_3 (nth (+ i 1) group_turning_point))
  490.          (setq
  491.            U_2 (cadr lst_2)
  492.            U_3 (cadr lst_3)
  493.          )
  494.          (setq Dist_1 0
  495.                Dist_2 (distance U_2 U_3)
  496.                α2    (angle U_2 U_3)
  497.                lst    (list 0 α2 0 0 Dist_2)
  498.          )
  499.          (setq lst   (append lst_2 (list lst))
  500.                group (cons lst group)
  501.          )
  502.        )
  503.       )
  504.       ;; 当转点为最后一个转点时的情形 上一转点->终点转点   
  505.       ((= i (- n 1))
  506.        (progn
  507.          (setq lst_1 (nth (- i 1) group_turning_point))
  508.          (setq lst_2 (nth i group_turning_point))
  509.          (setq U_1 (cadr lst_1)
  510.                U_2 (cadr lst_2)
  511.          )
  512.          (setq Dist_1 (distance U_1 U_2)
  513.                α1    (angle U_1 U_2)

  514.                lst    (list α1 0 0 Dist_1 0)
  515.          )
  516.          (setq lst   (append lst_2 (list lst))
  517.                group (cons lst group)
  518.          )
  519.        )
  520.       )
  521.     )                                        ; cond  函数结束  
  522.     (setq i (+ i 1))
  523.   )                                        ; (repeat n  函数结束
  524.   (setq group_turning_point (reverse group))

  525.                                         ; 排序函数结束
  526. )                                        ;  create_turning_point_group_2 函数结束  
  527. ;; (setq group_turning_point ( create_turning_point_group )  )   




  528. ;;888888888888888888888888888888888888888888888888888888888888888888888888888888  
  529. ;;  人口变量缓和曲线长Lh, 缓和曲线半径R,  出口变量缓和曲线出口段内移值p,切线增量q ,偏角β,缓和曲线参数A   
  530. (defun evaluation_transition_curve
  531.                                    (Lh              R                /
  532.                                     A              p                q
  533.                                     β              group
  534.                                     functon_parameter
  535.                                    )
  536.   ;; (setq lh 50 r 480 )  
  537.   (setq        R  (* 1.0 R)
  538.         Lh (* 1.0 Lh)
  539.   )
  540.   (setq        functon_parameter
  541.          '(((2 1 24.0)
  542.             (4 3 -2688.0)
  543.             (6 5 506880.0)
  544.             (8 7 -1.54829e+008)
  545.            )
  546.            ((1 0 2.0)
  547.             (3 2 -240.0)
  548.             (5 4 34560.0)
  549.             (7 6 -8.38656e+006)
  550.             (9 8 3.15851e+009)
  551.            )
  552.           )
  553.   )
  554.   ;;把参数parameter_easement_curve  带入求值,
  555.   (setq        group
  556.          (mapcar '(lambda (subset)
  557.                     (mapcar '(lambda (lst)
  558.                                (apply '(lambda (a_1 a_2 a_3)
  559.                                          (/ (expt Lh a_1)
  560.                                             (* (expt R a_2) a_3)
  561.                                          )
  562.                                        )
  563.                                       lst
  564.                                )
  565.                              )
  566.                             subset
  567.                     )
  568.                   )
  569.                  functon_parameter
  570.          )
  571.   )
  572.   (setq        group
  573.          (mapcar '(lambda (subset)
  574.                     (apply '+ subset)
  575.                   )
  576.                  group
  577.          )
  578.   )
  579.   (setq        p  (car group)
  580.         q  (cadr group)
  581.         β (/ Lh (* R 2.0))
  582.         A  (sqrt (* R Lh))
  583.   )
  584.   ;; 出口变量缓和曲线出口段内移值p,切线增量q ,偏角β,缓和曲线参数A   
  585.   (list p q β A)
  586. )                                        ;   evaluation_easement_curve 函数结束                                 
  587. ;;  (evaluation_transition_curve  50  480  )  (evaluation_transition_curve   50  480  )                          
  588. ;;888888888888888888888888888888888888888888888888888888888888888888888888888888888



  589. ;;888888888888888888888888888888888888888888888888888888888888888888888888888888
  590. ;; (setq group_turning_point ( create_turning_point_group )  )   
  591. ;; 求基本对称路线平曲线的 曲线要素 入口变量: [ ( 转点号I nil)   U_转点  ( Lh R  Lh  )(α1  α2   Δ Dist_1   Dist_2 )]  
  592. ;; 出口变量:该转点各线元的数据[( 转点号I j)   R_start R_end  transition_parameter   reflex  quadrant_ang    Z_start  U_insert )  ]   
  593. (defun evaluation_symmetrical_curve (subset / Z_I U group_data_out)
  594.   ;; (setq subset (nth 15   group_turning_point ))
  595.   (setq        Z_I    (car (car subset))        ; 转点编号
  596.         subset (cdr subset)
  597.   )
  598.   ;; (setq U_ZD_real (car subset) lst1  (cadr subset) lst2  (caddr subset) )   
  599.   (apply '(lambda (U_ZD_real             lst1     lst2     /
  600.                    ;; 计算交点用参数
  601.                    quadrant_ang             Δ
  602.                    ;; 计算切线长度 T1 T2 所用参数
  603.                    T1            T2             a_1      a_2      tangent
  604.                    cscΔ    cotΔ
  605.                    ;; 计算缓和曲线的内蕴参数
  606.                    parameter             Lh1      Lh2      R
  607.                    A1            A2             p1              p2       q1
  608.                    q2            β1             β2      βy      E
  609.                    Ly            L             adjusted_value    reflex
  610.                    ;; 建立线元坐标系所用参数
  611.                    U_center U_JD     U_ZH     U_HY     U_QZ
  612.                    U_YH            U_HZ
  613.                    ;; 桩号用参数
  614.                    Z_JD            Z_ZH     Z_HY     Z_QZ     Z_YH
  615.                    Z_HZ
  616.                    ;; 切线角用参数  
  617.                    ang_JD   ang_ZH   ang_HY   ang_QZ   ang_YH
  618.                    ang_HZ
  619.                    ;; 对数组 group_data_out 进行移位,镜像,旋转 用参数
  620.                    quadrant_ang             data_origin       data_insert
  621.                    ;;创建线元列表所用参数  
  622.                    lst            lst2     lst3     lst4     Line_segments
  623.                   )
  624.             (setq Lh1               (car lst1)
  625.                   R               (cadr lst1)
  626.                   Lh2               (caddr lst1)
  627.                   quadrant_ang
  628.                                (car lst2) ; 设计交点的入口方位角  
  629.                   Δ               (caddr lst2) ; 设计交点偏转系数

  630.             )
  631.             (if        (>= Δ 0)
  632.               (setq reflex 1)
  633.               (setq reflex -1
  634.                     Δ           (* -1 Δ)
  635.               )
  636.             )
  637.             (setq
  638.               parameter
  639.                         (evaluation_transition_curve Lh1 R)
  640.               ;; 出口变量缓和曲线出口段内移值p,切线增量q ,偏角β,缓和曲线参数A   
  641.               p1        (car parameter)
  642.               q1        (cadr parameter)
  643.               β1        (caddr parameter)
  644.               A1        (nth 3 parameter)
  645.             )
  646.             (cond
  647.               ((= Lh1 Lh2)
  648.                (setq
  649.                  β2 β1
  650.                  A2  A1
  651.                )
  652.                (setq tangent (/ (sin (/ Δ 2)) (cos (/ Δ 2)))
  653.                      T1             (+ (* (+ R p1) tangent) q1)
  654.                      T2             T1
  655.                                         ; 切线长度
  656.                )
  657.               )
  658.               ;; 当出口、进口缓和曲线长度不相等时
  659.               ((/= Lh1 Lh2)
  660.                (setq
  661.                  parameter
  662.                            (evaluation_transition_curve Lh2 R)
  663.                  ;; 出口变量缓和曲线出口段内移值p,切线增量q ,偏角β,缓和曲线参数A   
  664.                  p2           (car parameter)
  665.                  q2           (cadr parameter)
  666.                  β2           (caddr parameter)
  667.                  A2           (nth 3 parameter)
  668.                )
  669.                (setq cscΔ (/ 1.0 (sin Δ))
  670.                      cotΔ (/ (cos Δ) (sin Δ))
  671.                      a_1   (* (+ R p2) cscΔ)
  672.                      a_2   (* (+ R p1) cotΔ)
  673.                      T1           (+ (- a_1 a_2)
  674.                               q1
  675.                            )
  676.                      a_1   (* (+ R p1) cscΔ)
  677.                      a_2   (* (+ R p2) cotΔ)
  678.                      T2           (+ (- a_1 a_2)
  679.                               q2
  680.                            )
  681.                )
  682.               )
  683.             )                                ; (cond  函数 结束
  684.             (setq a_1                 (expt (+ R p1) 2)
  685.                   a_2                 (expt (- T1 q1) 2)
  686.                   E                 (- (sqrt (+ a_1 a_2)) R) ; 外距
  687.                   βy                 (- Δ (+ β1 β2))
  688.                   Ly                 (* βy R)
  689.                                         ; 圆曲线长度
  690.                   L                 (+ Ly (+ Lh1 Lh2))
  691.                   adjusted_value (- (+ T1 T2) L) ; 切曲差  
  692.             )
  693.             ;; 以ZH点为坐标原点,该点的切线方向为X轴,建立右手螺旋坐标系 ,转角 Δ取正数   
  694.             ;;转点的桩号 Z_JD = z_QZ + adjusted_value
  695.             (setq ang_JD (/ Δ 2)
  696.                   ;; 设置为U_JD ->U_center的垂直方向
  697.                   ang_ZH 0
  698.                   ang_HY β1
  699.                   ang_QZ (+ β1 (/ βy 2))
  700.                   ang_YH (- Δ β2)
  701.                   ang_HZ Δ
  702.             )
  703.             ;;   (angtos   (+(/ (- pi Δ) 2)Δ)   1 6  )   
  704.             (setq
  705.               U_JD     (list T1 0)
  706.               U_center (list q1 (+ R p1))
  707.               U_ZH     (list 0 0)        ;向量U_center ->U_JD 的方位角 (+ (/ Δ 2)pi)   
  708.               U_HY     (polar U_center (- ang_HY (* pi 0.5)) R)
  709.               U_QZ     (polar U_center (- ang_QZ (* pi 0.5)) R)
  710.               U_YH     (polar U_center (- ang_YH (* pi 0.5)) R)
  711.               U_HZ     (polar U_JD Δ T2)
  712.             )
  713.             (setq Z_JD T1
  714.                   Z_ZH 0
  715.                   Z_HY Lh1
  716.                   Z_QZ (+ Lh1 (/ Ly 2))
  717.                   Z_YH (+ Lh1 Ly)
  718.                   Z_HZ L
  719.             )
  720.             (setq group_data_out
  721.                    (list
  722.                      (list Z_JD U_JD ang_JD)
  723.                      (list Z_ZH U_ZH ang_ZH)
  724.                      (list Z_HY U_HY ang_HY)
  725.                      (list Z_QZ U_QZ ang_QZ)
  726.                      (list Z_YH U_YH ang_YH)
  727.                      (list Z_HZ U_HZ ang_HZ)
  728.                    )
  729.             )
  730.             ;; 创建transformation_group_data_out 函数用参数   data_origin  data_insert  
  731.             (setq
  732.               data_origin (list 0 U_JD 0)
  733.               data_insert (list 0 U_ZD_real quadrant_ang)
  734.             )
  735.             ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度quadrant_ang
  736.             (setq group_data_out
  737.                    (transformation_group_data_out
  738.                      group_data_out
  739.                      reflex
  740.                      data_origin
  741.                      data_insert
  742.                    )
  743.             )
  744.             ;;利用group_data_out数组 设置线元参数: (( 转点号I j)  R_start R_end  transition_parameter  reflex quadrant_ang  Z_start  U_insert )
  745.             (cond
  746.               ((and (/= Lh1 0)
  747.                     (/= Lh2 0)
  748.                )
  749.                (setq lst  (list 1 2 4)
  750.                      lst3 (list 0 1 2)
  751.                )
  752.               )
  753.               ((and (= Lh1 0)
  754.                     (/= Lh2 0)

  755.                )
  756.                (setq lst  (list 2 4)
  757.                      lst3 (list 1 2)
  758.                )
  759.               )
  760.               ((and (/= Lh1 0)
  761.                     (= Lh2 0)
  762.                )
  763.                (setq lst  (list 1 2)
  764.                      lst3 (list 0 1)
  765.                )
  766.               )
  767.               ((and (= Lh1 0)
  768.                     (= Lh2 0)
  769.                )
  770.                (setq lst  (list 2)
  771.                      lst3 (list 1)
  772.                )
  773.               )
  774.             )                                ; cond  函数结束  
  775.             (setq
  776.               group
  777.                             (mapcar '(lambda (i / lst2)
  778.                                        (setq lst2 (nth i group_data_out))
  779.                                        (list (caddr lst2) (car lst2) (cadr lst2))
  780.                                      )
  781.                                     (list 1 2 4)
  782.                             )
  783.               lst_4            (list (list (list Z_I 0) 0 R (list Lh1 A1) reflex)
  784.                                   (list (list Z_I 1) R R Ly reflex)
  785.                                   (list (list Z_I 2) R 0 (list Lh2 A2) reflex)
  786.                             )
  787.               Line_segments (mapcar '(lambda (i)
  788.                                        (append (nth i lst_4) (nth i group))
  789.                                      )
  790.                                     lst3
  791.                             )
  792.             )
  793.             (list Line_segments (list T1 T2 adjusted_value))
  794.           )
  795.          subset
  796.   )

  797. )                                        ;   evaluation_easement_curve 函数结束
  798. ;;888888888888888888888888888888888888888888888888888888888888888888888888888888888   





  799. ;;888888888888888888888888888888888888888888888888888888888888888888888888888888  
  800. ;; (setq group_turning_point ( create_turning_point_group )  )   
  801. ;; 求包含非完整缓和曲线的线元要素 入口变量: [ ( 转点号I T)   U_转点  ( R_start R R_end   Lh1  Lh2  )(α1  α2   Δ Dist_1   Dist_2 )]
  802. ;; 出口变量:该转点各线元的数据[( 转点号I j)   R_start R_end  transition_parameter   reflex  quadrant_ang    Z_start  U_insert )  ]   
  803. (defun evaluation_no_symmetrical_curve (subset / Z_I U group_data_out)
  804.   ;; (setq subset (nth 11   group_turning_point ))
  805.   (setq        Z_I         (car (car subset))        ; 转点编号
  806.         subset_2 (cdr subset)
  807.   )
  808.   ;; (setq U_ZD_real (car subset_2) lst1  (cadr subset_2) lst2  (caddr subset_2) )   
  809.   (apply '(lambda (U_ZD_real lst1      lst2         /
  810.                    ;; 计算交点用参数
  811.                    quadrant_ang               Δ
  812.                    ;; 计算切线长度 T1 T2 所用参数
  813.                    T1             T2               group_Z         Lh1_start Lh2_start
  814.                    ;; 计算缓和曲线的内蕴参数
  815.                    parameter Lh1       Lh2         R           A1
  816.                    A2             p1               p2         q1           q2
  817.                    β1             β2       βy         E           Ly
  818.                    L             adjusted_value         reflex
  819.                    ;; 建立线元坐标系所用参数
  820.                    U_center  U_ZD      U_ZH         U_HY           U_QZ
  821.                    U_YH             U_HZ
  822.                    ;; 桩号用参数
  823.                    Z_JD             Z_ZH      Z_HY         Z_QZ           Z_YH
  824.                    Z_HZ
  825.                    ;; 切线角用参数  
  826.                    ang_JD    ang_ZH    ang_HY         ang_QZ           ang_YH
  827.                    ang_HZ
  828.                    ;; 对数组 group_data_out 进行移位,镜像,旋转 用参数
  829.                    quadrant_ang               data_origin           data_insert
  830.                    ;;创建线元列表所用参数  
  831.                    lst             lst2      lst3         lst4           Line_segments
  832.                   )
  833.             (setq R_start (car lst1)
  834.                   R (cadr lst1)
  835.                   R_end        (caddr lst1)
  836.                   Lh1 (nth 3 lst1)
  837.                   Lh2 (nth 4 lst1)
  838.                   quadrant_ang
  839.                    (car lst2)                ; 设计交点的入口方位角  
  840.                   Δ (caddr lst2)        ; 设计交点偏转系数
  841.             )
  842.             (if        (= R_start 0)
  843.               (setq R_start (expt 10.0 30))
  844.             )
  845.             (if        (= R_end 0)
  846.               (setq R_end (expt 10.0 30))
  847.             )
  848.             (if        (>= Δ 0)
  849.               (setq reflex 1)
  850.               (setq reflex -1
  851.                     Δ           (* -1 Δ)
  852.               )                                ; (setq Δ (/ pi 3))   
  853.             )
  854.             ;; 当出口 缓和曲线长度不相等时
  855.             (if        (/= Lh1 0)
  856.               (progn
  857.                 ;; 创建lst结构 ( ( 转点号I j)  R_start R_end  transition_parameter    reflex         quadrant_ang    Z_start  U_insert )  
  858.                 (setq
  859.                   A1
  860.                      (abs (- (/ 1.0 R)
  861.                              (/ 1.0 R_start)
  862.                           )
  863.                      )
  864.                   A1
  865.                      (sqrt (/ Lh1 A1))
  866.                 )
  867.                 ;; 求入口非完整缓和曲线的HY点 ( z_桩号 U_z ang  )  
  868.                 (setq lst     (list R_start
  869.                                     R
  870.                                     (list Lh1 A1)
  871.                                     1
  872.                                     0        ; 线元的起点方位角
  873.                                     0
  874.                                     (list 0 0)
  875.                               )
  876.                       group_Z (list Lh1)
  877.                 )
  878.                 (setq group (solve_transition_curve group_Z lst)
  879.                       U_HY  (cadr (car group))
  880.                       β1   (caddr (car group))
  881.                 )
  882.                 ;; (setq group_data_out (solve_transition_curve  ( create_group_Z  0  Lh1   1)  lst ))  (tang_test   group_data_out )
  883.               )
  884.               (setq β1 0)                ; 当Lh1长度为0 时 , β1 偏角为0  
  885.             )
  886.             ;; 求出口口非完整缓和曲线的HY点 ( z_桩号 U_z ang  ) (以YH点为0点,右手螺旋坐标系,过YH点的切线为0度 )
  887.             (if        (/= Lh2 0)
  888.               (progn
  889.                 ;; 创建lst结构 ( R_start R_end  transition_parameter    reflex         quadrant_ang    Z_start  U_insert )  
  890.                 (setq
  891.                   A2
  892.                      (abs (- (/ 1.0 R)
  893.                              (/ 1.0 R_end)
  894.                           )
  895.                      )
  896.                   A2
  897.                      (sqrt (/ Lh2 A2))
  898.                 )
  899.                 (setq lst     (list R
  900.                                     R_end
  901.                                     (list Lh2 A2)
  902.                                     1
  903.                                     0        ; 线元的起点方位角
  904.                                     0
  905.                                     (list 0 0)
  906.                               )
  907.                       group_Z (list Lh2)
  908.                 )
  909.                 (setq group (solve_transition_curve group_Z lst)
  910.                       β2   (caddr (car group))
  911.                 )
  912.               )
  913.               (setq β2 0)                ; 当Lh2长度为0 时 , β2 偏角为0  
  914.             )                                ; (if        (/= Lh2 0) 函数结束

  915.             ;; 计算圆曲线的偏角
  916.             (setq βy (- Δ (+ β2 β1))
  917.                   Ly  (* R βy)                ; 圆曲线长度  
  918.             )

  919.             ;; 创建lst结构 ( R_start R_end  lenth    reflex         quadrant_ang    Z_start  U_insert )  
  920.             (setq lst          (list R R Ly 1 β1 0 U_HY)
  921.                   group_Z (list Ly)        ; YH 点的桩号
  922.             )
  923.             (setq group        (solve_circular_arc group_Z lst)
  924.                                         ; 求圆曲线的终点坐标
  925.                   U_YH        (cadr (car group))
  926.             )
  927.             ;; (setq group_data_out (solve_circular_arc  ( create_group_Z  0  Ly  1)  lst ))  (tang_test   group_data_out )  
  928.             (if        (/= Lh2 0)
  929.               (progn
  930.                 ;;求HZ点的 group_data_out 的数组( z_桩号 U_z ang  )  
  931.                 (setq lst     (list R
  932.                                     R_end
  933.                                     (list Lh2 A2)
  934.                                     1
  935.                                     (+ βy β1) ; 线元的起点方位角
  936.                                     0        ; 线元的起始桩号   
  937.                                     U_YH
  938.                               )
  939.                       group_Z (list Lh2) ; HZ点桩号
  940.                 )
  941.                 (setq group (solve_transition_curve group_Z lst)
  942.                       U_HZ  (cadr (car group))
  943.                                         ; 求第二缓和曲线在 以HZ点为坐标原点,起点缓和曲线切线为X轴方向
  944.                 )
  945.                 ;; (setq group_data_out (solve_transition_curve  ( create_group_Z  0  Lh2   1)  lst ))  (tang_test   group_data_out )  
  946.               )
  947.               (setq U_HZ U_YH)
  948.             )                                ; (if        (/= Lh2 0) 函数结束

  949.             ;; 求次坐标系中的转点坐标 U_ZD
  950.             (setq U_HZ_2 (polar U_HZ Δ 100.0)
  951.                   U_ZD         (inters U_HZ
  952.                                  U_HZ_2
  953.                                  (list 0 0)
  954.                                  (list 10000 0)
  955.                                  nil
  956.                          )
  957.             )
  958.             ;;  (setq tang99 (list  (list 0 0) U_HY  U_YH   U_HZ  U_ZD  ))( create_LWPOLYLINE  tang99 nil  "0"  )      

  959.             (setq T1                 (car U_ZD)
  960.                   T2                 (distance U_ZD U_HZ)
  961.                   L                 (+ Ly (+ Lh1 Lh2))
  962.                   adjusted_value (- (+ T1 T2) L) ; 切曲差  
  963.             )

  964.             ;; 以ZH点为坐标原点,该点的切线方向为X轴,建立右手螺旋坐标系 ,转角 Δ取正数   
  965.             ;;转点的桩号 Z_JD = z_QZ + adjusted_value
  966.             (setq ang_JD (/ Δ 2)
  967.                   ;; 设置为U_JD ->U_center的垂直方向
  968.                   ang_ZH 0
  969.                   ang_HY β1
  970.                   ang_QZ (+ β1 (/ βy 2))
  971.                   ang_YH (- Δ β2)
  972.                   ang_HZ Δ
  973.             )
  974.             ;;   (angtos   (+(/ (- pi Δ) 2)Δ)   1 6  )   
  975.             (setq
  976.               U_center (polar U_HY (+ ang_HY (* pi 0.5)) R)
  977.               U_ZH     (list 0 0)        ;向量U_center ->U_JD 的方位角 (+ (/ Δ 2)pi)   
  978.               U_QZ     (polar U_center (- ang_QZ (* pi 0.5)) R)
  979.             )
  980.             (setq Z_JD T1
  981.                   Z_ZH 0
  982.                   Z_HY Lh1
  983.                   Z_QZ (+ Lh1 (/ Ly 2))
  984.                   Z_YH (+ Lh1 Ly)
  985.                   Z_HZ L
  986.             )
  987.             (setq group_data_out
  988.                    (list
  989.                      (list Z_JD U_ZD ang_JD)
  990.                      (list Z_ZH U_ZH ang_ZH)
  991.                      (list Z_HY U_HY ang_HY)
  992.                      (list Z_QZ U_QZ ang_QZ)
  993.                      (list Z_YH U_YH ang_YH)
  994.                      (list Z_HZ U_HZ ang_HZ)
  995.                    )
  996.             )
  997.             ;; 创建transformation_group_data_out 函数用参数   data_origin  data_insert  
  998.             (setq
  999.               data_origin (list 0 U_ZD 0)
  1000.               data_insert (list 0 U_ZD_real quadrant_ang)
  1001.             )
  1002.             ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度quadrant_ang
  1003.             (setq group_data_out
  1004.                    (transformation_group_data_out
  1005.                      group_data_out
  1006.                      reflex
  1007.                      data_origin
  1008.                      data_insert
  1009.                    )
  1010.             )
  1011.             ;;利用group_data_out数组 设置线元参数: ( R_start R_end  transition_parameter  reflex quadrant_ang  Z_start  U_insert )
  1012.             (cond
  1013.               ((and (/= Lh1 0)
  1014.                     (/= Lh2 0)
  1015.                )
  1016.                (setq lst  (list 1 2 4)
  1017.                      lst3 (list 0 1 2)
  1018.                )
  1019.               )
  1020.               ((and (= Lh1 0)
  1021.                     (/= Lh2 0)

  1022.                )
  1023.                (setq lst  (list 2 4)
  1024.                      lst3 (list 1 2)
  1025.                )
  1026.               )
  1027.               ((and (/= Lh1 0)
  1028.                     (= Lh2 0)
  1029.                )
  1030.                (setq lst  (list 1 2)
  1031.                      lst3 (list 0 1)
  1032.                )
  1033.               )
  1034.               ((and (= Lh1 0)
  1035.                     (= Lh2 0)
  1036.                )
  1037.                (setq lst  (list 2)
  1038.                      lst3 (list 1)

  1039.                )
  1040.               )
  1041.             )                                ; cond  函数结束  
  1042.             (setq
  1043.               group
  1044.                             (mapcar '(lambda (i / lst2)
  1045.                                        (setq lst2 (nth i group_data_out))
  1046.                                        (list (caddr lst2) (car lst2) (cadr lst2))
  1047.                                      )
  1048.                                     (list 1 2 4)
  1049.                             )
  1050.               lst_4            (list (list (list Z_I 0) R_start R (list Lh1 A1) reflex)
  1051.                                   (list (list Z_I 1) R R Ly reflex)
  1052.                                   (list (list Z_I 2) R R_end (list Lh2 A2) reflex)
  1053.                             )
  1054.               Line_segments (mapcar '(lambda (i)
  1055.                                        (append (nth i lst_4) (nth i group))
  1056.                                      )
  1057.                                     lst3
  1058.                             )
  1059.             )
  1060.             (list Line_segments (list T1 T2 adjusted_value))
  1061.           )
  1062.          subset_2
  1063.   )


  1064. )                                        ;   evaluation_easement_curve 函数结束
  1065. ;;888888888888888888888888888888888888888888888888888888888888888888888888888888888   




  1066. ;;  (setq group_turning_point ( create_turning_point_group )  )
  1067. ;; 求线路的线元参数group_Line_segments [( 转点号I j) R_start R_end  transition_parameter   reflex  quadrant_ang   Z_start  U_insert ]  
  1068. ;; 以及转点参数  group_data_JD  ( Z_JD U ang JD  reflex )  
  1069. (defun create_group_Line_segments
  1070.                                   (group_turning_point
  1071.                                    Z_road_start           /
  1072.                                    group_turning_point_2
  1073.                                    lst                   state
  1074.                                    i                   dist
  1075.                                    quadrant_ang           num
  1076.                                    T_front           Δ
  1077.                                    U_insert           U
  1078.                                    Z                   group_parameter
  1079.                                    group_Line_segments
  1080.                                    group_data_JD
  1081.                                   )
  1082.   ;; 去掉group_turning_point 中的第一和最后一个转点,不进行处理
  1083.   (setq        group_turning_point_2
  1084.          (cdr group_turning_point)
  1085.         group_turning_point_2
  1086.          (reverse group_turning_point_2)
  1087.         group_turning_point_2
  1088.          (cdr group_turning_point_2)
  1089.         group_turning_point_2
  1090.          (reverse group_turning_point_2)
  1091.   )
  1092.   ;; 创建线元集合group_Line_segments [( 转点号I j) R_start R_end  transition_parameter   reflex  quadrant_ang    Z_start  U_insert ]   
  1093.   ;; 和 转点用的参数集合 group_parameter (list T1 T2 adjusted_value)
  1094.   (setq
  1095.     group_Line_segments
  1096.      nil
  1097.     group_parameter
  1098.      nil
  1099.   )
  1100.   (mapcar '(lambda                        ; (setq subset (nth 9 group_turning_point ) )   
  1101.              (subset / Line_segments state lst lst2)
  1102.               (setq state (cadr (car subset)))
  1103.                                         ; 判断该转点是否包含非完整缓和曲线   
  1104.               (if state
  1105.                 (setq lst
  1106.                        (evaluation_no_symmetrical_curve subset)
  1107.                       Line_segments
  1108.                        (car lst)
  1109.                       lst2 (cadr lst)

  1110.                 )
  1111.                 (setq lst
  1112.                        (evaluation_symmetrical_curve subset)
  1113.                       Line_segments
  1114.                        (car lst)
  1115.                       lst2 (cadr lst)

  1116.                 )
  1117.               )
  1118.               (setq group_Line_segments
  1119.                      (cons Line_segments group_Line_segments)
  1120.                     group_parameter
  1121.                      (cons lst2 group_parameter)
  1122.               )
  1123.            )
  1124.           group_turning_point_2
  1125.   )
  1126.   (setq        group_Line_segments
  1127.          (reverse group_Line_segments)
  1128.         group_parameter
  1129.          (reverse group_parameter)
  1130.   )
  1131.   ;;利用参数group_parameter (list T1 T2 adjusted_value)   和group_turning_point  把直线线元加进group_Line_segments 中
  1132.   (setq        i 0
  1133.         n (length group_Line_segments)
  1134.   )
  1135.   ;; 把第二个转点至最后一个转点的直线线元加进数组group_Line_segments 中
  1136.   (setq        group_Line_segments
  1137.          (mapcar
  1138.            '(lambda
  1139.               (lst         /           dist             lst2      T_back
  1140.                T_now         T_front   Δ             U_JD      quadrant_ang
  1141.                U_insert         element   num             Z_start
  1142.               )
  1143.                (cond
  1144.                  ((/= i (- n 1))        ; 当转点num 不是最后一个转点时  
  1145.                   (setq        T_now               (cadr (nth i group_parameter))
  1146.                         T_back               (car (nth i group_parameter))
  1147.                         adjusted_value (caddr (nth i group_parameter))
  1148.                         T_front               (car (nth (+ i 1) group_parameter))
  1149.                         lst2               (nth (+ i 1) group_turning_point)
  1150.                                         ; 线元所对应的转点号  
  1151.                         dist               (nth 4 (nth 3 lst2))
  1152.                         quadrant_ang   (cadr (nth 3 lst2))
  1153.                         Δ               (- dist (+ T_now T_front))
  1154.                                         ;直线线元的长度
  1155.                         num               (car (car lst2)) ; 转点号
  1156.                         Z_start               (- (+ T_now T_back) adjusted_value)
  1157.                                         ;线元的起点桩号  
  1158.                   )
  1159.                  )
  1160.                  ;;   当转点num  是最后一个转点时   
  1161.                  ((= i (- n 1))
  1162.                   (setq        T_now               (cadr (nth i group_parameter))
  1163.                         T_back               (car (nth i group_parameter))
  1164.                         adjusted_value (caddr (nth i group_parameter))
  1165.                         T_front               0;  最后一个转点的切线长度设置为0   
  1166.                         lst2               (nth (+ i 1) group_turning_point)
  1167.                                         ; 线元所对应的转点号  
  1168.                         dist               (nth 4 (nth 3 lst2))
  1169.                         quadrant_ang   (cadr (nth 3 lst2))
  1170.                         Δ               (- dist (+ T_now T_front))
  1171.                         num               (car (car lst2)) ; 转点号
  1172.                         Z_start               (- (+ T_now T_back) adjusted_value)
  1173.                                         ;线元的起点桩号  
  1174.                   )
  1175.                  )
  1176.                )
  1177.                (setq i (+ i 1))
  1178.                ;; 当 Δ 长度大于0.1米 时, 在该转点处加进直线线元
  1179.                (if (> Δ 0.1)
  1180.                  (progn
  1181.                    (setq U_JD          (cadr lst2)
  1182.                          U_insert (polar U_JD quadrant_ang T_now)
  1183.                          num          (car (car lst2))
  1184.                    )
  1185.                    ;; 创建直线线元[( 转点号I 3)  0  0   Δ    reflex  quadrant_ang    Z_start  U_insert ]  
  1186.                    (setq element (list (list num 3)
  1187.                                        0
  1188.                                        0
  1189.                                        Δ
  1190.                                        1
  1191.                                        quadrant_ang
  1192.                                        Z_start
  1193.                                        U_insert
  1194.                                  )
  1195.                          lst         (append lst (list element))
  1196.                    )
  1197.                  )
  1198.                )                        ; (if (> Δ 0.1) 函数结束
  1199.                lst
  1200.             )
  1201.            group_Line_segments
  1202.          )
  1203.   )
  1204.   ;; 把第一直线线元加进数组 group_Line_segments  
  1205.   (setq        lst             (car group_turning_point)
  1206.         dist             (nth 4 (nth 3 lst))
  1207.         quadrant_ang (cadr (nth 3 lst))
  1208.         U_insert     (cadr lst)                ; 第一个转点的 坐标
  1209.         num             (car (car lst))        ; 第一个线元的转点号   
  1210.         lst             (car group_parameter)
  1211.         T_front             (car lst)                ; 第二个转点 的入口方向切线长度
  1212.         Δ             (- dist T_front)
  1213.   )
  1214.   ;; 判断第一个线元的转点是否存在
  1215.   (if (> Δ 0.1)
  1216.     (progn
  1217.       (setq element (list (list num 3)
  1218.                           0
  1219.                           0
  1220.                           Δ
  1221.                           1
  1222.                           quadrant_ang
  1223.                           0
  1224.                           U_insert
  1225.                     )

  1226.       )
  1227.       (setq group_Line_segments
  1228.              (append (list (list element)) group_Line_segments)
  1229.       )
  1230.     )
  1231.   )
  1232.   ;; 对线元数组 group_Line_segments 中的起始桩号进行处理,  
  1233.   (if (not Z_road_start)
  1234.     (setq Z_road_start 0)                ; 当线路起始桩号没有定义时,设置为0  
  1235.   )
  1236.   (setq Z Z_road_start)                        ; 初始化桩号Z 为路线的起始桩号
  1237.   (setq        group_Line_segments
  1238.          (mapcar
  1239.            '(lambda (lst / element lenth)
  1240.               (setq lst
  1241.                      (mapcar
  1242.                        '(lambda        (subset)
  1243.                           (apply '(lambda (x_0 x_1 x_2 x_3 x_4 x_5 x_6 x_7)
  1244.                                     (list x_0 x_1 x_2 x_3 x_4 x_5 (+ Z x_6) x_7)
  1245.                                   )
  1246.                                  subset
  1247.                           )
  1248.                         )
  1249.                        lst
  1250.                      )
  1251.               )                                ;  (mapcar '(lambda        (subset) 函数结束
  1252.               ;; 当一个转点 的全部线元处理完毕后, 对该转点的最后一个线元的结束桩号,赋值给Z
  1253.               (setq element (last lst))        ; 该转点的最后一个线元
  1254.               (if (= (cadr (car element)) 2)
  1255.                 (setq lenth (car (nth 3 element)))
  1256.                                         ; 当最后一个线元是缓和曲线时  
  1257.                 (setq lenth (nth 3 element))
  1258.               )
  1259.               (setq Z (+ (nth 6 element) lenth))
  1260.               lst                        ; 保证输出结果为想要的group_Line_segments 数组  
  1261.             )
  1262.            group_Line_segments
  1263.          )
  1264.   )
  1265.   ;; 对group_turning_point 中的交点 ,求其交点桩号,病并求其象限角,以转角的一半为切线方向   

  1266.   (setq group_data_JD nil)                ; 利用数组group_Line_segments和group_parameter (list T1 T2 adjusted_value) 求解
  1267.   (setq i 1)
  1268.   (setq        group_data_JD
  1269.          (mapcar '(lambda (lst / T1 Z Z_JD lst2 U ang JD Δ reflex)
  1270.                     (setq T1         (car lst)
  1271.                           lst2         (nth i group_Line_segments)
  1272.                           Z         (nth 6 (car lst2))
  1273.                                         ; 该交点中的第一个线元的起点桩号
  1274.                           Z_JD         (+ Z T1)
  1275.                           reflex (nth 4 (car lst2))
  1276.                     )
  1277.                     (setq lst2 (nth i group_turning_point)
  1278.                           U    (cadr lst2)
  1279.                           JD   (car (car lst2))
  1280.                           Δ   (caddr (nth 3 lst2))
  1281.                           ang  (car (nth 3 lst2))
  1282.                           ang  (+ (* 0.5 Δ) ang)
  1283.                     )
  1284.                     (setq i (+ i 1))
  1285.                     (list Z_JD U ang JD reflex)
  1286.                   )
  1287.                  group_parameter
  1288.          )
  1289.   )


  1290.   (list group_Line_segments group_data_JD)
  1291. )
  1292. ;; 88888888888           88888888888888            88888888888888888          88888888888888888888   





  1293. ;; 计算线路加宽值8888888888            8888888888888888888              88888888888888888888           88888888888888888888   
  1294. ;;从文件中写入加宽数组 ,  输出 数组group_widen 其格式为 ( 转点号   widen 线路加宽值)  
  1295. (defun write_into_group_widen (/ lst fname f1 group group_widen)

  1296.   (setq fname (getfiled "\n输入存放线路交点加宽参数的文件" "" "txt" 1))
  1297.   (if (/= fname nil)
  1298.     (progn
  1299.       (setq f1 (open fname
  1300.                      "r"
  1301.                )
  1302.       )
  1303.       (while (setq list_1 (read-line f1))
  1304.         (setq group (cons list_1 group))
  1305.       )
  1306.       (setq group (reverse group))
  1307.       (setq
  1308.         group_widen
  1309.          nil
  1310.       )
  1311.       (setq group_widen
  1312.              (mapcar '(lambda (x)
  1313.                         (read x)
  1314.                       )
  1315.                      group
  1316.              )
  1317.       )
  1318.       (close f1)                        ;关闭文件fname
  1319.     )                                        ;  progn 函数结束
  1320.   )                                        ;if (/= fname nil) 函数结束
  1321.   group_widen
  1322. )                                        ; write_into_group_widen 函数结束
  1323. ;; 88888888888888888888888888888888888       (write_into_group_widen )      
  1324. ;;  (setq  group_widen (write_into_group_widen))  




  1325. ;; 输入参数 线元 Line_segments [( 转点号I j) R_start R_end  transition_parameter   reflex  quadrant_ang    Z_start  U_insert ]   
  1326. ;; mold加宽类型 ,mold为0时, 绘制普通加宽,mold=1 时,按直线加宽
  1327. (defun calculate_Transition-curve_widen
  1328.                                         (Z          group_widen
  1329.                                          Line_segments           mold
  1330.                                          /          L           widen
  1331.                                          k          k_2           k_3
  1332.                                          l_x          T_1           T_2
  1333.                                          T_3          widen_x  lenth
  1334.                                          lst          Z_end
  1335.                                         )
  1336.   (apply
  1337.     '(lambda (x_0 x_1 x_2 transition_parameter reflex x_5 Z_start x_7)
  1338.        (setq I         (car x_0)                ; 转点的编号
  1339.              num (cadr x_0)                ; 线元在转点中的编号
  1340.        )
  1341.        (setq lst   (assoc I group_widen)
  1342.                                         ; 寻找转点I 所对应的加宽值   
  1343.              widen (cadr lst)
  1344.        )
  1345.        (if (not widen)
  1346.          (setq widen 0)
  1347.        )
  1348.        (if (or (= num 0)
  1349.                (= num 2)
  1350.            )
  1351.          ;; 当线元为缓和曲线时  
  1352.          (progn
  1353.            (setq lenth (car transition_parameter)
  1354.                  lenth (* lenth 1.0)
  1355.                  Z_end (+ Z_start lenth)
  1356.            )
  1357.            (if (and
  1358.                  (>= Z z_start)
  1359.                  (<= Z z_end)
  1360.                )
  1361.              (progn
  1362.                (cond
  1363.                  ;; 当线元为进口缓和曲线时  
  1364.                  ((= num 0)
  1365.                   (setq L (- Z z_start))
  1366.                  )
  1367.                  ;; 当线元为出口缓和曲线时  
  1368.                  ((= num 2)
  1369.                   (setq L (- z_end z))
  1370.                  )
  1371.                )                        ; cond 函数结束   
  1372.                (setq k (/ L lenth))
  1373.                ;; 当 mold为0时, 绘制普通加宽,mold=1 时,按直线加宽
  1374.                (cond
  1375.                  ((= mold 0)
  1376.                   (setq        k_2        (* (expt k 3) 4)
  1377.                         k_3        (* (expt k 4) 3)
  1378.                         widen_x        (* (- k_2 k_3) widen)
  1379.                   )
  1380.                  )
  1381.                  ((= mold 1)
  1382.                   (setq widen_x (* k widen))
  1383.                  )
  1384.                )                        ; 判断 缓和曲线是否为普通或直线加宽的函数 结束   
  1385.              )
  1386.            )                                ; (if (and  (>= Z z_start) (< Z z_end) ) 函数结束
  1387.          )
  1388.        )                                ; 处理缓和曲线线元加宽值的 函数结束
  1389.        (if (= num 1)
  1390.          ;; 当线元为圆曲线时   
  1391.          (progn
  1392.            (setq lenth (* transition_parameter 1.0)
  1393.                  Z_end (+ Z_start lenth)
  1394.            )
  1395.            (if (and
  1396.                  (>= Z z_start)
  1397.                  (<= Z z_end)
  1398.                )
  1399.              (setq widen_x widen)
  1400.            )                                ; (if (and  (>= Z z_start) (< Z z_end) ) 函数结束
  1401.          )
  1402.        )                                ; 处理圆曲线线元加宽值的 函数结束
  1403.        (if (not widen_x)
  1404.          (setq widen_x 0)
  1405.          widen_x
  1406.        )
  1407.      )
  1408.     Line_segments
  1409.   )
  1410. )                                        ; calculate_Transition-curve_widen函数结束
  1411. ;; (calculate_Transition-curve_widen 7530  group_widen Line_segments  0 )   
  1412. ;;  (setq  group_widen (write_into_group_widen))  
  1413. ;; (setq Line_segments  (cadr(nth 2 tang99 )))  (setq   mold 0  z 7570  I 25  )     





  1414. ;; 绘图用函数88888    绘图用函数88888     绘图用函数88888     绘图用函数88888    绘图用函数88888    绘图用函数88888    绘图用函数88888  


  1415. ;; 对group_data_out 数组进行标注,   Wide 为标注点离中心线的距离 , color 为文字颜色   
  1416. (defun draw_group_data_out
  1417.                            (group_data_out          color             Wide
  1418.                             /               group          Z_start    group
  1419.                             n_point
  1420.                            )
  1421.   (setq group (mapcar 'cadr group_data_out))
  1422.   (entmake (append (list '(0 . "LWPOLYLINE")
  1423.                          '(100 . "AcDbEntity")
  1424.                          (cons 62 color)
  1425.                          '(100 . "AcDbPolyline")
  1426.                          (cons 90 (length group))
  1427.                    )
  1428.                    (mapcar '(lambda (U) (cons 10 U)) group)
  1429.            )
  1430.   )

  1431.   (setq        n_point        (length group_data_out)
  1432.         Z_start        (car (car group_data_out))
  1433.   )
  1434.   (if (not Wide)
  1435.     (setq Wide 8)
  1436.   )
  1437.   (mapcar
  1438.     '(lambda (lst / Z U ang string U_offset U_move)
  1439.        (setq Z         (car lst)
  1440.              U         (cadr lst)
  1441.              ang (+ (caddr lst)
  1442.                     (* 0.5 pi)
  1443.                  )
  1444.        )
  1445.        (setq string   (f_zhuanghao Z)
  1446.              U_offset (polar U ang Wide)
  1447.              U_move   (polar U ang (* Wide 2.2))
  1448.        )
  1449.        (if (or (= (rem Z 10) 0)
  1450.                (= state_label "completely")
  1451.            )
  1452.          (progn
  1453.            (entmakex
  1454.              (list '(0 . "line")
  1455.                    (cons 62 color)
  1456.                    (cons 10 U)
  1457.                    (cons 11 U_offset)
  1458.              )
  1459.            )
  1460.            ;; 对文字的 方向角度进行控制,使得其保持在0--180度之内
  1461.            (if (> ang pi)
  1462.              (setq ang (- ang pi))
  1463.            )
  1464.            (entmake
  1465.              (list '(0 . "TEXT")
  1466.                    (cons 62 color)
  1467.                    (append '(10) U_move)
  1468.                    (cons 40 3)
  1469.                    (cons '1 string)
  1470.                    (cons 50 ang)
  1471.                    '(72 . 1)
  1472.                    (append '(11) U_move)
  1473.                    '(73 . 2)
  1474.              )
  1475.            )
  1476.          )
  1477.        )
  1478.      )
  1479.     group_data_out
  1480.   )

  1481. )
  1482. ;; 888888888888            88888888888888888           88888888888888888888                  





  1483. ;; 对线元参数group_Line_segments [( 转点号num j) R_start R_end  transition_parameter   reflex  quadrant_ang   Z_start  U_insert ]  
  1484. ;; 求出一个新的数组 group_transition ( 转点号num j) (i j k) ,i 和 k 分别为该线元的 前后线元编号  i k 取值为0 ,1 ,2 ,3  
  1485. (defun create_group_transition
  1486.                                (group_Line_segments
  1487.                                 /              group_transition
  1488.                                 group              n_1
  1489.                                 n              group_i
  1490.                                 lst              num
  1491.                                )
  1492.   (setq group (apply 'append group_Line_segments))
  1493.   ;; 为了计算方便,在数组group的头和尾巴各加入一个数组  
  1494.   (setq        lst   (car (car group))
  1495.         num   (car lst)
  1496.         lst   (list (list num 3))
  1497.         group (append (list lst) group)
  1498.         lst   (car (last group))
  1499.         num   (car lst)
  1500.         lst   (list (list num 3))
  1501.         group (append group (list lst))
  1502.   )
  1503.   (setq        n        (length group)
  1504.         n_1        1
  1505.         group_i        nil
  1506.   )
  1507.   (repeat (- n 2)
  1508.     (setq group_i (cons n_1 group_i))
  1509.     (setq n_1 (+ n_1 1))
  1510.   )
  1511.   (setq group_i (reverse group_i))
  1512.   (setq group_transition nil)
  1513.   (mapcar '(lambda (n_1 / lst lst_back lst_front i j k)
  1514.              (setq lst (nth n_1 group)
  1515.                    j   (cadr (car lst))
  1516.              )
  1517.              (setq lst_back  (nth (- n_1 1) group)
  1518.                    lst_front
  1519.                              (nth (+ n_1 1) group)
  1520.              )
  1521.              (setq i (cadr (car lst_back))
  1522.                    k (cadr (car lst_front))
  1523.              )
  1524.              (setq group_transition
  1525.                     (cons (list (car lst) (list i j k))
  1526.                           group_transition
  1527.                     )
  1528.              )
  1529.            )
  1530.           group_i
  1531.   )
  1532.   (reverse group_transition)
  1533. )                                        ; (defun create_group_transition   函数结束  
  1534. ;; (setq group_transition ( create_group_transition group_Line_segments ) )   



  1535. ;; 绘制公路曲线中心线
  1536. ;; (setq Line_segments   (cadr group_Line_segments ) )  
  1537. ;; group_transition ( 转点号num j) (i j k) ,i 和 k 分别为该线元的 前后线元编号  i k 取值为0 ,1 ,2 ,3  
  1538. (defun draw_center_line
  1539.        (Line_segments group_transition / lst group_transition)
  1540.   (mapcar
  1541.     '(lambda
  1542.        (subset / lst group_Z num Z_start Z_end len group_data_out array
  1543.         j)
  1544.         ;;去除 [( 转点号I j)   R_start R_end  transition_parameter   reflex  quadrant_ang    Z_start  U_insert )]中的第一个元素  
  1545.         (setq array   (car subset)
  1546.               num     (cadr array)
  1547.               subset  (cdr subset)
  1548.               Z_start
  1549.                       (nth 5 subset)
  1550.         )
  1551.         (cond
  1552.           ((or (= num 0)
  1553.                (= num 2)
  1554.            )
  1555.            (progn
  1556.              (setq len           (car (caddr subset))
  1557.                    Z_end   (+ Z_start len)
  1558.                    group_Z (create_group_Z Z_start Z_end 1)
  1559.              )
  1560.              (setq group_data_out
  1561.                     (solve_transition_curve group_Z subset)
  1562.              )
  1563.            )
  1564.           )
  1565.           ((= num 1)
  1566.            (progn
  1567.              (setq len           (caddr subset)
  1568.                    Z_end   (+ Z_start len)
  1569.                    group_Z (create_group_Z Z_start Z_end 1)
  1570.              )
  1571.              (setq group_data_out (solve_circular_arc group_Z subset))
  1572.            )
  1573.           )
  1574.           ((= num 3)
  1575.            (progn
  1576.              (setq len           (caddr subset)
  1577.                    Z_end   (+ Z_start len)
  1578.                    group_Z (create_group_Z Z_start Z_end 1)
  1579.              )
  1580.              (setq group_data_out (solve_straightway group_Z subset))
  1581.            )
  1582.           )
  1583.         )
  1584.         (setq lst   (cadr (assoc array group_transition))
  1585.               group (mapcar 'cadr group_data_out)
  1586.         )
  1587.         (cond
  1588.           ((= (cadr lst) 3)                ; 直线线元时
  1589.            (setq j 1)
  1590.           )
  1591.           ((= (cadr lst) 1)                ;圆曲线线元时
  1592.            (setq j 2)                        ; 黄色  
  1593.           )
  1594.           ;; 当缓和曲线时接直线和圆时   
  1595.           ((or (equal lst '(3 0 1))
  1596.                (equal lst '(1 2 3))
  1597.            )
  1598.            (setq j 3)                        ; 绿色  
  1599.           )
  1600.           ;; 当缓和曲线时接缓和曲线和圆时   
  1601.           ((or (equal lst '(2 0 1))
  1602.                (equal lst '(1 2 0))
  1603.            )
  1604.            (setq j 6)                        ; 洋红色  
  1605.           )
  1606.           ;; 当缓和曲线是接圆和圆时   
  1607.           ((or (equal lst '(1 0 1))
  1608.                (equal lst '(1 2 1))
  1609.            )
  1610.            (setq j 4)                        ; 青色  
  1611.           )
  1612.           (t
  1613.            (setq j 0)
  1614.           )
  1615.         )
  1616.         (entmake (append (list '(0 . "LWPOLYLINE")
  1617.                                '(100 . "AcDbEntity")
  1618.                                (cons 62 j)
  1619.                                '(100 . "AcDbPolyline")
  1620.                                (cons 90 (length group))
  1621.                          )
  1622.                          (mapcar '(lambda (U) (cons 10 U)) group)
  1623.                  )
  1624.         )
  1625.      )
  1626.     Line_segments
  1627.   )
  1628. )
  1629. ;;     (setq e (entlast)) (command "zoom" "e")      
  1630. ;;  (mapcar '(lambda (lst)  (draw_center_line   lst group_transition ) )   group_Line_segments )  











  1631. ;; 绘制公路曲线左右边线
  1632. ;;  (setq group_turning_point ( create_turning_point_group )  )  
  1633. ;;  (setq  group_widen (write_into_group_widen))     
  1634. (defun draw_side_boundary (Width         group_widen   Line_segments
  1635.                            mold                 group_transition
  1636.                            /                 lst
  1637.                           )
  1638.   ;; (setq Width 5 )   
  1639.   (mapcar                                ;  (setq subset (car (nth 2 Line_segments )) )      
  1640.     '(lambda (subset        /          lst            group_Z   num
  1641.               Z_start        Z_end          len            group_data_out
  1642.               subset_2        i          array            color
  1643.              )
  1644.        ;;去除 [( 转点号I j)   R_start R_end  transition_parameter   reflex  quadrant_ang    Z_start  U_insert )]中的第一个元素  
  1645.        (setq array    (car subset)
  1646.              num      (cadr array)
  1647.              subset_2 (cdr subset)
  1648.              reflex   (nth 3 subset_2)
  1649.              Z_start  (nth 5 subset_2)
  1650.        )
  1651.        (cond
  1652.          ((or (= num 0)
  1653.               (= num 2)
  1654.           )
  1655.           (progn
  1656.             (setq len          (car (caddr subset_2))
  1657.                   Z_end          (+ Z_start len)
  1658.                   group_Z (create_group_Z Z_start Z_end 1)
  1659.             )
  1660.             (setq group_data_out
  1661.                    (solve_transition_curve group_Z subset_2)
  1662.             )
  1663.           )
  1664.          )
  1665.          ((= num 1)
  1666.           (progn
  1667.             (setq len          (caddr subset_2)
  1668.                   Z_end          (+ Z_start len)
  1669.                   group_Z (create_group_Z Z_start Z_end 1)
  1670.             )
  1671.             (setq group_data_out (solve_circular_arc group_Z subset_2))
  1672.           )
  1673.          )
  1674.          ((= num 3)
  1675.           (progn
  1676.             (setq len          (caddr subset_2)
  1677.                   Z_end          (+ Z_start len)
  1678.                   group_Z (create_group_Z Z_start Z_end 1)
  1679.             )
  1680.             (setq group_data_out (solve_straightway group_Z subset_2))
  1681.           )
  1682.          )
  1683.        )                                ; cond 函数结束
  1684.        ;; 求group_Z 中每个桩号 的加宽值 , 当边线和转弯的方向一致时加宽
  1685.        (if (minusp (* reflex Width))
  1686.          ;; 当边线 和路线转弯方向不一致时,加宽值设置为0   
  1687.          (setq group
  1688.                 (mapcar
  1689.                   '(lambda (z)
  1690.                      0
  1691.                    )
  1692.                   group_Z
  1693.                 )
  1694.          )
  1695.          (setq group
  1696.                 (mapcar
  1697.                   '(lambda (z)
  1698.                      (calculate_Transition-curve_widen
  1699.                        Z
  1700.                        group_widen
  1701.                        subset
  1702.                        mold
  1703.                      )
  1704.                    )
  1705.                   group_Z
  1706.                 )
  1707.          )
  1708.        )
  1709.        ;; 利用加宽数组 group 对group_data_out 沿中心线方向 进行偏移操作  
  1710.        (setq i 0
  1711.              group_sideline
  1712.               nil
  1713.        )
  1714.        (mapcar '(lambda        (w / lst ang)
  1715.                   (setq lst (nth i group_data_out))
  1716.                   (apply '(lambda (z U quadrant_ang)
  1717.                             (if        (minusp Width)
  1718.                               (setq quadrant_ang (+ quadrant_ang pi))
  1719.                             )
  1720.                             (setq ang (+ quadrant_ang (* 0.5 pi))
  1721.                                   U   (polar U ang (+ w (abs Width)))
  1722.                             )
  1723.                             (setq group_sideline
  1724.                                    (cons (list z U quadrant_ang)
  1725.                                          group_sideline
  1726.                                    )
  1727.                             )
  1728.                           )
  1729.                          lst
  1730.                   )
  1731.                   (setq i (+ i 1))
  1732.                 )
  1733.                group
  1734.        )
  1735.        (setq group_sideline (reverse group_sideline))
  1736.        (setq lst   (cadr (assoc array group_transition))
  1737.              group (mapcar 'cadr group_data_out)
  1738.        )
  1739.        (cond
  1740.          ((= (cadr lst) 3)                ; 直线线元时
  1741.           (setq color 1)
  1742.          )
  1743.          ((= (cadr lst) 1)                ;圆曲线线元时
  1744.           (setq color 2)                ; 黄色  
  1745.          )
  1746.          ;; 当缓和曲线时接直线和圆时   
  1747.          ((or (equal lst '(3 0 1))
  1748.               (equal lst '(1 2 3))
  1749.           )
  1750.           (setq color 3)                ; 绿色  
  1751.          )
  1752.          ;; 当缓和曲线时接缓和曲线和圆时   
  1753.          ((or (equal lst '(2 0 1))
  1754.               (equal lst '(1 2 0))
  1755.           )
  1756.           (setq color 6)                ; 洋红色  
  1757.          )
  1758.          ;; 当缓和曲线是接圆和圆时   
  1759.          ((or (equal lst '(1 0 1))
  1760.               (equal lst '(1 2 1))
  1761.           )
  1762.           (setq color 4)                ; 青色  
  1763.          )
  1764.          (t
  1765.           (setq color 0)
  1766.          )
  1767.        )
  1768.        (draw_group_data_out group_sideline color (abs Width))
  1769.      )
  1770.     Line_segments
  1771.   )
  1772. )
  1773. ;; (setq  group_Line_segments (car ( create_group_Line_segments   group_turning_point  6782.755 ))  )   
  1774. ;;  (mapcar '(lambda (lst)  (draw_side_boundary   3.5  group_widen  lst  0 group_transition  ) )   group_Line_segments )  
  1775. ;;   (setq e (entlast)) (command "zoom" "e")        





  1776. ;; group_Line_segments 结构    [( 转点号I j)   R_start R_end  transition_parameter   reflex  quadrant_ang    Z_start  U_insert )]  
  1777. ;; 对线元集合group_Line_segments 中的起始点进行标注
  1778. (defun label_Line_segments
  1779.        (group_Line_segments group_transition / group group_2 i)

  1780.   (setq group (apply 'append group_Line_segments))
  1781.   (mapcar '(lambda (lst              /                Z          quadrant_ang
  1782.                     ang              U                string          string_2  array
  1783.                     U_offset  U_move        reflex          color
  1784.                    )
  1785.              (setq z                (nth 6 lst)
  1786.                    U                (nth 7 lst)
  1787.                    quadrant_ang        (nth 5 lst)
  1788.                    reflex        (nth 4 lst)
  1789.                    array        (car lst)
  1790.              )
  1791.              ;;  group_transition ( 转点号num j) (i j k) ,i 和 k 分别为该线元的 前后线元编号  i k 取值为0 ,1 ,2 ,3   
  1792.              (setq array   (cadr (assoc array group_transition))
  1793.                    array_2 (list (car array) (cadr array))
  1794.              )
  1795.              (cond
  1796.                ((equal array_2
  1797.                        '(3 0)
  1798.                 )
  1799.                 (setq string "ZH")
  1800.                )
  1801.                ((equal array_2
  1802.                        '(3 1)
  1803.                 )
  1804.                 (setq string "ZY")
  1805.                )
  1806.                ((equal array_2
  1807.                        '(0 1)
  1808.                 )
  1809.                 (setq string "HY")
  1810.                )
  1811.                ((equal array_2
  1812.                        '(1 0)
  1813.                 )
  1814.                 (setq string "YH")
  1815.                )
  1816.                ((equal array_2
  1817.                        '(1 2)
  1818.                 )
  1819.                 (setq string "YH")
  1820.                )
  1821.                ((equal array_2
  1822.                        '(1 3)
  1823.                 )
  1824.                 (setq string "YZ")
  1825.                )
  1826.                ((equal array_2
  1827.                        '(2 3)
  1828.                 )
  1829.                 (setq string "HZ")
  1830.                )
  1831.                ((equal array_2
  1832.                        '(2 0)
  1833.                 )
  1834.                 (setq string "HH")
  1835.                )
  1836.                ((equal array_2
  1837.                        '(2 1)
  1838.                 )
  1839.                 (setq string "HY")
  1840.                )
  1841.                (t
  1842.                 (setq string "88")
  1843.                )
  1844.              )                                ; cond 函数结束

  1845.              (cond
  1846.                ((= (cadr array) 3)        ; 直线线元时
  1847.                 (setq color 1)
  1848.                )
  1849.                ((= (cadr array) 1)        ;圆曲线线元时
  1850.                 (setq color 2)                ; 黄色  
  1851.                )
  1852.                ;; 当缓和曲线时接直线和圆时   
  1853.                ((or (equal array '(3 0 1))
  1854.                     (equal array '(1 2 3))
  1855.                 )
  1856.                 (setq color 3)                ; 绿色  
  1857.                )
  1858.                ;; 当缓和曲线时接缓和曲线和圆时   
  1859.                ((or (equal array '(2 0 1))
  1860.                     (equal array '(1 2 0))
  1861.                 )
  1862.                 (setq color 6)                ; 洋红色  
  1863.                )
  1864.                ;; 当缓和曲线是接圆和圆时   
  1865.                ((or (equal array '(1 0 1))
  1866.                     (equal array '(1 2 1))
  1867.                 )
  1868.                 (setq color 4)                ; 青色  
  1869.                )
  1870.                (t
  1871.                 (setq color 0)
  1872.                )
  1873.              )
  1874.              ;; 创建标注桩号用的文字符   
  1875.              (setq string_2 (f_zhuanghao Z)
  1876.                    string   (strcat string ": " string_2)
  1877.              )
  1878.              (setq
  1879.                ang (+ quadrant_ang
  1880.                       (* (* 0.5 pi) reflex)
  1881.                    )
  1882.              )
  1883.              (setq U_offset (polar U ang 28)
  1884.                    U_move   (polar U ang 48)
  1885.              )
  1886.              (entmakex
  1887.                (list '(0 . "line")
  1888.                      (cons 62 color)
  1889.                      (cons 10 U)
  1890.                      (cons 11 U_offset)
  1891.                )
  1892.              )
  1893.              ;; 对文字的 方向角度进行控制,使得其保持在0--180度之内
  1894.              (if (> ang pi)
  1895.                (setq ang (- ang pi))
  1896.              )
  1897.              (entmake
  1898.                (list '(0 . "TEXT")
  1899.                      (cons 62 color)
  1900.                      (append '(10) U_move)
  1901.                      (cons 40 3)
  1902.                      (cons '1 string)
  1903.                      (cons 50 ang)
  1904.                      '(72 . 1)
  1905.                      (append '(11) U_move)
  1906.                      '(73 . 2)
  1907.                )
  1908.              )
  1909.            )
  1910.           group
  1911.   )
  1912. )
  1913. ;; (label_Line_segments   group_Line_segments group_transition )  





  1914. ;; 对group_data_JD (list Z_JD U ang JD   reflex )   数组进行标注  
  1915. ;;  (setq  lst  (create_group_Line_segments  group_turning_point  6782.755 )) (setq  group_data_JD (cadr lst))  
  1916. (defun lable_group_turning_point
  1917.        (group_data_JD group_turning_point / group U)
  1918.   ;; 画出group_turning_point 中的转点  
  1919.   (setq group (mapcar 'cadr group_turning_point))
  1920.   (entmake (append (list '(0 . "LWPOLYLINE")
  1921.                          '(100 . "AcDbEntity")
  1922.                          (cons 6 "tang")
  1923.                          (cons 48 8)
  1924.                          '(100 . "AcDbPolyline")
  1925.                          (cons 90 (length group))
  1926.                    )
  1927.                    (mapcar '(lambda (U) (cons 10 U)) group)
  1928.            )
  1929.   )
  1930.   ;; 对group_turning_point中的交点用数组group_data_JD 进行桩号标注  
  1931.   (mapcar
  1932.     '(lambda (lst / string ang U_offset U_move lst2)
  1933.        (apply '(lambda (Z U quadrant_ang JD reflex)
  1934.                  (setq string (f_zhuanghao Z)
  1935.                        string (strcat "JD" (itoa JD) ": " string)
  1936.                  )
  1937.                  (setq
  1938.                    ang          (- quadrant_ang
  1939.                              (* (* 0.5 pi) reflex)
  1940.                           )
  1941.                    U_move (polar U ang 50)
  1942.                  )
  1943.                  ;; 对文字的 方向角度进行控制,使得其保持在0--180度之内  
  1944.                  (if (> ang pi)
  1945.                    (setq ang (- ang pi))
  1946.                  )
  1947.                  (entmake
  1948.                    (list '(0 . "TEXT")
  1949.                          (append '(10) U_move)
  1950.                          (cons 40 3)
  1951.                          (cons '1 string)
  1952.                          (cons 50 ang)
  1953.                          '(72 . 1)
  1954.                          (append '(11) U_move)
  1955.                          '(73 . 2)
  1956.                    )
  1957.                  )
  1958.                )
  1959.               lst
  1960.        )
  1961.        ;; (setq lst ( car group_data_JD ))  
  1962.      )
  1963.     group_data_JD
  1964.   )
  1965. )                                        ; test_tang_5 函数结束  
  1966. ;; (lable_group_turning_point  group_data_JD group_turning_point )  

  1967. ;; 绘图用函数函数结束 88888    绘图用函数函数结束88888     绘图用函数函数结束88888    绘图用函数函数结束88888    绘图用函数函数结束88888   绘图用函数函数结束   






  1968. ;;  dcl使用文件       888888888888888888         dcl使用文件       888888888888888888     dcl使用文件       888888888888888888      
  1969. (setq dialog_tang
  1970.        '("JD_item:list_box{  key="JD_list"; label="交点参数表:"; value=0;"
  1971.          "list=" ( 转点号  转点状态nil) 转点坐标  ( Lh1 R  Lh2  ) \\n ( 转点号  转点状态t) 转点坐标 (R_start R R_end  Lh1 Lh2 )";"
  1972.          "allow_accept=true;}"
  1973.          "Line_segments :list_box{  key="Line_segments"; label="线元参数参数表:"; value=0;"
  1974.          "list="( 转点号I j) 起点半径 终点半径  曲线长度  偏转系数  线元起点象限角  起点桩号  起点坐标 ) ";"
  1975.          "allow_accept=true;}"
  1976.          "table_wide :list_box{  key="table_wide"; label="交点加宽参数参数表:"; value=0;"
  1977.          "list=" 交点号  交点加宽值 ";"
  1978.          "allow_accept=true;}"
  1979.          "scfg:toggle{  label="曲线加宽方式,选中为直线加宽,不选普通加宽";  key="scfg";}"
  1980.          "Z_road_start :edit_box {label="请选择线路起点桩号:";  key= "Z_road_start";value="0";allow_accept=true;}"
  1981.          "Wide_L :edit_box {label="路线左幅宽度:";  key= "Wide_L";value="5";allow_accept=true;}"
  1982.          "Wide_R :edit_box {label="路线右幅宽度:";  key= "Wide_R";value="10";allow_accept=true;}"
  1983.          "insert_table_J :button {label="请选择交点参数列表:";  key= "insert_table_J";    }"
  1984.          "insert_table_W :button {label="请选择加宽参数列表:";  key= "insert_table_W"; }"
  1985.          "draw :button {label="绘制曲线:";  key= "draw"; fixed_width=true;width=12;}"
  1986.          "calculate :button {label="计算线元参数:";  key= "calculate";  }"
  1987.          "draw_road:"
  1988.          "dialog{  label="用变换群的方法绘制公路曲线";  spacer;"
  1989.          "fixed_width=true;"
  1990.          "width=118;"
  1991.          ": boxed_row  {JD_item;"
  1992.          ": column {  fixed_width=true;width=20;"
  1993.          "insert_table_J;  spacer;    calculate ; }"
  1994.          "}"
  1995.          "Line_segments ;"
  1996.          ": boxed_row   { table_wide ;"
  1997.          ": column{   fixed_width=true;width=50;"
  1998.          "scfg ; insert_table_W ;"
  1999.          "Z_road_start ; Wide_L ; Wide_R ;"
  2000.          "}"
  2001.          "}"
  2002.          ": boxed_row   {    ok_cancel;  draw;     }"
  2003.          "}"
  2004.         )

  2005. )

  2006. (defun Dcl_write (lst / dcl_file str file)
  2007.   (vl-load-com)
  2008.   (setq dcl_file (vl-filename-mktemp nil nil ".dcl"))
  2009.   (setq file (open dcl_file "w"))
  2010.   (foreach str lst (write-line str file))
  2011.   (close file)
  2012.   (setq id (load_dialog dcl_file))
  2013. )

  2014. (defun C:use_dcl (/                   id                    sdt
  2015.                   group_turning_point                    group_Line_segments
  2016.                   group_Line_segments                    group_widen
  2017.                   W_L                   W_R                    mold
  2018.                  )
  2019.   (if nil
  2020.     (setq ID
  2021.            (load_dialog
  2022.              "D:\\工作文件\\新建文件夹\\work\\公路曲线简易程序\\绘制公路曲线"
  2023.            )
  2024.     )
  2025.     (Dcl_write dialog_tang)
  2026.   )
  2027.   ;; 创建一个绘制交点直线的线性   
  2028.   (if (not (tblobjname "LTYPE" "tang"))
  2029.     (entmake
  2030.       (list '(0 . "LTYPE")
  2031.             '(100 . "AcDbSymbolTableRecord")
  2032.             '(100 . "AcDbLinetypeTableRecord")
  2033.             (cons 2 "tang")                ; 线形名   
  2034.             '(3 . "点画线 ____   ____   ____") ; 线型的说明文字   

  2035.             '(70 . 0)                        ;标准标记值(按位编码值)

  2036.             '(73 . 2)                        ;线型元素的数目
  2037.             '(40 . 20.0)                ; 图案总长度

  2038.             '(49 . 15.0)                ; 虚线、点或空间长度(每个元素一个条目)
  2039.             '(74 . 0)                        ; 复杂线型元素类型(每个元素一种类型)。 默认值为 0(无嵌入的形/文字)

  2040.             '
  2041.              (49 . -5.0)
  2042.             '(74 . 0)
  2043.             '(46 . 50)
  2044.       )
  2045.     )
  2046.   )

  2047.   (if (not (new_dialog "draw_road" id))
  2048.     (exit)
  2049.   )
  2050.   (setq sdt 1)
  2051.   (while (> sdt 0)

  2052.     (action_tile
  2053.       "insert_table_J"
  2054.       "(action_insert_table_J) "
  2055.     )
  2056.     (action_tile
  2057.       "calculate"
  2058.       "(action_calculate) "
  2059.     )
  2060.     (action_tile
  2061.       "insert_table_W"
  2062.       "(action_insert_table_W) "
  2063.     )
  2064.     (action_tile
  2065.       "draw"
  2066.       "(action_draw)(done_dialog -8 )"
  2067.     )
  2068.     (setq sdt (start_dialog))
  2069.   )
  2070.   (unload_dialog id)
  2071.   (if (= sdt -8)
  2072.     (progn
  2073.       (if group_Line_segments
  2074.         (progn
  2075.           (setq        group_transition
  2076.                  (create_group_transition
  2077.                    group_Line_segments
  2078.                  )
  2079.           )
  2080.           (mapcar '(lambda (lst) (draw_center_line lst group_transition))
  2081.                   group_Line_segments
  2082.           )
  2083.           (mapcar
  2084.             '(lambda (lst)
  2085.                (draw_side_boundary
  2086.                  W_L group_widen lst mold group_transition)
  2087.              )
  2088.             group_Line_segments
  2089.           )
  2090.           (mapcar
  2091.             '(lambda (lst)
  2092.                (draw_side_boundary
  2093.                  W_R group_widen lst mold group_transition)
  2094.              )
  2095.             group_Line_segments
  2096.           )
  2097.           (label_Line_segments group_Line_segments group_transition)
  2098.         )
  2099.       )
  2100.       (if (and group_data_JD group_turning_point)
  2101.         (lable_group_turning_point
  2102.           group_data_JD
  2103.           group_turning_point
  2104.         )
  2105.       )
  2106.       (setq e (entlast))
  2107.       (command "zoom" "e")
  2108.     )
  2109.   )                                        ;  (if (= sdt 8) 函数结束  
  2110. )
  2111. ;;       (setq e (car (entsel "pick a object :" )))    (setq tang  (entget e )  )   


  2112. (defun action_calculate        (/ lst group road_start group_sum n)
  2113.   (setq        road_start (get_tile "Z_road_start")
  2114.         road_start (atof road_start)
  2115.   )
  2116.   (if group_turning_point
  2117.     (progn
  2118.       (setq
  2119.         lst
  2120.          (create_group_Line_segments group_turning_point road_start)
  2121.         group_Line_segments
  2122.          (car lst)
  2123.         group_data_JD
  2124.          (cadr lst)
  2125.         group_sum (apply 'append group_Line_segments)
  2126.       )
  2127.       ;; 用 group_Line_segments 填充列表框 "Line_segments"
  2128.       (setq group_sum
  2129.              (mapcar                        ; (setq lst (car group_sum))  (setq x_7 ( nth 7  lst))   
  2130.                '(lambda        (lst / lenth lst_label)
  2131.                   (apply '(lambda (x_0 x_1 x_2 x_3 x_4 x_5 x_6 x_7)
  2132.                             (setq x_0 (mapcar 'itoa x_0)
  2133.                                   x_0 (list (car x_0) "-" (cadr x_0))
  2134.                                   x_0 (apply 'strcat x_0)
  2135.                             )
  2136.                             (setq x_7 (mapcar 'rtos x_7)
  2137.                                   x_7 (list "N:" (cadr x_7) " E:" (car x_7))
  2138.                                   x_7 (apply 'strcat x_7)
  2139.                             )
  2140.                             (setq
  2141.                               x_6 (f_zhuanghao x_6)
  2142.                             )
  2143.                             (if        (atom x_3)
  2144.                               (setq lenth x_3)
  2145.                               (setq lenth (car x_3))
  2146.                             )
  2147.                             (setq lenth        (* lenth 1.0)
  2148.                                   x_3        (rtos lenth 2 2)
  2149.                                   x_5        (angtos x_5 1 6)
  2150.                             )
  2151.                             ;; 对(list x_0 x_1 x_2 x_3 x_4 x_5 x_6 x_7 ) 进行标注
  2152.                             (setq lst            (list x_0 x_1 x_2 x_3 x_4 x_5 x_6 x_7)
  2153.                                   lst_label (list "R_s:"
  2154.                                                   "R_e:"
  2155.                                                   "lenth:"
  2156.                                                   "reflex:"
  2157.                                                   "α_s:"
  2158.                                                  )
  2159.                                   lst            (append lst lst_label)
  2160.                             )
  2161.                             ;;  lst顺序为 (0 1 2 3 4 5 6 7 8 9 10 11 12 )
  2162.                             (mapcar '(lambda (i)
  2163.                                        (nth i lst)
  2164.                                      )
  2165.                                     (list 0 8 1 9 2 10 3 11 4 12 5 6 7)
  2166.                             )

  2167.                           )
  2168.                          lst
  2169.                   )
  2170.                 )
  2171.                group_sum
  2172.              )
  2173.       )
  2174.       (setq group                        ; (setq lst (car group_sum ))  
  2175.              (mapcar '(lambda (lst / string)
  2176.                         (setq string (vl-princ-to-string lst))
  2177.                         (setq string (vl-string-left-trim "\(" string)
  2178.                               string (vl-string-right-trim "\)" string)
  2179.                         )
  2180.                       )
  2181.                      group_sum
  2182.              )
  2183.       )
  2184.       (start_list "Line_segments" 3)
  2185.       (mapcar 'add_list group)
  2186.       (end_list)
  2187.       (setq n (length group))
  2188.       (set_tile "Line_segments" (itoa n))
  2189.     )
  2190.     ;; 当group_turning_point 数组为空时
  2191.     (progn
  2192.       (start_list "Line_segments" 2)
  2193.       (mapcar 'add_list (list "您还没有输入交点数组!"))
  2194.       (end_list)
  2195.       (setq n (length group))
  2196.       (set_tile "Line_segments" (itoa n))
  2197.     )
  2198.   )
  2199. )                                        ;   action_calculate 函数结束


  2200. (defun action_insert_table_W (/ lst group)
  2201.   (setq group_widen (write_into_group_widen))
  2202.   ;; 用group_widen 数组分别对列表框 "table_wide" 进行填充
  2203.   (setq        group
  2204.          (mapcar '(lambda (lst
  2205.                            /
  2206.                            JD
  2207.                            W
  2208.                           )
  2209.                     (setq JD (itoa (car lst))
  2210.                           W  (rtos (cadr lst) 2 3)
  2211.                     )
  2212.                     (strcat "JD: " JD "  加宽:" W)

  2213.                   )
  2214.                  group_widen
  2215.          )
  2216.   )
  2217.   (start_list "table_wide" 3)
  2218.   (mapcar 'add_list group)
  2219.   (end_list)
  2220. )                                        ;   action_insert_table_W 函数结束

  2221. ;; 定义插入交点文件按钮的函数     
  2222. (defun action_insert_table_J (/ lst group)
  2223.   (setq group_turning_point (create_turning_point_group))
  2224.   ;; 用group_turning_point 数组分别对列表框 "JD_list"
  2225.   ;; 用group_turning_point 数组分别对列表框 "JD_list"
  2226.   (setq        group
  2227.          (mapcar
  2228.            '(lambda (lst / state subset_label)
  2229.               (apply '(lambda (x_0 x_1 x_2 x_3)
  2230.                         (setq x_1 (mapcar 'rtos x_1)
  2231.                               x_1 (list "N:" (cadr x_1) " E:" (car x_1))
  2232.                               x_1 (apply 'strcat x_1)
  2233.                         )
  2234.                         (if (cadr x_0)
  2235.                           (progn
  2236.                             (setq state "Yes")
  2237.                             (setq
  2238.                               x_2 (apply '(lambda (y_0 y_1 y_2 y_3 y_4)
  2239.                                             (setq subset_label (list "R_s"
  2240.                                                                      "R"
  2241.                                                                      "R_e"
  2242.                                                                      "Lh1"
  2243.                                                                      "Lh2")
  2244.                                                   subset       (list y_0 y_1 y_2 y_3 y_4)
  2245.                                                   subset       (append subset subset_label)
  2246.                                             )
  2247.                                             (mapcar '(lambda (i)
  2248.                                                        (nth i subset)
  2249.                                                      )
  2250.                                                     (list 5 0 6 1 7 2 8 3 9 4)
  2251.                                             )
  2252.                                           )
  2253.                                          x_2
  2254.                                   )
  2255.                             )
  2256.                           )
  2257.                           (progn
  2258.                             (setq state "No")
  2259.                             (setq x_2 (apply '(lambda (y_0 y_1 y_2)
  2260.                                                 (setq subset_label (list "Lh1" "R" "Lh2")
  2261.                                                       subset           (list y_0 y_1 y_2)
  2262.                                                       subset           (append subset subset_label)
  2263.                                                 )
  2264.                                                 (mapcar        '(lambda (i)
  2265.                                                            (nth i subset)
  2266.                                                          )
  2267.                                                         (list 3 0 4 1 5 2)
  2268.                                                 )
  2269.                                               )
  2270.                                              x_2
  2271.                                       )
  2272.                             )
  2273.                           )
  2274.                         )                ; (if (cadr x_0) 函数结束
  2275.                         (setq x_2 (vl-princ-to-string x_2)
  2276.                               x_2 (vl-string-left-trim "\(" x_2)
  2277.                               x_2 (vl-string-right-trim "\)" x_2)
  2278.                         )
  2279.                         (list "JD:" (car x_0) state x_1 x_2)
  2280.                       )
  2281.                      lst
  2282.               )
  2283.             )
  2284.            group_turning_point
  2285.          )
  2286.   )
  2287.   (setq        group
  2288.          (mapcar '(lambda (lst / string)
  2289.                     (setq string (vl-princ-to-string lst)
  2290.                           string (vl-string-left-trim "\(" string)
  2291.                           string (vl-string-right-trim "\)" string)
  2292.                     )
  2293.                   )
  2294.                  group
  2295.          )
  2296.   )

  2297.   (start_list "JD_list" 3)
  2298.   (mapcar 'add_list group)
  2299.   (end_list)
  2300. )                                        ;   action_insert_table_J 函数结束

  2301. ;; 定义 绘图按钮draw 的函数   
  2302. (defun action_draw (/)
  2303.   (setq        W_L  (get_tile "Wide_L")
  2304.         W_L  (atof W_L)
  2305.         W_R  (get_tile "Wide_R")
  2306.         W_R  (* (atof W_R) -1.0)
  2307.         mold (get_tile "scfg")
  2308.         mold (atoi mold)                ; 加宽方式   
  2309.   )

  2310. )

  2311. ;;  (setq e (entlast))    (command "zoom" "e")     


您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-15 08:41 , Processed in 0.221589 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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