Skip to content

Commit

Permalink
3D-Print: remove object join workaround for PLY export
Browse files Browse the repository at this point in the history
PLY exporter now supports export selection.
Also do not force active object into selection.
  • Loading branch information
mrachinskiy committed Oct 16, 2019
1 parent a3087a1 commit 20f0c81
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 96 deletions.
38 changes: 3 additions & 35 deletions object_print3d_utils/export.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,34 +54,15 @@ def image_copy_guess(filepath, objects):

def write_mesh(context, report_cb):
scene = context.scene
collection = context.collection
layer = context.view_layer
unit = scene.unit_settings
print_3d = scene.print_3d

obj = layer.objects.active

export_format = print_3d.export_format
global_scale = unit.scale_length if (unit.system != 'NONE' and print_3d.use_apply_scale) else 1.0
path_mode = 'COPY' if print_3d.use_export_texture else 'AUTO'

context_override = context.copy()
obj_tmp = None

# PLY can only export single mesh objects!
if export_format == 'PLY':
context_backup = context.copy()
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)

from . import mesh_helpers
obj_tmp = mesh_helpers.object_merge(context, context_override["selected_objects"])
context_override["active_object"] = obj_tmp
context_override["selected_objects"] = [obj_tmp]
else:
if obj not in context_override["selected_objects"]:
context_override["selected_objects"].append(obj)

export_path = bpy.path.abspath(print_3d.export_path)
obj = layer.objects.active

# Create name 'export_path/blendname-objname'
# add the filename component
Expand Down Expand Up @@ -119,7 +100,6 @@ def addon_ensure(addon_id):
addon_ensure("io_mesh_stl")
filepath = bpy.path.ensure_ext(filepath, ".stl")
ret = bpy.ops.export_mesh.stl(
context_override,
filepath=filepath,
ascii=False,
use_mesh_modifiers=True,
Expand All @@ -130,16 +110,15 @@ def addon_ensure(addon_id):
addon_ensure("io_mesh_ply")
filepath = bpy.path.ensure_ext(filepath, ".ply")
ret = bpy.ops.export_mesh.ply(
context_override,
filepath=filepath,
use_mesh_modifiers=True,
use_selection=True,
global_scale=global_scale,
)
elif export_format == 'X3D':
addon_ensure("io_scene_x3d")
filepath = bpy.path.ensure_ext(filepath, ".x3d")
ret = bpy.ops.export_scene.x3d(
context_override,
filepath=filepath,
use_mesh_modifiers=True,
use_selection=True,
Expand All @@ -150,7 +129,6 @@ def addon_ensure(addon_id):
addon_ensure("io_scene_vrml2")
filepath = bpy.path.ensure_ext(filepath, ".wrl")
ret = bpy.ops.export_scene.vrml2(
context_override,
filepath=filepath,
use_mesh_modifiers=True,
use_selection=True,
Expand All @@ -161,7 +139,6 @@ def addon_ensure(addon_id):
addon_ensure("io_scene_obj")
filepath = bpy.path.ensure_ext(filepath, ".obj")
ret = bpy.ops.export_scene.obj(
context_override,
filepath=filepath,
use_mesh_modifiers=True,
use_selection=True,
Expand All @@ -174,16 +151,7 @@ def addon_ensure(addon_id):
# for formats that don't support images
if export_format in {'STL', 'PLY'}:
if path_mode == 'COPY':
image_copy_guess(filepath, context_override["selected_objects"])

if obj_tmp is not None:
bpy.data.meshes.remove(obj_tmp.data) # Automatically unlinks and removes object

# restore context
for ob in context_backup["selected_objects"]:
ob.select_set(True)

layer.objects.active = context_backup["active_object"]
image_copy_guess(filepath, context.selected_objects)

if 'FINISHED' in ret:
if report_cb is not None:
Expand Down
61 changes: 0 additions & 61 deletions object_print3d_utils/mesh_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,67 +192,6 @@ def bmesh_check_thick_object(obj, thickness):
return array.array('i', faces_error)


def object_merge(context, objects):
"""Caller must remove."""

import bpy

def cd_remove_all_but_active(seq):
tot = len(seq)
if tot > 1:
act = seq.active_index
for i in range(tot - 1, -1, -1):
if i != act:
seq.remove(seq[i])

scene = context.scene
layer = context.view_layer
scene_collection = context.layer_collection.collection

# deselect all
for obj in scene.objects:
obj.select_set(False)

# add empty object
mesh_tmp = bpy.data.meshes.new(name="~tmp~")
obj_tmp = bpy.data.objects.new(name="~tmp~", object_data=mesh_tmp)
scene_collection.objects.link(obj_tmp)
obj_tmp.select_set(True)

depsgraph = context.evaluated_depsgraph_get()

# loop over all meshes
for obj in objects:
if obj.type != 'MESH':
continue

# convert each to a mesh
obj_eval = obj.evaluated_get(depsgraph)
mesh_new = obj_eval.to_mesh().copy()

# remove non-active uvs/vcols
cd_remove_all_but_active(mesh_new.vertex_colors)
cd_remove_all_but_active(mesh_new.uv_layers)

# join into base mesh
obj_new = bpy.data.objects.new(name="~tmp-new~", object_data=mesh_new)
scene_collection.objects.link(obj_new)
obj_new.matrix_world = obj.matrix_world

override = context.copy()
override["active_object"] = obj_tmp
override["selected_editable_objects"] = [obj_tmp, obj_new]

bpy.ops.object.join(override)

bpy.data.meshes.remove(mesh_new)
obj_eval.to_mesh_clear()

layer.update()

return obj_tmp


def face_is_distorted(ele, angle_distort):
no = ele.normal
angle_fn = no.angle
Expand Down

0 comments on commit 20f0c81

Please sign in to comment.