明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10567|回复: 33

[讨论] 拉筋箍筋符号源码解析与测试(支持UCS、形式切换、智能比例、统一命令)

    [复制链接]
发表于 2014-2-13 00:15 | 显示全部楼层 |阅读模式
本帖最后由 林霄云 于 2014-2-19 15:37 编辑

拉筋箍筋(支持UCS、形式切换、智能比例、统一命令)
原版本详见,拉筋符号源码解析与测试(详解算法,支持UCS、形式切换)
http://bbs.mjtd.com/forum.php?mo ... 170&fromuid=7303580
主函数调用
主要修改,增加点筋点数判断,当大于2时,采用箍筋命令
  1. (if ( >  total_pt 2)
  2. (progn
  3. (setq num-pt 0)
  4. (setq ss (ReinforceBar_G pt_list num-pt))

  5. (prompt "\n左击切换箍筋形式")

  6.       (while (and (setq ptr (grread t 15 2))
  7.               (not (and (= 2 (car ptr)); 键盘事件
  8.                     (or (= 13 (cadr ptr)) (= 32 (cadr ptr))) ;_Enter Space
  9.             ))
  10.              (not (or (= (car ptr) 11) (= (car ptr) 25)));_Mouse Right button
  11.                           )   
  12.                  ; (redraw)
  13.       (cond ((= (car ptr) 3);_Mouse Left button
  14.         (setq num-pt (1+ num-pt)) ;切换标志,删除,生成
  15.         (ss_delete ss)
  16.         (setq ss (ReinforceBar_G pt_list num-pt))
  17.            ))

  18. )

  19. );progn
  20. );if
