printrun-src/printrun/stlplater.py

Wed, 20 Jan 2021 10:15:13 +0100

author
mdd
date
Wed, 20 Jan 2021 10:15:13 +0100
changeset 46
cce0af6351f0
parent 15
0bbb006204fc
permissions
-rwxr-xr-x

updated and added new files for printrun

46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
1 #!/usr/bin/env python3
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
2
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
3 # This file is part of the Printrun suite.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
4 #
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
5 # Printrun is free software: you can redistribute it and/or modify
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
6 # it under the terms of the GNU General Public License as published by
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
7 # the Free Software Foundation, either version 3 of the License, or
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
8 # (at your option) any later version.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
9 #
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
10 # Printrun is distributed in the hope that it will be useful,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
13 # GNU General Public License for more details.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
14 #
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
16 # along with Printrun. If not, see <http://www.gnu.org/licenses/>.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
17
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
18 import os
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
19
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
20 # Set up Internationalization using gettext
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
21 # searching for installed locales on /usr/share; uses relative folder if not found (windows)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
22 from .utils import install_locale
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
23 install_locale('pronterface')
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
24
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
25 import wx
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
26 import time
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
27 import logging
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
28 import threading
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
29 import math
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
30 import sys
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
31 import re
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
32 import traceback
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
33 import subprocess
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
34 from copy import copy
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
35
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
36 from printrun import stltool
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
37 from printrun.objectplater import make_plater, PlaterPanel
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
38
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
39 glview = '--no-gl' not in sys.argv
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
40 if glview:
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
41 try:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
42 from printrun import stlview
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
43 except:
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
44 glview = False
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
45 logging.warning("Could not load 3D viewer for plater:"
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
46 + "\n" + traceback.format_exc())
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
47
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
48
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
49 def evalme(s):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
50 return eval(s[s.find("(") + 1:s.find(")")])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
51
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
52 def transformation_matrix(model):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
53 matrix = stltool.I
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
54 if any(model.centeroffset):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
55 matrix = model.translation_matrix(model.centeroffset).dot(matrix)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
56 if model.rot:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
57 matrix = model.rotation_matrix([0, 0, model.rot]).dot(matrix)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
58 if any(model.offsets):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
59 matrix = model.translation_matrix(model.offsets).dot(matrix)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
60 return matrix
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
61
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
62 class showstl(wx.Window):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
63 def __init__(self, parent, size, pos):
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
64 super().__init__(parent, size = size, pos = pos)
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
65 self.i = 0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
66 self.parent = parent
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
67 self.previ = 0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
68 self.Bind(wx.EVT_MOUSEWHEEL, self.rot)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
69 self.Bind(wx.EVT_MOUSE_EVENTS, self.move)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
70 self.Bind(wx.EVT_PAINT, self.repaint)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
71 self.Bind(wx.EVT_KEY_DOWN, self.keypress)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
72 self.triggered = 0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
73 self.initpos = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
74 self.prevsel = -1
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
75
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
76 def prepare_model(self, m, scale):
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
77 m.bitmap = wx.Bitmap(800, 800, 32)
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
78 dc = wx.MemoryDC()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
79 dc.SelectObject(m.bitmap)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
80 dc.SetBackground(wx.Brush((0, 0, 0, 0)))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
81 dc.SetBrush(wx.Brush((0, 0, 0, 255)))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
82 dc.SetBrush(wx.Brush(wx.Colour(128, 255, 128)))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
83 dc.SetPen(wx.Pen(wx.Colour(128, 128, 128)))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
84 for i in m.facets:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
85 dc.DrawPolygon([wx.Point(400 + scale * p[0], (400 - scale * p[1])) for p in i[1]])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
86 dc.SelectObject(wx.NullBitmap)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
87 m.bitmap.SetMask(wx.Mask(m.bitmap, wx.Colour(0, 0, 0, 255)))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
88
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
89 def move_shape(self, delta):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
90 """moves shape (selected in l, which is list ListBox of shapes)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
91 by an offset specified in tuple delta.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
92 Positive numbers move to (rigt, down)"""
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
93 name = self.parent.l.GetSelection()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
94 if name == wx.NOT_FOUND:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
95 return False
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
96 name = self.parent.l.GetString(name)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
97 model = self.parent.models[name]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
98 model.offsets = [model.offsets[0] + delta[0],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
99 model.offsets[1] + delta[1],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
100 model.offsets[2]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
101 ]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
102 self.Refresh()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
103 return True
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
104
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
105 def move(self, event):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
106 if event.ButtonUp(wx.MOUSE_BTN_LEFT):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
107 if self.initpos is not None:
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
108 currentpos = event.GetPosition()
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
109 delta = (0.5 * (currentpos[0] - self.initpos[0]),
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
110 -0.5 * (currentpos[1] - self.initpos[1])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
111 )
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
112 self.move_shape(delta)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
113 self.Refresh()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
114 self.initpos = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
115 elif event.ButtonDown(wx.MOUSE_BTN_RIGHT):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
116 self.parent.right(event)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
117 elif event.Dragging():
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
118 if self.initpos is None:
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
119 self.initpos = event.GetPosition()
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
120 self.Refresh()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
121 dc = wx.ClientDC(self)
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
122 p = event.GetPosition()
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
123 dc.DrawLine(self.initpos[0], self.initpos[1], p[0], p[1])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
124 del dc
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
125 else:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
126 event.Skip()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
127
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
128 def rotate_shape(self, angle):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
129 """rotates acive shape
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
130 positive angle is clockwise
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
131 """
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
132 self.i += angle
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
133 if not self.triggered:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
134 self.triggered = 1
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
135 threading.Thread(target = self.cr).start()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
136
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
137 def keypress(self, event):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
138 """gets keypress events and moves/rotates acive shape"""
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
139 keycode = event.GetKeyCode()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
140 step = 5
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
141 angle = 18
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
142 if event.ControlDown():
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
143 step = 1
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
144 angle = 1
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
145 # h
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
146 if keycode == 72:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
147 self.move_shape((-step, 0))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
148 # l
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
149 if keycode == 76:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
150 self.move_shape((step, 0))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
151 # j
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
152 if keycode == 75:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
153 self.move_shape((0, step))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
154 # k
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
155 if keycode == 74:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
156 self.move_shape((0, -step))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
157 # [
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
158 if keycode == 91:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
159 self.rotate_shape(-angle)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
160 # ]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
161 if keycode == 93:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
162 self.rotate_shape(angle)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
163 event.Skip()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
164
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
165 def rotateafter(self):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
166 if self.i != self.previ:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
167 i = self.parent.l.GetSelection()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
168 if i != wx.NOT_FOUND:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
169 self.parent.models[self.parent.l.GetString(i)].rot -= 5 * (self.i - self.previ)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
170 self.previ = self.i
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
171 self.Refresh()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
172
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
173 def cr(self):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
174 time.sleep(0.01)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
175 wx.CallAfter(self.rotateafter)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
176 self.triggered = 0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
177
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
178 def rot(self, event):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
179 z = event.GetWheelRotation()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
180 s = self.parent.l.GetSelection()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
181 if self.prevsel != s:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
182 self.i = 0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
183 self.prevsel = s
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
184 self.rotate_shape(-1 if z < 0 else 1) #TEST
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
185
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
186 def repaint(self, event):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
187 dc = wx.PaintDC(self)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
188 self.paint(dc = dc)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
189
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
190 def paint(self, coord1 = "x", coord2 = "y", dc = None):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
191 if dc is None:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
192 dc = wx.ClientDC(self)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
193 scale = 2
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
194 dc.SetPen(wx.Pen(wx.Colour(100, 100, 100)))
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
195 for i in range(20):
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
196 dc.DrawLine(0, i * scale * 10, 400, i * scale * 10)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
197 dc.DrawLine(i * scale * 10, 0, i * scale * 10, 400)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
198 dc.SetPen(wx.Pen(wx.Colour(0, 0, 0)))
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
199 for i in range(4):
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
200 dc.DrawLine(0, i * scale * 50, 400, i * scale * 50)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
201 dc.DrawLine(i * scale * 50, 0, i * scale * 50, 400)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
202 dc.SetBrush(wx.Brush(wx.Colour(128, 255, 128)))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
203 dc.SetPen(wx.Pen(wx.Colour(128, 128, 128)))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
204 dcs = wx.MemoryDC()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
205 for m in self.parent.models.values():
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
206 b = m.bitmap
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
207 im = b.ConvertToImage()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
208 imgc = wx.Point(im.GetWidth() / 2, im.GetHeight() / 2)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
209 im = im.Rotate(math.radians(m.rot), imgc, 0)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
210 bm = wx.BitmapFromImage(im)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
211 dcs.SelectObject(bm)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
212 bsz = bm.GetSize()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
213 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)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
214 del dc
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
215
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
216 class StlPlaterPanel(PlaterPanel):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
217
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
218 load_wildcard = _("STL files (*.stl;*.STL)|*.stl;*.STL|OpenSCAD files (*.scad)|*.scad")
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
219 save_wildcard = _("STL files (*.stl;*.STL)|*.stl;*.STL")
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
220
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
221 def prepare_ui(self, filenames = [], callback = None,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
222 parent = None, build_dimensions = None, circular_platform = False,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
223 simarrange_path = None, antialias_samples = 0):
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
224 super().prepare_ui(filenames, callback, parent, build_dimensions)
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
225 self.cutting = False
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
226 self.cutting_axis = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
227 self.cutting_dist = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
228 if glview:
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
229 viewer = stlview.StlViewPanel(self, wx.DefaultSize,
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
230 build_dimensions = self.build_dimensions,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
231 circular = circular_platform,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
232 antialias_samples = antialias_samples)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
233 # Cutting tool
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
234 nrows = self.menusizer.GetRows()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
235 self.menusizer.Add(wx.StaticText(self.menupanel, -1, _("Cut along:")),
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
236 pos = (nrows, 0), span = (1, 1), flag = wx.ALIGN_CENTER)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
237 cutconfirmbutton = wx.Button(self.menupanel, label = _("Confirm cut"))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
238 cutconfirmbutton.Bind(wx.EVT_BUTTON, self.cut_confirm)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
239 cutconfirmbutton.Disable()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
240 self.cutconfirmbutton = cutconfirmbutton
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
241 self.menusizer.Add(cutconfirmbutton, pos = (nrows, 1), span = (1, 1), flag = wx.EXPAND)
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
242 cutpanel = wx.Panel(self.menupanel)
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
243 cutsizer = self.cutsizer = wx.BoxSizer(wx.HORIZONTAL)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
244 cutpanel.SetSizer(cutsizer)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
245 cutxplusbutton = wx.ToggleButton(cutpanel, label = _(">X"), style = wx.BU_EXACTFIT)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
246 cutxplusbutton.Bind(wx.EVT_TOGGLEBUTTON, lambda event: self.start_cutting_tool(event, "x", 1))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
247 cutsizer.Add(cutxplusbutton, 1, flag = wx.EXPAND)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
248 cutzplusbutton = wx.ToggleButton(cutpanel, label = _(">Y"), style = wx.BU_EXACTFIT)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
249 cutzplusbutton.Bind(wx.EVT_TOGGLEBUTTON, lambda event: self.start_cutting_tool(event, "y", 1))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
250 cutsizer.Add(cutzplusbutton, 1, flag = wx.EXPAND)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
251 cutzplusbutton = wx.ToggleButton(cutpanel, label = _(">Z"), style = wx.BU_EXACTFIT)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
252 cutzplusbutton.Bind(wx.EVT_TOGGLEBUTTON, lambda event: self.start_cutting_tool(event, "z", 1))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
253 cutsizer.Add(cutzplusbutton, 1, flag = wx.EXPAND)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
254 cutxminusbutton = wx.ToggleButton(cutpanel, label = _("<X"), style = wx.BU_EXACTFIT)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
255 cutxminusbutton.Bind(wx.EVT_TOGGLEBUTTON, lambda event: self.start_cutting_tool(event, "x", -1))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
256 cutsizer.Add(cutxminusbutton, 1, flag = wx.EXPAND)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
257 cutzminusbutton = wx.ToggleButton(cutpanel, label = _("<Y"), style = wx.BU_EXACTFIT)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
258 cutzminusbutton.Bind(wx.EVT_TOGGLEBUTTON, lambda event: self.start_cutting_tool(event, "y", -1))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
259 cutsizer.Add(cutzminusbutton, 1, flag = wx.EXPAND)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
260 cutzminusbutton = wx.ToggleButton(cutpanel, label = _("<Z"), style = wx.BU_EXACTFIT)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
261 cutzminusbutton.Bind(wx.EVT_TOGGLEBUTTON, lambda event: self.start_cutting_tool(event, "z", -1))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
262 cutsizer.Add(cutzminusbutton, 1, flag = wx.EXPAND)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
263 self.menusizer.Add(cutpanel, pos = (nrows + 1, 0), span = (1, 2), flag = wx.EXPAND)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
264 else:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
265 viewer = showstl(self, (580, 580), (0, 0))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
266 self.simarrange_path = simarrange_path
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
267 self.set_viewer(viewer)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
268
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
269 def start_cutting_tool(self, event, axis, direction):
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
270 toggle = event.EventObject
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
271 self.cutting = toggle.Value
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
272 if toggle.Value:
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
273 # Disable the other toggles
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
274 for child in self.cutsizer.Children:
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
275 child = child.Window
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
276 if child != toggle:
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
277 child.Value = False
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
278 self.cutting_axis = axis
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
279 self.cutting_direction = direction
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
280 else:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
281 self.cutting_axis = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
282 self.cutting_direction = None
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
283 self.cutting_dist = None
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
284
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
285 def cut_confirm(self, event):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
286 name = self.l.GetSelection()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
287 name = self.l.GetString(name)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
288 model = self.models[name]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
289 transformation = transformation_matrix(model)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
290 transformed = model.transform(transformation)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
291 logging.info(_("Cutting %s alongside %s axis") % (name, self.cutting_axis))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
292 axes = ["x", "y", "z"]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
293 cut = transformed.cut(axes.index(self.cutting_axis),
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
294 self.cutting_direction,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
295 self.cutting_dist)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
296 cut.offsets = [0, 0, 0]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
297 cut.rot = 0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
298 cut.scale = model.scale
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
299 cut.filename = model.filename
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
300 cut.centeroffset = [0, 0, 0]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
301 self.s.prepare_model(cut, 2)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
302 self.models[name] = cut
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
303 self.cutconfirmbutton.Disable()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
304 self.cutting = False
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
305 self.cutting_axis = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
306 self.cutting_dist = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
307 self.cutting_direction = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
308 for child in self.cutsizer.GetChildren():
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
309 child = child.GetWindow()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
310 child.SetValue(False)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
311
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
312 def clickcb(self, event, single = False):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
313 if not isinstance(self.s, stlview.StlViewPanel):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
314 return
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
315 if self.cutting:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
316 self.clickcb_cut(event)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
317 else:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
318 self.clickcb_rebase(event)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
319
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
320 def clickcb_cut(self, event):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
321 axis = self.cutting_axis
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
322 self.cutting_dist, _, _ = self.s.get_cutting_plane(axis, None,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
323 local_transform = True)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
324 if self.cutting_dist is not None:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
325 self.cutconfirmbutton.Enable()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
326
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
327 def clickcb_rebase(self, event):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
328 x, y = event.GetPosition()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
329 ray_near, ray_far = self.s.mouse_to_ray(x, y, local_transform = True)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
330 best_match = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
331 best_facet = None
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
332 best_dist = float("inf")
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
333 for key, model in self.models.items():
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
334 transformation = transformation_matrix(model)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
335 transformed = model.transform(transformation)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
336 if not transformed.intersect_box(ray_near, ray_far):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
337 logging.debug("Skipping %s for rebase search" % key)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
338 continue
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
339 facet, facet_dist = transformed.intersect(ray_near, ray_far)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
340 if facet is not None and facet_dist < best_dist:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
341 best_match = key
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
342 best_facet = facet
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
343 best_dist = facet_dist
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
344 if best_match is not None:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
345 logging.info("Rebasing %s" % best_match)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
346 model = self.models[best_match]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
347 newmodel = model.rebase(best_facet)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
348 newmodel.offsets = list(model.offsets)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
349 newmodel.rot = 0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
350 newmodel.scale = model.scale
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
351 newmodel.filename = model.filename
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
352 newmodel.centeroffset = [-(newmodel.dims[1] + newmodel.dims[0]) / 2,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
353 -(newmodel.dims[3] + newmodel.dims[2]) / 2,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
354 0]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
355 self.s.prepare_model(newmodel, 2)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
356 self.models[best_match] = newmodel
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
357 wx.CallAfter(self.Refresh)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
358
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
359 def done(self, event, cb):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
360 if not os.path.exists("tempstl"):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
361 os.mkdir("tempstl")
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
362 name = "tempstl/" + str(int(time.time()) % 10000) + ".stl"
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
363 self.export_to(name)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
364 if cb is not None:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
365 cb(name)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
366 if self.destroy_on_done:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
367 self.Destroy()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
368
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
369 def load_file(self, filename):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
370 if filename.lower().endswith(".stl"):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
371 try:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
372 self.load_stl(filename)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
373 except:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
374 dlg = wx.MessageDialog(self, _("Loading STL file failed"),
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
375 _("Error:") + traceback.format_exc(),
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
376 wx.OK)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
377 dlg.ShowModal()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
378 logging.error(_("Loading STL file failed:")
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
379 + "\n" + traceback.format_exc())
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
380 elif filename.lower().endswith(".scad"):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
381 try:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
382 self.load_scad(filename)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
383 except:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
384 dlg = wx.MessageDialog(self, _("Loading OpenSCAD file failed"),
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
385 _("Error:") + traceback.format_exc(),
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
386 wx.OK)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
387 dlg.ShowModal()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
388 logging.error(_("Loading OpenSCAD file failed:")
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
389 + "\n" + traceback.format_exc())
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
390
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
391 def load_scad(self, name):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
392 lf = open(name)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
393 s = [i.replace("\n", "").replace("\r", "").replace(";", "") for i in lf if "stl" in i]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
394 lf.close()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
395
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
396 for i in s:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
397 parts = i.split()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
398 for part in parts:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
399 if 'translate' in part:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
400 translate_list = evalme(part)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
401 for part in parts:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
402 if 'rotate' in part:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
403 rotate_list = evalme(part)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
404 for part in parts:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
405 if 'import' in part:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
406 stl_file = evalme(part)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
407
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
408 newname = os.path.split(stl_file.lower())[1]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
409 c = 1
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
410 while newname in self.models:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
411 newname = os.path.split(stl_file.lower())[1]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
412 newname = newname + "(%d)" % c
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
413 c += 1
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
414 stl_path = os.path.join(os.path.split(name)[0:len(os.path.split(stl_file)) - 1])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
415 stl_full_path = os.path.join(stl_path[0], str(stl_file))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
416 self.load_stl_into_model(stl_full_path, stl_file, translate_list, rotate_list[2])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
417
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
418 def load_stl(self, name):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
419 if not os.path.exists(name):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
420 logging.error(_("Couldn't load non-existing file %s") % name)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
421 return
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
422 path = os.path.split(name)[0]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
423 self.basedir = path
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
424 if name.lower().endswith(".stl"):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
425 for model in self.models.values():
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
426 if model.filename == name:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
427 newmodel = copy(model)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
428 newmodel.offsets = list(model.offsets)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
429 newmodel.rot = model.rot
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
430 newmodel.scale = list(model.scale)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
431 self.add_model(name, newmodel)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
432 self.s.prepare_model(newmodel, 2)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
433 break
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
434 else:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
435 # Filter out the path, just show the STL filename.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
436 self.load_stl_into_model(name, name)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
437 wx.CallAfter(self.Refresh)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
438
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
439 def load_stl_into_model(self, path, name, offset = None, rotation = 0, scale = [1.0, 1.0, 1.0]):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
440 model = stltool.stl(path)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
441 if offset is None:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
442 offset = [self.build_dimensions[3], self.build_dimensions[4], 0]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
443 model.offsets = list(offset)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
444 model.rot = rotation
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
445 model.scale = list(scale)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
446 model.filename = name
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
447 self.add_model(name, model)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
448 model.centeroffset = [-(model.dims[1] + model.dims[0]) / 2,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
449 -(model.dims[3] + model.dims[2]) / 2,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
450 0]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
451 self.s.prepare_model(model, 2)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
452
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
453 def export_to(self, name):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
454 with open(name.replace(".", "_") + ".scad", "w") as sf:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
455 facets = []
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
456 for model in self.models.values():
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
457 r = model.rot
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
458 o = model.offsets
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
459 co = model.centeroffset
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
460 sf.write("translate([%s, %s, %s])"
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
461 "rotate([0, 0, %s])"
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
462 "translate([%s, %s, %s])"
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
463 "import(\"%s\");\n" % (o[0], o[1], o[2],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
464 r,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
465 co[0], co[1], co[2],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
466 model.filename))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
467 model = model.transform(transformation_matrix(model))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
468 facets += model.facets
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
469 stltool.emitstl(name, facets, "plater_export")
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
470 logging.info(_("Wrote plate to %s") % name)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
471
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
472 def autoplate(self, event = None):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
473 if self.simarrange_path:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
474 try:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
475 self.autoplate_simarrange()
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
476 except Exception as e:
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
477 logging.warning(_("Failed to use simarrange for plating, "
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
478 "falling back to the standard method. "
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
479 "The error was: ") + e)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
480 super(StlPlaterPanel, self).autoplate()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
481 else:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
482 super(StlPlaterPanel, self).autoplate()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
483
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
484 def autoplate_simarrange(self):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
485 logging.info(_("Autoplating using simarrange"))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
486 models = dict(self.models)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
487 files = [model.filename for model in models.values()]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
488 command = [self.simarrange_path, "--dryrun",
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
489 "-m", # Pack around center
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
490 "-x", str(int(self.build_dimensions[0])),
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
491 "-y", str(int(self.build_dimensions[1]))] + files
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
492 p = subprocess.Popen(command, stdout = subprocess.PIPE, universal_newlines = True)
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
493
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
494 pos_regexp = re.compile("File: (.*) minx: ([0-9]+), miny: ([0-9]+), minrot: ([0-9]+)")
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
495 for line in p.stdout:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
496 line = line.rstrip()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
497 if "Generating plate" in line:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
498 plateid = int(line.split()[-1])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
499 if plateid > 0:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
500 logging.error(_("Plate full, please remove some objects"))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
501 break
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
502 if "File:" in line:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
503 bits = pos_regexp.match(line).groups()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
504 filename = bits[0]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
505 x = float(bits[1])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
506 y = float(bits[2])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
507 rot = -float(bits[3])
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
508 for name, model in list(models.items()):
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
509 # FIXME: not sure this is going to work superwell with utf8
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
510 if model.filename == filename:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
511 model.offsets[0] = x + self.build_dimensions[3]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
512 model.offsets[1] = y + self.build_dimensions[4]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
513 model.rot = rot
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
514 del models[name]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
515 break
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
516 if p.wait() != 0:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
517 raise RuntimeError(_("simarrange failed"))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
518
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
519 StlPlater = make_plater(StlPlaterPanel)

mercurial