明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8616|回复: 27

在打开图纸时自动替换未找到字体为指定字体的函数

  [复制链接]
发表于 2011-10-12 13:16:05 | 显示全部楼层 |阅读模式
本帖最后由 chg 于 2011-12-23 12:58 编辑

以前在论坛上看到过一个自动替换字体的帖子,受益匪浅,但源程序有些BUG,经自己更改并实验了一段时间,觉得有所进步,现贴出源代码,大家共享,共同改进。函数功能:在打开图纸时,将未能找到的字体文件,用指定的字体文件替代,如果是大字体文件未找到,直接取消大字体,并用指定字体替代。如果大字体文件存在,而字体文件不存在,则用SIMPLEX.SHX作为默认字体替代。
代码如下:
  1. (defun auto-ch-style
  2.        (newztname / st-name zt-name dzt-name st-list textname textfont zt-oldname)
  3.   (setsysvar)
  4.   (setvar "cmdecho" 0)
  5.   (chg_undo_push)
  6.   (setq st-list nil)
  7. ;;;在字体样式表中查找出每个字体样式的名称
  8.   (while (setq st-list (tblnext "STYLE" (null st-list)))
  9.     (setq st-name  (cdr (assoc 2 st-list)) ;字体样式名称
  10.           zt-name  (cdr (assoc 3 st-list)) ;字体名称
  11.           dzt-name (cdr (assoc 4 st-list)) ;大字体名称
  12.     )
  13.     (if (= (length (vl_brkstr zt-name "." 0 "")) 1)
  14.           (setq zt-name (strcat zt-name ".shx"))
  15.         )
  16.         ;;;如果字体名称为无则将它命名为新字体
  17.         (if (= zt-name "")
  18.           (progn
  19.             (setq zt-oldname zt-name)
  20.             (setq zt-name newztname)
  21.             )
  22.           (progn
  23.             (if (/= dzt-name "")
  24.               (if (not (findfile zt-name))
  25.                 (setq zt-name "simplex.shx"
  26.                       zt-oldname 1)
  27.                 )
  28.               )
  29.             )
  30.                
  31.         )
  32.     (if (= dzt-name "")
  33.       (progn
  34.         (if (or (findfile zt-name) (dos_find (strcat "c:/windows/fonts/" zt-name)))
  35.           ;判断是否是程序命名的字体,如是则更改为此字体
  36.           (if (= zt-oldname "")
  37.                   (style-change st-name newztname)
  38.                   )
  39.           ;未找到字体文件
  40.           (style-change st-name newztname)
  41.           )
  42.         )
  43.       (progn
  44.         (if (findfile dzt-name)
  45.           (progn
  46.             (if (or (findfile zt-name) (dos_find (strcat "c:/windows/fonts/" zt-name)))
  47.               (if (= zt-oldname "")
  48.                   (style-change st-name newztname)
  49.                   )
  50.               (progn
  51.                 (style-change st-name "simplex.shx")
  52.                 )
  53.               )
  54.             )
  55.           (progn
  56.             (setq stlist (style-change st-name newztname))
  57.             ;将大字体取消
  58.             (entmod (subst (cons 4 "") (assoc 4 stlist) stlist))
  59.             )
  60.           )
  61.         )
  62.       )
  63.     )
  64.   (command "_.regen")
  65.   (chg_undo_pop)
  66.   (setsysvar)
  67.   (setvar "cmdecho" 1)
  68.   (princ)
  69. )



  70. ;;;参数说明:st-name字体样式名称,newztname新的字体名称,须带后缀名
  71. (defun style-change
  72.                     (st-name         newztname   /                 ztname
  73.                      textname         textfont    st-objname         stlist
  74.                     )

  75.   (if (null
  76.         (setq textname
  77.                (car
  78.                  (reverse (dos_find (strcat "c:/windows/fonts/" newztname)))
  79.                )
  80.         )
  81.       )
  82.     (setq textname (findfile newztname))
  83.   )

  84.   (if textname
  85.     (setq textfont (car (reverse (vl_brkstr textname "\" "0" ""))))
  86.     (progn
  87.       (princ "/n指定的替代字体未找到,将用楷体替代")
  88.       (setq textfont "simkai.ttf")
  89.     )
  90.   )

  91.   (if  (vl-string-position (ascii "|") st-name 0 t)
  92.     (progn                                ;(setq st-list (tblsearch "STYLE" "TEXT-ST"))
  93.       (setq st-objname (tblobjname "STYLE" st-name))
  94.       (Setq stlist (entget st-objname))
  95.       (entmod (subst (cons 3 textfont) (assoc 3 stlist) stlist))
  96.     )
  97.     (progn
  98.       (cond
  99.         ((= (strcase textfont) "SIMFANG.TTF")
  100.          (setq textfont "仿宋")
  101.          )
  102.         ((= (strcase textfont) "SIMSUN.TTF")
  103.          (setq textfont "宋体")
  104.          )
  105.         ((= (strcase textfont) "SIMKAI.TTF")
  106.          (setq textfont "楷体")
  107.          )
  108.         ((= (strcase textfont) "SIMSUN.TTC")
  109.          (setq textfont "宋体")
  110.          )
  111.         ((= (strcase textfont) "SIMHEI.TTC")
  112.          (setq textfont "黑体")
  113.          )
  114.         )
  115.       (command "_.-style" st-name textfont "0" "0.7" "0" "n" "n")
  116.       (if (= (getvar "cmdactive") 1)
  117.         (command "n")
  118.       )
  119.     )
  120.   )
  121. )
字符分割函数
  1. (defun vl_brkstr (string   pattern
  2.                   ctrl1           ctrl2
  3.                   /           ps
  4.                   strl           str1
  5.                   string   str2
  6.                   brstring str2
  7.                   )
  8. ;ctrl1表示是否要将字符串变成大写,0大小写不变,1变成小写,2变成大写;ctrl2表示
  9. ;是否要去除分割符pattern,当为“Y”时保留,为其他字符时去除。
  10.   (setq        strl   (strlen pattern)
  11.         string (strcat string pattern)
  12.         )
  13.   (if (/= pattern "")
  14.     (progn
  15.       (while (setq ps (vl-string-search pattern string))
  16.         (if (/= ps 0)
  17.           (setq        str1   (substr string 1 ps)
  18.                 str2   str1
  19.                 string (substr string (+ ps strl 1))
  20.                 )
  21.           (if (= (strcase ctrl2) "Y")
  22.             (progn
  23.               (if (= ctrl1 2)
  24.                 (setq str1 (strcase pattern))
  25.                 (setq str1 pattern)
  26.                 )
  27.               (setq str2         pattern
  28.                     string (substr string (+ ps strl 1))
  29.                     )
  30.               )
  31.             (setq str1         nil
  32.                   string (substr string (+ ps strl 1))
  33.                   )
  34.             )
  35.           )
  36.         (if str1
  37.           (progn
  38.             (cond
  39.               ((and (= ctrl1 1) (/= ps 0))
  40.                (setq str1 (strcase str1 t))
  41.                )
  42.               ((and (= ctrl1 2) (/= ps 0)) (setq str1 (strcase str1)))
  43.               ((= ctrl1 0) (setq str1 str1))
  44.               )
  45.             (if        (distof str1)
  46.               (if (= (rtos (distof str1) 2 24) (rtos (atoi str1) 2 24))
  47.                 (setq str1 (atof str1))
  48.                 )
  49.               )
  50.             (if        (and (= (strcase ctrl2) "Y") (/= str2  pattern))
  51.               (progn
  52.               (if (= ctrl1 2)
  53.                 (Setq pattern1 (strcase pattern))
  54.                 (setq pattern1 pattern)
  55.                 )
  56.               (setq brstring (append brstring (list str1))
  57.                     brstring (append brstring (list pattern1))
  58.                     )
  59.               )
  60.               (setq brstring (append brstring (list str1)))
  61.               )
  62.             )
  63.           )
  64.         )
  65.       (if (and brstring (= (strcase ctrl2) "Y"))
  66.         (setq brstring (reverse (cdr (reverse brstring))))
  67.         )
  68.       brstring
  69.       )
  70.     (progn (princ "Partition symbol is wrong.") (princ))
  71.     )
  72.   )
以上函数要用到dos_lib库,请自行安装。

点评

我当宝收藏了!非常感谢  发表于 2012-3-13 08:17
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2011-10-12 18:54:41 | 显示全部楼层
此函数在不同操作系统下失败,比如你在win7下用仿宋字体,在XP下则显示问号,这个不能更改,不知是什么原因。
发表于 2011-10-22 20:10:08 | 显示全部楼层
WIN7的仿宋字体与XP下不同, WIN7的是仿宋, XP的是仿宋_GB2312。
发表于 2011-10-25 03:42:24 | 显示全部楼层
支持楼主共享!
 楼主| 发表于 2011-10-25 21:02:53 | 显示全部楼层
wim7和xp的仿宋字体名称是不同,可是都是SIMFANG.TTF,不过程序就是不能正确识别,用style命令会好些,但对外部参照中的字体不能修改,估计加个判断,将外部参照区分开会好些
发表于 2011-10-26 10:14:05 | 显示全部楼层
从注册表中可以找出仿宋与SIMFANG.TTF的映射

本帖子中包含更多资源

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

x
发表于 2011-12-19 17:28:37 | 显示全部楼层
楼主,这段程序放在什么地方呢?
 楼主| 发表于 2011-12-19 18:48:31 | 显示全部楼层
放在自启动的ACADDOC.LSP中的s::startup函数下,直接执行函数(auto-ch-style “simfang.ttf”)即可。另,第一段代码中的style-change函数有更改,可以更新下。
 楼主| 发表于 2011-12-22 19:04:42 | 显示全部楼层
因为没某些原因没弄明白,在style-change函数中的(cond ((= (strcase textfont) "SIMFANG.TTF")...)这一段需要自己根据CAD的提示取舍,如果需要输入.TTF或.SHX字体名称,则这段不要。
发表于 2011-12-23 23:18:19 | 显示全部楼层
哎,对于俺们这些菜鸟中的菜鸟就看不懂了,麻烦楼主可不可以做个完整的文件让我们直接加载应用啊,偶不会编LSP,自启动也不知道怎么做,再次麻烦楼主了,偶替我们这些不懂编lsp谢谢楼主了!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 07:12 , Processed in 0.189392 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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