找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1172|回复: 3

[每日一码] 道路设计横断面挖台阶

[复制链接]

已领礼包: 55个

财富等级: 招财进宝

发表于 2018-12-6 10:49:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 newer 于 2018-12-6 11:06 编辑

  1. ;;;本程序用于横断面台阶设计,准备横断面如实例,运行TAIJIE
  2. ;;;首先在CAD中选择要画横断面的线,LINE PLINE均可,次序不影响
  3. ;;;然后输入台阶宽度,坡率即可
  4. ;;;套用大师的排序程序,恕不缴费
  5. ;;;设计者:韩建文,尚不完善,发个玩玩!!!
  6. (defun C:taijie()
  7.         (setq tl (getdist"/n 请输入台阶水平宽度:"))
  8.         (setq tp (getdist"/n 请输入台阶水平坡率:"))
  9.         ;取得系统默认扑捉模式
  10.         (setq os(getvar"OSMODE"))
  11.         ;设定程序使用捕捉模式,全捕捉
  12.         (setvar"OSMODE" 4133)
  13.         (setq pt0 (getpoint"/n 请输入台阶起点:"))
  14.         (setq ptz (getpoint"/n 请输入台阶终点:"))
  15.         ;获得选择集
  16.         (setq ts (ssget))
  17.         ;取消光标捕捉
  18.         (setvar"OSMODE" 0)
  19.         ;设定图层和台阶线颜色
  20.         (if(null (tblsearch"layer""taijie"))
  21.                     (command"layer""new""taijie""color""yellow""taijie""lt""continuous""taijie""lw""0.2""taijie""")
  22.         )
  23.          (setvar"CLAYER""taijie")

  24.         ;如果是直线段,操作选择集排序,按10位x坐标从小到大排序
  25.         (vl-load-com)
  26.         (setq ts(SORT-SE ts 10 0 nil nil))        

  27.         ;如果是直线段组成,操作选择集,去除画台阶范围之外的线段
  28.         (setq n 0)
  29.         (repeat (sslength ts)

  30.                 (setq e (ssname ts n))
  31.                 (setq el (entget e))
  32.                 (setq n (+ n 1))
  33.                 (if (= "LINE" (cdr(assoc 0 el)))
  34.                 (progn
  35.                         (setq p1 (cdr(assoc 10 el)))
  36.                         (setq p2 (cdr(assoc 11 el)))
  37.                         (if (and (<= (car p1) (car pt0)) (<= (car p2) (car pt0)))
  38.                         (progn
  39.                                 (setq ts (ssdel e ts))
  40.                                 (setq n(- n 1))
  41.                         );eng progn
  42.                         );endif
  43.                         (if (and (>= (car p1) (car ptz)) (>= (car p2) (car ptz)))
  44.                         (progn
  45.                                 (setq ts (ssdel e ts))
  46.                                 (setq n(- n 1))
  47.                         );eng progn
  48.                         );endif
  49.                 );end progn
  50.                 );endif

  51.          );end repeat

  52.         ;选择集从第一个开始
  53.         (setq n 0)
  54.         (repeat (sslength ts)

  55.                 (setq e (ssname ts n))
  56.                 (setq el (entget e))
  57.                 ;如果是直线LINE
  58.                 (if (= "LINE" (cdr(assoc 0 el)))
  59.                 (progn
  60.                 (setq p1 (cdr(assoc 10 el)))
  61.                 (setq p2 (cdr(assoc 11 el)))
  62.                 ;如果线段P2交点在划线端点之外,则调整端点为P2点
  63.                 (if (<(car ptz) (car p2)) (setq p2 ptz))
  64.                 (while (< (car pt0) (car p2))
  65.                         (setq ang1 (angle p1 p2))
  66.                         (setq tll tl)
  67.                         (if (> ang1 (* 1.5 pi))
  68.                                 (progn
  69.                                 (setq th (* tll tp))
  70.                                 (setq pt1 (list (car pt0) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1))) th) 0.0))
  71.                                 (setq pt2 (list (+ (car pt0) tll) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1)))) 0.0))
  72.                                 (if(< (- (car p2) (car pt2)) tll)
  73.                                         (progn
  74.                                         (setq tll (+ (- (car p2) (car pt2)) tll))
  75.                                         (setq th (* tll tp))
  76.                                         (setq pt1 (list (car pt0) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1))) th) 0.0))
  77.                                         (setq pt2 (list (+ (car pt0) tll) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1)))) 0.0))
  78.                                         )
  79.                                 );endif
  80.                                 );end progn
  81.                         );endif
  82.                         (if (< ang1 (* 0.5 pi))
  83.                                 (progn
  84.                                 (setq th (* tll tp))
  85.                                 (setq pt1 (list (+ (car pt0) tll) (+ (cadr pt0) th) 0.0))
  86.                                 (setq pt2 (list (+ (car pt0) tll) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1)))) 0.0))
  87.                                 (if(< (- (car p2) (car pt2)) tll)
  88.                                         (progn
  89.                                         (setq tll (+ (- (car p2) (car pt2)) tll))
  90.                                         (setq th (* tll tp))
  91.                                         (setq pt1 (list (+ (car pt0) tll) (+ (cadr pt0) th) 0.0))
  92.                                         (setq pt2 (list (+ (car pt0) tll) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1)))) 0.0))
  93.                                         )
  94.                                 );endif
  95.                                 );end progn
  96.                         );endif
  97.                         (if(and (>= ang1 0.2) (<= ang1 6.08)) (command "line" pt0 pt1 pt2 ""))
  98.                         (setq pt0 pt2)
  99.                 );endwhile
  100.                 );end progn
  101.                 (setq n (+ n 1))
  102.                 )endif

  103.                 ;如果是多义线POLYLINE
  104.                 (if (= "LWPOLYLINE" (cdr(assoc 0 el)))
  105.                 ;获取多义线的顶点,首先取得起点坐标
  106.                 (PROGN
  107.                 (setq EN1_DATA el)
  108.                 (SETQ ZM1 0)
  109.                 (SETQ ZM (CDR (ASSOC 90 EN1_DATA)));顶点的数量
  110.                 ;循环直到第一个顶点
  111.                 (while (/= (CAR (CAR EN1_DATA)) 10)
  112.                         (SETQ EN1_DATA (CDR EN1_DATA))
  113.                 );endwhile
  114.                 ;找到第一个顶点,赋值P1
  115.                 (IF (= (CAR (CAR EN1_DATA)) 10)
  116.                         (PROGN
  117.                          (SETQ p1 (CDR (CAR EN1_DATA)));取出第一个点的坐标
  118.                           (SETQ ZM1 (+ ZM1 1))
  119.                         (setq EN1_DATA (CDR EN1_DATA))
  120.                         );end progn
  121.                 );END IF
  122.                 ;循环找到下一个顶点
  123.                    (WHILE (< ZM1 ZM)
  124.                 (while (/= (CAR (CAR EN1_DATA)) 10)
  125.                         (SETQ EN1_DATA (CDR EN1_DATA))
  126.                 );end while
  127.                 ;如果找到这个顶点,赋值P2
  128.                 (IF (= (CAR (CAR EN1_DATA)) 10)
  129.                         (PROGN
  130.                          (SETQ p2 (CDR (CAR EN1_DATA)));取出后续每一个点的坐标
  131.                           (SETQ ZM1 (+ ZM1 1))
  132.                         (setq EN1_DATA (CDR EN1_DATA))
  133.                         );END PROGN
  134.                  );END IF
  135.                         ;如果找到P1P2点在选择点之外,下一个实体
  136.                         (if (and (<(car p1) (car pt0)) (<(car p2) (car pt0))) (setq n (1+ n)))
  137.                         (if (and (>(car p1) (car ptz)) (>(car p2) (car pt0))) (setq n (1+ n)))
  138.                         ;开始画台阶
  139.                         (if (<(car ptz) (car p2)) (setq p2 ptz))
  140.                         (while (< (car pt0) (car p2))
  141.                         (setq ang1 (angle p1 p2))
  142.                         (setq tll tl)
  143.                         (if (> ang1 (* 1.5 pi))
  144.                                 (progn
  145.                                 (setq th (* tll tp))
  146.                                 (setq pt1 (list (car pt0) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1))) th) 0.0))
  147.                                 (setq pt2 (list (+ (car pt0) tll) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1)))) 0.0))
  148.                                 (if(< (- (car p2) (car pt2)) tll)
  149.                                         (progn
  150.                                         (setq tll (+ (- (car p2) (car pt2)) tll))
  151.                                         (setq th (* tll tp))
  152.                                         (setq pt1 (list (car pt0) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1))) th) 0.0))
  153.                                         (setq pt2 (list (+ (car pt0) tll) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1)))) 0.0))
  154.                                         )
  155.                                 );endif
  156.                                 );end progn
  157.                         );endif
  158.                         (if (< ang1 (* 0.5 pi))
  159.                                 (progn
  160.                                 (setq th (* tll tp))
  161.                                 (setq pt1 (list (+ (car pt0) tll) (+ (cadr pt0) th) 0.0))
  162.                                 (setq pt2 (list (+ (car pt0) tll) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1)))) 0.0))
  163.                                 (if(< (- (car p2) (car pt2)) tll)
  164.                                         (progn
  165.                                         (setq tll (+ (- (car p2) (car pt2)) tll))
  166.                                         (setq th (* tll tp))
  167.                                         (setq pt1 (list (+ (car pt0) tll) (+ (cadr pt0) th) 0.0))
  168.                                         (setq pt2 (list (+ (car pt0) tll) (+ (cadr pt0) (* tll (/ (sin ang1) (cos ang1)))) 0.0))
  169.                                         )
  170.                                 );endif
  171.                                 );end progn
  172.                         );endif
  173.                         (if(and (>= ang1 0.2) (<= ang1 6.08)) (command "line" pt0 pt1 pt2 ""))
  174.                         (setq pt0 pt2)
  175.                         );endwhile
  176.                 (SETQ P1 P2)

  177.                 );END WHILE

  178.                 );end progn
  179.                 (setq n (1+ n))
  180.                 );end if
  181.         );endrepeat
  182.         (SETVAR "OSMODE" OS)
  183. )end defun

  184. ;;; 通用函数 选择集按照给定的组码值进行排序
  185. ;;;
  186. ;|;;参数说明:SE  ----要排序的选择集                                                                  
  187.               DXF ----排序依据的组码号                                                                 
  188.               INT ----如果组码值为一个表,则INT指出使用第几个;否则nil                                 
  189.               FUZZ----允许偏差;若无为nil                                                              
  190.               K   ----T表示从大到小,nil表示从小到大                                                   
  191.     返回值:排序后的选择集                                                                             
  192.     示例:(SORT-SE SS 10 0   5.0 T  )  表示按照10组码的X坐标值进行排序,允许偏差值为5.0,顺序为从大到小
  193.           (SORT-SE SS 10 1   3.0 NIL)  表示按照10组码的Y坐标值进行排序,允许偏差值为3.0,顺序为从小到大
  194.           (SORT-SE SS 8  NIL NIL NIL)  表示按照8组码值(图层名称)进行排序,顺序为从小到大            
  195. |;

  196. (defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
  197.     ;;建立排序列表
  198.     (setq LST '()
  199.           INDEX        0
  200.     )
  201.     (repeat (sslength SE)
  202.         (setq ENT (entget (ssname SE INDEX))
  203.               TMP (cdr (assoc DXF ENT))
  204.         )
  205.         (if (and INT
  206.                  (= (type INT) 'INT)
  207.                  (= (type TMP) 'list)
  208.                  (< INT (length TMP))
  209.             )
  210.             (setq TMP (nth INT TMP))
  211.         )
  212.         (setq LST (cons
  213.                       (list TMP (cdr (assoc 5 ENT)))
  214.                       LST
  215.                   )
  216.         )
  217.         (setq INDEX (1+ INDEX))
  218.     )
  219.     ;;排序操作
  220.     (if        (and FUZZ
  221.              (or
  222.                  (= (type FUZZ) 'INT)
  223.                  (= (type FUZZ) 'REAL)
  224.              )
  225.              (or
  226.                  (= (type TMP) 'INT)
  227.                  (= (type TMP) 'REAL)
  228.              )
  229.         )
  230.         (setq NEWLST
  231.                  (vl-sort LST
  232.                           (function (lambda (E1 E2)
  233.                                         (< (+ (car E1) FUZZ) (car E2))
  234.                                     )
  235.                           )
  236.                  )
  237.         )
  238.         (setq NEWLST
  239.                  (vl-sort LST
  240.                           (function (lambda (E1 E2)
  241.                                         (< (car E1) (car E2))
  242.                                     )
  243.                           )
  244.                  )
  245.         )
  246.     )
  247.     ;;如果K为T,则倒置
  248.     (if        K
  249.         (setq NEWLST (reverse NEWLST))
  250.     )
  251.     ;;组织排序后的选择集
  252.     (setq NEWSE (ssadd))
  253.     (foreach TMP NEWLST
  254.         (setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
  255.     )
  256.     ;;返回值
  257.     NEWSE
  258. ) ;_结束defun


RTX截图未命名.png

评分

参与人数 2D豆 +10 收起 理由
newer + 5 很给力!经验;技术要点;资料分享奖!
marting + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 10个

财富等级: 恭喜发财

发表于 2018-12-6 11:55:15 | 显示全部楼层
谢谢楼主,好人
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 71个

财富等级: 招财进宝

发表于 2018-12-6 19:41:46 | 显示全部楼层
谢谢楼主,好人
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2019-10-1 16:02:58 | 显示全部楼层
本帖最后由 zml84 于 2019-10-1 16:05 编辑

1、手工带帽,是各苦力活。楼主这又是何苦呢。。
2、可能是行业习惯不同,台阶坡向内外有别。
3、引用他人的通用函数,建议还是保留原作者信息。是基本素养。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 04:29 , Processed in 0.358083 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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