OooCcc 发表于 2024-6-3 17:26:41

如何用lisp获取字体

1、如何使用lisp获取cad自带的字体,并区分哪些是大字体,哪些是普通字体?

2、如何用lisp获取windows字体,并获取字体的名称(不是文件名称)?

以上两条,不知道哪位大神能够帮忙解答下?谢谢!~~~

你有种再说一遍 发表于 2024-6-3 20:56:47

你的问题蛮清晰的,我觉得你都问了,应该会自己找答案了.
vla函数面向对象的

kozmosovia 发表于 2024-6-3 22:01:39

本帖最后由 kozmosovia 于 2024-6-3 22:04 编辑

这个其实比较复杂的,SHX需要遍历支持路径去查,TTF需要去读注册表。

可以用VLDCL的内置函数(vldcl-getAllFonts)实现,VLDCL可以从https://gitee.com/kozmos/tachyon ... VLX/VLDCL-FINAL.VLX下载
最后结果是(字体样式名称 . 字体文件名)列表,TTF和SHX再样式名称中有标注,可以自己再进一步处理细分。

结果样式:

(("@extfont2 (shx-bigfont)" . "C:\\Program Files\\Autodesk\\AutoCAD 2020\\fonts\\@extfont2.shx")
("AIGDT (TrueType)" . "C:\\Windows\\Fonts\\AIGDT___.TTF")
("AMDTSymbols (shx-unifont)" . "C:\\Program Files\\Autodesk\\AutoCAD 2020\\fonts\\AMDTSymbols.shx")
("AMGDT (TrueType)" . "C:\\Windows\\Fonts\\AMGDT___.ttf")
("AMGDT DWE Edits (shx-unifont)" . "C:\\Program Files\\Autodesk\\AutoCAD 2020\\fonts\\AMGDT DWE Edits.shx")
("AMGDTANS DWE Edits (shx-shapes)" . "C:\\Program Files\\Autodesk\\AutoCAD 2020\\fonts\\AMGDTANS DWE Edits.shx")
("ARCHSTYL (shx-shapes)" . "G:\\TC2020\\LSP\\ARCHSTYL.SHX")
("AcadEref (TrueType)" . "C:\\Windows\\Fonts\\AcadEref.ttf")
("AcadEref (shx-unifont)" . "C:\\Program Files\\Autodesk\\AutoCAD 2020\\fonts\\AcadEref.shx")
("AdobeDevanagari-Bold (TrueType)" . "C:\\Program Files (x86)\\Adobe\\Acrobat DC\\Resource\\Font\\AdobeDevanagari-Bold.otf")
("AdobeDevanagari-BoldItalic (TrueType)" . "C:\\Program Files (x86)\\Adobe\\Acrobat DC\\Resource\\Font\\AdobeDevanagari-BoldItalic.otf")
("AdobeDevanagari-Italic (TrueType)" . "C:\\Program Files (x86)\\Adobe\\Acrobat DC\\Resource\\Font\\AdobeDevanagari-Italic.otf")
("AdobeDevanagari-Regular (TrueType)" . "C:\\Program Files (x86)\\Adobe\\Acrobat DC\\Resource\\Font\\AdobeDevanagari-Regular.otf")
("Aehalf (shx-unifont)" . "C:\\Program Files\\Autodesk\\AutoCAD 2020\\fonts\\aehalf.shx")
("Agency FB (TrueType)" . "C:\\Windows\\Fonts\\AGENCYR.TTF")
("Agency FB Bold (TrueType)" . "C:\\Windows\\Fonts\\AGENCYB.TTF")
("Algerian (TrueType)" . "C:\\Windows\\Fonts\\ALGER.TTF")
("AmdtSymbols (TrueType)" . "C:\\Windows\\Fonts\\AMDT_Symbols.ttf")
("Amgdt (shx-unifont)" . "C:\\Program Files\\Autodesk\\AutoCAD 2020\\fonts\\amgdt.shx")
("Amgdtans (shx-shapes)" . "C:\\Program Files\\Autodesk\\AutoCAD 2020\\fonts\\amgdtans.shx")

...
("Zilla Slab SemiBold Italic (TrueType)" . "C:\\Windows\\Fonts\\ZillaSlab-SemiBoldItalic.ttf")
("方正舒体 (TrueType)" . "C:\\Windows\\Fonts\\FZSTK.TTF")
("方正姚体 (TrueType)" . "C:\\Windows\\Fonts\\FZYTK.TTF")
("仿宋_GB2312 (TrueType)" . "C:\\Windows\\Fonts\\FSGB2312.ttf")
("汉仪综艺体简 (TrueType)" . "C:\\Windows\\Fonts\\HYZYTJ.ttf")
("华文彩云 (TrueType)" . "C:\\Windows\\Fonts\\STCAIYUN.TTF"))


gaics 发表于 2024-6-4 10:09:38

(defun c:tt (/ font bigfont)
(vl-load-com)
(vlax-for x (vla-get-textstyles
                (vla-get-activedocument (vlax-get-acad-object))
              )
    (princ "\n字体样式:")
    (princ (vla-get-name x))
    (princ ",字体:")
    (vla-getfont x 'font 'bold 'italic 'charset 'pitchandfamily)
    (if        (= font "")
      (princ (vla-get-fontfile x))
      (princ font)
    )
    (if        (= (setq bigfont (vla-get-bigfontfile x)) "")
      (princ ",大字体:无")
      (princ (strcat ",大字体:" bigfont))
    )
)
(princ)
)

OooCcc 发表于 2024-6-5 15:12:23

gaics 发表于 2024-6-4 10:09


你这个只是列出了字体样式内的信息,我需要的是系统中的字体信息.不过还是谢谢解答~

OooCcc 发表于 2024-6-5 15:14:23

kozmosovia 发表于 2024-6-3 22:01
这个其实比较复杂的,SHX需要遍历支持路径去查,TTF需要去读注册表。

可以用VLDCL的内置函数(vldcl-getA ...

好的,谢谢解答~~~晚点我去尝试下

OooCcc 发表于 2024-6-5 15:35:03

kozmosovia 发表于 2024-6-3 22:01
这个其实比较复杂的,SHX需要遍历支持路径去查,TTF需要去读注册表。

可以用VLDCL的内置函数(vldcl-getA ...

经过你的启发,

shx字体文件只需要获取到路径后,打开,然后读取第一行数据就可以知道是啥类型了。

TTF字体,可以从windows注册表中读取字体信息

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

嗯,这样就可以解决问题了!~太感谢了哈~~

至于那个VLDCL的内置函数,如果要写入自己的插件中有点麻烦~
页: [1]
查看完整版本: 如何用lisp获取字体