Skip to content

Commit 5601bb6

Browse files
committed
fixed decorator function
1 parent 2d742de commit 5601bb6

File tree

4 files changed

+266
-40
lines changed

4 files changed

+266
-40
lines changed

extras/export_letters.py

Lines changed: 99 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import bpy
22
import os
33
import io
4+
import math
45
from contextlib import redirect_stdout
56
import sys
7+
import bmesh
68

79

810
def update_progress(job_title, progress):
@@ -86,11 +88,104 @@ def convert_curve(obj):
8688
bpy.ops.object.convert(target='MESH')
8789

8890

89-
def export_glyph(obj, folder):
91+
def angle_between_points(p0, p1, p2):
92+
a = (p1[0] - p0[0])**2 + (p1[1] - p0[1])**2
93+
b = (p1[0] - p2[0])**2 + (p1[1] - p2[1])**2
94+
c = (p2[0] - p0[0])**2 + (p2[1] - p0[1])**2
95+
96+
angle = math.acos((a + b - c) / math.sqrt(4 * a * b)) * 180 / math.pi
97+
return angle
98+
99+
100+
def get_angles(verts):
101+
"""
102+
Get a list of angles for each vertex in a looped mesh object
103+
"""
104+
angles = []
105+
for i in range(len(verts)):
106+
if i == 0:
107+
A = [verts[-1].co.x, verts[-1].co.y]
108+
else:
109+
A = [verts[i - 1].co.x, verts[i - 1].co.y]
110+
111+
B = [verts[i].co.x, verts[i].co.y]
112+
113+
if i == len(verts) - 1:
114+
C = [verts[0].co.x, verts[0].co.y]
115+
else:
116+
C = [verts[i + 1].co.x, verts[i + 1].co.y]
117+
118+
ABC_angle = angle_between_points(A, B, C)
119+
angles.append(ABC_angle)
120+
return angles
121+
122+
123+
def get_lowers(numbers, threshold):
124+
"""
125+
Returns a list of numbers lower than threshold
126+
"""
127+
lowers = []
128+
for num in numbers:
129+
if num <= threshold:
130+
lowers.append(num)
131+
return lowers
132+
133+
134+
def clean_mesh(obj):
135+
convert_curve(obj)
136+
mesh_obj = bpy.context.view_layer.objects.active
137+
islands = get_islands(mesh_obj)
138+
139+
bpy.ops.object.mode_set(mode='EDIT')
140+
bpy.ops.mesh.select_all(action='DESELECT')
141+
bm = bmesh.from_edit_mesh(mesh_obj.data)
142+
143+
i = 0
144+
while i < len(islands):
145+
verts = []
146+
for index in islands[i]:
147+
bm.verts.ensure_lookup_table()
148+
verts.append(bm.verts[index])
149+
150+
angles = get_angles(verts)
151+
threshold = 2
152+
153+
if min(angles) > threshold:
154+
for f in range(1, len(islands[i + 1])):
155+
index = islands[i + 1][f]
156+
bm.verts[index - 1].select = True
157+
islands.pop(i + 1)
158+
159+
else:
160+
if len(get_lowers(angles, threshold)) == 2:
161+
for x in range(2, len(angles)):
162+
if angles[x] > threshold:
163+
bm.verts.ensure_lookup_table()
164+
bm.verts[islands[i][x] - 1].select = True
165+
elif angles[x] < threshold:
166+
break
167+
i += 1
168+
169+
bpy.ops.mesh.delete()
170+
bpy.ops.object.mode_set(mode='OBJECT')
171+
172+
return mesh_obj
173+
174+
175+
def export_glyph(obj, folder, looped_font=False):
90176
name = obj.name
91177
path = os.path.join(folder, name + '.glyph')
92178

93-
convert_curve(obj)
179+
if looped_font == False:
180+
convert_curve(obj)
181+
else:
182+
try:
183+
clean_mesh(obj)
184+
except IndexError:
185+
bpy.ops.object.mode_set(mode='OBJECT')
186+
bpy.ops.object.delete()
187+
convert_curve(obj)
188+
94189
duplicate = bpy.context.view_layer.objects.active
95190
islands = get_islands(duplicate)
96191
left, right, bottom, top = get_glyph_size(duplicate.data.vertices)
@@ -110,7 +205,7 @@ def export_glyph(obj, folder):
110205
v[1] = round(v[1], decimals)
111206
v[2] = 0
112207
glyph_strokes[-1].append(v)
113-
208+
114209
stdout = io.StringIO()
115210
with redirect_stdout(stdout):
116211
bpy.ops.object.delete()
@@ -135,7 +230,7 @@ def export_glyph(obj, folder):
135230
os.makedirs(path)
136231

137232
for i in range(len(objs)):
138-
export_glyph(objs[i], path)
233+
export_glyph(objs[i], path, looped_font=True)
139234
update_progress("Making Glyphs", i / len(objs))
140235
update_progress("Making Glyphs", 1)
141236

