本帖最后由 林霄云 于 2014-5-8 21:49 编辑
梁线绘制源码解析(支持UCS,动态偏心或居中布置、宽度设置)
墙线与梁线是建模前提,墙与梁是孪生子。墙线绘制源码解析(支持UCS,偏心或居中布置,厚度设置,自动填充)http://bbs.mjtd.com/forum.php?mo ... amp;fromuid=7303580
梁线绘制,与墙线一样,甚至比墙线代码更为简单。
步骤
1,取点表getbeampoint( / pt1 pt2 ptlist-w x )
2,生成梁线make_beam,返回梁线选择集
3,动态处理bl(beam line),梁宽(通过键入数字),偏心(通过鼠标左击)。
核心代码
生成梁线,梁线为line类型。- (defun make_beam(ptlist-w wid lr-flag / ss en en-a1 en-a2 wid-temp)
- ;约定lr-flag取值为-1,0.5,1
- (setq lr-flag (rem lr-flag 3))
- (setq lr-flag (nth lr-flag '( -1.0 0.5 1.0)))
- (setq wid-temp (* wid lr-flag))
- (setup "beam_in"); 设置图层
- (setq en (make_line ptlist-w (getvar "clayer") ))
- ;生成梁线
- (setq en-a1 (en_offset en wid-temp t))
- (setq en-a2 (en_offset en-a1 (* wid (- (sign wid-temp))) nil))
- ;添加到选择集 en-a1 en-a2.
- (setq ss (ssadd))
- (setq ss (ssadd en-a1 ss))
- (setq ss (ssadd en-a2 ss))
- )
至于调用函数- (defun C:bl( / en ptlist-w ss flag num-pt wid-flag wid-temp)
- ;BEAMLINE-L方式
- ;Designed by 林霄云 2014年2月26日
- (setq ss (ssadd))
- (setq flag t)
- (setq num-pt 1)
- (setq wid-flag nil )
- (setq ptlist-w (getbeampoint))
- (setq ss (make_beam ptlist-w hnu:beamwid num-pt) )
- ;捕捉左键,进行缩放测试
- (prompt "\n左击循环方式调整梁位置 or U撤销 or 键入梁宽 or 右击退出")
- (while (and (setq ptr (grread t 15 2))
- flag
- )
- ;(redraw)
- (cond ((= (car ptr) 3);_Mouse Left button
- (if ss
- (progn (ss_delete ss)(setq ss nil)(setq num-pt (1+ num-pt)) (setq ss (make_beam ptlist-w hnu:beamwid num-pt))) ;切换标志,删除,生成
- ) ;左键进行0.5倍缩小,测试ss选择集方式可行。
- ));cond 左击事件
- (cond ((= (car ptr) 2);键盘事件
- (if (or (= (ascii "U") (cadr ptr)) (= (ascii "u") (cadr ptr))) (if ss (progn (ss_delete ss) (setq ss nil) (setq flag (not flag)))))
- (if (<= (ascii "0")(setq wid-temp (cadr ptr))(ascii "9"))
- (if wid-flag
- (progn (setq wid-flag (+ (* 10 wid-flag )(- wid-temp (ascii "0"))))(princ (itoa (- wid-temp (ascii "0"))))) ;处理其他数字
- (if ( = (ascii "0") wid-temp ) (setq wid-flag nil) (progn (setq wid-flag (- wid-temp (ascii "0"))) (princ (strcat "\n新梁宽:" (itoa (- wid-temp (ascii "0")))))));处理第一个数字
- )
- ; (if wid-flag (princ (itoa wid-flag)));回显
- );处理输入数字情况
- (if (or (= 13 (cadr ptr)) (= 32 (cadr ptr)))
- (if wid-flag
- (progn (setq hnu:beamwid wid-flag)
- (princ (strcat "\n当前梁宽设置为:" (itoa hnu:beamwid)))
- (if ss (progn (ss_delete ss) (setq ss nil)))
- (setq ss (make_beam ptlist-w hnu:beamwid num-pt))
- (setq wid-flag nil)
- )
- (setq flag (not flag));退出循环
- )
- )
- ));cond 键盘事件
- (cond ((or (= (car ptr) 11) (= (car ptr) 25))
- (if wid-flag
- (progn (setq hnu:beamwid wid-flag)
- (princ (strcat "\n当前梁宽设置为:" (itoa hnu:beamwid)))
- (if ss (progn (ss_delete ss) (setq ss nil)))
- (setq ss (make_beam ptlist-w hnu:beamwid num-pt))
- (setq wid-flag nil)
- )
- (setq flag (not flag));退出循环
- )) ;_Mouse Right button
- );cond 右击事件
- );while
- ;捕捉左键,进行缩放测试
- (princ)
- )
必须强调的是,
1,梁宽的设置逻辑,保存键入的数字;当空格回车右击时,判断,是否有键入数字标记,有则,删除原梁线,生成新梁线。否则,设置退出动态标记。
2,左击点数记录,作为参数传给make_beam。同时,删除原梁线,生成新梁线。
3,梁宽设置保存至全局变量,方便下次使用。
附加
生成梁线后,为了进一步方便建模。
1,在没有轴线处,生成辅助轴线,bax(beam axis)——取梁中线
2,梁高不同于典型梁高时,设置梁截面标注文字,bte(beam text)——自动取梁宽,按全局变量设置梁高
为了直接对接模板图,补充
3,梁裁剪,方便十字梁裁剪,btr(beam)
4,梁虚实线转换,bcd(beam continuous or dashed)——特定图层的切换
接口
5,bsetb(beam set b) 设梁宽 ,bseth(beam set h) 设梁高
作为纯cad绘图,这些命令或许能提高些许效率。而最重要的概念,左手快捷键及其设置原则不是lisp代码命令可以解决的。
下篇:徒手板负筋源码解析(支持UCS)
|