From d6dfbfa5a13853702305f00ec9e4a03dc8aa18d9 Mon Sep 17 00:00:00 2001 From: themancalledjakob Date: Tue, 20 May 2025 19:21:32 +0200 Subject: [PATCH 1/4] cleanup --- butils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/butils.py b/butils.py index eec7106..c87b10d 100644 --- a/butils.py +++ b/butils.py @@ -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 From 2422d0cf0978f1575c70d6dda63df6efba3a99e6 Mon Sep 17 00:00:00 2001 From: themancalledjakob Date: Tue, 20 May 2025 19:22:00 +0200 Subject: [PATCH 2/4] clean startup --- __init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/__init__.py b/__init__.py index ef361dc..33d293b 100644 --- a/__init__.py +++ b/__init__.py @@ -1829,9 +1829,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(): @@ -1917,12 +1918,11 @@ def register(): 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() From 7ebe913e49c4a24ff7607cddcc8e2f140d8e2603 Mon Sep 17 00:00:00 2001 From: themancalledjakob Date: Tue, 20 May 2025 19:24:43 +0200 Subject: [PATCH 3/4] 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 --- __init__.py | 14 +++++++------- butils.py | 21 +++++++++++---------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/__init__.py b/__init__.py index 33d293b..8d54e7e 100644 --- a/__init__.py +++ b/__init__.py @@ -180,7 +180,7 @@ 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): butils.set_text_on_curve(self) @@ -1321,8 +1321,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 @@ -1911,8 +1911,8 @@ 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) @@ -1938,8 +1938,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) diff --git a/butils.py b/butils.py index c87b10d..9b696d1 100644 --- a/butils.py +++ b/butils.py @@ -777,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): @@ -843,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. @@ -879,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"): @@ -954,12 +954,13 @@ 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 - ShowMessageBox( - title="Glyph replaced" if replaced else "Glyph missing", - icon="INFO" if replaced else "ERROR", - message=message, - prevent_repeat=True, - ) + if can_regenerate: + ShowMessageBox( + title="Glyph replaced" if replaced else "Glyph missing", + icon="INFO" if replaced else "ERROR", + message=message, + prevent_repeat=True, + ) if not replaced: continue @@ -997,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: @@ -1079,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 From 49699db30983a49c6f29076b3b08d0f1ed8bdd58 Mon Sep 17 00:00:00 2001 From: themancalledjakob Date: Fri, 23 May 2025 11:33:38 +0200 Subject: [PATCH 4/4] regenerate if needed in update_callback --- __init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index 8d54e7e..f1d8157 100644 --- a/__init__.py +++ b/__init__.py @@ -183,7 +183,10 @@ class ABC3D_text_properties(bpy.types.PropertyGroup): butils.set_text_on_curve(self, can_regenerate=True) def update_callback(self, context): - butils.set_text_on_curve(self) + 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(" ")