extras/rename_letters.py

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import bpy
2+
3+
def get_char_name(char):
4+
character_dict = {
5+
"!": "exclamation",
6+
"#": "pound",
7+
"$": "dollar",
8+
"%": "percentage",
9+
"&": "ampersand",
10+
"'": "quotesingle",
11+
"(": "parenthesisleft",
12+
")": "parenthesisright",
13+
"*": "asterisk",
14+
"+": "plus",
15+
",": "comma",
16+
"-": "minus",
17+
".": "period",
18+
"/": "slash",
19+
"0": "0",
20+
"1": "1",
21+
"2": "2",
22+
"3": "3",
23+
"4": "4",
24+
"5": "5",
25+
"6": "6",
26+
"7": "7",
27+
"8": "8",
28+
"9": "9",
29+
":": "colon",
30+
";": "semicolon",
31+
"<": "lessthan",
32+
"=": "equal",
33+
">": "greaterthan",
34+
"?": "question",
35+
"@": "at",
36+
"A": "a-uppercase",
37+
"B": "b-uppercase",
38+
"C": "c-uppercase",
39+
"D": "d-uppercase",
40+
"E": "e-uppercase",
41+
"F": "f-uppercase",
42+
"G": "g-uppercase",
43+
"H": "h-uppercase",
44+
"I": "i-uppercase",
45+
"J": "j-uppercase",
46+
"K": "k-uppercase",
47+
"L": "l-uppercase",
48+
"M": "m-uppercase",
49+
"N": "n-uppercase",
50+
"O": "o-uppercase",
51+
"P": "p-uppercase",
52+
"Q": "q-uppercase",
53+
"R": "r-uppercase",
54+
"S": "s-uppercase",
55+
"T": "t-uppercase",
56+
"U": "u-uppercase",
57+
"V": "v-uppercase",
58+
"W": "w-uppercase",
59+
"X": "x-uppercase",
60+
"Y": "y-uppercase",
61+
"Z": "z-uppercase",
62+
"[": "bracketleft",
63+
"\\": "backslash",
64+
"]": "bracketright",
65+
"^": "caret",
66+
"_": "underscore",
67+
"`": "grave",
68+
"a": "a-lowercase",
69+
"b": "b-lowercase",
70+
"c": "c-lowercase",
71+
"d": "d-lowercase",
72+
"e": "e-lowercase",
73+
"f": "f-lowercase",
74+
"g": "g-lowercase",
75+
"h": "h-lowercase",
76+
"i": "i-lowercase",
77+
"j": "j-lowercase",
78+
"k": "k-lowercase",
79+
"l": "l-lowercase",
80+
"m": "m-lowercase",
81+
"n": "n-lowercase",
82+
"o": "o-lowercase",
83+
"p": "p-lowercase",
84+
"q": "q-lowercase",
85+
"r": "r-lowercase",
86+
"s": "s-lowercase",
87+
"t": "t-lowercase",
88+
"u": "u-lowercase",
89+
"v": "v-lowercase",
90+
"w": "w-lowercase",
91+
"x": "x-lowercase",
92+
"y": "y-lowercase",
93+
"z": "z-lowercase",
94+
"{": "curlyleft",
95+
"|": "verticalbar",
96+
"}": "curlyright",
97+
"~": "tilde",
98+
"Δ": "delta",
99+
"←": "arrowleft",
100+
"↑": "arrowup",
101+
"→": "arrowright",
102+
"↓": "arrowdown",
103+
"☐": "box",
104+
"♀": "female",
105+
"♂": "male",
106+
'"': "quotedouble",
107+
"°": "degree",
108+
}
109+
try:
110+
return character_dict[char]
111+
except KeyError:
112+
return character_dict['☐']
113+
114+
def rename_letters():
115+
chars = """0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!$&()+-?:",./;'"""
116+
objs = list(bpy.data.objects)
117+
for obj in objs:
118+
bpy.ops.object.select_all(action='DESELECT')
119+
bpy.context.view_layer.objects.active = obj
120+
obj.select_set(True)
121+
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')
122+
123+
objs.sort(key=lambda o: o.location[0])
124+
for i in range(len(objs)):
125+
objs[i].name = get_char_name(chars[i])
126+
127+
rename_letters()

extras/test_string.txt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
0123456789
2-
abcdefghijklmnopqrstuvwxyz
3-
ABCDEFGHIJKLMNOPQRSTUVWXYZ
4-
`~!@#$%^&*()_+`-=
5-
<>?:"{}|,./;'[]\
6-
°↑↓←→☐Δ♂♀
1+
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_+`-=<>?:"{}|,./;'[]\°↑↓←→☐Δ♂♀
2+
3+
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!$&()+-?:",./;'

0 commit comments

Comments
 (0)