0

(英语不是我的母语)

我想用来ezdxf将“DXF”文件转换为图片。

作为文档的示例:


fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ctx = RenderContext(dxf_doc)
out = MatplotlibBackend(ax)
frontend = Frontend(ctx, out)
frontend.ctx.set_current_layout(msp)
# frontend.draw_layout(msp, filter_func=lambda entity_f: entity_f in entity_use, finalize=True)
frontend.draw_entities(entity_use)
frontend.out.set_background(
frontend.ctx.current_layout_properties.background_color)
frontend.out.finalize()
fig.savefig(f'./datas/your_{i}.png', dpi=500)
plt.close(fig)

但是,警告来了:


findfont: Font family ["Tssdeng"] not found,Falling back to DejaVu Sans.
findfont: Font family ["bzxw"] not found,Falling back to DejaVu Sans.
findfont: Font family ["simfang"] not found,Falling back to DejaVu Sans.
findfont: Font family [''] not found,Falling back to DejaVu Sans.
findfont: Font family ["tssdeng"] not found,Falling back to DejaVu Sans.

它使:创建的图片,将使用矩形来表示(如“工程”字样,“工程”等汉字)

我想,matplotlib加载字体时可能有任何问题。所以,我在main.py头部尝试了下面的代码:


from matplotlib.font_manager import fontManager
fontManager.addfont(r"./mpl_ttf/TssdEng.ttf")
fontManager.addfont(r"./mpl_ttf/simfang.ttf")

但出现了其他警告:

Matplotlib RuntimeError: In affine_transform: Invalid vertices array.

所以我只写了一个迷你代码来展示,应该如何使用自定义字体:


import numpy as np

import matplotlib as mpl

from pathlib import Path
from matplotlib import font_manager
from matplotlib.font_manager import fontManager

import matplotlib.pyplot as plt


myfont = mpl.font_manager.FontProperties(fname=r"./mpl_ttf/TssdEng.ttf")
t = np.arange(-5*np.pi, 5*np.pi, 0.001)
y = np.sin(t)/t
my_post = plt.plot(t, y)
plt.title('matplotlib 中文显示测试——test chinese',fontproperties=myfont)
plt.xlabel('中文显示测试X',fontproperties=myfont)
plt.ylabel('中文显示测试Y',fontproperties=myfont)

plt.show()

警告来了:


RuntimeWarning: Glyph 101 missing from current font.

另外,我尝试了其他代码(查找字体支持的字符):

from itertools import chain

from fontTools.ttLib import TTFont
from fontTools.unicode import Unicode

font_path = r"TssdEng.ttf"


def font_validation(input_string, font_path):
    font = TTFont(font_path)
    chars = chain.from_iterable([y + (Unicode[y[0]],) for y in x.cmap.items()] for x in font["cmap"].tables)
    for char in chain.from_iterable([y + (Unicode[y[0]],) for y in x.cmap.items()] for x in font["cmap"].tables):
        print(f" {char} ")
    for i in input_string:
        char = ord(i)
        print(i, char, hex(char), Unicode[char], char in (x[0] for x in chars))
    font.close()


font_validation("C", font_path)

显示:字体不支持所有字符。

那么,我该怎么做才能将“DXF”文件的一部分转换为ezdxf使用自定义字体的图片?

4

0 回答 0