第一次做即显程序,希望大家多多指导
本帖最后由 菜卷鱼 于 2013-12-27 20:55 编辑第一次随便写写,用了一个粗糙的思路,逐个插入块,插入的越多,反应越慢。
需要配合附件的DWG使用。
由于是第一次写即显的,所以舍不得删,呵呵,优化版本在6楼
(defun c:ec ()
(princ "明细表添加行")
(setq ent (ssget ":e:s" '((0 . "insert")(2 . "C1")) ))
(setq eg(entget (ssnameent 0)))
(setq e2(cdr (assoc 2 eg)))
(setq e41 (cdr (assoc 41 eg)))
(setq e10 (cdr (assoc 10 eg)))
(setq hg (* 7 e41))
(setq dt (grread T 15 0))
(SETQ PT (CAR (CDR DT)))
(SETQ PT2 PT)
(SETQ CD (CAR DT))
(setvar "attreq" 0)
(setq tm0 0)
(setq tm
(atof (rtos(/
(abs (- (cadr pt) (cadr e10)) )
hg) 2 0)))
(setvar "attreq" 0)
(setq plist (ssadd))
(while
(/= cd 3)
(setq x1 1)
(setq dt0 (* hg x1))
(setq apt (list 0dt00))
(setq npt (mapcar '+ apt e10))
(SETQ I 0)
(cond
((and (= (sslength plist) 0) (> (abs (- tm tm0)) 0) (> (cadr pt) (cadr e10)) (< tm 32) )
(progn
(repeat tm
(setvar "cmdecho" 0)
(command "insert" "C1"npt e41 e41 "")
(setq plist (ssadd (entlast) plist))
(setvar "cmdecho" 1)
(setq x1 (1+ x1))
(setq i (1+ i))
(setq dt0 (* hg x1))
(setq apt (list 0dt00))
(setq npt (mapcar '+ apt e10))
))
)
((and (> (sslength plist) 0)(> (abs (- tm tm0)) 0)(> (cadr pt) (cadr e10)) (< tm 32) )
(progn
(setvar "cmdecho" 0)
(command "erase" plist "")
(setvar "cmdecho" 1)
(repeat tm
(setvar "cmdecho" 0)
(command "insert" "C1"NPT e41 e41 "")
(setq plist (ssadd (entlast) plist))
(setvar "cmdecho" 1)
(setq x1 (1+ x1))
(setq i (1+ i))
(setq dt0 (* hg x1))
(setq apt (list 0dt00))
(setq npt (mapcar '+ apt e10))
))
))
(setq dt (grread T 15 0))
(SETQ PT2 PT)
(SETQ PT (CAR (CDR DT)))
(setq tm0 tm)
(setq tm
(atoi (rtos(/
(abs (- (cadr pt) (cadr e10)) )
hg))))
(SETQ CD (CAR DT))
)
(prin1)
)
支持你的第一次!第一次要珍惜的啊,不可以随便哟 第一次就xie了这么多
这也太随便了 谢谢你,先试试 本帖最后由 菜卷鱼 于 2013-12-24 08:09 编辑
flyfox1047 发表于 2013-12-23 18:04 static/image/common/back.gif
支持你的第一次!第一次要珍惜的啊,不可以随便哟
这只是第一次写“即显”的啊,又不是第一次写程序,我估计别人不是用的这种方法,我的这个太慢了,我只是想试一试这种思路行不行 本帖最后由 菜卷鱼 于 2013-12-27 21:15 编辑
command换成entmode,速度明显加快很多,但是属性会丢失,要用AttSync才能回来
(vl-load-com)
(defun c:ec ()
(setq *error* wmsg_err)
(princ "明细表添加行")
(setq ent (ssget ":s" '((0 . "insert")) ))
(while (or (= ent nil)(= (sslength ent) 0))
(setq ent (ssget ":s" '((0 . "insert")) )))
(setq ent0 (ssname ent 0))
(setq eg (entget ent0 ))
(setq BlkName0 (vla-get-effectivename (vlax-ename->vla-object ent0) )
) ;;;;;;;;;;;;;;;;;;;;加上这句如果明细栏是动态属性块也可以用,得到的是真实块名
(setq e41 (cdr (assoc 41 eg))) ;;;;得到缩放比例
(setq e10 (cdr (assoc 10 eg))) ;;;;得到插入点
(setq hg (* 7 e41)) ;;;;;;明细栏高度为7,假如高度是其他7就改成其他
(setq dt (grread T 15 2))
(SETQ PT (CAR (CDR DT)))
(SETQ PT2 PT)
(SETQ CD (CAR DT))
(setq tm0 0)
(setq tm (atoi (rtos(/
(abs (- (cadr pt) (cadr e10)) )
hg) 2 0))) ;;;;;;用atoi是因为repeat只能配合整数使用,tm的值是根据鼠标移动变的,
;;;;;;;;;;;;;;;;;这样tm的值要加1或者减1插入行才会增加1删除1,鼠标在一定范围内移动不会造成动作
(setvar "attreq" 0) ;;;;;插入属性块的时候不用填属性,改成1就要手动一个一个填属性
(setq plist (ssadd))
(while
(/= cd 3)
(setq x1 1)
(setq npt (polar e10 (angtof "90") (* hg x1) ))
(SETQ i 0)
(if
(and (/= (abs (- tm tm0)) 0)(> (cadr pt)(cadr e10)))
(progn
(if (/= (sslength plist) 0)
(progn (setvar "cmdecho" 0)(command "erase" plist "")(setvar "cmdecho" 1)) ) ;;;;;;
(repeat tm
;;;entmake开始行;;;(entmake (list '(0 . "INSERT") (cons 2 BlkName0) (cons 41 e41)
;;;entmake结束行;;;(cons 42 e41) (cons 43 e41) (cons 10 npt)))
;;;;;;;;;;entmake,command(vl-cmdf)二选一
;;;;;;;;;entmake速度快,但是属性会丢失,还没有想到办法,希望有高手帮忙解决
(setvar "cmdecho" 0)
(vl-cmdf "insert" BlkName0 npt e41 e41 "") ;;;;;;;;;;entmake,command(vl-cmdf)二选一,
(setvar "cmdecho" 1)
;;;;;;;;; 想用哪个就把前面的;;;去掉
(setq plist (ssadd (entlast) plist))
(setq x1 (1+ x1))
(setqi (1+i))
(setq npt (polar e10 (angtof "90") (* hg x1) ))
) ;;;;;;endrepeat
(mapcar 'princ (list "\n插入" (rtos tm 2 0) "行"))) ;;;;;;endprogn
) ;;;;;;endif
(setq dt (grread T 15 2))
(SETQ PT2 PT)
(SETQ PT (CAR (CDR DT)))
(setq tm0 tm)
(setq tm
(atoi (rtos(/
(abs (- (cadr pt) (cadr e10)) )
hg))))
(SETQ CD (CAR DT))
)
(prin1))
第一次呀,很不错。顶你!!! 自贡黄明儒 发表于 2013-12-26 09:19 static/image/common/back.gif
第一次呀,很不错。顶你!!!
黄大师帮忙啊,我的那明细栏是属性块,用entmake插入属性块速度是快,但是属性丢了,要用AttSync才能出来 楼主的第一次就这么奉献出来了! 奉献出来
页:
[1]
2