明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1944|回复: 15

[源码] 字体分类更换

[复制链接]
发表于 2020-12-23 14:36:40 | 显示全部楼层 |阅读模式
本帖最后由 nyistjz 于 2020-12-24 12:50 编辑

修改好的源码在11楼。
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2020-12-24 12:47:14 | 显示全部楼层
本帖最后由 nyistjz 于 2020-12-24 12:48 编辑
bssurvey 发表于 2020-12-24 10:58
我在2008測試是沒問題的

朋友,你是对的,确实是字体的问题,是在定义变量时少写了一个字母,导致出错。修改后放在这里,供有需要的朋友自取。
两种方法,效果一致。


(defun c:11E (/ date1 date2 font font_obj fontlist fontname n to-shx to-ttf)
        (setq date1 (getvar "millisecs"))
        (defun to-shx(shxx shxb / a3)
                (setq a3 (entget (tblobjname "style" font)));取出字体的数据串行
                (setq a3 (subst (cons 3 shxx )(assoc 3 a3) a3));将字体字型改成新字型
                (setq a3 (subst (cons 4 shxb )(assoc 4 a3) a3));将字体字型改成新字型
                (entmod a3);更新字体
        )
        (defun to-ttf(ttf / obj)
                (setq obj (vla-add font_obj font))
                (vla-setFont obj ttf :vlax-false :vlax-false 134 2)
        )
        (setq font_obj (vla-get-TextStyles(vla-get-ActiveDocument(vlax-get-acad-object))))
        (vlax-for sobj font_obj
                (setq fontname (vla-get-name sobj))
                (setq fontlist (vl-remove "" (cons fontname fontlist)))
        )
        (setq n 0)
        (repeat (length fontlist)
                (setq font (nth n fontlist))
                (cond
                        ((wcmatch font "*仿宋*")(to-ttf "仿宋"))
                        ((wcmatch font "*宋体*")(to-ttf "宋体"))
                        ((wcmatch font "*黑体*")(to-ttf "黑体"))
                        (t(to-shx "tssdeng.shx" "hztxt.shx"))
                )
                (setq n (+ n 1))
        )
        (repeat 1 (vl-cmdf "regen"))
        (setq date2 (getvar "millisecs"))
        (princ (strcat ",耗时" (rtos(/(- date2 date1)1000.000)2 3) "秒。"))
)



(defun C:22E(/ a1 a2 date1 date2 to-shx to-ttf)
        (setq date1 (getvar "millisecs"))
        (defun to-shx(shxx shxb / a3)
                (setq a3 (entget (tblobjname "style" a2)));取出字体的数据串行
                (setq a3 (subst (cons 3 shxx )(assoc 3 a3) a3));将字体字型改成新字型
                (setq a3 (subst (cons 4 shxb )(assoc 4 a3) a3));将字体字型改成新字型
                (entmod a3);更新字体
        )
        (defun to-ttf(ttf / font_obj obj)
                (setq font_obj (vla-get-TextStyles(vla-get-ActiveDocument(vlax-get-acad-object))))
                (setq obj (vla-add font_obj a2))
                (vla-setFont obj ttf :vlax-false :vlax-false 134 2)
        )
        (setq a1 (tblnext "style" t));将指针移到第一个字体
        (while a1
                (setq a2 (cdr (assoc 2 a1)));取出字体名称
                (cond
                        ((wcmatch a2 "*仿宋*")(to-ttf "仿宋"))
                        ((wcmatch a2 "*宋体*")(to-ttf "宋体"))
                        ((wcmatch a2 "*黑体*")(to-ttf "黑体"))
                        (t(to-shx "tssdeng.shx" "hztxt.shx"))
                )
                (setq a1 (tblnext "style"));找出下一个字体
        )
        (repeat 1 (vl-cmdf "regen"))
        (setq date2 (getvar "millisecs"))
        (princ (strcat ",耗时" (rtos(/(- date2 date1)1000.000)2 3) "秒。"))
)


回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-23 15:10:02 | 显示全部楼层
試看看 是不是這樣,大家一起學習
(defun c:tty (/ font font_obj fontlist fontname n toshx tottf)                        
  (defun toshx(shx shxb / a3)                                                         
    (setq a3 (entget (tblobjname "style" "font")));取出字体的数据串行                 
    (setq a3 (subst (cons 3 "shxx" )(assoc 3 a3) a3));将字体字型改成新字型            
    (setq a3 (subst (cons 4 "shxb" )(assoc 4 a3) a3));将字体字型改成新字型            
    (entmod a3);更新字体                                                              
  )                                                                                   
  (defun tottf(ttf / obj)                                                            
    (setq obj (vla-add font_obj font))                                                
    (vla-setFont obj ttf :vlax-false :vlax-false 134 2)                              
  )                                                                                   
  (setq font_obj (vla-get-TextStyles(vla-get-ActiveDocument(vlax-get-acad-object))))  
  (vlax-for sobj font_obj                                                            
    (setq fontname (vla-get-name sobj))                                               
    (setq fontlist (vl-remove "" (cons fontname fontlist)))                           
  )                                                                                   
  (setq n 0)                                                                          
  (repeat (length fontlist)                                                           
    (setq font (nth n fontlist))                                                      
    (cond                                                                             
      ((= font "*黑体*")(tottf "黑体"))                                               
      ((= font "*仿宋*")(tottf "仿宋"))                                               
      ((= font "*宋体*")(tottf "宋体"))                                               
      (t(toshx "tssdeng.shx" "hztxt.shx"))                                            
    )                                                                                 
    (setq n (+ n 1))                                                                  
  )                                                                                   
  (repeat 1 (vl-cmdf "regen"))                                                        
)                                                                                    
发表于 2020-12-24 10:31:07 | 显示全部楼层
本帖最后由 bssurvey 于 2020-12-24 10:39 编辑
nyistjz 发表于 2020-12-24 09:58
你还没有看懂这个程序的运行顺序,是从第12行开始的。

