From: daid303 Date: Fri, 12 Apr 2013 07:22:06 +0000 (+0200) Subject: Add object duplication. X-Git-Tag: 13.05~111 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=44c296629a67b4b82356570f86672a72765e4acb;p=cura.git Add object duplication. --- diff --git a/Cura/gui/sceneView.py b/Cura/gui/sceneView.py index 878e5ee3..3241fc0e 100644 --- a/Cura/gui/sceneView.py +++ b/Cura/gui/sceneView.py @@ -209,6 +209,13 @@ class SceneView(openglGui.glGuiPanel): self.updateProfileToControls() self.sceneUpdated() + def OnDuplicateObject(self, e): + if self._selectedObj is None: + return + self._scene.add(self._selectedObj.copy()) + self._scene.centerAll() + self.sceneUpdated() + def OnMergeObjects(self, e): if self._selectedObj is None or self._focusObj is None or self._selectedObj == self._focusObj: return @@ -247,7 +254,7 @@ class SceneView(openglGui.glGuiPanel): self._focusObj = None self._scene.remove(obj) for m in obj._meshList: - if m.vbo is not None: + if m.vbo is not None and m.vbo.decRef(): self.glReleaseList.append(m.vbo) if self._isSimpleMode: self._scene.arrangeAll() @@ -339,11 +346,10 @@ class SceneView(openglGui.glGuiPanel): self.Refresh() if e.GetButton() == 3: if self._selectedObj == self._focusObj: - #menu = wx.Menu() - #menu.Append(-1, 'Test') - #self.PopupMenu(menu) - #menu.Destroy() - pass + menu = wx.Menu() + self.Bind(wx.EVT_MENU, self.OnDuplicateObject, menu.Append(-1, 'Duplicate')) + self.PopupMenu(menu) + menu.Destroy() if self._selectedObj != self._focusObj and self._focusObj is not None: menu = wx.Menu() self.Bind(wx.EVT_MENU, self.OnMergeObjects, menu.Append(-1, 'Merge')) diff --git a/Cura/gui/util/opengl.py b/Cura/gui/util/opengl.py index 6e7d3065..e0f78796 100644 --- a/Cura/gui/util/opengl.py +++ b/Cura/gui/util/opengl.py @@ -22,8 +22,20 @@ glutInit() platformMesh = None -class GLShader(object): +class GLReferenceCounter(object): + def __init__(self): + self._refCounter = 1 + + def incRef(self): + self._refCounter += 1 + + def decRef(self): + self._refCounter -= 1 + return self._refCounter <= 0 + +class GLShader(GLReferenceCounter): def __init__(self, vertexProgram, fragmentProgram): + super(GLShader, self).__init__() self._vertexString = vertexProgram self._fragmentString = fragmentProgram try: @@ -65,8 +77,9 @@ class GLShader(object): if self._program is not None and bool(glDeleteProgram): print "Shader was not properly released!" -class GLVBO(object): +class GLVBO(GLReferenceCounter): def __init__(self, vertexArray, normalArray): + super(GLVBO, self).__init__() self._buffer = glGenBuffers(1) self._size = len(vertexArray) glBindBuffer(GL_ARRAY_BUFFER, self._buffer) diff --git a/Cura/util/mesh.py b/Cura/util/mesh.py index f4d988d5..ce75c803 100644 --- a/Cura/util/mesh.py +++ b/Cura/util/mesh.py @@ -15,7 +15,23 @@ class printableObject(object): self._matrix = numpy.matrix([[1,0,0],[0,1,0],[0,0,1]], numpy.float64) self._transformedMin = None self._transformedMax = None + self._transformedSize = None self._boundaryCircleSize = None + self._drawOffset = None + self._loadAnim = None + + def copy(self): + ret = printableObject() + ret._matrix = self._matrix.copy() + ret._meshList = self._meshList[:] + ret._transformedMin = self._transformedMin + ret._transformedMax = self._transformedMin + ret._transformedSize = self._transformedSize + ret._boundaryCircleSize = self._boundaryCircleSize + ret._drawOffset = self._drawOffset + for m in ret._meshList: + m.vbo.incRef() + return ret def _addMesh(self): m = mesh()