Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
P
Printrun
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
machinery
Printrun
Commits
95aaa81b
Commit
95aaa81b
authored
Jan 02, 2012
by
Václav 'Ax' Hůla
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
reformated plater.py
parent
b631c3ba
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
234 additions
and
233 deletions
+234
-233
plater.py
plater.py
+234
-233
No files found.
plater.py
View file @
95aaa81b
#!/usr/bin/env python
#!/usr/bin/env python
import
wx
,
time
,
random
,
threading
,
os
,
math
import
wx
import
stltool
import
time
import
random
import
threading
import
os
import
math
import
sys
import
sys
import
stltool
glview
=
False
glview
=
False
if
"-nogl"
not
in
sys
.
argv
:
if
"-nogl"
not
in
sys
.
argv
:
try
:
try
:
import
stlview
import
stlview
glview
=
True
glview
=
True
except
:
except
:
pass
pass
def
evalme
(
s
):
def
evalme
(
s
):
return
eval
(
s
[
s
.
find
(
"("
)
+
1
:
s
.
find
(
")"
)])
return
eval
(
s
[
s
.
find
(
"("
)
+
1
:
s
.
find
(
")"
)])
class
stlwrap
:
class
stlwrap
:
def
__init__
(
self
,
obj
,
name
=
None
):
def
__init__
(
self
,
obj
,
name
=
None
):
self
.
obj
=
obj
self
.
obj
=
obj
self
.
name
=
name
self
.
name
=
name
if
name
is
None
:
if
name
is
None
:
self
.
name
=
obj
.
name
self
.
name
=
obj
.
name
def
__repr__
(
self
):
def
__repr__
(
self
):
return
self
.
name
return
self
.
name
class
showstl
(
wx
.
Window
):
class
showstl
(
wx
.
Window
):
def
__init__
(
self
,
parent
,
size
,
pos
):
def
__init__
(
self
,
parent
,
size
,
pos
):
wx
.
Window
.
__init__
(
self
,
parent
,
size
=
size
,
pos
=
pos
)
wx
.
Window
.
__init__
(
self
,
parent
,
size
=
size
,
pos
=
pos
)
#self.SetBackgroundColour((0,
0,
0))
#self.SetBackgroundColour((0,
0,
0))
#wx.FutureCall(200,self.paint)
#wx.FutureCall(200,
self.paint)
self
.
i
=
0
self
.
i
=
0
self
.
parent
=
parent
self
.
parent
=
parent
self
.
previ
=
0
self
.
previ
=
0
self
.
Bind
(
wx
.
EVT_MOUSEWHEEL
,
self
.
rot
)
self
.
Bind
(
wx
.
EVT_MOUSEWHEEL
,
self
.
rot
)
self
.
Bind
(
wx
.
EVT_MOUSE_EVENTS
,
self
.
move
)
self
.
Bind
(
wx
.
EVT_MOUSE_EVENTS
,
self
.
move
)
self
.
Bind
(
wx
.
EVT_PAINT
,
self
.
repaint
)
self
.
Bind
(
wx
.
EVT_PAINT
,
self
.
repaint
)
self
.
Bind
(
wx
.
EVT_KEY_DOWN
,
self
.
keypress
)
self
.
Bind
(
wx
.
EVT_KEY_DOWN
,
self
.
keypress
)
#self.s
=stltool.stl("sphere.stl").scale([2,1,
1])
#self.s
= stltool.stl("sphere.stl").scale([2, 1,
1])
self
.
triggered
=
0
self
.
triggered
=
0
self
.
initpos
=
None
self
.
initpos
=
None
self
.
prevsel
=
-
1
self
.
prevsel
=
-
1
def
drawmodel
(
self
,
m
,
scale
):
def
drawmodel
(
self
,
m
,
scale
):
m
.
bitmap
=
wx
.
EmptyBitmap
(
800
,
800
,
32
)
m
.
bitmap
=
wx
.
EmptyBitmap
(
800
,
800
,
32
)
dc
=
wx
.
MemoryDC
()
dc
=
wx
.
MemoryDC
()
dc
.
SelectObject
(
m
.
bitmap
)
dc
.
SelectObject
(
m
.
bitmap
)
dc
.
SetBackground
(
wx
.
Brush
((
0
,
0
,
0
,
0
)))
dc
.
SetBackground
(
wx
.
Brush
((
0
,
0
,
0
,
0
)))
dc
.
SetBrush
(
wx
.
Brush
((
0
,
0
,
0
,
255
)))
dc
.
SetBrush
(
wx
.
Brush
((
0
,
0
,
0
,
255
)))
#dc.DrawRectangle(-1,
-1,10000,
10000)
#dc.DrawRectangle(-1,
-1, 10000,
10000)
dc
.
SetBrush
(
wx
.
Brush
(
wx
.
Colour
(
128
,
255
,
128
)))
dc
.
SetBrush
(
wx
.
Brush
(
wx
.
Colour
(
128
,
255
,
128
)))
dc
.
SetPen
(
wx
.
Pen
(
wx
.
Colour
(
128
,
128
,
128
)))
dc
.
SetPen
(
wx
.
Pen
(
wx
.
Colour
(
128
,
128
,
128
)))
#m.offsets
=[10,10,
0]
#m.offsets
= [10, 10,
0]
#print m.offsets,m.dims
#print m.offsets,
m.dims
for
i
in
m
.
facets
:
#random.sample(m.facets,min(100000,
len(m.facets))):
for
i
in
m
.
facets
:
# random.sample(m.facets, min(100000,
len(m.facets))):
dc
.
DrawPolygon
([
wx
.
Point
(
400
+
scale
*
p
[
0
],(
400
-
scale
*
p
[
1
]))
for
p
in
i
[
1
]])
dc
.
DrawPolygon
([
wx
.
Point
(
400
+
scale
*
p
[
0
],
(
400
-
scale
*
p
[
1
]))
for
p
in
i
[
1
]])
#if(time.time()-t)>5:
#if(time.time()-t)>5:
# break
# break
dc
.
SelectObject
(
wx
.
NullBitmap
)
dc
.
SelectObject
(
wx
.
NullBitmap
)
m
.
bitmap
.
SetMask
(
wx
.
Mask
(
m
.
bitmap
,
wx
.
Colour
(
0
,
0
,
0
,
255
)))
m
.
bitmap
.
SetMask
(
wx
.
Mask
(
m
.
bitmap
,
wx
.
Colour
(
0
,
0
,
0
,
255
)))
def
move_shape
(
self
,
delta
):
def
move_shape
(
self
,
delta
):
"""moves shape (selected in l, which is list ListBox of shapes)
"""moves shape (selected in l, which is list ListBox of shapes)
by an offset specified in tuple delta.
by an offset specified in tuple delta.
...
@@ -106,7 +110,7 @@ class showstl(wx.Window):
...
@@ -106,7 +110,7 @@ class showstl(wx.Window):
del
dc
del
dc
else
:
else
:
event
.
Skip
()
event
.
Skip
()
def
rotate_shape
(
self
,
angle
):
def
rotate_shape
(
self
,
angle
):
"""rotates acive shape
"""rotates acive shape
positive angle is clockwise
positive angle is clockwise
...
@@ -146,133 +150,134 @@ class showstl(wx.Window):
...
@@ -146,133 +150,134 @@ class showstl(wx.Window):
event
.
Skip
()
event
.
Skip
()
def
rotateafter
(
self
):
def
rotateafter
(
self
):
if
(
self
.
i
!=
self
.
previ
):
if
(
self
.
i
!=
self
.
previ
):
i
=
self
.
parent
.
l
.
GetSelection
()
i
=
self
.
parent
.
l
.
GetSelection
()
if
i
!=
wx
.
NOT_FOUND
:
if
i
!=
wx
.
NOT_FOUND
:
#o
=
self.models[self.l.GetItemText(i)].offsets
#o
=
self.models[self.l.GetItemText(i)].offsets
self
.
parent
.
models
[
self
.
parent
.
l
.
GetString
(
i
)]
.
rot
-=
5
*
(
self
.
i
-
self
.
previ
)
self
.
parent
.
models
[
self
.
parent
.
l
.
GetString
(
i
)]
.
rot
-=
5
*
(
self
.
i
-
self
.
previ
)
#self.models[self.l.GetItemText(i)].offsets
=
o
#self.models[self.l.GetItemText(i)].offsets
=
o
self
.
previ
=
self
.
i
self
.
previ
=
self
.
i
self
.
Refresh
()
self
.
Refresh
()
def
cr
(
self
):
def
cr
(
self
):
time
.
sleep
(
0.01
)
time
.
sleep
(
0.01
)
wx
.
CallAfter
(
self
.
rotateafter
)
wx
.
CallAfter
(
self
.
rotateafter
)
self
.
triggered
=
0
self
.
triggered
=
0
def
rot
(
self
,
event
):
def
rot
(
self
,
event
):
z
=
event
.
GetWheelRotation
()
z
=
event
.
GetWheelRotation
()
s
=
self
.
parent
.
l
.
GetSelection
()
s
=
self
.
parent
.
l
.
GetSelection
()
if
self
.
prevsel
!=
s
:
if
self
.
prevsel
!=
s
:
self
.
i
=
0
self
.
i
=
0
self
.
prevsel
=
s
self
.
prevsel
=
s
if
z
<
0
:
if
z
<
0
:
self
.
rotate_shape
(
-
1
)
self
.
rotate_shape
(
-
1
)
else
:
else
:
self
.
rotate_shape
(
1
)
self
.
rotate_shape
(
1
)
def
repaint
(
self
,
event
):
def
repaint
(
self
,
event
):
dc
=
wx
.
PaintDC
(
self
)
dc
=
wx
.
PaintDC
(
self
)
self
.
paint
(
dc
=
dc
)
self
.
paint
(
dc
=
dc
)
def
paint
(
self
,
coord1
=
"x"
,
coord2
=
"y"
,
dc
=
None
):
def
paint
(
self
,
coord1
=
"x"
,
coord2
=
"y"
,
dc
=
None
):
coords
=
{
"x"
:
0
,
"y"
:
1
,
"z"
:
2
}
coords
=
{
"x"
:
0
,
"y"
:
1
,
"z"
:
2
}
if
dc
is
None
:
if
dc
is
None
:
dc
=
wx
.
ClientDC
(
self
)
dc
=
wx
.
ClientDC
(
self
)
offset
=
[
0
,
0
]
offset
=
[
0
,
0
]
scale
=
2
scale
=
2
dc
.
SetPen
(
wx
.
Pen
(
wx
.
Colour
(
100
,
100
,
100
)))
dc
.
SetPen
(
wx
.
Pen
(
wx
.
Colour
(
100
,
100
,
100
)))
for
i
in
xrange
(
20
):
for
i
in
xrange
(
20
):
dc
.
DrawLine
(
0
,
i
*
scale
*
10
,
400
,
i
*
scale
*
10
)
dc
.
DrawLine
(
0
,
i
*
scale
*
10
,
400
,
i
*
scale
*
10
)
dc
.
DrawLine
(
i
*
scale
*
10
,
0
,
i
*
scale
*
10
,
400
)
dc
.
DrawLine
(
i
*
scale
*
10
,
0
,
i
*
scale
*
10
,
400
)
dc
.
SetPen
(
wx
.
Pen
(
wx
.
Colour
(
0
,
0
,
0
)))
dc
.
SetPen
(
wx
.
Pen
(
wx
.
Colour
(
0
,
0
,
0
)))
for
i
in
xrange
(
4
):
for
i
in
xrange
(
4
):
dc
.
DrawLine
(
0
,
i
*
scale
*
50
,
400
,
i
*
scale
*
50
)
dc
.
DrawLine
(
0
,
i
*
scale
*
50
,
400
,
i
*
scale
*
50
)
dc
.
DrawLine
(
i
*
scale
*
50
,
0
,
i
*
scale
*
50
,
400
)
dc
.
DrawLine
(
i
*
scale
*
50
,
0
,
i
*
scale
*
50
,
400
)
dc
.
SetBrush
(
wx
.
Brush
(
wx
.
Colour
(
128
,
255
,
128
)))
dc
.
SetBrush
(
wx
.
Brush
(
wx
.
Colour
(
128
,
255
,
128
)))
dc
.
SetPen
(
wx
.
Pen
(
wx
.
Colour
(
128
,
128
,
128
)))
dc
.
SetPen
(
wx
.
Pen
(
wx
.
Colour
(
128
,
128
,
128
)))
t
=
time
.
time
()
t
=
time
.
time
()
dcs
=
wx
.
MemoryDC
()
dcs
=
wx
.
MemoryDC
()
for
m
in
self
.
parent
.
models
.
values
():
for
m
in
self
.
parent
.
models
.
values
():
b
=
m
.
bitmap
b
=
m
.
bitmap
#print b
#print b
im
=
b
.
ConvertToImage
()
im
=
b
.
ConvertToImage
()
#print im
#print im
imgc
=
wx
.
Point
(
im
.
GetWidth
()
/
2
,
im
.
GetHeight
()
/
2
)
imgc
=
wx
.
Point
(
im
.
GetWidth
()
/
2
,
im
.
GetHeight
()
/
2
)
#print math.radians(5*(self.i-self.previ))
#print math.radians(5*(self.i-self.previ))
im
=
im
.
Rotate
(
math
.
radians
(
m
.
rot
),
imgc
,
0
)
im
=
im
.
Rotate
(
math
.
radians
(
m
.
rot
),
imgc
,
0
)
bm
=
wx
.
BitmapFromImage
(
im
)
bm
=
wx
.
BitmapFromImage
(
im
)
dcs
.
SelectObject
(
bm
)
dcs
.
SelectObject
(
bm
)
bsz
=
bm
.
GetSize
()
bsz
=
bm
.
GetSize
()
dc
.
Blit
(
scale
*
m
.
offsets
[
0
]
-
bsz
[
0
]
/
2
,
400
-
(
scale
*
m
.
offsets
[
1
]
+
bsz
[
1
]
/
2
),
bsz
[
0
],
bsz
[
1
],
dcs
,
0
,
0
,
useMask
=
1
)
dc
.
Blit
(
scale
*
m
.
offsets
[
0
]
-
bsz
[
0
]
/
2
,
400
-
(
scale
*
m
.
offsets
[
1
]
+
bsz
[
1
]
/
2
),
bsz
[
0
],
bsz
[
1
],
dcs
,
0
,
0
,
useMask
=
1
)
#for i in m.facets:#random.sample(m.facets,
min(100000,
len(m.facets))):
#for i in m.facets:#random.sample(m.facets,
min(100000,
len(m.facets))):
# dc.DrawPolygon([wx.Point(offset[0]+scale*m.offsets[0]+scale*p[0],400-(offset[1]+scale*m.offsets[1]+scale*p[1])) for p in i[1]])
# dc.DrawPolygon([wx.Point(offset[0]+scale*m.offsets[0]+scale*p[0],
400-(offset[1]+scale*m.offsets[1]+scale*p[1])) for p in i[1]])
#if(time.time()-t)>5:
#if(time.time()-t)>5:
# break
# break
del
dc
del
dc
#print time.time()-t
#print time.time()-t
#s.export()
#s.export()
class
stlwin
(
wx
.
Frame
):
class
stlwin
(
wx
.
Frame
):
def
__init__
(
self
,
size
=
(
800
,
580
),
callback
=
None
,
parent
=
None
):
def
__init__
(
self
,
size
=
(
800
,
580
),
callback
=
None
,
parent
=
None
):
wx
.
Frame
.
__init__
(
self
,
parent
,
title
=
"Plate building tool"
,
size
=
size
)
wx
.
Frame
.
__init__
(
self
,
parent
,
title
=
"Plate building tool"
,
size
=
size
)
self
.
SetIcon
(
wx
.
Icon
(
"plater.ico"
,
wx
.
BITMAP_TYPE_ICO
))
self
.
SetIcon
(
wx
.
Icon
(
"plater.ico"
,
wx
.
BITMAP_TYPE_ICO
))
self
.
mainsizer
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
self
.
mainsizer
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
self
.
panel
=
wx
.
Panel
(
self
,
-
1
,
size
=
(
150
,
600
),
pos
=
(
0
,
0
))
self
.
panel
=
wx
.
Panel
(
self
,
-
1
,
size
=
(
150
,
600
),
pos
=
(
0
,
0
))
self
.
panel
.
SetBackgroundColour
((
10
,
10
,
10
))
self
.
panel
.
SetBackgroundColour
((
10
,
10
,
10
))
self
.
l
=
wx
.
ListBox
(
self
.
panel
,
size
=
(
300
,
180
),
pos
=
(
0
,
30
))
self
.
l
=
wx
.
ListBox
(
self
.
panel
,
size
=
(
300
,
180
),
pos
=
(
0
,
30
))
self
.
cl
=
wx
.
Button
(
self
.
panel
,
label
=
"Clear"
,
pos
=
(
0
,
205
))
self
.
cl
=
wx
.
Button
(
self
.
panel
,
label
=
"Clear"
,
pos
=
(
0
,
205
))
self
.
lb
=
wx
.
Button
(
self
.
panel
,
label
=
"Load"
,
pos
=
(
0
,
0
))
self
.
lb
=
wx
.
Button
(
self
.
panel
,
label
=
"Load"
,
pos
=
(
0
,
0
))
if
(
callback
is
None
):
if
(
callback
is
None
):
self
.
eb
=
wx
.
Button
(
self
.
panel
,
label
=
"Export"
,
pos
=
(
100
,
0
))
self
.
eb
=
wx
.
Button
(
self
.
panel
,
label
=
"Export"
,
pos
=
(
100
,
0
))
self
.
eb
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
export
)
self
.
eb
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
export
)
else
:
else
:
self
.
eb
=
wx
.
Button
(
self
.
panel
,
label
=
"Done"
,
pos
=
(
100
,
0
))
self
.
eb
=
wx
.
Button
(
self
.
panel
,
label
=
"Done"
,
pos
=
(
100
,
0
))
self
.
eb
.
Bind
(
wx
.
EVT_BUTTON
,
lambda
e
:
self
.
done
(
e
,
callback
))
self
.
eb
.
Bind
(
wx
.
EVT_BUTTON
,
lambda
e
:
self
.
done
(
e
,
callback
))
self
.
eb
=
wx
.
Button
(
self
.
panel
,
label
=
"Cancel"
,
pos
=
(
200
,
0
))
self
.
eb
=
wx
.
Button
(
self
.
panel
,
label
=
"Cancel"
,
pos
=
(
200
,
0
))
self
.
eb
.
Bind
(
wx
.
EVT_BUTTON
,
lambda
e
:
self
.
Destroy
())
self
.
eb
.
Bind
(
wx
.
EVT_BUTTON
,
lambda
e
:
self
.
Destroy
())
self
.
sb
=
wx
.
Button
(
self
.
panel
,
label
=
"Snap to Z=0"
,
pos
=
(
00
,
255
))
self
.
sb
=
wx
.
Button
(
self
.
panel
,
label
=
"Snap to Z = 0"
,
pos
=
(
00
,
255
))
self
.
cb
=
wx
.
Button
(
self
.
panel
,
label
=
"Put at 100,100"
,
pos
=
(
0
,
280
))
self
.
cb
=
wx
.
Button
(
self
.
panel
,
label
=
"Put at 100, 100"
,
pos
=
(
0
,
280
))
self
.
db
=
wx
.
Button
(
self
.
panel
,
label
=
"Delete"
,
pos
=
(
0
,
305
))
self
.
db
=
wx
.
Button
(
self
.
panel
,
label
=
"Delete"
,
pos
=
(
0
,
305
))
self
.
ab
=
wx
.
Button
(
self
.
panel
,
label
=
"Auto"
,
pos
=
(
0
,
330
))
self
.
ab
=
wx
.
Button
(
self
.
panel
,
label
=
"Auto"
,
pos
=
(
0
,
330
))
self
.
cl
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
clear
)
self
.
cl
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
clear
)
self
.
lb
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
right
)
self
.
lb
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
right
)
self
.
sb
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
snap
)
self
.
sb
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
snap
)
self
.
cb
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
center
)
self
.
cb
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
center
)
self
.
db
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
delete
)
self
.
db
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
delete
)
self
.
ab
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
autoplate
)
self
.
ab
.
Bind
(
wx
.
EVT_BUTTON
,
self
.
autoplate
)
self
.
basedir
=
"."
self
.
basedir
=
"."
self
.
models
=
{}
self
.
models
=
{}
self
.
SetBackgroundColour
((
10
,
10
,
10
))
self
.
SetBackgroundColour
((
10
,
10
,
10
))
self
.
mainsizer
.
Add
(
self
.
panel
)
self
.
mainsizer
.
Add
(
self
.
panel
)
#self.mainsizer.AddSpacer(10)
#self.mainsizer.AddSpacer(10)
if
glview
:
if
glview
:
self
.
s
=
stlview
.
TestGlPanel
(
self
,(
580
,
580
))
self
.
s
=
stlview
.
TestGlPanel
(
self
,
(
580
,
580
))
else
:
else
:
self
.
s
=
showstl
(
self
,(
580
,
580
),(
0
,
0
))
self
.
s
=
showstl
(
self
,
(
580
,
580
),
(
0
,
0
))
self
.
mainsizer
.
Add
(
self
.
s
,
1
,
wx
.
EXPAND
)
self
.
mainsizer
.
Add
(
self
.
s
,
1
,
wx
.
EXPAND
)
self
.
SetSizer
(
self
.
mainsizer
)
self
.
SetSizer
(
self
.
mainsizer
)
#self.mainsizer.Fit(self)
#self.mainsizer.Fit(self)
self
.
Layout
()
self
.
Layout
()
#self.SetClientSize(size)
#self.SetClientSize(size)
def
autoplate
(
self
,
event
):
def
autoplate
(
self
,
event
):
print
"Autoplating"
print
"Autoplating"
separation
=
2
separation
=
2
bedsize
=
[
200
,
200
,
100
]
bedsize
=
[
200
,
200
,
100
]
cursor
=
[
0
,
0
,
0
]
cursor
=
[
0
,
0
,
0
]
newrow
=
0
newrow
=
0
max
=
[
0
,
0
]
max
=
[
0
,
0
]
for
i
in
self
.
models
:
for
i
in
self
.
models
:
self
.
models
[
i
]
.
offsets
[
2
]
=-
1.0
*
self
.
models
[
i
]
.
dims
[
4
]
self
.
models
[
i
]
.
offsets
[
2
]
=
-
1.0
*
self
.
models
[
i
]
.
dims
[
4
]
x
=
abs
(
self
.
models
[
i
]
.
dims
[
0
]
-
self
.
models
[
i
]
.
dims
[
1
])
x
=
abs
(
self
.
models
[
i
]
.
dims
[
0
]
-
self
.
models
[
i
]
.
dims
[
1
])
y
=
abs
(
self
.
models
[
i
]
.
dims
[
2
]
-
self
.
models
[
i
]
.
dims
[
3
])
y
=
abs
(
self
.
models
[
i
]
.
dims
[
2
]
-
self
.
models
[
i
]
.
dims
[
3
])
centre
=
[
x
/
2
,
y
/
2
]
centre
=
[
x
/
2
,
y
/
2
]
centreoffset
=
[
self
.
models
[
i
]
.
dims
[
0
]
+
centre
[
0
],
self
.
models
[
i
]
.
dims
[
2
]
+
centre
[
1
]]
centreoffset
=
[
self
.
models
[
i
]
.
dims
[
0
]
+
centre
[
0
],
self
.
models
[
i
]
.
dims
[
2
]
+
centre
[
1
]]
if
(
cursor
[
0
]
+
x
+
separation
)
>=
bedsize
[
0
]:
if
(
cursor
[
0
]
+
x
+
separation
)
>=
bedsize
[
0
]:
cursor
[
0
]
=
0
cursor
[
0
]
=
0
cursor
[
1
]
+=
newrow
+
separation
cursor
[
1
]
+=
newrow
+
separation
newrow
=
0
newrow
=
0
if
(
newrow
==
0
)
or
(
newrow
<
y
):
if
(
newrow
==
0
)
or
(
newrow
<
y
):
newrow
=
y
newrow
=
y
...
@@ -280,103 +285,100 @@ class stlwin(wx.Frame):
...
@@ -280,103 +285,100 @@ class stlwin(wx.Frame):
# Good job, it confused the hell out of me.
# Good job, it confused the hell out of me.
self
.
models
[
i
]
.
offsets
[
0
]
=
cursor
[
0
]
+
centre
[
0
]
-
centreoffset
[
0
]
self
.
models
[
i
]
.
offsets
[
0
]
=
cursor
[
0
]
+
centre
[
0
]
-
centreoffset
[
0
]
self
.
models
[
i
]
.
offsets
[
1
]
=
cursor
[
1
]
+
centre
[
1
]
-
centreoffset
[
1
]
self
.
models
[
i
]
.
offsets
[
1
]
=
cursor
[
1
]
+
centre
[
1
]
-
centreoffset
[
1
]
if
(
max
[
0
]
==
0
)
or
(
max
[
0
]
<
(
cursor
[
0
]
+
x
)):
if
(
max
[
0
]
==
0
)
or
(
max
[
0
]
<
(
cursor
[
0
]
+
x
)):
max
[
0
]
=
cursor
[
0
]
+
x
max
[
0
]
=
cursor
[
0
]
+
x
if
(
max
[
1
]
==
0
)
or
(
max
[
1
]
<
(
cursor
[
1
]
+
x
)):
if
(
max
[
1
]
==
0
)
or
(
max
[
1
]
<
(
cursor
[
1
]
+
x
)):
max
[
1
]
=
cursor
[
1
]
+
x
max
[
1
]
=
cursor
[
1
]
+
x
cursor
[
0
]
+=
x
+
separation
cursor
[
0
]
+=
x
+
separation
if
(
cursor
[
1
]
+
y
)
>=
bedsize
[
1
]:
if
(
cursor
[
1
]
+
y
)
>=
bedsize
[
1
]:
print
"Bed full, sorry sir :("
print
"Bed full, sorry sir :("
self
.
Refresh
()
self
.
Refresh
()
return
return
centreoffset
=
[(
bedsize
[
0
]
-
max
[
0
])
/
2
,(
bedsize
[
1
]
-
max
[
1
])
/
2
]
centreoffset
=
[(
bedsize
[
0
]
-
max
[
0
])
/
2
,
(
bedsize
[
1
]
-
max
[
1
])
/
2
]
for
i
in
self
.
models
:
for
i
in
self
.
models
:
self
.
models
[
i
]
.
offsets
[
0
]
+=
centreoffset
[
0
]
self
.
models
[
i
]
.
offsets
[
0
]
+=
centreoffset
[
0
]
self
.
models
[
i
]
.
offsets
[
1
]
+=
centreoffset
[
1
]
self
.
models
[
i
]
.
offsets
[
1
]
+=
centreoffset
[
1
]
self
.
Refresh
()
self
.
Refresh
()
def
clear
(
self
,
event
):
def
clear
(
self
,
event
):
result
=
wx
.
MessageBox
(
'Are you sure you want to clear the grid? All unsaved changes will be lost.'
,
'Clear the grid?'
,
result
=
wx
.
MessageBox
(
'Are you sure you want to clear the grid? All unsaved changes will be lost.'
,
'Clear the grid?'
,
wx
.
YES_NO
|
wx
.
ICON_QUESTION
)
wx
.
YES_NO
|
wx
.
ICON_QUESTION
)
if
(
result
==
2
):
if
(
result
==
2
):
self
.
models
=
{}
self
.
models
=
{}
self
.
l
.
Clear
()
self
.
l
.
Clear
()
self
.
Refresh
()
self
.
Refresh
()
def
center
(
self
,
event
):
def
center
(
self
,
event
):
i
=
self
.
l
.
GetSelection
()
i
=
self
.
l
.
GetSelection
()
if
i
!=
-
1
:
if
i
!=
-
1
:
m
=
self
.
models
[
self
.
l
.
GetString
(
i
)]
m
=
self
.
models
[
self
.
l
.
GetString
(
i
)]
m
.
offsets
=
[
100
,
100
,
m
.
offsets
[
2
]]
m
.
offsets
=
[
100
,
100
,
m
.
offsets
[
2
]]
self
.
Refresh
()
self
.
Refresh
()
def
snap
(
self
,
event
):
def
snap
(
self
,
event
):
i
=
self
.
l
.
GetSelection
()
i
=
self
.
l
.
GetSelection
()
if
i
!=
-
1
:
if
i
!=
-
1
:
m
=
self
.
models
[
self
.
l
.
GetString
(
i
)]
m
=
self
.
models
[
self
.
l
.
GetString
(
i
)]
m
.
offsets
[
2
]
=-
1.0
*
min
(
m
.
facetsminz
)[
0
]
m
.
offsets
[
2
]
=
-
1.0
*
min
(
m
.
facetsminz
)[
0
]
#print m.offsets[2]
#print m.offsets[2]
self
.
Refresh
()
self
.
Refresh
()
def
delete
(
self
,
event
):
def
delete
(
self
,
event
):
i
=
self
.
l
.
GetSelection
()
i
=
self
.
l
.
GetSelection
()
if
i
!=
-
1
:
if
i
!=
-
1
:
del
self
.
models
[
self
.
l
.
GetString
(
i
)]
del
self
.
models
[
self
.
l
.
GetString
(
i
)]
self
.
l
.
Delete
(
i
)
self
.
l
.
Delete
(
i
)
self
.
l
.
Select
(
self
.
l
.
GetCount
()
-
1
)
self
.
l
.
Select
(
self
.
l
.
GetCount
()
-
1
)
self
.
Refresh
()
self
.
Refresh
()
def
done
(
self
,
event
,
cb
):
def
done
(
self
,
event
,
cb
):
import
os
,
time
try
:
try
:
os
.
mkdir
(
"tempstl"
)
os
.
mkdir
(
"tempstl"
)
except
:
except
:
pass
pass
name
=
"tempstl/"
+
str
(
int
(
time
.
time
())
%
10000
)
+
".stl"
name
=
"tempstl/"
+
str
(
int
(
time
.
time
())
%
10000
)
+
".stl"
self
.
writefiles
(
name
)
self
.
writefiles
(
name
)
if
cb
is
not
None
:
if
cb
is
not
None
:
cb
(
name
)
cb
(
name
)
self
.
Destroy
()
self
.
Destroy
()
def
export
(
self
,
event
):
def
export
(
self
,
event
):
dlg
=
wx
.
FileDialog
(
self
,
"Pick file to save to"
,
self
.
basedir
,
style
=
wx
.
FD_SAVE
)
dlg
=
wx
.
FileDialog
(
self
,
"Pick file to save to"
,
self
.
basedir
,
style
=
wx
.
FD_SAVE
)
dlg
.
SetWildcard
(
"STL files (;*.stl;)"
)
dlg
.
SetWildcard
(
"STL files (;*.stl;)"
)
if
(
dlg
.
ShowModal
()
==
wx
.
ID_OK
):
if
(
dlg
.
ShowModal
()
==
wx
.
ID_OK
):
name
=
dlg
.
GetPath
()
name
=
dlg
.
GetPath
()
self
.
writefiles
(
name
)
self
.
writefiles
(
name
)
def
writefiles
(
self
,
name
):
def
writefiles
(
self
,
name
):
sf
=
open
(
name
.
replace
(
"."
,
"_"
)
+
".scad"
,
"w"
)
sf
=
open
(
name
.
replace
(
"."
,
"_"
)
+
".scad"
,
"w"
)
facets
=
[]
facets
=
[]
for
i
in
self
.
models
.
values
():
for
i
in
self
.
models
.
values
():
r
=
i
.
rot
r
=
i
.
rot
o
=
i
.
offsets
o
=
i
.
offsets
sf
.
write
(
'translate([
%
s,
%
s,
%
s]) rotate([0,0,
%
s]) import_stl("
%
s");
\n
'
%
(
str
(
o
[
0
]),
str
(
o
[
1
]),
str
(
o
[
2
]),
r
,
os
.
path
.
split
(
i
.
filename
)[
1
]))
sf
.
write
(
'translate([
%
s,
%
s,
%
s]) rotate([0, 0,
%
s]) import_stl("
%
s");
\n
'
%
(
str
(
o
[
0
]),
str
(
o
[
1
]),
str
(
o
[
2
]),
r
,
os
.
path
.
split
(
i
.
filename
)[
1
]))
if
r
!=
0
:
if
r
!=
0
:
i
=
i
.
rotate
([
0
,
0
,
r
])
i
=
i
.
rotate
([
0
,
0
,
r
])
if
o
!=
[
0
,
0
,
0
]:
if
o
!=
[
0
,
0
,
0
]:
i
=
i
.
translate
([
o
[
0
],
o
[
1
],
o
[
2
]])
i
=
i
.
translate
([
o
[
0
],
o
[
1
],
o
[
2
]])
facets
+=
i
.
facets
facets
+=
i
.
facets
sf
.
close
()
sf
.
close
()
stltool
.
emitstl
(
name
,
facets
,
"plater_export"
)
stltool
.
emitstl
(
name
,
facets
,
"plater_export"
)
print
"wrote "
,
name
print
"wrote "
,
name
def
right
(
self
,
event
):
def
right
(
self
,
event
):
dlg
=
wx
.
FileDialog
(
self
,
"Pick file to load"
,
self
.
basedir
,
style
=
wx
.
FD_OPEN
|
wx
.
FD_FILE_MUST_EXIST
)
dlg
=
wx
.
FileDialog
(
self
,
"Pick file to load"
,
self
.
basedir
,
style
=
wx
.
FD_OPEN
|
wx
.
FD_FILE_MUST_EXIST
)
dlg
.
SetWildcard
(
"STL files (;*.stl;)|*.stl|OpenSCAD files (;*.scad;)|*.scad"
)
dlg
.
SetWildcard
(
"STL files (;*.stl;)|*.stl|OpenSCAD files (;*.scad;)|*.scad"
)
if
(
dlg
.
ShowModal
()
==
wx
.
ID_OK
):
if
(
dlg
.
ShowModal
()
==
wx
.
ID_OK
):
name
=
dlg
.
GetPath
()
name
=
dlg
.
GetPath
()
if
(
name
.
lower
()
.
endswith
(
".stl"
)):
if
(
name
.
lower
()
.
endswith
(
".stl"
)):
self
.
load_stl
(
event
,
name
)
self
.
load_stl
(
event
,
name
)
elif
(
name
.
lower
()
.
endswith
(
".scad"
)):
elif
(
name
.
lower
()
.
endswith
(
".scad"
)):
self
.
load_scad
(
event
,
name
)
self
.
load_scad
(
event
,
name
)
def
load_scad
(
self
,
event
,
name
):
def
load_scad
(
self
,
event
,
name
):
lf
=
open
(
name
)
lf
=
open
(
name
)
s
=
[
i
.
replace
(
"
\n
"
,
""
)
.
replace
(
"
\r
"
,
""
)
.
replace
(
";"
,
""
)
for
i
in
lf
if
"stl"
in
i
]
s
=
[
i
.
replace
(
"
\n
"
,
""
)
.
replace
(
"
\r
"
,
""
)
.
replace
(
";"
,
""
)
for
i
in
lf
if
"stl"
in
i
]
lf
.
close
()
lf
.
close
()
for
i
in
s
:
for
i
in
s
:
...
@@ -390,76 +392,75 @@ class stlwin(wx.Frame):
...
@@ -390,76 +392,75 @@ class stlwin(wx.Frame):
for
part
in
parts
:
for
part
in
parts
:
if
'import'
in
part
:
if
'import'
in
part
:
stl_file
=
evalme
(
part
)
stl_file
=
evalme
(
part
)
newname
=
os
.
path
.
split
(
stl_file
.
lower
())[
1
]
newname
=
os
.
path
.
split
(
stl_file
.
lower
())[
1
]
c
=
1
c
=
1
while
newname
in
self
.
models
:
while
newname
in
self
.
models
:
newname
=
os
.
path
.
split
(
stl_file
.
lower
())[
1
]
newname
=
os
.
path
.
split
(
stl_file
.
lower
())[
1
]
newname
=
newname
+
"(
%
d)"
%
c
newname
=
newname
+
"(
%
d)"
%
c
c
+=
1
c
+=
1
stl_path
=
os
.
path
.
join
(
os
.
path
.
split
(
name
)[
0
:
len
(
os
.
path
.
split
(
stl_file
))
-
1
])
stl_path
=
os
.
path
.
join
(
os
.
path
.
split
(
name
)[
0
:
len
(
os
.
path
.
split
(
stl_file
))
-
1
])
stl_full_path
=
os
.
path
.
join
(
stl_path
[
0
],
str
(
stl_file
))
stl_full_path
=
os
.
path
.
join
(
stl_path
[
0
],
str
(
stl_file
))
self
.
load_stl_into_model
(
stl_full_path
,
stl_file
,
translate_list
,
rotate_list
[
2
])
self
.
load_stl_into_model
(
stl_full_path
,
stl_file
,
translate_list
,
rotate_list
[
2
])
def
load_stl
(
self
,
event
,
name
):
def
load_stl
(
self
,
event
,
name
):
if
not
(
os
.
path
.
exists
(
name
)):
if
not
(
os
.
path
.
exists
(
name
)):
return
return
path
=
os
.
path
.
split
(
name
)[
0
]
path
=
os
.
path
.
split
(
name
)[
0
]
self
.
basedir
=
path
self
.
basedir
=
path
t
=
time
.
time
()
t
=
time
.
time
()
#print name
#print name
if
name
.
lower
()
.
endswith
(
".stl"
):
if
name
.
lower
()
.
endswith
(
".stl"
):
#Filter out the path, just show the STL filename.
#Filter out the path, just show the STL filename.
self
.
load_stl_into_model
(
name
,
name
)
self
.
load_stl_into_model
(
name
,
name
)
self
.
Refresh
()
self
.
Refresh
()
#print time.time()-t
#print time.time()-t
def
load_stl_into_model
(
self
,
path
,
name
,
offset
=
[
0
,
0
,
0
],
rotation
=
0
,
scale
=
[
1.0
,
1.0
,
1.0
]):
def
load_stl_into_model
(
self
,
path
,
name
,
offset
=
[
0
,
0
,
0
],
rotation
=
0
,
scale
=
[
1.0
,
1.0
,
1.0
]):
newname
=
os
.
path
.
split
(
name
.
lower
())[
1
]
newname
=
os
.
path
.
split
(
name
.
lower
())[
1
]
c
=
1
c
=
1
while
newname
in
self
.
models
:
while
newname
in
self
.
models
:
newname
=
os
.
path
.
split
(
name
.
lower
())[
1
]
newname
=
os
.
path
.
split
(
name
.
lower
())[
1
]
newname
=
newname
+
"(
%
d)"
%
c
newname
=
newname
+
"(
%
d)"
%
c
c
+=
1
c
+=
1
self
.
models
[
newname
]
=
stltool
.
stl
(
path
)
self
.
models
[
newname
]
=
stltool
.
stl
(
path
)
self
.
models
[
newname
]
.
offsets
=
offset
self
.
models
[
newname
]
.
offsets
=
offset
self
.
models
[
newname
]
.
rot
=
rotation
self
.
models
[
newname
]
.
rot
=
rotation
self
.
models
[
newname
]
.
scale
=
scale
self
.
models
[
newname
]
.
scale
=
scale
self
.
models
[
newname
]
.
filename
=
name
self
.
models
[
newname
]
.
filename
=
name
minx
,
miny
,
minz
,
maxx
,
maxy
,
maxz
=
(
10000
,
10000
,
10000
,
0
,
0
,
0
)
minx
,
miny
,
minz
,
maxx
,
maxy
,
maxz
=
(
10000
,
10000
,
10000
,
0
,
0
,
0
)
for
i
in
self
.
models
[
newname
]
.
facets
:
for
i
in
self
.
models
[
newname
]
.
facets
:
for
j
in
i
[
1
]:
for
j
in
i
[
1
]:
if
j
[
0
]
<
minx
:
if
j
[
0
]
<
minx
:
minx
=
j
[
0
]
minx
=
j
[
0
]
if
j
[
1
]
<
miny
:
if
j
[
1
]
<
miny
:
miny
=
j
[
1
]
miny
=
j
[
1
]
if
j
[
2
]
<
minz
:
if
j
[
2
]
<
minz
:
minz
=
j
[
2
]
minz
=
j
[
2
]
if
j
[
0
]
>
maxx
:
if
j
[
0
]
>
maxx
:
maxx
=
j
[
0
]
maxx
=
j
[
0
]
if
j
[
1
]
>
maxy
:
if
j
[
1
]
>
maxy
:
maxy
=
j
[
1
]
maxy
=
j
[
1
]
if
j
[
2
]
>
maxz
:
if
j
[
2
]
>
maxz
:
maxz
=
j
[
2
]
maxz
=
j
[
2
]
self
.
models
[
newname
]
.
dims
=
[
minx
,
maxx
,
miny
,
maxy
,
minz
,
maxz
]
self
.
models
[
newname
]
.
dims
=
[
minx
,
maxx
,
miny
,
maxy
,
minz
,
maxz
]
#if minx
<
0:
#if minx
<
0:
# self.models[newname].offsets[0]
=
-minx
# self.models[newname].offsets[0]
=
-minx
#if miny
<
0:
#if miny
<
0:
# self.models[newname].offsets[1]
=
-miny
# self.models[newname].offsets[1]
=
-miny
self
.
s
.
drawmodel
(
self
.
models
[
newname
],
2
)
self
.
s
.
drawmodel
(
self
.
models
[
newname
],
2
)
#print time.time()
-
t
#print time.time()
-
t
self
.
l
.
Append
(
newname
)
self
.
l
.
Append
(
newname
)
i
=
self
.
l
.
GetSelection
()
i
=
self
.
l
.
GetSelection
()
if
i
==
wx
.
NOT_FOUND
:
if
i
==
wx
.
NOT_FOUND
:
self
.
l
.
Select
(
0
)
self
.
l
.
Select
(
0
)
self
.
l
.
Select
(
self
.
l
.
GetCount
()
-
1
)
self
.
l
.
Select
(
self
.
l
.
GetCount
()
-
1
)
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
app
=
wx
.
App
(
False
)
app
=
wx
.
App
(
False
)
main
=
stlwin
()
main
=
stlwin
()
main
.
Show
()
main
.
Show
()
app
.
MainLoop
()
app
.
MainLoop
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment