找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 893|回复: 0

[讨论]:关于字体修改的问题

[复制链接]
发表于 2002-12-12 17:03:45 | 显示全部楼层 |阅读模式

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

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

×
关于字体修改的问题

以下的程序目的是把图形中所有的字体都修改成名字不同的同一种字体样式
使用(tblobjname "style" stylename) 获取字体表 然后entmod
对于使用WINDOWS系统字体的字体样式就出问题了:

修改后
使用
(tblobjname "style" stylename)
(tblnext "style" t)
查看都改过了
但是图形中的字体没有变化
我保存后重新打开
用ST命令发现字体还是没有改过来
具体测试如下
修改前:
Command:(tblnext "style" ) =>
((0 . "STYLE") (2 . "SSSS") (70 . 0) (40 . 0.0) (41 . 0.5) (50 . 0.0) (71 . 0)
(42 . 2.29114) (3 . "simhei.ttf") (4 . ""))
;;;;;;;;;;;;;;;;;;;;;
Command:(entget(tblobjname "style" "ssss"))=>
((-1 . <Entity name: 3370588>) (0 . "STYLE") (5 . "A9") (100 .
"AcDbSymbolTableRecord") (100 . "AcDbTextStyleTableRecord") (2 . "SSSS") (70 .
0) (40 . 0.0) (41 . 0.5) (50 . 0.0) (71 . 0) (42 . 2.29114) (3 . "simhei.ttf")
(4 . ""))

修改后:
Command: (tblnext "style" )
((0 . "STYLE") (2 . "SSSS") (70 . 0) (40 . 0.0) (41 . 0.5) (50 . 0.0) (71 . 0)
(42 . 2.29114) (3 . "romans.shx") (4 . "HZDX.shx"))

Command: (entget(tblobjname "style" "ssss"))
((-1 . <Entity name: 3370588>) (0 . "STYLE") (5 . "A9") (100 .
"AcDbSymbolTableRecord") (100 . "AcDbTextStyleTableRecord") (2 . "SSSS") (70 .
0) (40 . 0.0) (41 . 0.5) (50 . 0.0) (71 . 0) (42 . 2.29114) (3 . "romans.shx")
(4 . "HZDX.shx"))
保存后重新打开:
Command:(tblnext "style" ) =>
((0 . "STYLE") (2 . "SSSS") (70 . 0) (40 . 0.0) (41 . 0.5) (50 . 0.0) (71 . 0)
(42 . 2.29114) (3 . "simhei.ttf") (4 . "HZDX.shx"))
;;;;;;;;;;;;;;;;;;;;;
Command:(entget(tblobjname "style" "ssss"))=>
((-1 . <Entity name: 3370588>) (0 . "STYLE") (5 . "A9") (100 .
"AcDbSymbolTableRecord") (100 . "AcDbTextStyleTableRecord") (2 . "SSSS") (70 .
0) (40 . 0.0) (41 . 0.5) (50 . 0.0) (71 . 0) (42 . 2.29114) (3 . "simhei.ttf")
(4 . "HZDX.shx"))

显然是有些东西好像被保护了?
为什么会这样呢?
ACAD的帮助里有如下说明:(但是好像没说明什么问题)
///////////////////////////////
entmod 函数对它所能完成的修改作了某些限制。首先,它不能改变一个图元的类型和句柄。如果一定要这样做,只能先调用 entdel 函数删除它,然后调用 command 或 entmake函数创建一个新图元。在执行 entmod 函数之前,图元数据表引用的所有对象对 AutoCAD 来说都必须是已知的。因此,字体、线型、形和块名必须先在图形中定义才能在 entmod 函数中的图元数据表中使用。但图层名例外:如果在图元数据表中用了未定义的新图层名,entmod
函数将用 LAYER 命令的 New 选项采用标准的缺省值来创建该图层。
/////////////////////////////////


  1. (defun  c:dd_fontsame ( / tbs  substyle  STYELST substlst)

  2. (setq substyle (getstring "要统一为何种字体样式<hzdx>?:"))
  3.   (IF (= substyle "") (setq substyle "hzdx"))
  4. (setq tbs (tblnext "style" t))
  5.   ;;;(PRINC (tblobjname "style" "HZDX"))
  6. (if (setq substyle (tblobjname "style" substyle))
  7.     (setq substlst  (entget substyle))
  8.     (alert "你选择的字体样式不存在!")
  9.    )  
  10. ;; (princ substyle)
  11. (while tbs

  12.        (progn
  13.          ;;;;
  14.          (setq styelst (entget (tblobjname "style" (cdr (assoc 2 tbs)) )))
  15.             ;;(print "-----------------------")
  16.          ;;(print substyle)
  17.         ;; (print styelst)
  18.          
  19.          (setq substlst (subst (assoc -1 styelst) (assoc -1 substlst)  substlst))
  20.          (setq substlst (subst (assoc 5 styelst) (assoc 5 substlst)  substlst))
  21.          (setq substlst (subst (assoc 41 styelst) (assoc 41 substlst)  substlst))
  22.          (setq substlst (subst (assoc 2 styelst) (assoc 2 substlst)  substlst))
  23.          ;;;;;;
  24.          ;;(print "-----------------------")
  25.          ;;(print substLST)
  26.          (entmod substlst)
  27.         )

  28. (setq tbs (tblnext "style" ))
  29. )

  30.   (princ)
  31. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-26 05:18 , Processed in 0.166096 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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