self.Bind(wx.EVT_TIMER, self.OnCheckReloadFile, self.checkReloadFileTimer)
self.checkReloadFileTimer.Start(1000)
- self.rotateToolButton = openglGui.glButton(self.glCanvas, 1, 'Rotate', (0,1), self.OnRotateSelect)
- self.scaleToolButton = openglGui.glButton(self.glCanvas, 2, 'Scale', (0,2), self.OnScaleSelect)
+ group = []
+ self.rotateToolButton = openglGui.glRadioButton(self.glCanvas, 1, 'Rotate', (0,1), group, self.OnToolSelect)
+ self.scaleToolButton = openglGui.glRadioButton(self.glCanvas, 2, 'Scale', (0,2), group, self.OnToolSelect)
+ self.mirrorToolButton = openglGui.glRadioButton(self.glCanvas, 12, 'Mirror', (0,3), group, self.OnToolSelect)
self.resetRotationButton = openglGui.glButton(self.glCanvas, 4, 'Reset rotation', (1,1), self.OnRotateReset)
self.layFlatButton = openglGui.glButton(self.glCanvas, 5, 'Lay flat', (1,2), self.OnLayFlat)
self.resetScaleButton = openglGui.glButton(self.glCanvas, 8, 'Scale reset', (1,1), self.OnScaleReset)
self.scaleMaxButton = openglGui.glButton(self.glCanvas, 9, 'Scale to machine size', (1,2), self.OnScaleMax)
+ self.mirrorXButton = openglGui.glButton(self.glCanvas, 12, 'Mirror X', (1,1), lambda : self.OnMirror(0))
+ self.mirrorYButton = openglGui.glButton(self.glCanvas, 13, 'Mirror Y', (1,2), lambda : self.OnMirror(1))
+ self.mirrorZButton = openglGui.glButton(self.glCanvas, 14, 'Mirror Z', (1,3), lambda : self.OnMirror(2))
+
self.openFileButton = openglGui.glButton(self.glCanvas, 3, 'Load model', (0,0), lambda : self.GetParent().GetParent().GetParent()._showModelLoadDialog(1))
self.sliceButton = openglGui.glButton(self.glCanvas, 6, 'Prepare model', (0,-2), lambda : self.GetParent().GetParent().GetParent().OnSlice(None))
self.printButton = openglGui.glButton(self.glCanvas, 7, 'Print model', (0,-1), lambda : self.GetParent().GetParent().GetParent().OnPrint(None))
self.scaleZmmctrl = openglGui.glNumberCtrl(self.scaleForm, '0.0', (1,6), lambda value: self.OnScaleEntryMM(value, 2))
openglGui.glLabel(self.scaleForm, 'Uniform scale', (0,8))
self.scaleUniform = openglGui.glCheckbox(self.scaleForm, True, (1,8), None)
- self.scaleForm.setHidden(True)
self.OnViewChange()
+ self.OnToolSelect()
self.returnToModelViewAndUpdateModel()
self.matrix = numpy.matrix(numpy.array(profile.getObjectMatrix(), numpy.float64).reshape((3,3,)))
- self.tool = previewTools.toolNone(self.glCanvas)
def returnToModelViewAndUpdateModel(self):
if self.glCanvas.viewMode == 'GCode' or self.glCanvas.viewMode == 'Mixed':
self.setViewMode('Normal')
- self.resetRotationButton.setHidden(not self.rotateToolButton.getSelected())
- self.layFlatButton.setHidden(not self.rotateToolButton.getSelected())
- self.resetScaleButton.setHidden(not self.scaleToolButton.getSelected())
- self.scaleMaxButton.setHidden(not self.scaleToolButton.getSelected())
- self.scaleForm.setHidden(not self.scaleToolButton.getSelected())
self.updateModelTransform()
- def OnRotateSelect(self):
+ def OnToolSelect(self):
if self.rotateToolButton.getSelected():
- self.rotateToolButton.setSelected(False)
- self.tool = previewTools.toolNone(self.glCanvas)
- else:
- self.rotateToolButton.setSelected(True)
self.tool = previewTools.toolRotate(self.glCanvas)
- self.scaleToolButton.setSelected(False)
- self.returnToModelViewAndUpdateModel()
-
- def OnScaleSelect(self):
- self.rotateToolButton.setSelected(False)
- if self.scaleToolButton.getSelected():
- self.scaleToolButton.setSelected(False)
+ elif self.scaleToolButton.getSelected():
+ self.tool = previewTools.toolScale(self.glCanvas)
+ elif self.mirrorToolButton.getSelected():
self.tool = previewTools.toolNone(self.glCanvas)
else:
- self.scaleToolButton.setSelected(True)
- self.tool = previewTools.toolScale(self.glCanvas)
+ self.tool = previewTools.toolNone(self.glCanvas)
+ self.resetRotationButton.setHidden(not self.rotateToolButton.getSelected())
+ self.layFlatButton.setHidden(not self.rotateToolButton.getSelected())
+ self.resetScaleButton.setHidden(not self.scaleToolButton.getSelected())
+ self.scaleMaxButton.setHidden(not self.scaleToolButton.getSelected())
+ self.scaleForm.setHidden(not self.scaleToolButton.getSelected())
+ self.mirrorXButton.setHidden(not self.mirrorToolButton.getSelected())
+ self.mirrorYButton.setHidden(not self.mirrorToolButton.getSelected())
+ self.mirrorZButton.setHidden(not self.mirrorToolButton.getSelected())
self.returnToModelViewAndUpdateModel()
def OnScaleEntry(self, value, axis):
self.matrix *= numpy.matrix(matrix, numpy.float64)
self.updateModelTransform()
+ def OnMirror(self, axis):
+ matrix = [[1,0,0], [0, 1, 0], [0, 0, 1]]
+ matrix[axis][axis] = -1
+ self.matrix *= numpy.matrix(matrix, numpy.float64)
+ for obj in self.objectList:
+ obj.dirty = True
+ obj.steepDirty = True
+ self.updateModelTransform()
+
def OnMove(self, e = None):
if e is not None:
e.Skip()
if obj.dirty:
obj.dirty = False
glNewList(obj.displayList, GL_COMPILE)
- opengl.DrawMesh(obj.mesh)
+ opengl.DrawMesh(obj.mesh, numpy.linalg.det(obj.mesh.matrix) < 0)
glEndList()
glNewList(obj.outlineDisplayList, GL_COMPILE)
opengl.DrawMeshOutline(obj.mesh)
glDisableClientState(GL_VERTEX_ARRAY)
-def DrawMesh(mesh):
+def DrawMesh(mesh, insideOut = False):
glEnable(GL_CULL_FACE)
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)
- glNormalPointer(GL_FLOAT, 0, mesh.normal)
+ if insideOut:
+ glNormalPointer(GL_FLOAT, 0, mesh.invNormal)
+ else:
+ glNormalPointer(GL_FLOAT, 0, mesh.normal)
#Odd, drawing in batchs is a LOT faster then drawing it all at once.
batchSize = 999 #Warning, batchSize needs to be dividable by 3
glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)
glCullFace(GL_FRONT)
- glNormalPointer(GL_FLOAT, 0, mesh.invNormal)
+ if insideOut:
+ glNormalPointer(GL_FLOAT, 0, mesh.normal)
+ else:
+ glNormalPointer(GL_FLOAT, 0, mesh.invNormal)
for i in xrange(0, int(mesh.vertexCount / batchSize)):
glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)
extraStartPos = int(mesh.vertexCount / batchSize) * batchSize