求一个多图元类型自动标注程序!
本帖最后由 半听可乐 于 2012-12-10 13:01 编辑本人尝试了一些自动标注程序,包括一些广为熟知的商用软件里的自动标注,发现大多只对单一对象就行标注,能不能实现对指定的多种类型的图元进行标注呢?因为有些图元不光要标间距,还要标与周围墙、柱子的距离,这时就得手工调整了,如果工程较大那真是苦不堪言,一次就罢了,改图时那种痛~~~不说了,各位高手请看插图和附件
本帖最后由 springwillow 于 2012-12-12 17:42 编辑
帮你做了一个,严重建议你将喷头的块炸开成圆。
喷头标注演示
xyp1964 发表于 2012-9-5 13:06 static/image/common/back.gif
喷头标注演示
院长动作真快!佩服佩服!可以标柱中、墙中吗? 半听可乐 发表于 2012-9-5 13:10 static/image/common/back.gif
院长动作真快!佩服佩服!可以标柱中、墙中吗?
便于工人下料啊,尺寸看起来也简单 你说的2和4不是cad认识的类型,要做也得做一些处理 本帖最后由 半听可乐 于 2012-9-5 16:54 编辑
天意今天 发表于 2012-9-5 14:16 http://bbs.mjtd.com/static/image/common/back.gif
你说的2和4不是cad认识的类型,要做也得做一些处理
就是想要高手的处理,我的思路是
①判断墙线间距,如果间距在500以内,则在两墙线之间画中心线,个人提供中心线参考程序如下
②把画出的中心线当作自动标注的捕捉点之一,自动标注
③标注完成后删除中心线
也许没那么复杂(我想如果能自动计算出中心点,而不需要画线)
;---------------------------------------------------------------------------------------------------------------------
;★DB_AICENT 中心线绘制(支持矩形框,中心线为黄色虚线,在cen层)
;by 向赞扬
;---------------------------------------------------------------------------------------------------------------------
(defun C:DB_AICENT(/ en en_data lx pt0
nx cenptr pt3xpt3y pt4x pt4y pt5
pt5x pt5y pt6 pt6xpt6y l l1 en3
en1 en1_data en2en2_data
)
(terpri)
(setq v1 (getvar "osmode"))
(setq v2 (getvar "cmdecho"))
(setq v3 (getvar "blipmode"))
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(SETVAR "OSMODE" 0)
(graphscr)
(setq en (entsel "\nselection a object!"))
(setq en_data (entget (car en)))
(setq lx_list (assoc 0 en_data))
(setq lx (cdr lx_list))
(cond ((= "CIRCLE" lx)
(progn
(setq v4 (getvar "CLAYER"))
(setq pt0 (cadr en))
(setq nx (cdr (assoc 0 en_data)))
(setq cenpt (osnap pt0 "center"))
(setq r (cdr (assoc 40 en_data)))
(setq pt1 (polar cenpt pi (+ (* r 0.2) r)))
(setq pt2 (polar cenpt 0 (+ (* r 0.2) r)))
(setq pt3 (polar cenpt (* 0.5 pi) (+ (* r 0.2) r)))
(setq pt4 (polar cenpt (* 1.5 pi) (+ (* r 0.2) r)))
(command "osnap" "none")
(if (not (tblsearch "LAYER" "Cen"))
(command "layer" "m" "Cen" "c" 2 "" "l" "center2" "" "lw"
0.18 "" "")
)
(command "layer" "s" "cen" "")
(command "line" pt1 pt2 "")
(command "line" pt3 pt4 "")
(setvar "CLAYER" v4)
)
)
((= "ARC" lx)
(progn
(setq v4 (getvar "CLAYER"))
(setq pt0 (cadr en))
(setq nx (cdr (assoc 0 en_data)))
(setq cenpt (osnap pt0 "center"))
(setq r (cdr (assoc 40 en_data)))
(setq pt1 (polar cenpt pi (+ (* r 0.2) r)))
(setq pt2 (polar cenpt 0 (+ (* r 0.2) r)))
(setq pt3 (polar cenpt (* 0.5 pi) (+ (* r 0.2) r)))
(setq pt4 (polar cenpt (* 1.5 pi) (+ (* r 0.2) r)))
(command "osnap" "none")
(if (not (tblsearch "LAYER" "Cen"))
(command "layer" "m" "Cen" "c" 2 "" "l" "center2" "" "lw"
0.18 "" "")
)
(command "layer" "s" "cen" "")
(command "line" pt1 pt2 "")
(command "line" pt3 pt4 "")
(setvar "CLAYER" v4)
)
)
((= "LINE" lx)
(progn
(setq v4 (getvar "CLAYER"))
(setq pt1 (osnap (cadr en) "nearest"))
(setq en1 (entsel "\n selection another line")
en1_data (entget (car en1))
)
(setq pt2 (osnap (cadr en1) "nearest"))
(command "line" pt1 (osnap pt2 "perpendicular") "")
(setq en2 (entlast))
(setq en2_data (entget en2))
(setq pt3x (cadr (assoc 10 en2_data)))
(setq pt3y (caddr (assoc 10 en2_data)))
(setq pt3 (list pt3x pt3y))
(setq pt4x (cadr (assoc 11 en2_data)))
(setq pt4y (caddr (assoc 11 en2_data)))
(setq pt4 (list pt4x pt4y))
(setq l (distance pt3 pt4))
(SETQ l1 (/ l 2))
(command "offset" l1 en pt2 "")
(setq en3 (entlast))
(if (not (tblsearch "LAYER" "Cen"))
(command "layer" "m" "Cen" "c" 2 "" "l" "center2" "" "lw"
0.18 "" "")
)
(command "change" en3 "" "p" "la" "Cen" "c" "byl" "lt" "byl"
"")
(setq pt5x (cadr (assoc 10 (entget en3)))
pt5y (caddr (assoc 10 (entget en3)))
pt5(list pt5x pt5y)
pt6x (cadr (assoc 11 (entget en3)))
pt6y (caddr (assoc 11 (entget en3)))
pt6(list pt6x pt6y)
)
(command "osnap" "none")
(command "lengthen" "de" 3 pt5 "")
(command "lengthen" "de" 3 pt6 "")
(command "ERASE" en2 "")
(setvar "CLAYER" v4)
)
)
((= "LWPOLYLINE" lx)
(progn
(SETVAR "OSMODE" 0)
(command "ucs" "w" )
(setq v4 (getvar "CLAYER"))
(setq pt1(cdr(assoc 10 en_data))
)
(setq listlength(length en_data))
(setq pt4(cdr(nth (-listlength 5) en_data)))
(setq pt3(cdr(nth (-listlength 9) en_data)))
(setq pt2(cdr(nth (-listlength 13) en_data)))
(setq al(angle pt1 pt2))
(setq l(distance pt1 pt2))
(setq h(distance pt1 pt4))
(command "line" pt1 pt3 "")
(setq en2 (entlast))
(command "_divide" en2 2)
(setq en3(entlast))
(setq en3_data (entget en3))
(setq cenpt(cdr(assoc 10 en3_data)))
(setq pt5(polar cenpt (+ pi al) (/ l 2)))
(setq pt6(polar cenpt al (/ l 2)))
(setq pt7(polar cenpt (+ al (* pi 1.5)) (/ h 2)))
(setq pt8(polar cenpt (+ al (/ pi 2)) (/ h 2)))
(command "erase" en2 en3 "")
(if (not (tblsearch "LAYER" "Cen"))
(command "layer" "m" "Cen" "c" 2 "" "l" "center2" "" "lw" 0.18 "" "")
)
(command "layer" "s" "cen" "") (command "line" pt5 pt6 "")
(setq en4(entlast))
(command "line" pt7 pt8 "")
(setq en5(entlast))
(setq dee(* 0.1 l))
(command "lengthen" "de" dee pt5 pt6 pt7 pt8 "")
;(print "Selective is spline can't add centerline!")
(setvar "CLAYER" v4)
)
)
)
(setvar "osmode" v1)
(setvar "cmdecho" v2)
(setvar "blipmode" v3)
(princ)
) 半听可乐 发表于 2012-9-5 16:53 static/image/common/back.gif
就是想要高手的处理,我的思路是
①判断墙线间距,如果间距在500以内,则在两墙线之间画中心线,个人提 ...
关注,感觉自己到这样的 大神何在?顶的好辛苦! 请2楼院长帮指点下好了