From 58f54990e12c28c5dbd4551f5b21f160fc581047 Mon Sep 17 00:00:00 2001 From: daid303 Date: Fri, 5 Apr 2013 17:24:51 +0200 Subject: [PATCH] bunch of small things. --- Cura/gui/sceneView.py | 36 ++++++++++++++++++++++++++---------- Cura/util/mesh.py | 6 ++++++ Cura/util/objectScene.py | 12 +++++++++++- Cura/util/sliceEngine.py | 16 ++++++++++++---- 4 files changed, 55 insertions(+), 15 deletions(-) diff --git a/Cura/gui/sceneView.py b/Cura/gui/sceneView.py index d57e2257..313c3b0c 100644 --- a/Cura/gui/sceneView.py +++ b/Cura/gui/sceneView.py @@ -63,7 +63,7 @@ class SceneView(openglGui.glGuiPanel): self._animView = None self._animZoom = None self._platformMesh = meshLoader.loadMeshes(resources.getPathForMesh('ultimaker_platform.stl'))[0] - self._platformMesh._drawOffset = numpy.array([0,0,0.5], numpy.float32) + self._platformMesh._drawOffset = numpy.array([0,0,1.5], numpy.float32) self._isSimpleMode = True self._viewport = None @@ -255,6 +255,14 @@ class SceneView(openglGui.glGuiPanel): def _selectObject(self, obj, zoom = True): if obj != self._selectedObj: self._selectedObj = obj + scale = self._selectedObj.getScale() + size = self._selectedObj.getSize() + self.scaleXctrl.setValue(round(scale[0], 2)) + self.scaleYctrl.setValue(round(scale[1], 2)) + self.scaleZctrl.setValue(round(scale[2], 2)) + self.scaleXmmctrl.setValue(round(size[0], 2)) + self.scaleYmmctrl.setValue(round(size[1], 2)) + self.scaleZmmctrl.setValue(round(size[2], 2)) if zoom: newViewPos = numpy.array([obj.getPosition()[0], obj.getPosition()[1], obj.getMaximum()[2] / 2]) self._animView = anim(self._viewTarget.copy(), newViewPos, 0.5) @@ -448,7 +456,6 @@ class SceneView(openglGui.glGuiPanel): self._animZoom = None if self._objectShader is None: self._objectShader = opengl.GLShader(""" -uniform float cameraDistance; varying float light_amount; void main(void) @@ -457,11 +464,9 @@ void main(void) gl_FrontColor = gl_Color; light_amount = abs(dot(normalize(gl_NormalMatrix * gl_Normal), normalize(gl_LightSource[0].position.xyz))); - light_amount *= 1.0 - (length(gl_Position.xyz - vec3(0.0,0.0,cameraDistance)) / 1.5 / cameraDistance); light_amount += 0.2; } """,""" -uniform float cameraDistance; varying float light_amount; void main(void) @@ -470,7 +475,6 @@ void main(void) } """) self._objectLoadShader = opengl.GLShader(""" -uniform float cameraDistance; uniform float intensity; uniform float scale; varying float light_amount; @@ -484,11 +488,9 @@ void main(void) gl_FrontColor = gl_Color; light_amount = abs(dot(normalize(gl_NormalMatrix * gl_Normal), normalize(gl_LightSource[0].position.xyz))); - light_amount *= 1.0 - (length(gl_Position.xyz - vec3(0.0,0.0,cameraDistance)) / 1.5 / cameraDistance); light_amount += 0.2; } """,""" -uniform float cameraDistance; uniform float intensity; varying float light_amount; @@ -534,7 +536,6 @@ void main(void) glStencilFunc(GL_ALWAYS, 1, 1) glStencilOp(GL_INCR, GL_INCR, GL_INCR) self._objectShader.bind() - self._objectShader.setUniform('cameraDistance', self._zoom) for obj in self._scene.objects(): if obj._loadAnim is not None: if obj._loadAnim.isDone(): @@ -558,7 +559,6 @@ void main(void) glDisable(GL_STENCIL_TEST) glEnable(GL_BLEND) self._objectLoadShader.bind() - self._objectLoadShader.setUniform('cameraDistance', self._zoom) glColor4f(0.2, 0.6, 1.0, 1.0) for obj in self._scene.objects(): if obj._loadAnim is None: @@ -571,6 +571,23 @@ void main(void) self._drawMachine() + #Draw the object box-shadow, so you can see where it will collide with other objects. + if self._selectedObj is not None and len(self._scene.objects()) > 1: + size = self._selectedObj.getSize()[0:2] / 2 + self._scene.getObjectExtend() + glPushMatrix() + glTranslatef(self._selectedObj.getPosition()[0], self._selectedObj.getPosition()[1], 0.0) + glEnable(GL_BLEND) + glEnable(GL_CULL_FACE) + glColor4f(0,0,0,0.12) + glBegin(GL_QUADS) + glVertex3f(-size[0], size[1], 0) + glVertex3f(-size[0], -size[1], 0) + glVertex3f( size[0], -size[1], 0) + glVertex3f( size[0], size[1], 0) + glEnd() + glDisable(GL_CULL_FACE) + glPopMatrix() + #Draw the outline of the selected object, on top of everything else except the GUI. if self._selectedObj is not None and self._selectedObj._loadAnim is None: glDisable(GL_DEPTH_TEST) @@ -620,7 +637,6 @@ void main(void) if profile.getPreference('machine_type') == 'ultimaker': glColor4f(1,1,1,0.5) self._objectShader.bind() - self._objectShader.setUniform('cameraDistance', self._zoom) self._renderObject(self._platformMesh) self._objectShader.unbind() diff --git a/Cura/util/mesh.py b/Cura/util/mesh.py index a4922869..9fe24c85 100644 --- a/Cura/util/mesh.py +++ b/Cura/util/mesh.py @@ -78,6 +78,12 @@ class printableObject(object): matrix[axis][axis] = -1 self.applyMatrix(numpy.matrix(matrix, numpy.float64)) + def getScale(self): + return numpy.array([ + numpy.linalg.norm(self._matrix[::,0].getA().flatten()), + numpy.linalg.norm(self._matrix[::,1].getA().flatten()), + numpy.linalg.norm(self._matrix[::,2].getA().flatten())], numpy.float64); + class mesh(object): def __init__(self): self.vertexes = None diff --git a/Cura/util/objectScene.py b/Cura/util/objectScene.py index b469c071..2684bd5b 100644 --- a/Cura/util/objectScene.py +++ b/Cura/util/objectScene.py @@ -17,6 +17,9 @@ class _objectOrderFinder(object): for n in xrange(0, len(self._objs)): if scene.checkPlatform(self._objs[n]): initialList.append(n) + if len(initialList) == 0: + self.order = [] + return self._todo = [_objectOrder([], initialList)] while len(self._todo) > 0: current = self._todo.pop() @@ -26,6 +29,7 @@ class _objectOrderFinder(object): todoList.remove(addIdx) order = current.order[:] + [addIdx] if len(todoList) == 0: + self._todo = None self.order = order return self._todo.append(_objectOrder(order, todoList)) @@ -72,6 +76,9 @@ class Scene(object): def setSizeOffsets(self, sizeOffsets): self._sizeOffsets = sizeOffsets + def getObjectExtend(self): + return self._sizeOffsets + self._headOffsets + def objects(self): return self._objectList @@ -112,7 +119,10 @@ class Scene(object): obj.setPosition(obj.getPosition() + offset) def printOrder(self): - return _objectOrderFinder(self, self._headOffsets + self._sizeOffsets).order + order = _objectOrderFinder(self, self._headOffsets + self._sizeOffsets).order + if order is None: + print "ODD! Cannot find out proper printing order!!!" + return order def _pushFree(self): for a in self._objectList: diff --git a/Cura/util/sliceEngine.py b/Cura/util/sliceEngine.py index c128d684..2589ff2a 100644 --- a/Cura/util/sliceEngine.py +++ b/Cura/util/sliceEngine.py @@ -30,6 +30,7 @@ class Slicer(object): self._binaryStorageFilename = getTempFilename() self._exportFilename = getTempFilename() self._progressSteps = ['inset', 'skin', 'export'] + self._objCount = 0 def abortSlicer(self): if self._process is not None: @@ -74,14 +75,21 @@ class Slicer(object): def _watchProcess(self): self._callback(0.0, False) line = self._process.stdout.readline() + objectNr = 0 while len(line): line = line.strip() if line.startswith('Progress:'): line = line.split(':') - progressValue = float(line[2]) / float(line[3]) - progressValue /= len(self._progressSteps) - progressValue += 1.0 / len(self._progressSteps) * self._progressSteps.index(line[1]) - self._callback(progressValue, False) + if line[1] == 'process': + objectNr += 1 + else: + progressValue = float(line[2]) / float(line[3]) + progressValue /= len(self._progressSteps) + progressValue += 1.0 / len(self._progressSteps) * self._progressSteps.index(line[1]) + + progressValue /= self._objCount + progressValue += 1.0 / self._objCount * objectNr + self._callback(progressValue, False) else: print '#', line.strip() line = self._process.stdout.readline() -- 2.30.2