dealing with multiple fonts

This commit is contained in:
jrkb 2024-08-14 10:50:57 +02:00
parent 7c72dd54dc
commit 94f4e28605
3 changed files with 195 additions and 32 deletions

View file

@ -4,6 +4,8 @@ import queue
import importlib
import os
import re
from multiprocessing import Process
# import time # for debugging performance
# then import dependencies for our addon
@ -381,12 +383,18 @@ def load_font_from_filepath(filepath):
return False
font3d_data = bpy.context.scene.font3d_data
for f in bpy.context.scene.font3d_data.available_fonts.values():
print(f"inside available font: {f.font_name} {f.face_name}")
allObjectsBefore = []
for ob in bpy.data.objects:
allObjectsBefore.append(ob.name)
bpy.ops.import_scene.gltf(filepath=filepath)
print(f"after import available fonts:")
for f in bpy.context.scene.font3d_data.available_fonts.values():
print(f"after import available font: {f.font_name} {f.face_name}")
fontcollection = bpy.data.collections.get("Font3D")
if fontcollection is None:
fontcollection = bpy.data.collections.new("Font3D")
@ -395,6 +403,8 @@ def load_font_from_filepath(filepath):
all_objects = []
for o in bpy.data.objects:
all_objects.append(o)
for f in bpy.context.scene.font3d_data.available_fonts.values():
print(f"before loop available font: {f.font_name} {f.face_name}")
for o in all_objects:
if o.name not in allObjectsBefore:
# must be new
@ -404,9 +414,13 @@ def load_font_from_filepath(filepath):
and not ("type" in o.keys() and o["type"] == "metrics")
and not is_metrics_object(o)
):
for f in bpy.context.scene.font3d_data.available_fonts.values():
print(f"super inside available font: {f.font_name} {f.face_name}")
glyph_id = o["glyph"]
font_name = o["font_name"]
face_name = o["face_name"]
ShowMessageBox("Loading Font", "INFO", f"adding glyph {glyph_id} for {font_name} {face_name}")
print(f"adding glyph {glyph_id} for {font_name} {face_name}")
glyph_obj = move_in_fontcollection(
o,
fontcollection)
@ -422,21 +436,47 @@ def load_font_from_filepath(filepath):
if glyph_obj != o:
remove_list.append(o)
found = False
for f in font3d_data.available_fonts.values():
if f.font_name == font_name and f.face_name == face_name:
found = True
break
if not found:
f = font3d_data.available_fonts.add()
f.font_name = font_name
f.face_name = face_name
print(f"{__name__} added {font_name} {face_name}")
# found = False
# for f in font3d_data.available_fonts.values():
# print(f"has in availables {f.font_name} {f.face_name}")
# if f.font_name == font_name and f.face_name == face_name:
# found = True
# break
# if not found:
# f = font3d_data.available_fonts.add()
# f.font_name = font_name
# f.face_name = face_name
# print(f"{__name__} added {font_name} {face_name}")
else:
remove_list.append(o)
for o in remove_list:
bpy.data.objects.remove(o, do_unlink=True)
print(f"{__name__}: loaded fonts")
print(f"{__name__}: loaded font from {filepath}")
update_available_fonts()
def update_available_fonts():
font3d_data = bpy.context.scene.font3d_data
for font_name in Font.fonts.keys():
for face_name in Font.fonts[font_name].faces.keys():
found = False
for f in font3d_data.available_fonts.values():
if font_name == f.font_name and face_name == f.face_name:
found = True
if not found:
f = font3d_data.available_fonts.add()
f.font_name = font_name
f.face_name = face_name
print("{__name__} added {font_name} {face_name}")
def update_available_texts():
font3d_data = bpy.context.scene.font3d_data
for o in bpy.context.scene.objects:
if "linked_textobject" in o.keys():
i = o["linked_textobject"]
found = False
if len(font3d_data.available_texts) > i:
if font3d_data.available_texts[i].glyphs
def getPreferences(context):
preferences = context.preferences
@ -447,17 +487,17 @@ def clear_available_fonts():
bpy.context.scene.font3d_data.available_fonts.clear()
def load_available_fonts():
preferences = getPreferences(bpy.context)
currentObjects = []
for ob in bpy.data.objects:
currentObjects.append(ob.name)
print(f"assets folder: {preferences.assets_dir}")
font_dir = f"{preferences.assets_dir}/fonts"
for file in os.listdir(font_dir):
if file.endswith(".glb") or file.endswith(".gltf"):
font_path = os.path.join(font_dir, file)
ShowMessageBox("Loading Font", "INFO", f"loading font from {font_path}")
print(f"loading font from {font_path}")
for f in bpy.context.scene.font3d_data.available_fonts.values():
print(f"available font: {f.font_name} {f.face_name}")
load_font_from_filepath(font_path)
def ShowMessageBox(title = "Message Box", icon = 'INFO', message=""):
@ -560,6 +600,9 @@ def set_text_on_curve(text_properties):
regenerate = True
if len(text_properties.text) > i and g.glyph_id != text_properties.text[i]:
regenerate = True
if len(text_properties.text) > i and (g.font_name != text_properties.text[i].font_name
or g.face_name != text_properties.text[i].face_name):
regenerate = True
if len(text_properties.text) != len(text_properties.glyphs):
regenerate = True