比开图自动替换字体更厉害的终极解决方案(2022全球首发)
本帖最后由 xugaoming23 于 2023-3-23 23:56 编辑2022年全球首发的真正意义上的大字体自动映射,如同西文的fontalt映射!
我看都2023年了,还没有人发布类似方案,在此提点一二!
由于我的原理已变成商用的万能字体插件,所以在此仅给出方案,不给代码,有了方案,一定难不到聪明的你。
万能字体插件演示:https://www.douyin.com/video/7098569390710443302
一、先说下背景:
我们都知道fontAlt可以设置西文的映射字体,即当这个西文字体不存在时,会映射为fontAlt设置的字体,而不会弹窗。
但中文大字体却不幸,只要这个字体不存在,就会弹窗,这个就是老美对我们的不公。
而我就是突破这个,做到中文大字体也可以自动映射,从而不会弹窗。
二、再说下发现原理:
当图纸第一次打开后,手动替换不存在的大字体后,不关闭CAD再打开这个图纸时,就不会出现替换框,原因就是CAD在内存中暂存了一份映射表 ,例如当手动a.shx映射为gbcbig.shx,在不关闭CAD主程序的前提下,随后打开的图纸,不会再次在替换框中出现a.shx。
通过这个原理,我找到了CAD内置函数,直接添加大字体映射即可。(利用c#可以调用这个函数,注意不是托管函数,属于c语言的,CAD没有公开这个函数,全球互联网都是搜不到这个函数的,只能自己凭感觉去一个dll一个dll发现)
利用以上原理,不仅仅可以添加大字体映射,还能添加真字体映射,也能添加西文字体映射。
在实验过程中,我还把西文映射为真字体也是可以的,2010及以下的版本是没有问题,感觉特别好玩,但是高版本添加映射后,刷新不出来,要双击或到自动保存时间到了后才能刷新效果,一直也没找到如何解决这个问题,当然最后通过各种实验归纳了通用的方案。
三、方案思路:
利用c#编写程序,设置自动加载,初始化时执行文档读入事件
通过图纸读入完成后的事件,自动执行映射函数,
映射函数,包括遍历textstyle 文字样式,遍历多行文字,读取里面的所有大字体、真字体
只要发现本地的大字体和真字体不存在时,就自动添加映射,我一般设置的是大字体映射为hztxt.shx,真字体映射为宋体(关于列出本地字体表有托管函数,cad也没有公开,不过一搜就能收到)
最后刷新一下图纸regen即可。
针对西文,我自己研发了万能字体,比快速看图和看图王兼容更多的钢筋字符,利用fontalt设置系统变量即可。
有三个注意点:
1.07以上的图纸可以刷新,但07以下版的图纸是刷新不了的,要通过重载图纸,即不关闭CAD,而重新打开图纸,之所以刷新不了,是因为07版以下的图纸字符编码不一样,07以上是unicode编码,中英文占宽一样,07以下占宽不一样,打开图纸后,编码是跟 这字体解析发生变化,无法通过刷新来回归字符编码,这也是很多永久性乱码图纸产生的原因,(有的人拿着07以下版本的图纸,打开时没有手动替换或者映射到正确字体,结果就显示乱码,而当保存后就出现了永久乱码)
所以在此呼吁,大家不要保存07以下版本图纸,至少07版本
2.特别要注意内存中的映射表状况,不要产生映射循环,如a映射b,b映射c,怪异的现象自己做实验哦,还有一种情况,同一个图纸,可能会出现一个字体,在不同的样式中,一会代表西文,一会代表中文,这个是要进行修正的,不然映射就循环得一塌糊涂导致文字直接不显示。
3.程序是后于字体替换窗口的,因此需要关闭替换窗口,2010以上的CAD可以通过添加忽略字体窗口来解决,这个同样是程序编程处理,我看论坛有人采用这个技术,效果比较好,2010以下版本CAD版本,需要先开个CAD,再打开图纸,这样程序会先于替换窗口执行,再利用替换字体窗口的特征关闭窗口,效果不是很好,会有闪窗的影子。
总结:整过解决方案不会修改图纸字体,纯内部映射,c#的速度也很快,效果是很完美的,唯一遗憾的是2010以下没有忽略窗口的,会有闪影.
既然大家这么活跃,直接放源码:
【统一所有字体为宋体】
顺便也解决了乱码问题。保存图纸后也不再弹出提示换字体。
其实弹不弹提示,不是最烦的。
最烦的是乱码问号。各种设计院独立门户,滥用字体秀智商............
统一字体,避免张三李四的,字体一大堆,看起来极为不爽
(defun c:HT (/ OBJNAME ATTS);原作者:liunian0524
(vl-load-com)
(setq ThisDrawing(vla-get-activedocument (vlax-get-acad-object)))
(Setq TextStyles(vla-get-TextStyles ThisDrawing))
(Setq TextStyle(vla-add TextStyles "仿宋"))
(vla-SetFont TextStyle "仿宋" :vlax-false :vlax-false 1 0)
(vlax-for blkobj (vla-get-blocks
(vla-get-ActiveDocument (vlax-get-acad-object))
)
(vlax-for obj blkobj
(if (or (= "AcDbMText" (setq objname (vla-get-objectname obj)))
(= "AcDbText" objname)
(= "AcDbAttribute" objname)
(= "AcDbAttributeDefinition" objname)
)
(VL-CATCH-ALL-APPLY 'vla-put-stylename (list obj "仿宋"))
)
(if (and
(or (= "AcDbMInsertBlock" objname)
(= "AcDbBlockReference" objname)
)
(setq atts (vlax-invoke obj 'GetAttributes))
)
(foreach a atts (VL-CATCH-ALL-APPLY 'vla-put-stylename (list a "仿宋")))
)
)
)
(setvar 'textstyle "仿宋")
(command "purge" "st" "*" "n")
(princ)
)
开心无惧 发表于 2025-4-20 17:59
可以发个链接吗
我是替换文字样式表的,
因为cad读取字体并执行渲染的顺序比较靠后,
所以替换文字样式和调用arx函数修改映射本身没有区别,
无非是你自己需要准备一个map记录来源和目标,
从而达到首次开图就替换. 2022年初代产品演示,有一些好玩的:https://www.douyin.com/video/7074640423620316419 明经上只做PPT不提供产品的都是扯淡 本帖最后由 lxl217114 于 2023-3-24 09:13 编辑
来明经打广告,给站长交广告费了么?
没交的话这里@mccad
这个问题,很容易解决。
钢筋符号?天正,理正??都是弟弟
只要不是pdf转回来的乱码,统统搞定!
授人以鱼不如授人以渔
不用花大价钱,一碗泡面钱,就问你良不良心?:lol:lol:lol:lol:lol:lol:lol
需要的@我。:lol:lol:lol:lol:lol:lol:lol
来,这里是免费的,阿甘出品: http://bbs.mjtd.com/thread-183072-1-1.html lengxiaxi 发表于 2023-3-24 11:08
既然大家这么活跃,直接放源码:
【统一所有字体为宋体】
顺便也解决了乱码问题。保存图纸后也不再弹出提 ...
感谢分享,不支持shx字体吗? 刚开始 发表于 2023-3-24 11:48
感谢分享,不支持shx字体吗?
支持修改成自己钟意的shx字体,阿甘出品: http://bbs.mjtd.com/thread-183072-1-1.html 货物呢?咋看不到啊!