diff --git a/direct/src/directutil/DirectSession.py b/direct/src/directutil/DirectSession.py index 7cbac736ac..22dcd3b6a1 100644 --- a/direct/src/directutil/DirectSession.py +++ b/direct/src/directutil/DirectSession.py @@ -65,24 +65,22 @@ class DirectSession(PandaObject): def select(self, nodePath): dnp = self.selected.select(nodePath) if dnp: + messenger.send('preSelectNodePath', [dnp]) # Update the readout self.readout.reparentTo(render2d) self.readout.setText(dnp.name) # Show the manipulation widget self.widget.reparentTo(render) - # Update camera controls coa to this point # Coa2Camera = Coa2Dnp * Dnp2Camera mCoa2Camera = dnp.mCoa2Dnp * dnp.getMat(base.camera) row = mCoa2Camera.getRow(3) coa = Vec3(row[0], row[1], row[2]) self.cameraControl.updateCoa(coa) - # Adjust widgets size # This uses the additional scaling factor used to grow and # shrink the widget self.widget.setScalingFactor(dnp.getRadius()) - # Spawn task to have object handles follow the selected object taskMgr.removeTasksNamed('followSelectedNodePath') t = Task.Task(self.followSelectedNodePathTask) diff --git a/direct/src/extensions/NodePath-extensions.py b/direct/src/extensions/NodePath-extensions.py index 5db7285ca2..202119e9d2 100644 --- a/direct/src/extensions/NodePath-extensions.py +++ b/direct/src/extensions/NodePath-extensions.py @@ -79,7 +79,7 @@ def getAncestry(self): from PandaObject import * node = self.node() - if ((node != render.node()) | (node != hidden.node())): + if (self.hasParent()): ancestry = self.getParent().getAncestry() ancestry.append(self) return ancestry diff --git a/direct/src/leveleditor/LevelEditor.py b/direct/src/leveleditor/LevelEditor.py index 328fcb56e9..413535ba04 100644 --- a/direct/src/leveleditor/LevelEditor.py +++ b/direct/src/leveleditor/LevelEditor.py @@ -373,15 +373,16 @@ class LevelEditor(NodePath, PandaObject): self.grid.ignore('insert') self.ignore('selectedNodePath') self.ignore('preRemoveNodePath') - self.ignore('preSelectNodePath') + #self.ignore('preSelectNodePath') self.ignore('toggleMapViz') - self.ignore('setGroupParent') - self.ignore('isolateNodePath') self.ignore('reparentNodePath') self.ignore('createNewLevelGroup') self.ignore('setNodePathName') self.ignore('manipulateObjectCleanup') self.ignore('SGESelectNodePath') + self.ignore('SGEIsolateNodePath') + self.ignore('SGESet ParentNodePath') + self.ignore('SGEAdd GroupNodePath') self.ignore('showAll') self.ignore('p') self.disableManipulation() @@ -453,15 +454,16 @@ class LevelEditor(NodePath, PandaObject): self.show() self.accept('selectedNodePath', self.selectDNARoot) self.accept('preRemoveNodePath', self.preRemoveNodePath) - self.accept('preSelectNodePath', self.preSelectNodePath) self.accept('toggleMapViz', self.toggleMapViz) - self.accept('setGroupParent', self.setGroupParent) - self.accept('isolateNodePath', self.isolateNodePath) self.accept('reparentNodePath', self.reparentNodePath) self.accept('createNewLevelGroup', self.createNewLevelGroup) self.accept('setNodePathName', self.setNodePathName) self.accept('manipulateObjectCleanup', self.updateSelectedPose) self.accept('SGESelectNodePath', self.selectNodePath) + self.accept('SGESelectNodePath', self.preSelectNodePath) + self.accept('SGEIsolateNodePath', self.isolateNodePath) + self.accept('SGESet ParentNodePath', self.setGroupParent) + self.accept('SGEAdd GroupNodePath', self.addGroupToSelected) self.accept('showAll', self.showAll) self.accept('p',self.plantSelectedNodePath) self.enableManipulation() @@ -699,14 +701,12 @@ class LevelEditor(NodePath, PandaObject): # Otherwise, find its dictionary entry self.selectedLevelObject = ( self.getLevelObject(self.direct.selected.last)) - # If not None, determine interaction type if self.selectedLevelObject: selectedObjectDNA = self.selectedLevelObject['DNA'] # Default target/menu target = None menuType = None - # Interaction type depends on selected object's class objClass = selectedObjectDNA.__class__.getClassType() if objClass.eq(DNAFlatBuilding.getClassType()): @@ -774,7 +774,6 @@ class LevelEditor(NodePath, PandaObject): target = selectedObjectDNA else: target = None - elif objClass.eq(DNALandmarkBuilding.getClassType()): menuType = 'door' target = self.getDoor(selectedObjectDNA) @@ -787,7 +786,6 @@ class LevelEditor(NodePath, PandaObject): target = selectedObjectDNA if self.direct.fControl: menuType = 'propColor' - # Now spawn apropriate menu task if ((target != None) | (menuType == 'cornice')): self.spawnMenuTask(menuType, target) @@ -803,20 +801,21 @@ class LevelEditor(NodePath, PandaObject): t.initState = t.hidden = aNodePath.isHidden() t.count = 0 t.uponDeath = self.preSelectDone - #taskMgr.spawnTaskNamed(t, 'preselectNodePath') + taskMgr.spawnTaskNamed(t, 'preselectNodePath') def preSelectNodePathTask(self, state): aNodePath = state.aNodePath initState = state.initState hidden = state.hidden - count = t.count - if (t.count < 4): - if hidden: - aNodePath.show() - else: - aNodePath.hide() - t.count = count + 1 - t.hidden = not t.hidden + count = state.count + if (state.count < 21): + if (state.count % 5) == 0: + if hidden: + aNodePath.show() + else: + aNodePath.hide() + state.hidden = not state.hidden + state.count = count + 1 return Task.cont else: return Task.done @@ -1740,7 +1739,7 @@ class LevelEditor(NodePath, PandaObject): def addFlatBuilding(self, buildingType): # Create new building - #newDNAFlatBuilding = DNAFlatBuilding(buildingType + '_DNARoot') + newDNAFlatBuilding = DNAFlatBuilding(buildingType + '_DNARoot') newDNAFlatBuilding = DNAFlatBuilding(buildingType) # Select walls @@ -1792,7 +1791,7 @@ class LevelEditor(NodePath, PandaObject): self.addFlatBuilding) def addLandmark(self, landmarkType): - #newDNALandmarkBuilding = DNALandmarkBuilding(landmarkType + '_DNARoot') + newDNALandmarkBuilding = DNALandmarkBuilding(landmarkType + '_DNARoot') newDNALandmarkBuilding = DNALandmarkBuilding(landmarkType) newDNALandmarkBuilding.setCode(self.getDNACode(landmarkType)) newDNALandmarkBuilding.setPos(VBase3(0)) @@ -1811,7 +1810,7 @@ class LevelEditor(NodePath, PandaObject): return objectDictionary def addProp(self, newPropType): - #newDNAProp = DNAProp(newPropType + '_DNARoot') + newDNAProp = DNAProp(newPropType + '_DNARoot') newDNAProp = DNAProp(newPropType) newDNAProp.setCode(self.getDNACode(newPropType)) newDNAProp.setPos(VBase3(0)) @@ -1821,7 +1820,7 @@ class LevelEditor(NodePath, PandaObject): self.setPropType(newPropType) def addStreetModule(self, streetType): - #newDNAStreet = DNAStreet(streetType + '_DNARoot') + newDNAStreet = DNAStreet(streetType + '_DNARoot') newDNAStreet = DNAStreet(streetType) newDNAStreet.setCode(self.getDNACode(streetType)) newDNAStreet.setPos(VBase3(0)) @@ -1860,6 +1859,10 @@ class LevelEditor(NodePath, PandaObject): newDNADoor.setColor(colors[randint(0,len(colors) - 1)]) return newDNADoor + def addGroupToSelected(self, aNodePath): + self.setGroupParent(aNodePath) + self.createNewLevelGroup() + def createNewLevelGroup(self): newGroupParentDNA = DNAGroup('group=' + `self.groupNum`) # Add it to the level objects @@ -2100,7 +2103,7 @@ class LevelEditor(NodePath, PandaObject): if (dnaGroup.__class__.getClassType().eq(DNAFlatBuilding.getClassType())): dnaGroup.setWidth(self.getWallWidth()) newNodePath = dnaGroup.traverse(parent,self.dnaStore) - newNodePath.node().setName(newNodePath.node().getName() + '_DNARoot') + #newNodePath.node().setName(newNodePath.node().getName() + '_DNARoot') # Add it to the level dictionary self.addObject(newNodePath, dnaGroup) @@ -2128,7 +2131,7 @@ class LevelEditor(NodePath, PandaObject): if dnaGroup.__class__.getClassType().eq(DNAFlatBuilding.getClassType()): dnaGroup.setWidth(self.getWallWidth()) newNodePath = dnaGroup.traverse(parent, self.dnaStore) - newNodePath.node().setName(newNodePath.node().getName() + '_DNARoot') + #newNodePath.node().setName(newNodePath.node().getName() + '_DNARoot') # Add it to the level dictionary self.addObject(newNodePath, dnaGroup) @@ -2215,22 +2218,19 @@ class LevelEditor(NodePath, PandaObject): # Get rid of default group and root node self.preRemoveNodePath(self.groupParent) self.removeNodePath(self.groupParent) - # Clear self.dnaStore self.dnaStore.resetDNAGroups() - + # Reset DNA VIS Groups + self.dnaStore.resetDNAVisGroups() # Now load in new file self.groupParent = loadDNAFile(self.dnaStore, filename, getDefaultCoordinateSystem()) - # Make sure the topmost level object gets put under level objects dna self.groupParentDNA = self.dnaStore.findDNAGroup( self.groupParent.getBottomArc()) self.levelObjectsDNA.add(self.groupParentDNA) - # No level objects node found, just add the whole thing self.groupParent.reparentTo(self.levelObjects) - if 0: newLevelObjects = nodePath.find('**/LevelObjects') if newLevelObjects.isEmpty(): @@ -2245,28 +2245,26 @@ class LevelEditor(NodePath, PandaObject): # (since there is probably one in the dnafile self.preRemoveNodePath(self.groupParent) self.removeNodePath(self.groupParent) - # Now add the children from the DNA File children = newLevelObjects.getChildren() for i in range(children.getNumPaths()): children.getPath(i).reparentTo(self.levelObjects) # Now create a new top level group with next group number self.createTopLevelGroup() - # Add these objects to the levelDictionary numPaths = self.dnaStore.getNumNodeRelations() for pathNum in range(numPaths): relation = self.dnaStore.getNodeRelationAt(pathNum) if relation: - newNodePath = NodePath(relation) - group = self.dnaStore.findDNAGroup(relation) - if newNodePath.isSingleton(): - print 'Singleton!!' - else: - self.addObject(newNodePath, group) + if (relation.getChild() and relation.getParent()): + newNodePath = NodePath(relation) + group = self.dnaStore.findDNAGroup(relation) + if newNodePath.isSingleton(): + print 'Singleton!!' + else: + self.addObject(newNodePath, group) else: print'blah' - self.createNewLevelGroup() def outputDNADefaultFile(self): @@ -2353,7 +2351,7 @@ class LevelEditor(NodePath, PandaObject): # Traverse the dna to create the new node path newNodePath = dnaGroup.traverse(parent, self.dnaStore) - newNodePath.node().setName(newNodePath.node().getName() + '_DNARoot') + #newNodePath.node().setName(newNodePath.node().getName() + '_DNARoot') self.selectNodePath(newNodePath) # Add it to the levelObjects dictionary @@ -2372,7 +2370,7 @@ class LevelEditor(NodePath, PandaObject): # Traverse the dna to create the new node path newNodePath = dnaGroup.traverse(parent, self.dnaStore) - newNodePath.node().setName(newNodePath.node().getName() + '_DNARoot') + #newNodePath.node().setName(newNodePath.node().getName() + '_DNARoot') self.selectNodePath(newNodePath) # Add it to the levelObjects dictionary @@ -3200,7 +3198,8 @@ class LevelEditorPanel(Pmw.MegaToplevel): self.sceneGraphExplorer = SceneGraphExplorer( parent = sceneGraphPage, - root = self.levelEditor.getLevelObjects()) + root = self.levelEditor.getLevelObjects(), + menuItems = ['Select', 'Isolate', 'Set Parent', 'Add Group']) self.sceneGraphExplorer.pack(expand = 1, fill = 'both') def toggleGrid(self): diff --git a/direct/src/tkwidgets/SceneGraphExplorer.py b/direct/src/tkwidgets/SceneGraphExplorer.py index 6c4f0c55f3..4fc8f8ffeb 100644 --- a/direct/src/tkwidgets/SceneGraphExplorer.py +++ b/direct/src/tkwidgets/SceneGraphExplorer.py @@ -8,7 +8,9 @@ class SceneGraphExplorer(Pmw.MegaWidget): "Graphical display of a scene graph" def __init__(self, root = render, parent = None, **kw): # Define the megawidget options. - optiondefs = () + optiondefs = ( + ('menuItems', ['Select'], None), + ) self.defineoptions(kw, optiondefs) # Initialise superclass @@ -45,7 +47,7 @@ class SceneGraphExplorer(Pmw.MegaWidget): self._treeItem = SceneGraphExplorerItem(self.root) self._node = TreeNode(self._canvas, None, self._treeItem, - ['Select Node']) + self['menuItems']) self._node.expand() # Check keywords and initialise options based on input values. @@ -113,7 +115,6 @@ class SceneGraphExplorerItem(TreeItem): messenger.send('SGESelectNodePath', [self.nodePath]) def MenuCommand(self, command): - if (command == 'Select Node'): - messenger.send('SGESelectNodePath', [self.nodePath]) + messenger.send('SGE' + command + 'NodePath', [self.nodePath])