明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4562|回复: 9

[讨论] 拉筋符号源码解析与测试(详解算法,支持UCS、形式切换)

  [复制链接]
发表于 2014-2-10 22:51 | 显示全部楼层 |阅读模式
拉筋符号(详解算法,支持UCS、形式切换、智能比例)
算法:
详见附图,拉筋为六点多段线。其顶点的计算按给定参数求得。
主函数 ReinforceBar
  1. (defun ReinforceBar(ptlist S-flag / pt1 pt2 pt3 pt1a pt2a pt3a pt10 a d h self-ang temp-dis  b s-flag-num)
  2. ;函数ReinforceBar 生成拉筋,参数ptlist 点表,s-flag 拉筋形式控制开关。生成拉筋
  3. ;Desiged by 林霄云 2014年2月10日
其中ptlist点表根据点筋获得,常见点筋形式为块或者2点多段线。取得点筋点表函数get_bar_ptlist
  1. (defun get_bar_ptlist( ss / pt_list pt en ent)
  2. ;函数get_bar_ptlist,参数ss 选择集。返回值,点筋点表。
  3. ;Desiged by 林霄云 2014年2月10日
  4. ;(setq ss (ssget '((0 . "INSERT,LWPOLYLINE"))));由用户任意选择TEXT实体 用于测试
  5. (setq pt_list nil)
  6. (foreach en (SSTOENLIST ss)
  7. (setq ent (entget en))
  8. (setq typ (cdr (assoc 0 ent)))
  9. (cond
  10. ((= typ "INSERT") (setq pt (cdr (assoc 10 ent)))) ;块插入点,WCS
  11. ((= typ "LWPOLYLINE") (setq pt (get_midpoint en)))
  12. );cond
  13. (if pt
  14. (setq pt_list (cons pt pt_list))
  15. )
  16. );foreach
  17. (reverse pt_list)
  18. )
需强调的是,并不对块和多段线进行过多判断,其中子函数sstoenlist
  1. (defun SSTOENLIST (SS / I EN LST_EN) ;改名 By 林霄云
  2. ;函数SSTOENLIST,参数ss 选择集。返回值,选择集里的图元名列表。
其中子函数get_midpoint,为求得多段线两顶点的中点。
主函数核心
  1. (setq pt1 (car ptlist))
  2. (setq pt10 (cadr ptlist))


  3. (setq a (* pi 0.5)
  4.     d 100
  5.     h 75
  6.     self-ang (angle pt1 pt10))
  7. ;根据长度判断比例,按1:25与1:100考虑,350这个阈值是有待商榷的。但是一般来说,满足要求
  8. (if (< (setq temp-dis (distance pt1 pt10)) 350)
  9. (setq d 25
  10.     h 20))
  11.    
  12. ;画S拉筋,给self-ang增加一个负角度b
  13. (if S-flag
  14. (progn
  15. (setq b (atan (* 2 h) (sqrt (+ (* temp-dis temp-dis) (* 4 h h)))))
  16. (setq self-ang (- self-ang b))
  17. );progn
  18. )
  19.    
  20. (setq pt1 (polar pt1 (- self-ang a) h))
  21. (setq pt2 (polar pt1 self-ang d))
  22. (setq pt3 (polar pt1 (+ self-ang a ) (* 2 h)))

  23. (if S-flag
  24. (progn
  25. (setq pt3a (polar pt10 (- self-ang a) h))
  26. (setq pt1a (polar pt3a (+ self-ang a ) (* 2 h)))
  27. (setq pt2a (polar pt1a (+ self-ang pi) d))

  28. );progn
  29. (progn
  30. (setq pt1a (polar pt10 (- self-ang a) h))
  31. (setq pt2a (polar pt1a (+ self-ang pi) d))
  32. (setq pt3a (polar pt1a (+ self-ang a ) (* 2 h)))
  33. );progn
  34. );if s-flag

  35. (if S-flag
  36. (setq s-flag-num 1)
  37. (setq s-flag-num -1)
  38. )
  39. (setq ucszdir (trans '(0 0 1) 1 0 T ));生成OCS法向量

  40. (setq ss (ssadd)) ;设置选择集
  41. (ssadd (EntMakex (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(8 . "G_BAR(钢筋)") '(100 . "AcDbPolyline") '(90 . 6) '(43 . 0)
  42. (cons 10 pt2) (cons 10 pt1)'(42 . -1) (cons 10 pt3) (cons 10 pt3a)(cons 42 s-flag-num)(cons 10 pt1a)(cons 10 pt2a) (cons 210 ucszdir))) ss)
  43. ;多线
  44. ss
思路如下,根据拉筋形式,计算拉筋多段线顶点,生成多段线,返回选择集。(切换比例由特征长度350决定,可以深化研究)
其中图层做如下判断
  1. (setq layername "G_BAR(钢筋)")
  2. (if (null (tblobjname "LAYER" layername) )
  3. (entmake (list '(0 . "LAYER")
  4.         '(100 . "AcDbSymbolTableRecord")
  5.         '(100 . "AcDbLayerTableRecord")
  6.         '(70 . 0)
  7.         '(6 . "Continuous")   ;线型
  8.         (cons 2 layername)
  9.     '(62 . 20)  ;颜色
  10.     '(370 . 50)  ;线宽,整数,50表示0.50 9表示0.09
  11.         )
  12.     )
  13. );if
主函数调用如下


  1. (defun C:RB()
  2. ;函数ReinforceBar
  3. ;Desiged by 林霄云 2014年2月10日
  4. (prompt "\n选择点筋")
  5. (setq ss-pt (ssget '((0 . "INSERT,LWPOLYLINE")))) ;选择点筋
  6. (setq flag t)
  7. (setq ss (ReinforceBar (get_bar_ptlist ss-pt) flag))
  8. (prompt "\n左击切换拉筋形式")
  9.       (while (and (setq ptr (grread t 15 2))
  10.               (not (and (= 2 (car ptr)); 键盘事件
  11.                     (or (= 13 (cadr ptr)) (= 32 (cadr ptr))) ;_Enter Space
  12.             ))
  13.              (not (or (= (car ptr) 11) (= (car ptr) 25)));_Mouse Right button
  14.                           )   
  15.                  ; (redraw)
  16.       (cond ((= (car ptr) 3);_Mouse Left button
  17.         (setq flag (not flag)) ;切换标志,删除,生成
  18.         (ss-delete ss)
  19.         (setq ss (ReinforceBar (get_bar_ptlist ss-pt) flag))
  20.            ))

  21. )
  22. (princ)
  23. )
  24. (princ "\nRB  ReinforceBar 生成拉筋命令加载成功\nDesigned by 林霄云 2014年2月10日")
  25. (princ)
结果:详附图
本代码对拉筋形式进行左键选择切换,仅是一种尝试,也许分别使用命令来得更简便。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-2-10 23:55 | 显示全部楼层
哈哈  第一个 支持下同行
发表于 2014-2-11 10:22 | 显示全部楼层
强烈支持楼主,无私奉献
 楼主| 发表于 2014-2-11 14:58 | 显示全部楼层
本帖最后由 林霄云 于 2014-2-11 16:08 编辑

有些人只会炫耀,有些人只会索取……

感谢老大、q2、g版、高飞鸟、路人等名人对我的成长提供的帮助。
同时感谢屠夫、小萝卜头、小菜、飞诗等侠的榜样作用。
最后感谢猫老师等大师的贡献精神对我的激励作用。
发表于 2014-2-13 16:14 | 显示全部楼层
结构同行鼎力支持啊!
发表于 2014-2-13 16:56 | 显示全部楼层
同是结构同行,顶!
发表于 2014-4-23 10:54 | 显示全部楼层
同是结构同行,顶!
发表于 2016-1-10 09:50 | 显示全部楼层
虽然我不用画钢筋图,但是好东西必须顶起
发表于 2019-9-10 12:15 | 显示全部楼层
必须支持下,感谢分享
发表于 2020-4-20 20:24 | 显示全部楼层
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-22 21:36 , Processed in 0.164581 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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