Skip to content

Commit a16a9ae

Browse files
committed
fixed symmetry option causing invalid mesh (#10)
1 parent f0c5bfe commit a16a9ae

5 files changed

Lines changed: 40 additions & 32 deletions

File tree

src/job.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def finish(self, unwrap, output, added_edges):
7070
uvvert_to_meshvert[uv_v] = mesh_verts[uv_v_idx]
7171

7272
# the faces will all be separate, so merging by distance joins them
73-
bmesh.ops.remove_doubles(uvbm, verts=uvbm.verts, dist=1e-7)
73+
bmesh.ops.remove_doubles(uvbm, verts=uvbm.verts, dist=0.0001)
7474

7575
# find boundary edges of uv bmesh which are seams of original bmesh
7676
seams = []

src/manager.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def finish_unwrap(self, unwrap, invalid_pass=False):
128128

129129
if unwrap.merge_cuts:
130130
bm = new_bmesh(output)
131-
bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=1e-7)
131+
bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.0001)
132132
set_bmesh(bm, output)
133133

134134
# automatically add grid material to final object
@@ -205,11 +205,6 @@ def start_next(self):
205205
)
206206

207207
if self.error_code != 0:
208-
# convert unsigned int
209-
THRESHOLD = 2147483648
210-
ADJUSTMENT = 4294967296
211-
if self.error_code >= THRESHOLD:
212-
self.error_code -= ADJUSTMENT
213208
err_msg = f"An unknown error occurred: {self.error_code}"
214209
msg.append(err_msg)
215210
logger.add_data("errors", err_msg)

src/ops/start.py

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
calc_center,
2222
check_collection,
2323
cut,
24+
cut_on_axes,
2425
deselect_all,
2526
export_obj,
2627
get_dir_path,
@@ -286,34 +287,13 @@ def create_jobs(self, context):
286287
obj.select_set(True)
287288

288289
symmetrize_job = None
289-
# bisect if symmetry on
290-
axes = props.sym_axes
291290
if props.use_symmetry:
291+
# bisect if symmetry on
292+
axes = props.sym_axes
292293
apply_transforms(obj)
293-
294-
bm = new_bmesh(obj)
295294
obj_center = calc_center(obj)
296295
symmetrize_job = Symmetrise(1, axes, obj_center, props.sym_merge)
297-
cuts = []
298-
if "X" in axes:
299-
cuts.append((1, 0, 0))
300-
if "Y" in axes:
301-
cuts.append((0, 1, 0))
302-
if "Z" in axes:
303-
cuts.append((0, 0, 1))
304-
305-
for direction in cuts:
306-
bmesh.ops.bisect_plane(
307-
bm,
308-
geom=bm.verts[:] + bm.edges[:] + bm.faces[:],
309-
plane_co=obj_center,
310-
plane_no=direction,
311-
clear_inner=True,
312-
)
313-
# if the object already had vertices down it's center plane
314-
# there will be duplicates
315-
bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=1e-7)
316-
set_bmesh(bm, obj)
296+
cut_on_axes(obj, obj_center, axes)
317297

318298
# separate objects
319299
bpy.ops.mesh.separate(type="LOOSE")

src/unwrap.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,17 @@ def poll_folder(self):
166166
# mesh is invalid
167167
msg = ""
168168

169+
# convert unsigned int
170+
THRESHOLD = 2147483648
171+
ADJUSTMENT = 4294967296
172+
if ret_code >= THRESHOLD:
173+
ret_code -= ADJUSTMENT
174+
169175
move_to_invalid = False
170-
if ret_code == 101:
176+
if ret_code == -1:
177+
msg = "Mesh needs cleanup"
178+
move_to_invalid = True
179+
elif ret_code == 101:
171180
msg = "Non Manifold Edges"
172181
move_to_invalid = True
173182
elif ret_code == 102:

src/utils.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,3 +287,27 @@ def cut(num, center, length, dim, bm):
287287
bmesh.ops.split_edges(
288288
bm, edges=[e for e in cut if isinstance(e, bmesh.types.BMEdge)]
289289
)
290+
291+
292+
def cut_on_axes(obj, obj_center, axes):
293+
bm = new_bmesh(obj)
294+
cuts = []
295+
if "X" in axes:
296+
cuts.append((1, 0, 0))
297+
if "Y" in axes:
298+
cuts.append((0, 1, 0))
299+
if "Z" in axes:
300+
cuts.append((0, 0, 1))
301+
302+
for direction in cuts:
303+
bmesh.ops.bisect_plane(
304+
bm,
305+
geom=bm.verts[:] + bm.edges[:] + bm.faces[:],
306+
plane_co=obj_center,
307+
plane_no=direction,
308+
clear_inner=True,
309+
)
310+
# if the object already had vertices down its center plane
311+
# there will be duplicates
312+
bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.0001)
313+
set_bmesh(bm, obj)

0 commit comments

Comments
 (0)