找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1287|回复: 5

[分享]:中西混排矢量文字字高调整程序

[复制链接]
发表于 2007-10-19 11:01:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
这是一个能够调整中西混排时中文和西文字高看起来不一样高的程序,是从一篇论文上整理下来的,整理完后不知道哪里有问题不能使用,请高手帮忙看一下,看看哪里有问题,修正一下这个lisp程序。(该论文详见附件)

作者的思路是当中西文混排又是采用矢量字体时让汉字和西文分开,要么放大汉字要么缩小西文。该程序考虑到了截断语句和改变字高带来的位置变化,除了破坏了语句的整体性外,表面上几乎是天衣无缝的 从原理上讲确实非常原始,但还算实用方便。

程序如下:


  1.   [FONT=courier new]
  2. ;;;ZXTEXT.LSP中西混排矢量文字输入及调整程序
  3. ;;;--------------------------------------------
  4. (defun c:zxtext        (/hight pt style chinese xx angle ang str)
  5.   (setq os (getvar "osmode"))
  6.   (setvar "osmode" 0)
  7.   (initget "Edit")
  8.   (setq pt (getpoint "\nEdit <Start point:>"))
  9.   (if (=pt "Edit")
  10.     (zxedit)
  11.     (progn
  12.       (setq style (getvar "TEXTSTYLE"))
  13.       (setq chinese (cdr (assoc 4 (tb1search "style" style))))
  14.       (if (=chinese "")
  15.         (progn)
  16.         (prompt
  17.           (strcat "\n当前的字型"style"中没有定义矢量汉字字体")
  18.         )
  19.         (princ))
  20.       (progn
  21.         (setq hight (getvar "TEXTSIZE"))
  22.         (setq XX (getdist pt (strcat "\nHeight <" (rtos hight) ">:")))
  23.         if
  24.         XX
  25.         (setq hight XX)
  26.       )
  27.       (setq angle (getangle "\nRotation angle <0>:"))
  28.       (if (=angle nil)
  29.         (setq angle 0)
  30.       )
  31.       (setq ang (/ (* angle pi) 180))
  32.       (setq str (getstring 1 "\nText : "))
  33.       (zxtext _a)
  34.     )
  35.   )
  36. )
  37. )
  38. (setvar "osmode" os)
  39. )
  40. ;;;---------------------------------------------------------------------------------
  41. (defun zxedit /object sset sslen nsset ename elist style layer selist chinese str hight width color pt ang angle)
  42. (setq object "edit"
  43.       (setq sset (ai _ aselect))
  44.        (if (null sset)
  45.          (progn
  46.            (princ "\n错误:没有选到文字。")
  47.            (exit)
  48.          )
  49.        )
  50.       (setq sslen (sslength sset)
  51.             nsset (ssadd)
  52.       )
  53.        (if (>sslen 25)
  54.          (princ "\n确认所选的图元--请稍候。")
  55.        )
  56.       (while (>sslen 0)
  57.         (setq ename (ssname sset (setq sslen (1-sslen)))
  58.               elist (entget ename)
  59.         )
  60.         (if (= (cdr (assoc 0 elist)) "TEXT")
  61.           (progn
  62.             (setq style          (cdr (assoc 7 elist))
  63.                   selist  (tb1search "style" style)
  64.                   chinese (cdr (assoc 4 selist))
  65.             )
  66.             (if        (/=chinese "")
  67.               (ssadd ename nsset)
  68.             )
  69.           )
  70.         )
  71.       )
  72.        (setq sslen (sslength nsset)
  73.              sset  nsset
  74.        )
  75.       (while (>sslen 0)
  76.         (setq ename (ssname sset (setq sslen (1-sslen)))
  77.               elist (entget ename)
  78.               str   (cdr (assoc 1 elist))
  79.               style (cdr (assoc 7 elist))
  80.               layer (cdr (assoc 8 elist))
  81.               pt    (cdr (assoc 1O elist))
  82.               hight (cdr (assoc 40 elist))
  83.               width (cdr (assoc 41 elist))
  84.               ang   (cdr (assoc 5O elist))
  85.               color (cdr (assoc 62 elist))
  86.               angle (/ (* ang 180) pi)
  87.         )
  88.         (command "_erase" ename "")
  89.         (command "_style" style "" "0.0" "" "" "" "" "")
  90.         (zxtext _a)
  91.       )
  92. )
  93. ;;;-------------------------------------------------------------------------------------
  94. (defun zxtext _a (/n a len asc _a asc _b asc_c len new _str pt2
  95. )
  96. (setq n        1
  97.       a        n
  98.       len 1
  99. )
  100. (while (/= (substr str n 1) "")
  101.   (setq        asc _a (ascii ((substr str n 1))
  102.         asc _b (ascii (substr str (1+n) 1))
  103.         )
  104.          (if (=asc _c nil)(setq asc _c asc_a))
  105.         (if (and (/=asc _b 0);非空
  106.                  (or
  107.                    (and (<asc _a 127) (<asc _b 127) (<asc _c 127));两者均为西文
  108.                    (and (>asc _a 127) (>asc _b l27)) ;两者均为汉字
  109.                    (and (>asc _a 127) (=asc _b 32)) ;汉字中空格
  110.                    (and (=asc _a 32) (=asc _b 32)) ;空格
  111.                    (and (=asc _a 32) (>asc _b 127) (>asc _c 127));汉字中空格
  112.                  )
  113.             )
  114.           (setq len (1+ len))
  115.           (progn
  116.             (setq new str
  117.                   (substr str a len)
  118.             )
  119.             (if        (< (ascii (substr new _str 1 1)) 127)
  120.               (progn
  121.                 (setq pt (polar pt (-ang (* pi 0.5)) (* hight 0.1)))
  122.                 (setq pt 2 "up")
  123.                 (command "text" pt (* hight 0.8) angle new _str)
  124.                 (setq asc _c nil)
  125.               )
  126.               (progn
  127.                 (setq pt2 nil)
  128.                 (command "text" pt hight angle new _str)
  129.                 (setq asc _c nil)
  130.               )
  131.             )
  132.             (next Pt)
  133.             (setq len 1  a(1+n))
  134.           );end progn
  135.         );end if
  136.          (setq n (1+n))
  137.   )
  138.   (princ)
  139. )
  140. ;;;-------------------------------------------------------------------------------
  141. (defun next pt
  142.   (last _ename last _elist pt1 dis)
  143.   (if (=object "edit")
  144.     (progn
  145.       (setq last _ename (entlast)
  146.              last _elist (entget last _ename)
  147.             last _elist (subst (cons 8 layer)(assoc 8 last _elist) last _elist)
  148.              last _elist (subst (cons 41 width)(assoc 41 last _elist)last _elist)
  149.       )
  150.       (entmod last _elist)
  151.     )
  152.   )
  153.   (setq        last _ename(entlast)
  154.          last_elist (entget last _ename)
  155.         last _elist (subst (cons 72 2) (assoc 72 last _elist) last _elist)
  156.          last_etist (subst (cons 11 pt) (assoc 11 last _elist) last_elist)
  157.   )
  158.   (entmod last _elist)
  159.   (setq        last _ename (entlast)
  160.                   last_elist (entget last _ename)
  161.                      pt1 (cdr (assoc 10 last _elist))
  162.                      dis (distance pt1 pt)
  163.   )
  164.   (setq        last _elist (subst (cons 72 0) (assoc 72 last _elist) last _elist)
  165.          last_elist (subst (cons 10 pt) (assoc 10 last _elist) last _elist)
  166.   )
  167.   (entmod last _elist)
  168.   (setq pt (polar pt ang (+ dis (* hight 0.2))))
  169.   (if (= pt2 "up")
  170.     (setq pt (polar pt (-ang (* pi 0.5)) (*hight 0.1)))
  171.   )
  172. )
  173. ;;;---------------------END--------------------------------------
  174.   [/FONT]


请高手修正一下,使其能正常使用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-10-31 00:40:19 | 显示全部楼层
我最近在XdCad里下不了附件,能否传到我邮箱:xigeia@sohu.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-11-8 14:37:14 | 显示全部楼层
要把文字打断,要编辑就好麻烦了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-11 12:32:25 | 显示全部楼层
这个程序的功能其实类似晓东工具箱里的"中西美化"功能,希望高手把这个程序完善一下.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-11-14 18:36:55 | 显示全部楼层
呵呵,很受教育
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-11-16 08:31:48 | 显示全部楼层
我也常发现这一问题,同样字号的中文和字母,大小差很多.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-16 07:34 , Processed in 0.189313 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表