Skip to content
Snippets Groups Projects
Commit 20f0c81f authored by Mikhail Rachinskiy's avatar Mikhail Rachinskiy
Browse files

3D-Print: remove object join workaround for PLY export

PLY exporter now supports export selection.
Also do not force active object into selection.
parent a3087a1c
No related branches found
No related tags found
No related merge requests found
......@@ -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
......@@ -119,7 +100,6 @@ def write_mesh(context, report_cb):
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,
......@@ -130,16 +110,15 @@ def write_mesh(context, report_cb):
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,
......@@ -150,7 +129,6 @@ def write_mesh(context, report_cb):
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,
......@@ -161,7 +139,6 @@ def write_mesh(context, report_cb):
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,
......@@ -174,16 +151,7 @@ def write_mesh(context, report_cb):
# 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:
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment