def centerOnObject(self, *args): selectedObject = modelController.getSelectedObject() if selectedObject.hasNodepath(): pos = selectedObject.getNodepath().getPos(render) else: pos = selectedObject.getParentNodepath().getPos(render) cameraController.setPivotPos(pos)
def centerOnObject(self, *args): selectedObject = modelController.getSelectedObject() if selectedObject.hasNodepath(): pos = selectedObject.getNodepath().getPos(render) else: pos = selectedObject.getParentNodepath().getPos(render) cameraController.setPivotPos(pos)
def duplicateModelWrapper(self): originalModel = modelController.getSelectedObject() objectInstance = originalModel.duplicate(originalModel) if objectInstance is not None: objectInstance.setEditmodeEnabled() #objectInstance.loadFromData( originalModel.getSaveData('.') ) messenger.send(EVENT_SCENEGRAPH_REFRESH) modelController.selectObject(objectInstance)
def duplicateModelWrapper(self): originalModel = modelController.getSelectedObject() objectInstance = originalModel.duplicate(originalModel) if objectInstance is not None: objectInstance.setEditmodeEnabled() #objectInstance.loadFromData( originalModel.getSaveData('.') ) messenger.send( EVENT_SCENEGRAPH_REFRESH ) modelController.selectObject( objectInstance )
def createEggWrapper(self, type): # create the actual wrapper of the object module = __import__("core.modules.pNodePathWrapper.p%s" % type, globals(), locals(), [type], -1) modelParent = modelController.getSelectedObject() objectInstance = getattr(module, type).onCreateInstance(modelParent) if objectInstance is not None: objectInstance.setEditmodeEnabled() messenger.send(EVENT_SCENEGRAPH_REFRESH) modelController.selectObject(objectInstance)
def createEggWrapper(self, type): # create the actual wrapper of the object module = __import__("core.modules.pNodePathWrapper.p%s" % type, globals(), locals(), [type], -1) modelParent = modelController.getSelectedObject() objectInstance = getattr(module, type).onCreateInstance(modelParent) if objectInstance is not None: objectInstance.setEditmodeEnabled() messenger.send(EVENT_SCENEGRAPH_REFRESH) modelController.selectObject(objectInstance)
def onCreateFilebrowserModelWrapper(self, objectType, filepath): if filepath != None and filepath != '' and filepath != ' ': filepath = Filename.fromOsSpecific(filepath).getFullpath() modelParent = modelController.getSelectedObject() module = __import__("core.modules.p%s" % objectType, globals(), locals(), [objectType], -1) objectInstance = getattr(module, objectType).onCreateInstance(modelParent, filepath) if objectInstance is not None: objectInstance.setEditmodeEnabled() messenger.send(EVENT_SCENEGRAPH_REFRESH) modelController.selectObject(objectInstance)
def onCreateObject(self, e): """Invoked when the user hits one of the buttons in the "Create" menu.""" modelParent = modelController.getSelectedObject() if modelParent == None: modelParent = render objectInstance = None if e.Id == ID_NODEPATH: objectInstance = NodePathWrapper.onCreateInstance(modelParent) elif e.Id == ID_MODEL: filter = "Panda3D Egg Format (*.egg)|*.[eE][gG][gG];*.egg" filter += "|Panda3D Binary Format (*.bam)|*.[bB][aA][mM];*.bam" filter += "|MultiGen (*.flt)|*.[fF][lL][tT];*.flt" filter += "|Lightwave (*.lwo)|*.[lL][wW][oO];*.lwo" filter += "|AutoCAD (*.dxf)|*.[dD][xX][fF];*.dxf" filter += "|VRML (*.wrl)|*.[wW][rR][lL];*.wrl" filter += "|DirectX (*.x)|*.[xX];*.x" filter += "|COLLADA (*.dae)|*.[dD][aA][eE];*.dae" dlg = wx.FileDialog(self, "Select model", "", "", filter, wx.OPEN) try: if dlg.ShowModal() == wx.ID_OK: objectInstance = NodePathWrapper.onCreateInstance( modelParent, Filename.fromOsSpecific(dlg.GetPath()).getFullpath()) finally: dlg.Destroy() elif e.Id == ID_TERRAIN: filter = "Portable Network Graphics (*.png)|*.[pP][nN][gG];*.png" dlg = wx.FileDialog(self, "Select heightfield", "", "", filter, wx.OPEN) try: if dlg.ShowModal() == wx.ID_OK: objectInstance = GeoMipTerrainNodeWrapper.onCreateInstance( modelParent, Filename.fromOsSpecific(dlg.GetPath()).getFullpath()) finally: dlg.Destroy() elif e.Id == ID_AMBIENT: objectInstance = AmbientLightNodeWrapper.onCreateInstance( modelParent) elif e.Id == ID_DIRECTIONAL: objectInstance = DirectionalLightNodeWrapper.onCreateInstance( modelParent) elif e.Id == ID_POINT: objectInstance = PointLightNodeWrapper.onCreateInstance( modelParent) elif e.Id == ID_SPOT: objectInstance = SpotLightNodeWrapper.onCreateInstance(modelParent) if objectInstance != None: objectInstance.reparentTo(modelParent) objectInstance.enableEditmode() modelController.selectObject(objectInstance) messenger.send(EVENT_SCENEGRAPH_REFRESH)
def onCreateFilebrowserModelWrapper(self, objectType, filepath): if filepath != None and filepath != '' and filepath != ' ': filepath = Filename.fromOsSpecific(filepath).getFullpath() modelParent = modelController.getSelectedObject() module = __import__("core.modules.p%s" % objectType, globals(), locals(), [objectType], -1) objectInstance = getattr(module, objectType).onCreateInstance( modelParent, filepath) if objectInstance is not None: objectInstance.setEditmodeEnabled() messenger.send(EVENT_SCENEGRAPH_REFRESH) modelController.selectObject(objectInstance)
def onCreateObject(self, e): """Invoked when the user hits one of the buttons in the "Create" menu.""" modelParent = modelController.getSelectedObject() if modelParent == None: modelParent = render objectInstance = None if e.Id == ID_NODEPATH: objectInstance = NodePathWrapper.onCreateInstance(modelParent) elif e.Id == ID_MODEL: filter = "Panda3D Egg Format (*.egg)|*.[eE][gG][gG];*.egg" filter += "|Panda3D Binary Format (*.bam)|*.[bB][aA][mM];*.bam" filter += "|MultiGen (*.flt)|*.[fF][lL][tT];*.flt" filter += "|Lightwave (*.lwo)|*.[lL][wW][oO];*.lwo" filter += "|AutoCAD (*.dxf)|*.[dD][xX][fF];*.dxf" filter += "|VRML (*.wrl)|*.[wW][rR][lL];*.wrl" filter += "|DirectX (*.x)|*.[xX];*.x" filter += "|COLLADA (*.dae)|*.[dD][aA][eE];*.dae" dlg = wx.FileDialog(self, "Select model", "", "", filter, wx.OPEN) try: if dlg.ShowModal() == wx.ID_OK: objectInstance = NodePathWrapper.onCreateInstance(modelParent, Filename.fromOsSpecific(dlg.GetPath()).getFullpath()) finally: dlg.Destroy() elif e.Id == ID_TERRAIN: filter = "Portable Network Graphics (*.png)|*.[pP][nN][gG];*.png" dlg = wx.FileDialog(self, "Select heightfield", "", "", filter, wx.OPEN) try: if dlg.ShowModal() == wx.ID_OK: objectInstance = GeoMipTerrainNodeWrapper.onCreateInstance(modelParent, Filename.fromOsSpecific(dlg.GetPath()).getFullpath()) finally: dlg.Destroy() elif e.Id == ID_AMBIENT: objectInstance = AmbientLightNodeWrapper.onCreateInstance(modelParent) elif e.Id == ID_DIRECTIONAL: objectInstance = DirectionalLightNodeWrapper.onCreateInstance(modelParent) elif e.Id == ID_POINT: objectInstance = PointLightNodeWrapper.onCreateInstance(modelParent) elif e.Id == ID_SPOT: objectInstance = SpotLightNodeWrapper.onCreateInstance(modelParent) if objectInstance != None: objectInstance.reparentTo(modelParent) objectInstance.enableEditmode() modelController.selectObject(objectInstance) messenger.send(EVENT_SCENEGRAPH_REFRESH)
def destroyModel(self): selectedObject = modelController.getSelectedObject() if selectedObject is not None: if selectedObject == self.treeParent: print "W: core.EditorClass: should not destroy root object" return modelController.selectObject(None) MEMLEAK_CHECK = False if MEMLEAK_CHECK: tmp = [selectedObject] # delete recursively for object in selectedObject.getRecChildren(): if MEMLEAK_CHECK: tmp.append(object) object.destroy() del object selectedObject.destroy() del selectedObject # refresh the scenegraphbrowser messenger.send(EVENT_SCENEGRAPH_REFRESH) if MEMLEAK_CHECK: import gc gc.collect() gc.collect() for t in tmp: print "W: EditorClass.destroyModel: MEMLEAK_CHECK" print " - type: ", t.__class__.__name__ print " - instance: ", t print " - num references:", len(gc.get_referrers(t)) for ref in gc.get_referrers(t): print " -", ref
def destroyModel(self): selectedObject = modelController.getSelectedObject() if selectedObject is not None: if selectedObject == self.treeParent: print "W: core.EditorClass: should not destroy root object" return modelController.selectObject(None) MEMLEAK_CHECK = False if MEMLEAK_CHECK: tmp = [selectedObject] # delete recursively for object in selectedObject.getRecChildren(): if MEMLEAK_CHECK: tmp.append(object) object.destroy() del object selectedObject.destroy() del selectedObject # refresh the scenegraphbrowser messenger.send(EVENT_SCENEGRAPH_REFRESH) if MEMLEAK_CHECK: import gc gc.collect() gc.collect() for t in tmp: print "W: EditorClass.destroyModel: MEMLEAK_CHECK" print " - type: ", t.__class__.__name__ print " - instance: ", t print " - num references:", len(gc.get_referrers(t)) for ref in gc.get_referrers(t): print " -", ref
def modelSelected(self, model): ''' is called when a object is selected creates a corresponding editing sidebar for the object ''' if self.lastSelectedObject != modelController.getSelectedObject(): # selected model has been changed if self.editorObjectGuiInstance is not None: # destroy gui instance of old object self.editorObjectGuiInstance.stopEdit() # save the object as the new object self.lastSelectedObject = modelController.getSelectedObject() if modelController.getSelectedObject() is not None: # update menubar for object self.menuBarGui.update() # create gui instance of new object objType = modelController.getSelectedObject().__class__ # the codenode inherits from the real class we use... # but we need the name of the internal class, bases = list() for base in objType.__bases__: bases.append(base.__name__) if 'CodeNodeWrapper' in bases: objType = 'CodeNodeWrapper' else: objType = objType.__name__ module = __import__("dgui.modules.p%s" % objType, globals(), locals(), [objType], -1) try: self.editorObjectGuiInstance = getattr(module, objType)( modelController.getSelectedObject(), self) self.editorObjectGuiInstance.startEdit() except TypeError: print "E: dgui.EditorApp.modelSelected: object", objType, modelController.getSelectedObject( ) traceback.print_exc() else: self.editorObjectGuiInstance = None else: # the same object is selected again pass
def modelSelected(self, model): ''' is called when a object is selected creates a corresponding editing sidebar for the object ''' if self.lastSelectedObject != modelController.getSelectedObject(): # selected model has been changed if self.editorObjectGuiInstance is not None: # destroy gui instance of old object self.editorObjectGuiInstance.stopEdit() # save the object as the new object self.lastSelectedObject = modelController.getSelectedObject() if modelController.getSelectedObject() is not None: # update menubar for object self.menuBarGui.update() # create gui instance of new object objType = modelController.getSelectedObject().__class__ # the codenode inherits from the real class we use... # but we need the name of the internal class, bases = list() for base in objType.__bases__: bases.append(base.__name__) if 'CodeNodeWrapper' in bases: objType = 'CodeNodeWrapper' else: objType = objType.__name__ module = __import__("dgui.modules.p%s" % objType, globals(), locals(), [objType], -1) try: self.editorObjectGuiInstance = getattr(module, objType)(modelController.getSelectedObject(), self) self.editorObjectGuiInstance.startEdit() except TypeError: print "E: dgui.EditorApp.modelSelected: object", objType, modelController.getSelectedObject() traceback.print_exc() else: self.editorObjectGuiInstance = None else: # the same object is selected again pass
def create(self): selectedObject = modelController.getSelectedObject() possibleChildren = selectedObject.getPossibleChildren() possibleFunctions = selectedObject.getPossibleFunctions() nodeButtonDefinitions = list() if 'NodePathWrapper' in possibleChildren: nodeButtonDefinitions.append([ 'model', self.createFilebrowserModelWrapper, ['NodePathWrapper'] ]) if 'ParticleSystemWrapper' in possibleChildren: nodeButtonDefinitions.append([ 'particlesystem', self.createFilebrowserModelWrapper, ['ParticleSystemWrapper'] ]) if 'CodeNodeWrapper' in possibleChildren: nodeButtonDefinitions.append([ 'codeNode', self.createFilebrowserModelWrapper, ['CodeNodeWrapper'] ]) if 'GeoMipTerrainNodeWrapper' in possibleChildren: nodeButtonDefinitions.append([ 'GeoMipTerrain', self.createFilebrowserModelWrapper, ['GeoMipTerrainNodeWrapper'] ]) if 'SoundNodeWrapper' in possibleChildren: nodeButtonDefinitions.append([ 'sound', self.createFilebrowserModelWrapper, ['SoundNodeWrapper'] ]) if 'SceneNodeWrapper' in possibleChildren: nodeButtonDefinitions.append([ 'scene', self.createFilebrowserModelWrapper, ['SceneNodeWrapper'] ]) if 'ShaderWrapper' in possibleChildren: nodeButtonDefinitions.append( ['paintshader', self.createModelWrapper, ['ShaderWrapper']]) if 'CurveNodeWrapper' in possibleChildren: nodeButtonDefinitions.append( ['curve', self.createModelWrapper, ['CurveNodeWrapper']]) if 'CurveSurfaceNodeWrapper' in possibleChildren: nodeButtonDefinitions.append([ 'surfaceCurve', self.createModelWrapper, ['CurveSurfaceNodeWrapper'] ]) if 'AnimatedTextureWrapper' in possibleChildren: nodeButtonDefinitions.append([ 'animated texture', self.createModelWrapper, ['AnimatedTextureWrapper'] ]) if 'ObjectEggGroup' in possibleChildren: nodeButtonDefinitions.append( ['Egg Group', self.createEggWrapper, ['ObjectEggGroup']]) if 'ObjectEggGroup' in possibleChildren: nodeButtonDefinitions.append( ['Egg Polygon', self.createEggWrapper, ['ObjectEggPolygon']]) if 'ObjectEggGroup' in possibleChildren: nodeButtonDefinitions.append( ['Egg Texture', self.createEggWrapper, ['ObjectEggTexture']]) if 'ObjectEggGroup' in possibleChildren: nodeButtonDefinitions.append([ 'Egg VertexPool', self.createEggWrapper, ['ObjectEggVertexPool'] ]) self.nodeButtons = self.createInterface(nodeButtonDefinitions, 'nodes', align=ALIGN_RIGHT | ALIGN_TOP, pos=Vec3(-.85, 0, 0)) lightButtonDefinitions = list() if 'SpotLightNodeWrapper' in possibleChildren: lightButtonDefinitions.append([ 'spotlight', self.createModelWrapper, ['SpotLightNodeWrapper'] ]) if 'DirectionalLightNodeWrapper' in possibleChildren: lightButtonDefinitions.append([ 'directionallight', self.createModelWrapper, ['DirectionalLightNodeWrapper'] ]) if 'AmbientLightNodeWrapper' in possibleChildren: lightButtonDefinitions.append([ 'ambientlight', self.createModelWrapper, ['AmbientLightNodeWrapper'] ]) if 'PointLightNodeWrapper' in possibleChildren: lightButtonDefinitions.append([ 'pointlight', self.createModelWrapper, ['PointLightNodeWrapper'] ]) self.lightButtons = self.createInterface(lightButtonDefinitions, 'lights', align=ALIGN_RIGHT | ALIGN_TOP, pos=Vec3(-.45, 0, 0)) editButtonDefinitions = list() if 'destroy' in possibleFunctions: editButtonDefinitions.append([ 'destroy', self.guiEditorInstance.editorInstance.destroyModel, [] ]) if 'revert' in possibleFunctions: editButtonDefinitions.append(['revert', selectedObject.revert, []]) if 'duplicate' in possibleFunctions: editButtonDefinitions.append( ['duplicate', self.duplicateModelWrapper, []]) if 'save' in possibleFunctions: editButtonDefinitions.append(['save', selectedObject.save, []]) if 'saveAs' in possibleFunctions: editButtonDefinitions.append( ['saveAs', self.saveAsFile, [selectedObject]]) self.editButtons = self.createInterface(editButtonDefinitions, 'edit' + selectedObject.className, align=ALIGN_RIGHT | ALIGN_TOP, pos=Vec3(-.05, 0, 0))
def create(self): selectedObject = modelController.getSelectedObject() possibleChildren = selectedObject.getPossibleChildren() possibleFunctions = selectedObject.getPossibleFunctions() nodeButtonDefinitions = list() if 'NodePathWrapper' in possibleChildren: nodeButtonDefinitions.append( ['model', self.createFilebrowserModelWrapper, ['NodePathWrapper']] ) if 'ParticleSystemWrapper' in possibleChildren: nodeButtonDefinitions.append( ['particlesystem', self.createFilebrowserModelWrapper, ['ParticleSystemWrapper']] ) if 'CodeNodeWrapper' in possibleChildren: nodeButtonDefinitions.append( ['codeNode', self.createFilebrowserModelWrapper, ['CodeNodeWrapper']] ) if 'GeoMipTerrainNodeWrapper' in possibleChildren: nodeButtonDefinitions.append( ['GeoMipTerrain', self.createFilebrowserModelWrapper, ['GeoMipTerrainNodeWrapper']] ) if 'SoundNodeWrapper' in possibleChildren: nodeButtonDefinitions.append( ['sound', self.createFilebrowserModelWrapper, ['SoundNodeWrapper']] ) if 'SceneNodeWrapper' in possibleChildren: nodeButtonDefinitions.append( ['scene', self.createFilebrowserModelWrapper, ['SceneNodeWrapper']] ) if 'ShaderWrapper' in possibleChildren: nodeButtonDefinitions.append( ['paintshader', self.createModelWrapper, ['ShaderWrapper']] ) if 'CurveNodeWrapper' in possibleChildren: nodeButtonDefinitions.append( ['curve', self.createModelWrapper, ['CurveNodeWrapper']] ) if 'CurveSurfaceNodeWrapper' in possibleChildren: nodeButtonDefinitions.append( ['surfaceCurve', self.createModelWrapper, ['CurveSurfaceNodeWrapper']] ) if 'AnimatedTextureWrapper' in possibleChildren: nodeButtonDefinitions.append( ['animated texture', self.createModelWrapper, ['AnimatedTextureWrapper']] ) if 'ObjectEggGroup' in possibleChildren: nodeButtonDefinitions.append( ['Egg Group', self.createEggWrapper, ['ObjectEggGroup']] ) if 'ObjectEggGroup' in possibleChildren: nodeButtonDefinitions.append( ['Egg Polygon', self.createEggWrapper, ['ObjectEggPolygon']] ) if 'ObjectEggGroup' in possibleChildren: nodeButtonDefinitions.append( ['Egg Texture', self.createEggWrapper, ['ObjectEggTexture']] ) if 'ObjectEggGroup' in possibleChildren: nodeButtonDefinitions.append( ['Egg VertexPool', self.createEggWrapper, ['ObjectEggVertexPool']] ) self.nodeButtons = self.createInterface(nodeButtonDefinitions, 'nodes', align=ALIGN_RIGHT|ALIGN_TOP, pos=Vec3(-.85,0,0)) lightButtonDefinitions = list() if 'SpotLightNodeWrapper' in possibleChildren: lightButtonDefinitions.append( ['spotlight', self.createModelWrapper, ['SpotLightNodeWrapper']] ) if 'DirectionalLightNodeWrapper' in possibleChildren: lightButtonDefinitions.append( ['directionallight', self.createModelWrapper, ['DirectionalLightNodeWrapper']] ) if 'AmbientLightNodeWrapper' in possibleChildren: lightButtonDefinitions.append( ['ambientlight', self.createModelWrapper, ['AmbientLightNodeWrapper']] ) if 'PointLightNodeWrapper' in possibleChildren: lightButtonDefinitions.append( ['pointlight', self.createModelWrapper, ['PointLightNodeWrapper']] ) self.lightButtons = self.createInterface(lightButtonDefinitions, 'lights', align=ALIGN_RIGHT|ALIGN_TOP, pos=Vec3(-.45,0,0)) editButtonDefinitions = list() if 'destroy' in possibleFunctions: editButtonDefinitions.append( ['destroy', self.guiEditorInstance.editorInstance.destroyModel, []] ) if 'revert' in possibleFunctions: editButtonDefinitions.append( ['revert', selectedObject.revert, []] ) if 'duplicate' in possibleFunctions: editButtonDefinitions.append( ['duplicate', self.duplicateModelWrapper, []] ) if 'save' in possibleFunctions: editButtonDefinitions.append( ['save', selectedObject.save, []] ) if 'saveAs' in possibleFunctions: editButtonDefinitions.append( ['saveAs', self.saveAsFile, [selectedObject]] ) self.editButtons = self.createInterface(editButtonDefinitions, 'edit'+selectedObject.className, align=ALIGN_RIGHT|ALIGN_TOP, pos=Vec3(-.05,0,0))
def viewForSelection(self): """Similar to viewForNodePath, but this uses the currently selected model.""" return self.viewForNodePath(modelController.getSelectedObject())
def viewForSelection(self): """Similar to viewForNodePath, but this uses the currently selected model.""" return self.viewForNodePath(modelController.getSelectedObject())