Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
B
blender-addons
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
blender
blender-addons
Commits
0260327c
Commit
0260327c
authored
5 years ago
by
Mikhail Rachinskiy
Browse files
Options
Downloads
Patches
Plain Diff
STL: cleanup and PEP8
Unused imports, move rare imports inside functions, correct description.
parent
376fa84e
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
io_mesh_stl/__init__.py
+93
-90
93 additions, 90 deletions
io_mesh_stl/__init__.py
io_mesh_stl/blender_utils.py
+6
-4
6 additions, 4 deletions
io_mesh_stl/blender_utils.py
io_mesh_stl/stl_utils.py
+16
-10
16 additions, 10 deletions
io_mesh_stl/stl_utils.py
with
115 additions
and
104 deletions
io_mesh_stl/__init__.py
+
93
−
90
View file @
0260327c
...
...
@@ -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
)
...
...
This diff is collapsed.
Click to expand it.
io_mesh_stl/blender_utils.py
+
6
−
4
View file @
0260327c
...
...
@@ -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
()
...
...
This diff is collapsed.
Click to expand it.
io_mesh_stl/stl_utils.py
+
16
−
10
View file @
0260327c
...
...
@@ -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,
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment