Compare commits

..

4 commits

Author SHA1 Message Date
49699db309 regenerate if needed in update_callback 2025-05-23 11:33:38 +02:00
7ebe913e49 fix rendering crashes
1) introduce can_regenerate so we only regenerate when necessary
2) no notifications of missing glyphs when rendering
3) use frame_change_pre instead of post
2025-05-20 19:24:43 +02:00
2422d0cf09 clean startup 2025-05-20 19:22:00 +02:00
d6dfbfa5a1 cleanup 2025-05-20 19:21:32 +02:00
2 changed files with 26 additions and 23 deletions

View file

@ -180,10 +180,13 @@ class ABC3D_text_properties(bpy.types.PropertyGroup):
def glyphs_update_callback(self, context):
butils.prepare_text(self.font_name, self.face_name, self.text)
butils.set_text_on_curve(self)
butils.set_text_on_curve(self, can_regenerate=True)
def update_callback(self, context):
try:
butils.set_text_on_curve(self)
except (AttributeError, TypeError):
butils.set_text_on_curve(self, can_regenerate=True)
def font_update_callback(self, context):
font_name, face_name = self.font.split(" ")
@ -1321,8 +1324,8 @@ class ABC3D_OT_PlaceText(bpy.types.Operator):
# t['font'] = self.font # enums want to be set as attribute
t["font_name"] = self.font_name
t["face_name"] = self.face_name
t.text_object = selected
t["text"] = self.text
t["text_object"] = selected
t.text = self.text
t["letter_spacing"] = self.letter_spacing
t["font_size"] = self.font_size
t["offset"] = self.offset
@ -1829,9 +1832,10 @@ def load_used_glyphs():
def load_handler(self, dummy):
if not bpy.app.timers.is_registered(butils.execute_queued_functions):
bpy.app.timers.register(butils.execute_queued_functions)
butils.run_in_main_thread(butils.register_installed_fonts)
butils.run_in_main_thread(butils.update_available_fonts)
butils.run_in_main_thread(bpy.ops.abc3d.load_installed_fonts)
butils.run_in_main_thread(load_used_glyphs)
butils.run_in_main_thread(butils.update_types)
def load_handler_unload():
@ -1910,19 +1914,18 @@ def register():
# and autostart if we reload script
load_handler(None, None)
if on_frame_changed not in bpy.app.handlers.frame_change_post:
bpy.app.handlers.frame_change_post.append(on_frame_changed)
if on_frame_changed not in bpy.app.handlers.frame_change_pre:
bpy.app.handlers.frame_change_pre.append(on_frame_changed)
if on_depsgraph_update not in bpy.app.handlers.depsgraph_update_post:
bpy.app.handlers.depsgraph_update_post.append(on_depsgraph_update)
butils.run_in_main_thread(butils.clear_available_fonts)
# butils.run_in_main_thread(butils.load_installed_fonts)
butils.run_in_main_thread(butils.register_installed_fonts)
butils.run_in_main_thread(butils.update_available_fonts)
butils.run_in_main_thread(load_used_glyphs)
butils.run_in_main_thread(butils.update_types)
# bpy.ops.abc3d.load_installed_fonts()
Font.init()
@ -1938,8 +1941,8 @@ def unregister():
# and when reload script
load_handler_unload()
if on_frame_changed in bpy.app.handlers.frame_change_post:
bpy.app.handlers.frame_change_post.remove(on_frame_changed)
if on_frame_changed in bpy.app.handlers.frame_change_pre:
bpy.app.handlers.frame_change_pre.remove(on_frame_changed)
if on_depsgraph_update in bpy.app.handlers.depsgraph_update_post:
bpy.app.handlers.depsgraph_update_post.remove(on_depsgraph_update)

View file

@ -634,7 +634,6 @@ def ShowMessageBox(title="Message Box", icon="INFO", message="", prevent_repeat=
if prevent_repeat:
for m in message_memory:
if m[0] == title and m[1] == icon and m[2] == message:
print("PREVENT PREVENT")
return
message_memory.append([title, icon, message])
myLines = message
@ -778,7 +777,7 @@ def is_bezier(curve):
return True
def will_regenerate(text_properties):
def would_regenerate(text_properties):
mom = text_properties.text_object
if len(text_properties.text) != len(text_properties.glyphs):
@ -844,7 +843,7 @@ def parent_to_curve(o, c):
p = cm.vertices[0].co
o.matrix_parent_inverse.translation = p * -1.0
def set_text_on_curve(text_properties, reset_timeout_s=0.1, reset_depsgraph_n=4):
def set_text_on_curve(text_properties, reset_timeout_s=0.1, reset_depsgraph_n=4, can_regenerate=False):
"""set_text_on_curve
An earlier reset cancels the other.
@ -880,7 +879,7 @@ def set_text_on_curve(text_properties, reset_timeout_s=0.1, reset_depsgraph_n=4)
# elif distribution_type == "FOLLOW_PATH":
# mom.data.use_path = True
regenerate = will_regenerate(text_properties)
regenerate = can_regenerate and would_regenerate(text_properties)
# if we regenerate.... delete objects
if regenerate and text_properties.get("glyphs"):
@ -955,6 +954,7 @@ def set_text_on_curve(text_properties, reset_timeout_s=0.1, reset_depsgraph_n=4)
message = message + f" (replaced with '{possible_replacement}')"
replaced = True
if can_regenerate:
ShowMessageBox(
title="Glyph replaced" if replaced else "Glyph missing",
icon="INFO" if replaced else "ERROR",
@ -998,6 +998,7 @@ def set_text_on_curve(text_properties, reset_timeout_s=0.1, reset_depsgraph_n=4)
inner_node.parent = outer_node
inner_node.matrix_parent_inverse = outer_node.matrix_world.inverted()
parent_to_curve(outer_node, mom)
outer_node.hide_set(True)
glyph_properties["glyph_object"] = outer_node
else:
@ -1080,7 +1081,6 @@ def set_text_on_curve(text_properties, reset_timeout_s=0.1, reset_depsgraph_n=4)
inner_node.rotation_mode = previous_inner_node_rotation_mode
# outer_node.hide_viewport = True
outer_node.hide_set(True)
############### PREPARE FOR THE NEXT