STL: cleanup and PEP8
Unused imports, move rare imports inside functions, correct description.
This commit is contained in:
parent
376fa84e78
commit
0260327cff
|
@ -23,9 +23,8 @@ bl_info = {
|
|||
"author": "Guillaume Bouchard (Guillaum)",
|
||||
"version": (1, 1, 3),
|
||||
"blender": (2, 81, 6),
|
||||
"location": "File > Import-Export > Stl",
|
||||
"location": "File > Import-Export",
|
||||
"description": "Import-Export STL files",
|
||||
"warning": "",
|
||||
"wiki_url": "https://docs.blender.org/manual/en/latest/addons/io_mesh_stl.html",
|
||||
"support": 'OFFICIAL',
|
||||
"category": "Import-Export",
|
||||
|
@ -53,75 +52,70 @@ if "bpy" in locals():
|
|||
if "blender_utils" in locals():
|
||||
importlib.reload(blender_utils)
|
||||
|
||||
import os
|
||||
|
||||
import bpy
|
||||
from bpy.props import (
|
||||
StringProperty,
|
||||
BoolProperty,
|
||||
CollectionProperty,
|
||||
EnumProperty,
|
||||
FloatProperty,
|
||||
)
|
||||
StringProperty,
|
||||
BoolProperty,
|
||||
CollectionProperty,
|
||||
EnumProperty,
|
||||
FloatProperty,
|
||||
)
|
||||
from bpy_extras.io_utils import (
|
||||
ImportHelper,
|
||||
ExportHelper,
|
||||
orientation_helper,
|
||||
axis_conversion,
|
||||
)
|
||||
ImportHelper,
|
||||
ExportHelper,
|
||||
orientation_helper,
|
||||
axis_conversion,
|
||||
)
|
||||
from bpy.types import (
|
||||
Operator,
|
||||
OperatorFileListElement,
|
||||
)
|
||||
Operator,
|
||||
OperatorFileListElement,
|
||||
)
|
||||
|
||||
|
||||
@orientation_helper(axis_forward='Y', axis_up='Z')
|
||||
class ImportSTL(Operator, ImportHelper):
|
||||
"""Load STL triangle mesh data"""
|
||||
bl_idname = "import_mesh.stl"
|
||||
bl_label = "Import STL"
|
||||
bl_description = "Load STL triangle mesh data"
|
||||
bl_options = {'UNDO'}
|
||||
|
||||
filename_ext = ".stl"
|
||||
|
||||
filter_glob: StringProperty(
|
||||
default="*.stl",
|
||||
options={'HIDDEN'},
|
||||
)
|
||||
default="*.stl",
|
||||
options={'HIDDEN'},
|
||||
)
|
||||
files: CollectionProperty(
|
||||
name="File Path",
|
||||
type=OperatorFileListElement,
|
||||
)
|
||||
name="File Path",
|
||||
type=OperatorFileListElement,
|
||||
)
|
||||
directory: StringProperty(
|
||||
subtype='DIR_PATH',
|
||||
)
|
||||
|
||||
subtype='DIR_PATH',
|
||||
)
|
||||
global_scale: FloatProperty(
|
||||
name="Scale",
|
||||
soft_min=0.001, soft_max=1000.0,
|
||||
min=1e-6, max=1e6,
|
||||
default=1.0,
|
||||
)
|
||||
|
||||
name="Scale",
|
||||
soft_min=0.001, soft_max=1000.0,
|
||||
min=1e-6, max=1e6,
|
||||
default=1.0,
|
||||
)
|
||||
use_scene_unit: BoolProperty(
|
||||
name="Scene Unit",
|
||||
description="Apply current scene's unit (as defined by unit scale) to imported data",
|
||||
default=False,
|
||||
)
|
||||
|
||||
name="Scene Unit",
|
||||
description="Apply current scene's unit (as defined by unit scale) to imported data",
|
||||
default=False,
|
||||
)
|
||||
use_facet_normal: BoolProperty(
|
||||
name="Facet Normals",
|
||||
description="Use (import) facet normals (note that this will still give flat shading)",
|
||||
default=False,
|
||||
)
|
||||
name="Facet Normals",
|
||||
description="Use (import) facet normals (note that this will still give flat shading)",
|
||||
default=False,
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
import os
|
||||
from mathutils import Matrix
|
||||
from . import stl_utils
|
||||
from . import blender_utils
|
||||
from mathutils import Matrix
|
||||
|
||||
paths = [os.path.join(self.directory, name.name)
|
||||
for name in self.files]
|
||||
paths = [os.path.join(self.directory, name.name) for name in self.files]
|
||||
|
||||
scene = context.scene
|
||||
|
||||
|
@ -130,9 +124,10 @@ class ImportSTL(Operator, ImportHelper):
|
|||
if scene.unit_settings.system != 'NONE' and self.use_scene_unit:
|
||||
global_scale /= scene.unit_settings.scale_length
|
||||
|
||||
global_matrix = axis_conversion(from_forward=self.axis_forward,
|
||||
from_up=self.axis_up,
|
||||
).to_4x4() @ Matrix.Scale(global_scale, 4)
|
||||
global_matrix = axis_conversion(
|
||||
from_forward=self.axis_forward,
|
||||
from_up=self.axis_up,
|
||||
).to_4x4() @ Matrix.Scale(global_scale, 4)
|
||||
|
||||
if not paths:
|
||||
paths.append(self.filepath)
|
||||
|
@ -209,64 +204,70 @@ class STL_PT_import_geometry(bpy.types.Panel):
|
|||
|
||||
@orientation_helper(axis_forward='Y', axis_up='Z')
|
||||
class ExportSTL(Operator, ExportHelper):
|
||||
"""Save STL triangle mesh data from the active object"""
|
||||
bl_idname = "export_mesh.stl"
|
||||
bl_label = "Export STL"
|
||||
bl_description = """Save STL triangle mesh data"""
|
||||
|
||||
filename_ext = ".stl"
|
||||
filter_glob: StringProperty(default="*.stl", options={'HIDDEN'})
|
||||
|
||||
use_selection: BoolProperty(
|
||||
name="Selection Only",
|
||||
description="Export selected objects only",
|
||||
default=False,
|
||||
)
|
||||
name="Selection Only",
|
||||
description="Export selected objects only",
|
||||
default=False,
|
||||
)
|
||||
global_scale: FloatProperty(
|
||||
name="Scale",
|
||||
min=0.01, max=1000.0,
|
||||
default=1.0,
|
||||
)
|
||||
|
||||
name="Scale",
|
||||
min=0.01, max=1000.0,
|
||||
default=1.0,
|
||||
)
|
||||
use_scene_unit: BoolProperty(
|
||||
name="Scene Unit",
|
||||
description="Apply current scene's unit (as defined by unit scale) to exported data",
|
||||
default=False,
|
||||
)
|
||||
name="Scene Unit",
|
||||
description="Apply current scene's unit (as defined by unit scale) to exported data",
|
||||
default=False,
|
||||
)
|
||||
ascii: BoolProperty(
|
||||
name="Ascii",
|
||||
description="Save the file in ASCII file format",
|
||||
default=False,
|
||||
)
|
||||
name="Ascii",
|
||||
description="Save the file in ASCII file format",
|
||||
default=False,
|
||||
)
|
||||
use_mesh_modifiers: BoolProperty(
|
||||
name="Apply Modifiers",
|
||||
description="Apply the modifiers before saving",
|
||||
default=True,
|
||||
)
|
||||
name="Apply Modifiers",
|
||||
description="Apply the modifiers before saving",
|
||||
default=True,
|
||||
)
|
||||
batch_mode: EnumProperty(
|
||||
name="Batch Mode",
|
||||
items=(('OFF', "Off", "All data in one file"),
|
||||
('OBJECT', "Object", "Each object as a file"),
|
||||
))
|
||||
name="Batch Mode",
|
||||
items=(
|
||||
('OFF', "Off", "All data in one file"),
|
||||
('OBJECT', "Object", "Each object as a file"),
|
||||
),
|
||||
)
|
||||
|
||||
@property
|
||||
def check_extension(self):
|
||||
return self.batch_mode == 'OFF'
|
||||
|
||||
def execute(self, context):
|
||||
from . import stl_utils
|
||||
from . import blender_utils
|
||||
import os
|
||||
import itertools
|
||||
from mathutils import Matrix
|
||||
keywords = self.as_keywords(ignore=("axis_forward",
|
||||
"axis_up",
|
||||
"use_selection",
|
||||
"global_scale",
|
||||
"check_existing",
|
||||
"filter_glob",
|
||||
"use_scene_unit",
|
||||
"use_mesh_modifiers",
|
||||
"batch_mode"
|
||||
))
|
||||
from . import stl_utils
|
||||
from . import blender_utils
|
||||
|
||||
keywords = self.as_keywords(
|
||||
ignore=(
|
||||
"axis_forward",
|
||||
"axis_up",
|
||||
"use_selection",
|
||||
"global_scale",
|
||||
"check_existing",
|
||||
"filter_glob",
|
||||
"use_scene_unit",
|
||||
"use_mesh_modifiers",
|
||||
"batch_mode"
|
||||
),
|
||||
)
|
||||
|
||||
scene = context.scene
|
||||
if self.use_selection:
|
||||
|
@ -279,9 +280,10 @@ class ExportSTL(Operator, ExportHelper):
|
|||
if scene.unit_settings.system != 'NONE' and self.use_scene_unit:
|
||||
global_scale *= scene.unit_settings.scale_length
|
||||
|
||||
global_matrix = axis_conversion(to_forward=self.axis_forward,
|
||||
to_up=self.axis_up,
|
||||
).to_4x4() @ Matrix.Scale(global_scale, 4)
|
||||
global_matrix = axis_conversion(
|
||||
to_forward=self.axis_forward,
|
||||
to_up=self.axis_up,
|
||||
).to_4x4() @ Matrix.Scale(global_scale, 4)
|
||||
|
||||
if self.batch_mode == 'OFF':
|
||||
faces = itertools.chain.from_iterable(
|
||||
|
@ -424,6 +426,7 @@ classes = (
|
|||
STL_PT_export_geometry,
|
||||
)
|
||||
|
||||
|
||||
def register():
|
||||
for cls in classes:
|
||||
bpy.utils.register_class(cls)
|
||||
|
|
|
@ -18,10 +18,6 @@
|
|||
|
||||
# <pep8 compliant>
|
||||
|
||||
import bpy
|
||||
import array
|
||||
from itertools import chain
|
||||
|
||||
|
||||
def create_and_link_mesh(name, faces, face_nors, points, global_matrix):
|
||||
"""
|
||||
|
@ -29,6 +25,10 @@ def create_and_link_mesh(name, faces, face_nors, points, global_matrix):
|
|||
*points* and *faces* and link it in the current scene.
|
||||
"""
|
||||
|
||||
import array
|
||||
from itertools import chain
|
||||
import bpy
|
||||
|
||||
mesh = bpy.data.meshes.new(name)
|
||||
mesh.from_pydata(points, [], faces)
|
||||
|
||||
|
@ -77,6 +77,8 @@ def faces_from_mesh(ob, global_matrix, use_mesh_modifiers=False):
|
|||
Split the quad into two triangles
|
||||
"""
|
||||
|
||||
import bpy
|
||||
|
||||
# get the editmode data
|
||||
ob.update_from_editmode()
|
||||
|
||||
|
|
|
@ -26,14 +26,9 @@ Used as a blender script, it load all the stl files in the scene:
|
|||
blender --python stl_utils.py -- file1.stl file2.stl file3.stl ...
|
||||
"""
|
||||
|
||||
import os
|
||||
import struct
|
||||
import contextlib
|
||||
import itertools
|
||||
from mathutils.geometry import normal
|
||||
|
||||
# TODO: endien
|
||||
|
||||
|
||||
class ListDict(dict):
|
||||
"""
|
||||
Set struct with order.
|
||||
|
@ -88,6 +83,10 @@ def _is_ascii_file(data):
|
|||
represents a binary file. It can be a (very *RARE* in real life, but
|
||||
can easily be forged) ascii file.
|
||||
"""
|
||||
|
||||
import os
|
||||
import struct
|
||||
|
||||
# Skip header...
|
||||
data.seek(BINARY_HEADER)
|
||||
size = struct.unpack('<I', data.read(4))[0]
|
||||
|
@ -106,6 +105,10 @@ def _is_ascii_file(data):
|
|||
|
||||
def _binary_read(data):
|
||||
# Skip header...
|
||||
|
||||
import os
|
||||
import struct
|
||||
|
||||
data.seek(BINARY_HEADER)
|
||||
size = struct.unpack('<I', data.read(4))[0]
|
||||
|
||||
|
@ -164,6 +167,10 @@ def _ascii_read(data):
|
|||
|
||||
|
||||
def _binary_write(filepath, faces):
|
||||
import struct
|
||||
import itertools
|
||||
from mathutils.geometry import normal
|
||||
|
||||
with open(filepath, 'wb') as data:
|
||||
fw = data.write
|
||||
# header
|
||||
|
@ -191,6 +198,8 @@ def _binary_write(filepath, faces):
|
|||
|
||||
|
||||
def _ascii_write(filepath, faces):
|
||||
from mathutils.geometry import normal
|
||||
|
||||
with open(filepath, 'w') as data:
|
||||
fw = data.write
|
||||
header = _header_version()
|
||||
|
@ -206,10 +215,7 @@ def _ascii_write(filepath, faces):
|
|||
fw('endsolid %s\n' % header)
|
||||
|
||||
|
||||
def write_stl(filepath="",
|
||||
faces=(),
|
||||
ascii=False,
|
||||
):
|
||||
def write_stl(filepath="", faces=(), ascii=False):
|
||||
"""
|
||||
Write a stl file from faces,
|
||||
|
||||
|
|
Loading…
Reference in New Issue