本帖最后由 林霄云 于 2014-4-23 22:09 编辑
引线标注点筋与线筋源码解析(支持UCS)
我曾说,我会离开lisp。谁又知道我从软件工程转土木工程有多难,又知道我内心有燃烧过那热火。——记录与真实生活
闲话少说,看正文。
思路
将标注点筋和线筋(一个标根数一个是标间距)集成在一起。应该做如下几件事:
1,选择后的选择集,自动判断是标注点筋还是线筋。
如果有点筋,标注点筋,如果没有点筋,标注线筋。
2,引线自动生成。
对于点筋,取点筋中点,如果是块,该是插入点,作为引线一端。对于线筋,取选择框中点距对象最近的点。且各自成前处理函数,生成点表。
取点筋点表- (defun get_bar_ptlist( ss / pt_list pt en ent ptli )
- ;函数get_bar_ptlist,参数ss 选择集。返回值,点筋点表。
- ;Desiged by 林霄云 2014年2月10日
取线筋点表- (defun get_linebar_pt( ss / pt sslist )
- ;Designed by 林霄云 2014年4月20日
- ;取线筋接触点。多选时,仅支持取第一根
3,动态处理文字位置,且为当前UCS下,支持90度旋转
对文字及文字下划线,拖动模式,更新其坐标点。旋转时,亦更新相应坐标点。
4,支持平行引线
当点筋标注时,在左击确认时,增加剩余平行引线。
5,最后间距按全局比例设置。
如果按固定的1:100出图,文字与文字下划线设为100便可。但支持墙柱配筋大样和墙身配筋大样,必然得支持自动复合相应的比例间距。
主函数解析:
dimbar(ptlist dotflag),ptlist为引线端点点表,由前述两函数获得,dotflag为点筋与否标识。
函数内的flag为动态退出标志;ang为文字角度主函数做的事情是,接收输入,生成文字,文字下划线,引线。然后动态调整其端点。
值得注意的是,1,get_textbox为我以前文章中的取文本四角点,offset_point为比polar更直观的求点自定义函数。2,make_text_b为,make_line自定义生成对象的函数,get-dxf,set-dxf为组码获得与更新。3,动态中,鼠标当前点,使用UCS,WCS系两点保存。
调用函数代码- (defun C:dba( / ss ptlist )
- ;Designed by 林霄云 2014年4月20日
- ;dim bar 标注点钢筋与线钢筋
- (setq ss (ssget '((0 . "INSERT,*LINE")))) ;最好加上钢筋图层控制
- (if ss
- (progn
- (setq ptlist (get_bar_ptlist ss)) ;有点筋么?
- (if ptlist
- (progn
- (dimbar ptlist t )
- );progn
- (progn
- (setq pt (get_linebar_pt ss)) ;有线筋么?
- (if pt
- (dimbar (list pt) nil )
- )
- );progn
- );if
- ));if ss
- (princ)
- );defun
还是得强调钱处理函数,代码给上,处理点筋点表- (defun get_bar_ptlist( ss / pt_list pt en ent ptli )
- ;函数get_bar_ptlist,参数ss 选择集。返回值,点筋点表。
- ;Desiged by 林霄云 2014年2月10日
- ;(setq ss (ssget '((0 . "INSERT,LWPOLYLINE"))));由用户任意选择TEXT实体 用于测试
- (setq pt_list nil)
- (foreach en (SS2ENLIST ss)
- (setq ent (entget en))
- (setq typ (get-dxf 0 en))
- (cond
- ((= typ "INSERT")
- (if (= (get-dxf 2 en) "点筋") (setq pt (get-dxf 10 en)) (setq pt nil));if ;块插入点,WCS
- )
- ((= typ "LWPOLYLINE")
- ;如果是点筋,取中点
- (if (and (= (get-dxf 90 en) 2)
- (= (abs(get-dxf 42 en)) 1))
- (setq pt (mid_point (car (setq ptli (get_pline_vertex en))) (cadr ptli)))
- (setq pt nil)
- );if
- )
- );cond
- (if pt
- (setq pt_list (cons pt pt_list))
- )
- );foreach
- (reverse pt_list)
- )
比较难搞的线筋点表,敢情是最原创的东西,使用ssnamex函数。- (defun get_linebar_pt( ss / pt sslist )
- ;Designed by 林霄云 2014年4月20日
- ;取线筋接触点。多选时,仅支持取第一根
- ;(setq ss (ssget '((0 . "INSERT,LWPOLYLINE"))))
- (setq sslist (ssnamex ss 0))
- (cond ((= (caar sslist) 1)(setq pt (cadr (last (car sslist)))))
- ((or (= (caar sslist) 2) (= (caar sslist) 3)) (setq pt (mid_point (last(cadr (last sslist))) (last (cadddr (last sslist)))))
- ;(command "line" "non" (last(cadr (last sslist))) "non" (last(caddr (last sslist))) "non" (last(cadddr (last sslist))) "non" (last(last(last sslist))) "c") ;测试代码
- )
- );cond
- ;如果是线筋,取最近点
- (setq pt (vlax-curve-getClosestPointTo (vlax-ename->vla-object (ssname ss 0)) pt t)) ;pt均为WCS下。
- ;(command "line" "non" (list 0 0) "non" (trans pt 0 1) "")
- )
鉴于代码中预留的解析比较详细,就不赘言了。所有的思路与步骤都已经给上。
结果
详测试图。
结论
基本完美的实现了,动态的,支持UCS的,智能判断的(文字处理,不提供输入,二是进行默认处理,是我自己的见解)点筋线筋标注集成命令。
(本文是我原创的最后一个功能,以后可能不做了,但已有的未发表的,将择机择日发布,附件中是还待整理的通用函数)
预告
1,墙线绘制源码解析(支持UCS,偏心或居中布置,厚度设置,自动填充)
2,梁线绘制源码解析(支持偏心或居中布置,宽度设置,梁线十字裁剪,梁截面标注,生成梁中轴线)
|