其中子函数ReinforceBar_G,为绘制箍筋。
  1. (defun ReinforceBar_G(ptlist  num-pt / in-anglist ss pt_list h d en self-ang pt0 pt1 pt2 pt1a pt2a)
  2. ;函数ReinforceBar 生成箍筋,参数ptlist 点表,flag-num 箍筋弯钩位置。生成箍筋
  3. ;Desiged by 林霄云 2014年2月12日
本箍筋符号绘制的核心代码为,一,给定点表ptlist,形成封闭的多段线;二,求得多段线各个内角,以便箍筋弯钩的插入。
  1. (defun con_ptlist (ptlist / x-list x y)
  2. ……
  3. (defun con_anglist(ptlist / in-anglist total i x y )
  4. ……
函数列表
  1. ;;MAKE_LAYER
  2. ;;MAKE_STYLE
  3. ;;EN_OFFSET
  4. ;;SS2ENLIST
  5. ;;GET_PLINE_VERTEX
  6. ;;GET_MIDPOINT
  7. ;;GET_BAR_PTLIST
  8. ;;CON_PTLIST
  9. ;;MOD_I
  10. ;;CON_ANGLIST
  11. ;;MAKE_PLINE
  12. ;;MAKE_TEXT
  13. ;;SS_DELETE
  14. ;;REINFORCEBAR
  15. ;;REINFORCEBAR_G
  16. ;;C:RB
复制代码
结果:详见附图
实现了拉筋箍筋的大一统,其满足结构专业应用需求。
异性箍筋的绘制;箍筋弯钩的正确性与可切换。拉筋的正确性与可切换。支持UCS。支持比例切换。

补充代码解析
con_ptlist函数,并非用凸包算法,但是取一种可被理解的一般使用可以接受的便捷方式。凸包算法
  1. (defun con_ptlist (ptlist / x-list pt-first ang-list index-list out-list out-list1 i x y)
  2. ;函数con_ptlist,参数ptlist 点表。返回值,按逆时针排序好的,可生成pline的点表;但不保证是凸边形。
  3. ;Desiged by 林霄云 2014年2月12日

  4. ;取最右端点,当多个时,取右上端点,使用两次vl-sort就行。g版,在凸包算法中,定了复杂的lambda。
  5. (setq x-list (vl-sort
  6.                    (vl-sort ptlist '(lambda (x y) (< (cadr x) (cadr y)))) ; y坐标较小者在前面
  7.                    '(lambda (x y) (< (car x) (car y)))                ; x坐标较小者在前面
  8.                  ))
  9. (setq  pt-first (last x-list))  ;最后一个,为x的较大者,且y的较大者。   

  10. ;取角度list,然后进行极角排序,如果是凸包,极角相同时,得去掉距离近的点。此处并不处理。
  11.   (setq x-list (vl-remove pt-first x-list) ) ;去掉最后一个元素,因为其为起始点。
  12. ; (princ (vl-princ-to-string x-list))
  13.   (setq ang-list (mapcar '(lambda (x) (angle  pt-first x)) x-list));ang-list 与 x-list 有一一对应关系。(angle (setq pt1 (getpoint))(getpoint pt1))
  14. ; (princ (vl-princ-to-string ang-list))
  15.   (setq index-list (vl-sort-i ang-list '< ));最好不要有三点共线
  16. ; (princ (vl-princ-to-string index-list))
  17. ;生成点表
  18.   (setq i 0)
  19.   (setq out-list nil)
  20.   (repeat (setq total (length x-list))
  21.   (setq out-list (cons (nth (nth i index-list ) x-list) out-list))
  22.   (setq i (1+ i))
  23.   );repeat
  24. ;  (princ (vl-princ-to-string (reverse out-list)))

  25. ;对于结束边要逆序。处理共线问题。
  26. (setq i 1)
  27. (setq ang-last (angle pt-first (car out-list)))
  28. (while (= ang-last (angle pt-first (nth i out-list)))
  29. (setq i (1+ i))
  30. );while
  31. ;退出循环,i 保存了结束边点数(除了pt-first)。大于1时,需手工逆序;否则用reverse逆序。
  32. (if (> i 1)
  33. (progn
  34. (setq out-list1 nil)
  35. (setq ii 1)
  36. (repeat total
  37. (if (<= ii i)
  38. (setq out-list1 (cons (nth (- i ii) out-list) out-list1))
  39. (setq out-list1 (cons (nth  (- ii 1 ) out-list) out-list1))
  40. );if
  41. (setq ii (1+ ii))
  42. )

  43. (cons pt-first out-list1); 人工逆序。
  44. );progn
  45.   (cons pt-first (reverse out-list));
  46.    );if
  47.   );defun
为了定位箍筋弯钩直段,内角平分线作为基准线。对于内角列表,巧妙的使用rem函数,去掉正负性。欢迎指点。
  1. (defun con_anglist(ptlist / in-anglist total i x y )
  2. ;函数con_anglist,参数ptlist 点表。返回值,点表形成的多边形内角。
  3. ;Desiged by 林霄云 2014年2月12日
  4.     (setq i 0)
  5.   (setq in-anglist '())  
  6.   (setq total (length ptlist))
  7.     (repeat total
  8.   (setq in-anglist (cons (rem (+   (setq test1 (angle (nth i ptlist) (nth (mod_i (1- i) total) ptlist)))
  9.                 (-  (setq test2 (angle (nth i ptlist) (nth (mod_i (1+ i) total) ptlist))))
  10.                 (* 2 pi))
  11.                 (* 2 pi))
  12.               in-anglist))
  13.        (setq i (1+ i))
  14.     )
  15.    
  16.   (reverse in-anglist)
  17.   )
由于需要循环性,所以定义了mod_i函数,对角标值进行修正
  1.   (defun mod_i (i num)
  2. ;函数mod_i,返回值,对i进行调整,使其形成在0 num-1内循环。要求  -num-1 <i< 2*num
  3. ;Desiged by 林霄云 2014年2月12日
  4.   (if (< i 0) (setq i (+ i num) ) (if (>= i num) (setq i (- i num)) i ))
  5.   )
定义了一个简单的多段线偏移en_offset
  1. (defun en_offset(en d d-flag / en-obj)
  2. (setq en-obj (vlax-ename->vla-object en))
  3. (vla-offset en-obj d)
  4. (if d-flag (entdel en));d-flag :delete source flag
  5. )
定义了一个简单的多段线生成函数make_pline,设置了测试代码。
  1. (defun make_pline(ptlist layername c-flag / ucszdir  temp-list i in-anglist)
  2. ;函数make_pline,参数ptlist 点表,layername 图层名,c-flag闭合标识 t为闭合。返回值,点表形成的多边形。为简单的pline,不支持圆弧。
  3. ;Desiged by 林霄云 2014年2月12日

  4. (if c-flag (setq c-flag 1) (setq c-flag 0))
  5. (setq ucszdir (trans '(0 0 1) 1 0 T ));生成OCS法向量

  6. (setq temp-list  (mapcar '(lambda(x)(cons 10 x)) ptlist ) )

  7. (setq temp-list (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")
  8.                 (cons 210 ucszdir)(cons 8 layername)  (cons 90 (length ptlist)) (cons 70 c-flag)(cons 43 0))
  9.         temp-list ) )
  10. ;多线
  11. (EntMakex temp-list) ;返回ename
  12. );defun
定义了简单的图层生成函数make_layer
  1. (defun make_layer(layername code-6 code-62 code-370)
  2. (if (null (tblobjname "LAYER" layername) )
  3. (entmake (list '(0 . "LAYER")
  4.         '(100 . "AcDbSymbolTableRecord")
  5.         '(100 . "AcDbLayerTableRecord")
  6.         '(70 . 0)
  7.     (cons 2 layername)
  8.         (cons 6 code-6)   ;线型Continuous
  9.        (cons 62 code-62)  ;颜色
  10.     (cons 370 code-370)  ;线宽,整数,50表示0.50 9表示0.09
  11.         )
  12.     )
  13. );if
  14. );defun
等等,

本帖子中包含更多资源

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

x

评分

参与人数 4明经币 +2 金钱 +20 收起 理由
tigcat + 1 很给力!
angelnoeyeb + 10 很给力!
GamIng + 10 很给力!结构的福音!
xyp1964 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 学习|主题: 24, 订阅: 0
发表于 2021-12-14 16:22 | 显示全部楼层
好程序,再加上设置线宽更完美了,code-370我还不会
发表于 2023-6-9 16:21 | 显示全部楼层
支持一下,为结构设计减少点工作量。
发表于 2014-2-13 09:18 来自手机 | 显示全部楼层
牛,可惜用不起
 楼主| 发表于 2014-2-13 09:43 | 显示全部楼层
429014673 发表于 2014-2-13 09:18
牛,可惜用不起

源代码还在整理,由于定义了多个子函数,为了其具有通用性,需要点时间调试。
回头这个,都免费。
发表于 2014-2-13 09:58 | 显示全部楼层
支持一下,为结构设计减少点工作量。
发表于 2014-2-13 10:40 | 显示全部楼层
异性箍筋的绘制,太实用了
发表于 2014-2-13 11:38 | 显示全部楼层
不错,用心了
发表于 2014-2-13 11:38 | 显示全部楼层
能不能修改下钢筋图层可以自定义,钢筋宽度可以自定义
发表于 2014-2-13 12:59 | 显示全部楼层
这样的有木有?

本帖子中包含更多资源

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

x
 楼主| 发表于 2014-2-13 14:41 | 显示全部楼层
zhl0123321 发表于 2014-2-13 11:38
能不能修改下钢筋图层可以自定义,钢筋宽度可以自定义

可以考虑,提供一个接口函数,让用户设置,并保存。
 楼主| 发表于 2014-2-13 14:46 | 显示全部楼层
xyp1964 发表于 2014-2-13 12:59
这样的有木有?

可以分次实现。
在选择点筋后,生成的点筋点表,过滤掉,使内角大于或等于pi的点。
但是,得多次选择。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 06:25 , Processed in 0.368977 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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