柱哥 发表于 2014-11-13 11:52:49

把一行文字转成两行怎么写

本帖最后由 柱哥 于 2014-11-13 11:53 编辑

一行品名,中间有中文数字字母,怎样分成两行,求码怎么写。

(setq nc (strlen pm))
(setq      ncb (fix (* nc 0.5))
      nca (- nc ncb)
)
(setq tx (substr pm nca 1))
(cond
((and (= nca ncb) (<= (ascii tx) 160))
   (progn
   (setq pma (substr pm 1 nca))
   (setq pmb (substr pm (1+ nca) nc))
   )
)
((and (= nca ncb) (> (ascii tx) 160))
   (progn
   (setq pma (substr pm 1 nca))
   (setq pmb (substr pm (1+ nca) nc))
   )
)
((and (/= nca ncb) (<= (ascii tx) 160))
   (progn
   (setq pma (substr pm 1 nca))
   (setq pmb (substr pm (1+ nca) nc))
   )
)
((and (/= nca ncb) (> (ascii tx) 160))
   (progn
   (setq pma (substr pm 1 nca))
   (setq pmb (substr pm (1+ nca) nc))
   )
)
)

总是有错,中间汉字有时会出错,求高手指点,小菜在此谢谢。

伪书虫86 发表于 2014-11-13 15:48:07

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=93336
可以参考下这个

有来有去 发表于 2014-11-15 23:25:52

主要是汉字双字节的问题

柱哥 发表于 2014-11-18 13:43:29

本帖最后由 柱哥 于 2014-11-20 13:05 编辑

伪书虫86 给的我看了,只是我这样的不会改,请学长们出手帮忙。




把文字打段的改到d1里面。
两段品名一般写的一样长就可以了,所以没有指定在那个字上边分段,用按键决定品名一加长点或品名二加长点。

llsheng_73 发表于 2014-11-20 10:54:19

本帖最后由 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))))))




以前写来分段文字的,没有考虑它的位置问题,因为当时那不是关注的重点
可以根据自己需要进行修改
页: [1]
查看完整版本: 把一行文字转成两行怎么写