明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 13831|回复: 52

[提问] 求“不存在的字体”批量替换程序lsp

    [复制链接]
发表于 2020-8-2 00:05:57 | 显示全部楼层 |阅读模式
10明经币
哪位大神能帮助写个完美的程序,当遇到需要字体替换时,如下图:
哪怕是选择了已有的字体,在字体样式中就会有黄色叹号,很多字体还是会显示不正确。


希望能编写个lsp程序,达到
1、把字体名仅是黄色中文叹号的,可选windows系统中有的任意中文进行替换,
2、把shx字体和大字体中有黄色叹号的替换成CAD中fonts目录中任意的字体进行替换。
类似下图界面功能:

期待回复,QQ:371835653
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

发表于 2020-8-2 00:05:58 | 显示全部楼层
本帖最后由 gaics 于 2020-8-12 19:21 编辑

  1. (defun c:tt (/ a b c d e err)
  2.   (vl-load-com)
  3.   (setvar "cmdecho" 0)
  4.   (command "undo" "be")
  5.   (vlax-for x (vla-get-textstyles
  6.     (vla-get-activedocument (vlax-get-acad-object))
  7.         )
  8.     (vla-getfont x 'a 'b 'c 'd 'e)
  9.     (if  (= a "")
  10.       (progn
  11.   (if (and (not (findfile (vla-get-fontfile x)))
  12.      (not (findfile (strcat (vla-get-fontfile x) ".shx")))
  13.       )
  14.     (vla-put-fontfile x "hzasc.shx")
  15.   )
  16.   (if
  17.     (and (/= (vla-get-bigfontfile x) "")
  18.          (not (findfile (vla-get-bigfontfile x)))
  19.          (not (findfile (strcat (vla-get-bigfontfile x) ".shx")))
  20.     )
  21.      (vla-put-bigfontfile x "hztxt.shx")
  22.   )
  23.       )
  24.       (progn (setq
  25.          err (vl-catch-all-apply 'vla-setfont (list x a b c d e))
  26.        )
  27.        (if (vl-catch-all-error-p err)
  28.          (vla-setfont x "仿宋" b c d e)
  29.        )
  30.       )
  31.     )
  32.   )
  33.   (command "undo" "e")
  34.   (princ)
  35. )

评分

参与人数 1金钱 +5 收起 理由
匆匆肥马 + 5 很给力!

查看全部评分

回复

使用道具 举报

发表于 2020-8-4 16:07:08 | 显示全部楼层
我都是每次打开都直接全部忽略掉的,不是自己的图才会有这种情况
回复

使用道具 举报

 楼主| 发表于 2020-8-5 00:28:00 | 显示全部楼层
CAD字体可以替换,但中文字体不行



中文字体windows里是有的,但这里还能正常显示出来。
另外用以下语句列出的字体也会被修改
命令: (setq textsty (tblnext "STYLE" (not textsty)))
((0 . "STYLE") (2 . "_TCH_DIM") (70 . 0) (40 . 0.0) (41 . 1.0) (50 . 0.0) (71 . 0) (42 . 350.0) (3 . "simfang.ttf") (4 . "GBCBIG"))

其中的:(4 . "GBCBIG"),没有列出.shx,也被认为是没有的CAD字体,其实是GBCBIG.shx,是有的。

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2020-8-5 07:59:38 | 显示全部楼层
sctw 发表于 2020-8-5 00:28
CAD字体可以替换,但中文字体不行

这几个问题我也没搞懂,中文字体如楷体、宋体等提取的组码都是空的(3 . ""),个别shx字体提取不到后缀名。

比较难判断。
回复

使用道具 举报

发表于 2020-8-5 08:06:03 | 显示全部楼层
本帖最后由 gaics 于 2020-8-5 08:15 编辑

我自己的方法是,不管原图的字体有没有,都换成一种我常用的字体,不去区分是否为系统字体还是大字体。
当然这种方法仅适用于方便读图。

(defun c:sty (/ name D en)
  (while (setq D (tblnext "style" (null D)))
    (setq name (cdr (assoc 2 D)))
    (setq en (tblobjname "style" name))
    (ch_dxf en 3 "hzasc.shx")
    (ch_dxf en 4 "hztxt.shx")
  )
  (alert "已替换字体,请刷新图纸!")
  (princ)
)

(defun ch_dxf (en num ch / old new ent)
  (if (setq ent  (entget en)
      new  (cons num ch)
      old  (assoc num ent)
      )
    (entmod (subst new old ent))
    (entmod (reverse (cons new (reverse ent))))
  )
)

回复

使用道具 举报

 楼主| 发表于 2020-8-5 08:41:10 | 显示全部楼层
感谢gaics,
我有个思路,只是不会写语句,就是把while提取的字体样式激活为当前字体,(我知道怎样把当前字体设置成windows的中文字体),最后再恢复把当前字体恢复为最初的字体样式就可以了
回复

使用道具 举报

发表于 2020-8-5 09:13:02 | 显示全部楼层
希望大神能做出来  我也困扰这个
回复

使用道具 举报

发表于 2020-8-5 09:23:51 | 显示全部楼层
本帖最后由 gaics 于 2020-8-5 09:25 编辑
sctw 发表于 2020-8-5 08:41
感谢gaics,
我有个思路,只是不会写语句,就是把while提取的字体样式激活为当前字体,(我知道怎样把当前 ...

如何判断字体是windows中文字体还是shx字体?
回复

使用道具 举报

 楼主| 发表于 2020-8-5 13:55:01 | 显示全部楼层
一、CAD无法获取windows的宋体、楷体等几个特殊字体,只能获取为空,
    所以判断windows字体的条件为:
    1、空
    2、.ttf
二、判断为CAD字体的条件为:
    1、.shx
    2、手动加入"SIMPLEX"、"TSSDENG"、"COMPLEX"等天正自建没有shx扩展名的情况

点评

可以获得,要使用 ActiveX方法函数。 另外除了Win系统Fonts文件夹,还需要判断用户层级的Font文件夹。  发表于 2020-8-6 10:24
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 07:45 , Processed in 0.197273 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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