本帖最后由 llsheng_73 于 2014-11-20 10:58 编辑
关键是没有说清楚从哪个地方分段,或者可以指定?
 - (defun makedcl(str_lst / dclfile fileID dclHandle)
- (setq dclfile(vl-filename-mktemp nil nil ".dcl")fileID(open dclfile "w"))
- (write-line(apply'strcat(listall(list str_lst)t))fileID)
- (close fileID)
- (setq dclHandle(load_dialog dclfile))
- (vl-file-delete dclfile)
- dclHandle)
- (defun ListAll(tlst f / aaa lst);;f为t时全部压平,nil时保留一层
- (defun aaa(tlst)
- (foreach b tlst
- (if(listp b)(if f(aaa b)(if(listp(car b))(aaa b)(setq lst(cons b lst))))
- (setq lst(cons b lst)))))
- (if(listp tlst)(if(setq lst (aaa tlst))(reverse lst))))
- (defun mtext2txt(s / ob)
- (vlax-put-property(setq ob(vlax-create-object"Vbscript.RegExp"))"IgnoreCase"0)
- (vlax-put-property ob "Global" 1)
- (setq s(mapcar'(lambda(x y)(vlax-put-property ob"Pattern"x)(setq s(vlax-invoke-method ob"Replace"s y)))
- '("\\\\\\\\""\\\\{""\\\\}""\\\\pi(.[^;]*);""\\\\pt(.[^;]*);""\\\\S(.[^;]*)(\\^|#|\\\\)(.[^;]*);"
- "(\\\\F|\\\\f|\\\\C|\\\\H|\\\\T|\\\\Q|\\\\W|\\\\A)(.[^;]*);""(\\\\L|\\\\O|\\\\l|\\\\o)""\\\\~"
- "\\\\P""\n""({|})""\\x01""\\x02""\\x03")(list(CHR 1)(CHR 2)(CHR 3)"""""""""""""""""""\\""{""}")))
- (if ob(vlax-release-object ob))
- (last s))
- (defun delsame(l1 / L2 X)
- (while(setq x(car l1)l1(cdr l1))
- (setq l2(cons x l2))(if(member x l1)(setq l1(vl-remove x l1))))
- (reverse l2))
- (defun mysel(msg filter / p a b c)
- (if(and(setq a(entsel msg))(setq b(entget(car a)))(apply'and(mapcar'(lambda(x)(if(member x b)t))filter)))a
- (progn(setq p(last(grread t 8))b(getvar'pickbox)c(* b 0.05))
- (while(null(setq b(+ b c)
- a(ssget"c"(polar p b 0.785398)(polar p b 3.92699)filter)
- a(if a(ssname a 0));;此处严格应该计算点p到选择集a里边最近的一个图元
- )))
- (list a p))))
- (defun str->lst(a / c)
- (setq a(vl-string->list a))
- (while a
- (if(<(car a)129)(setq c(cons(chr(car a))c)a(cdr a))
- (setq c(cons(strcat(chr(car a))(chr(cadr a)))c)a(cddr a))))
- (reverse c))
- (Defun STB(TAB / snl sll)
- (SetQ sll(TblNext TAB T))
- (While(SetQ snl(Cons(Cdr(Assoc 2 sll))snl)sll(TblNext TAB nil)))
- (reverse snl))
- (defun SstoEs(ss / a lst)
- (if ss(progn(setq a -1)(repeat(sslength ss)(setq lst(cons(ssname ss(setq a(1+ a)))lst))))))
- (defun c:Dtxt(/ dcl lys ctl a b c i pat pats la lb lc)
- (setq dcl(makedcl'("TXTCF:dialog{key=\"AAA\";"
- ":column{:row{:button{label=\"拾取样本文字\";key=\"SEL\";}:popup_list{label=\"分隔符\";key=\"PAT\";}}"
- ":row{:popup_list{label=\"第一部分\";key=\"LA\";}:popup_list{label=\"其余部分\";key=\"LB\";}}"
- ":row{:button{key = \"ESC\";label = \"退出\";is_cancel = true;}:button{key = \"DO\";label=\"执行\";}}}}"))
- LYS(STB"layer")ctl 5)
- (while(> ctl 1)
- (new_dialog"TXTCF"dcl)
- (set_tile "AAA""文本拆分")
- (action_tile"SEL""(done_dialog 2)")
- (start_list"PAT")(mapcar'add_list pats)(end_list)
- (start_list"LA")(mapcar'add_list LYS)(end_list)(if a(set_tile"LA"(itoa(vl-position LC LYS))))
- (start_list"LB")(mapcar'add_list LYS)(end_list)(if a(set_tile"LB"(itoa(vl-position LC LYS))))
- (action_tile"DO""(setq LA(nth(atoi(get_tile\"LA\"))lys)LB(nth(atoi(get_tile\"LB\"))lys)PAT(nth(atoi(get_tile\"PAT\"))pats))(done_dialog 1)")
- (action_tile"ESC""(done_dialog 0)")
- (setq ctl(start_dialog))
- (cond((= ctl 2)(setq a(car(mysel"拾取样本文字"'((0 . "*TEXT"))))a(if a(entget a))
- pats(delsame(Str->Lst(vl-string-trim" "(mtext2txt(cdr(assoc 1 a)))))) LC(cdr(assoc 8 a))))
- ((= ctl 1)
- (foreach a(sstoes(ssget"X"(list'(0 . "TEXT")(assoc 8 a))))
- (setq b(entget a)c(vl-string-trim" "(cdr(assoc 1 b)))i(vl-string-search pat c)i(if i i(1+(strlen c))))
- (entmakex(setq b(append(list'(0 . "TEXT")(cons 1(substr c 1 i))(cons 8 LA)'(72 . 2)'(10 0 0 0)'(73 . 2)
- (cons 11(cdr(assoc(if(=(+(cdr(assoc 72 b))(cdr(assoc 73 b)))0)10 11)b))))
- (mapcar'(lambda(x)(assoc x b))'(40 41 7 50 71)))))
- (entmakex(append(list'(0 . "TEXT")(cons 1(vl-string-trim" "(substr c(1+ i))))(cons 8 LB))(vl-remove(assoc 72 b)(member'(10 0 0 0)b))))
- (entdel a))))))
以前写来分段文字的,没有考虑它的位置问题,因为当时那不是关注的重点
可以根据自己需要进行修改
|