真的很抱歉
看看是不是這樣
(defun c:tty (/ font font_obj fontlist fontname n toshx tottf)                        
  (defun toshx(shxx shxb / a3)                                                         
    (setq a3 (entget (tblobjname "style" font)));取出字体的数据串行
    (setq a3 (subst (cons 3 shxx)(assoc 3 a3) a3));将字体字型改成新字型
    (entmod a3);更新字体                 ; 增加这一行就可以了                                             
    (setq a3 (subst (cons 4 shxb)(assoc 4 a3) a3));将字体字型改成新字型
    (entmod a3);更新字体                                                              
  )                                                                                   
  (defun tottf(ttf / obj)                                                            
    (setq obj (vla-add font_obj font))                                                
    (vla-setFont obj ttf :vlax-false :vlax-false 134 2)                              
  )                                                                                   
  (setq font_obj (vla-get-TextStyles(vla-get-ActiveDocument(vlax-get-acad-object))))  
  (vlax-for sobj font_obj                                                            
    (setq fontname (vla-get-name sobj))                                               
    (setq fontlist (vl-remove "" (cons fontname fontlist)))                           
  )                                                                                   
  (setq n 0)                                                                          
  (repeat (length fontlist)                                                           
    (setq font (nth n fontlist))
    (cond                                                                             
      ((wcmatch font "*黑体*")(tottf "黑体"))
      ((wcmatch font "*仿宋*")(tottf "仿宋"))                                               
      ((wcmatch font "*宋体*")(tottf "宋体"))                                               
      (t(toshx "tssdeng.shx" "hztxt.shx"))
    )                                                                                 
    (setq n (+ n 1))                                                                  
  )                                                                                   
  (repeat 1 (vl-cmdf "regen"))                                                        
)

 楼主| 发表于 2020-12-23 15:17:33 | 显示全部楼层
bssurvey 发表于 2020-12-23 15:10
試看看 是不是這樣,大家一起學習
(defun c:tty (/ font font_obj fontlist fontname n toshx tottf)      ...

你测试一下,好像是不行的。
发表于 2020-12-23 15:27:09 | 显示全部楼层
本帖最后由 bssurvey 于 2020-12-23 15:33 编辑
nyistjz 发表于 2020-12-23 15:17
你测试一下,好像是不行的。

(tblobjname "style" "font") font 要圖檔有的字型名稱, 例如"Standard"
 楼主| 发表于 2020-12-23 15:32:56 | 显示全部楼层
bssurvey 发表于 2020-12-23 15:27
(tblobjname "style" "font") font 要圖檔有的字型名稱, 例如"Standard" 好像沒用到(defun tottf(ttf / ...

(setq font (nth n fontlist))
有这个定义!
发表于 2020-12-23 17:26:56 | 显示全部楼层
nyistjz 发表于 2020-12-23 15:32
(setq font (nth n fontlist))
有这个定义!

(setq a3 (subst (cons 3 shxx )(assoc 3 a3) a3));将字体字型改成新字型  應該是shxx 並沒有設定變數,是哪一個新字型,所以才會出錯
    (setq a3 (subst (cons 4 shxb )(assoc 4 a3) a3));将字体字型改成新字型 這個shxb 也是一樣
 楼主| 发表于 2020-12-24 09:58:35 | 显示全部楼层
bssurvey 发表于 2020-12-23 17:26
(setq a3 (subst (cons 3 shxx )(assoc 3 a3) a3));将字体字型改成新字型  應該是shxx 並沒有設定變數, ...

你还没有看懂这个程序的运行顺序,是从第12行开始的。
 楼主| 发表于 2020-12-24 10:49:34 | 显示全部楼层
bssurvey 发表于 2020-12-24 10:31
真的很抱歉
看看是不是這樣
(defun c:tty (/ font font_obj fontlist fontname n toshx tottf)         ...

谢谢您,还是不对,您自己在电脑上试一下,看能不能运行。
我怀疑(entmod a3)解析出来的a3格式不对,所以entmod运行不了。



发表于 2020-12-24 10:58:19 | 显示全部楼层
本帖最后由 bssurvey 于 2020-12-24 11:01 编辑
nyistjz 发表于 2020-12-24 10:49
谢谢您,还是不对,您自己在电脑上试一下,看能不能运行。
我怀疑(entmod a3)解析出来的a3格式不对,所 ...

我在2008測試是沒問題的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-17 14:36 , Processed in 0.177782 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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