autoremove text_objects and newline
This commit is contained in:
parent
62e6c63a61
commit
8bcb252087
2 changed files with 46 additions and 73 deletions
87
__init__.py
87
__init__.py
|
@ -167,6 +167,7 @@ class FONT3D_glyph_properties(bpy.types.PropertyGroup):
|
||||||
class FONT3D_text_properties(bpy.types.PropertyGroup):
|
class FONT3D_text_properties(bpy.types.PropertyGroup):
|
||||||
def update_callback(self, context):
|
def update_callback(self, context):
|
||||||
butils.set_text_on_curve(self)
|
butils.set_text_on_curve(self)
|
||||||
|
text_index: bpy.props.IntProperty()
|
||||||
font_name: bpy.props.StringProperty()
|
font_name: bpy.props.StringProperty()
|
||||||
font_face: bpy.props.StringProperty()
|
font_face: bpy.props.StringProperty()
|
||||||
text_object: bpy.props.PointerProperty(type=bpy.types.Object)
|
text_object: bpy.props.PointerProperty(type=bpy.types.Object)
|
||||||
|
@ -245,6 +246,14 @@ class FONT3D_PT_panel(bpy.types.Panel):
|
||||||
for i, t in enumerate(font3d_data.available_texts):
|
for i, t in enumerate(font3d_data.available_texts):
|
||||||
if type(t.text_object) == type(None):
|
if type(t.text_object) == type(None):
|
||||||
remove_list.append(i)
|
remove_list.append(i)
|
||||||
|
continue
|
||||||
|
remove_me = True
|
||||||
|
for c in t.text_object.children:
|
||||||
|
if len(c.users_collection) > 0 and (c.get('linked_textobject')) != type(None) and c.get('linked_textobject') == t.text_index:
|
||||||
|
remove_me = False
|
||||||
|
if remove_me:
|
||||||
|
remove_list.append(i)
|
||||||
|
|
||||||
for i in remove_list:
|
for i in remove_list:
|
||||||
font3d_data.available_texts.remove(i)
|
font3d_data.available_texts.remove(i)
|
||||||
|
|
||||||
|
@ -414,82 +423,14 @@ class FONT3D_OT_TestFont(bpy.types.Operator):
|
||||||
font_name = "NM_Origin"
|
font_name = "NM_Origin"
|
||||||
font_face = "Tender"
|
font_face = "Tender"
|
||||||
|
|
||||||
# text_text_object = bpy.data.objects.new(f"{selected.name}_text", None)
|
|
||||||
# text_text_object.empty_display_type = 'PLAIN_AXES'
|
|
||||||
# selected.users_collection[0].objects.link(text_text_object)
|
|
||||||
|
|
||||||
distribution_type = 'DEFAULT'
|
distribution_type = 'DEFAULT'
|
||||||
|
|
||||||
bpy.ops.object.select_all(action='DESELECT')
|
|
||||||
t = font3d_data.available_texts.add()
|
t = font3d_data.available_texts.add()
|
||||||
|
text_index = 0
|
||||||
offset = mathutils.Vector((0.0, 0.0, 0.0))
|
for i, tt in enumerate(font3d_data.available_texts):
|
||||||
advance = 0
|
while text_index == tt.text_index:
|
||||||
for i, c in enumerate(scene.font3d.test_text):
|
text_index = text_index + 1
|
||||||
glyph_id = c
|
t.text_index = text_index
|
||||||
glyph = Font.get_glyph(font_name, font_face, glyph_id)
|
|
||||||
|
|
||||||
if glyph == None:
|
|
||||||
self.report({'ERROR'}, f"Glyph not found for {font_name} {font_face} {glyph_id}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
ob = bpy.data.objects.new(f"{glyph_id}", glyph.data)
|
|
||||||
|
|
||||||
distribution_type = 'CALCULATE'
|
|
||||||
|
|
||||||
if selected.type == "CURVE" and distribution_type == 'FOLLOW_PATH':
|
|
||||||
distribution_type = "FOLLOW_PATH"
|
|
||||||
curve_length = butils.get_curve_length(selected)
|
|
||||||
|
|
||||||
ob.constraints.new(type='FOLLOW_PATH')
|
|
||||||
ob.constraints["Follow Path"].target = selected
|
|
||||||
ob.constraints["Follow Path"].use_fixed_location = True
|
|
||||||
ob.constraints["Follow Path"].offset_factor = advance / curve_length
|
|
||||||
ob.constraints["Follow Path"].use_curve_follow = True
|
|
||||||
ob.constraints["Follow Path"].forward_axis = "FORWARD_X"
|
|
||||||
ob.constraints["Follow Path"].up_axis = "UP_Y"
|
|
||||||
|
|
||||||
# butils.ShowMessageBox("WHAT","INFO","I don't really know what you mean, lsaidry")
|
|
||||||
elif selected.type == "CURVE" and distribution_type == 'CALCULATE':
|
|
||||||
location, tangent = butils.calc_point_on_bezier_curve(selected, advance, True)
|
|
||||||
ob.location = selected.matrix_world @ location
|
|
||||||
mask = [0]
|
|
||||||
input_rotations = [mathutils.Vector((0.0, 0.0, 0.0))]
|
|
||||||
vectors = [tangent]
|
|
||||||
factors = [1.0]
|
|
||||||
local_main_axis = mathutils.Vector((1.0, 0.0, 0.0))
|
|
||||||
motor = butils.align_rotations_auto_pivot(mask,
|
|
||||||
input_rotations,
|
|
||||||
vectors,
|
|
||||||
factors,
|
|
||||||
local_main_axis)
|
|
||||||
|
|
||||||
ob.rotation_quaternion = (selected.matrix_world @ motor[0]).to_quaternion()
|
|
||||||
print("what")
|
|
||||||
|
|
||||||
else:
|
|
||||||
offset.x = advance
|
|
||||||
ob.location = selected.location + offset
|
|
||||||
|
|
||||||
scalor = 0.001
|
|
||||||
|
|
||||||
glyph_advance = (-1 * glyph.bound_box[0][0] + glyph.bound_box[4][0]) * scalor
|
|
||||||
|
|
||||||
ob.scale = (scalor, scalor, scalor)
|
|
||||||
selected.users_collection[0].objects.link(ob)
|
|
||||||
|
|
||||||
advance = advance + glyph_advance
|
|
||||||
tc = t.glyphs.add()
|
|
||||||
tc.glyph_id = c
|
|
||||||
tc.glyph_object = ob
|
|
||||||
tc.letter_spacing = 0
|
|
||||||
|
|
||||||
ob.select_set(True)
|
|
||||||
|
|
||||||
selected.select_set(True)
|
|
||||||
bpy.context.view_layer.objects.active = selected
|
|
||||||
bpy.ops.object.parent_set(type='OBJECT')
|
|
||||||
bpy.ops.object.select_all(action='DESELECT')
|
|
||||||
|
|
||||||
t.font_name = font_name
|
t.font_name = font_name
|
||||||
t.font_face = font_face
|
t.font_face = font_face
|
||||||
|
|
32
butils.py
32
butils.py
|
@ -41,6 +41,21 @@ def get_curve_length(curve_obj, resolution = -1):
|
||||||
|
|
||||||
return total_length
|
return total_length
|
||||||
|
|
||||||
|
def get_curve_line_lengths(curve_obj, resolution = -1):
|
||||||
|
output = []
|
||||||
|
for spline in curve_obj.data.splines:
|
||||||
|
output.append(spline.calc_length(resolution=resolution))
|
||||||
|
return output
|
||||||
|
|
||||||
|
def get_next_line_advance(curve_obj, current_advance, previous_glyph_advance, resolution = -1):
|
||||||
|
curve_line_lengths = get_curve_line_lengths(curve_obj, resolution)
|
||||||
|
total_length = 0
|
||||||
|
for cll in curve_line_lengths:
|
||||||
|
total_length += cll
|
||||||
|
if current_advance - previous_glyph_advance < total_length:
|
||||||
|
return total_length
|
||||||
|
return current_advance
|
||||||
|
|
||||||
def calc_point_on_bezier(bezier_point_1, bezier_point_2, t):
|
def calc_point_on_bezier(bezier_point_1, bezier_point_2, t):
|
||||||
p1 = bezier_point_1.co
|
p1 = bezier_point_1.co
|
||||||
h1 = bezier_point_1.handle_right
|
h1 = bezier_point_1.handle_right
|
||||||
|
@ -364,6 +379,8 @@ def set_text_on_curve(text_properties):
|
||||||
context_override["selected_objects"] = list(glyph_objects)
|
context_override["selected_objects"] = list(glyph_objects)
|
||||||
with bpy.context.temp_override(**context_override):
|
with bpy.context.temp_override(**context_override):
|
||||||
bpy.ops.object.delete()
|
bpy.ops.object.delete()
|
||||||
|
for g in glyph_objects:
|
||||||
|
bpy.data.objects.remove(g, do_unlink=True)
|
||||||
# bpy.ops.object.delete({"selected_objects": glyph_objects})
|
# bpy.ops.object.delete({"selected_objects": glyph_objects})
|
||||||
text_properties.glyphs.clear()
|
text_properties.glyphs.clear()
|
||||||
|
|
||||||
|
@ -374,7 +391,21 @@ def set_text_on_curve(text_properties):
|
||||||
|
|
||||||
curve_length = get_curve_length(mom)
|
curve_length = get_curve_length(mom)
|
||||||
advance = 0
|
advance = 0
|
||||||
|
glyph_advance = 0
|
||||||
|
is_command = False
|
||||||
for i, c in enumerate(text_properties.text):
|
for i, c in enumerate(text_properties.text):
|
||||||
|
print(f"trying letter ({c})")
|
||||||
|
if c == '\\':
|
||||||
|
is_command = True
|
||||||
|
continue
|
||||||
|
if is_command:
|
||||||
|
if c == 'n':
|
||||||
|
next_line_advance = get_next_line_advance(mom, advance, glyph_advance)
|
||||||
|
if advance == next_line_advance:
|
||||||
|
self.report({'INFO'}, f"would like to add new line for {text_properties.text} please")
|
||||||
|
advance = next_line_advance
|
||||||
|
continue
|
||||||
|
is_command = False
|
||||||
glyph_id = c
|
glyph_id = c
|
||||||
glyph = Font.get_glyph(text_properties.font_name,
|
glyph = Font.get_glyph(text_properties.font_name,
|
||||||
text_properties.font_face,
|
text_properties.font_face,
|
||||||
|
@ -385,6 +416,7 @@ def set_text_on_curve(text_properties):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
ob = bpy.data.objects.new(f"{glyph_id}", glyph.data)
|
ob = bpy.data.objects.new(f"{glyph_id}", glyph.data)
|
||||||
|
ob['linked_textobject'] = text_properties.text_index
|
||||||
|
|
||||||
distribution_type = 'CALCULATE'
|
distribution_type = 'CALCULATE'
|
||||||
if distribution_type == 'FOLLOW_PATH':
|
if distribution_type == 'FOLLOW_PATH':
|
||||||
|
|
Loading…
Reference in a new issue