mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
*** empty log message ***
This commit is contained in:
parent
bb9a999fb9
commit
bee6c69d12
@ -109,12 +109,14 @@ class State(DirectObject):
|
|||||||
def enter(self, argList=[]):
|
def enter(self, argList=[]):
|
||||||
"""enter(self)
|
"""enter(self)
|
||||||
Call the enter function for this state"""
|
Call the enter function for this state"""
|
||||||
|
|
||||||
|
# enter child FSMs first. It is assumed these have a start
|
||||||
|
# state that is safe to enter
|
||||||
|
self.__enterChildren(argList)
|
||||||
|
|
||||||
if (self.__enterFunc != None):
|
if (self.__enterFunc != None):
|
||||||
apply(self.__enterFunc, argList)
|
apply(self.__enterFunc, argList)
|
||||||
|
|
||||||
#enter child FSMs
|
|
||||||
self.__enterChildren(argList)
|
|
||||||
|
|
||||||
def exit(self, argList=[]):
|
def exit(self, argList=[]):
|
||||||
"""exit(self)
|
"""exit(self)
|
||||||
Call the exit function for this state"""
|
Call the exit function for this state"""
|
||||||
|
@ -14,6 +14,7 @@ import VectorWidgets
|
|||||||
import string
|
import string
|
||||||
import os
|
import os
|
||||||
import __builtin__
|
import __builtin__
|
||||||
|
import whrandom
|
||||||
|
|
||||||
# Colors used by all color menus
|
# Colors used by all color menus
|
||||||
DEFAULT_COLORS = [
|
DEFAULT_COLORS = [
|
||||||
@ -217,6 +218,8 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
# NPToplevel: Corresponding Node Path
|
# NPToplevel: Corresponding Node Path
|
||||||
# DNAParent: Current DNA Node that new objects get added to
|
# DNAParent: Current DNA Node that new objects get added to
|
||||||
# NPParent: Corresponding Node Path
|
# NPParent: Corresponding Node Path
|
||||||
|
# DNAVisGroup: Current DNAVisGroup that new objects get added to
|
||||||
|
# NPVisGroup: Corresponding Node Path
|
||||||
# selectedDNARoot: DNA Node of currently selected object
|
# selectedDNARoot: DNA Node of currently selected object
|
||||||
# selectedNPRoot: Corresponding Node Path
|
# selectedNPRoot: Corresponding Node Path
|
||||||
# DNATarget: Subcomponent being modified by Pie Menu
|
# DNATarget: Subcomponent being modified by Pie Menu
|
||||||
@ -238,6 +241,11 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
# Create level Editor Panel
|
# Create level Editor Panel
|
||||||
self.panel = LevelEditorPanel(self)
|
self.panel = LevelEditorPanel(self)
|
||||||
|
|
||||||
|
# Used to store whatever edges and points are loaded in the level
|
||||||
|
self.edgeDict = {}
|
||||||
|
self.pointDict = {}
|
||||||
|
self.cellDict = {}
|
||||||
|
|
||||||
# Initialize LevelEditor variables DNAData, DNAToplevel, NPToplevel
|
# Initialize LevelEditor variables DNAData, DNAToplevel, NPToplevel
|
||||||
# DNAParent, NPParent, groupNum, lastAngle
|
# DNAParent, NPParent, groupNum, lastAngle
|
||||||
# Pass in the new toplevel group and don't clear out the old
|
# Pass in the new toplevel group and don't clear out the old
|
||||||
@ -416,6 +424,10 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
self.snapList = []
|
self.snapList = []
|
||||||
# Last menu used
|
# Last menu used
|
||||||
self.activeMenu = None
|
self.activeMenu = None
|
||||||
|
# Reset path markers
|
||||||
|
self.resetPathMarkers()
|
||||||
|
# Reset battle cell markers
|
||||||
|
self.resetBattleCellMarkers()
|
||||||
|
|
||||||
def deleteToplevel(self):
|
def deleteToplevel(self):
|
||||||
# Destory old toplevel node path and DNA
|
# Destory old toplevel node path and DNA
|
||||||
@ -440,6 +452,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
# Update parent pointers
|
# Update parent pointers
|
||||||
self.DNAParent = self.DNAToplevel
|
self.DNAParent = self.DNAToplevel
|
||||||
self.NPParent = self.NPToplevel
|
self.NPParent = self.NPToplevel
|
||||||
|
self.VGParent = None
|
||||||
# Update scene graph explorer
|
# Update scene graph explorer
|
||||||
# self.panel.sceneGraphExplorer.update()
|
# self.panel.sceneGraphExplorer.update()
|
||||||
|
|
||||||
@ -1576,6 +1589,11 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
newDNAToplevel = self.findDNANode(newNPToplevel)
|
newDNAToplevel = self.findDNANode(newNPToplevel)
|
||||||
# Update toplevel variables
|
# Update toplevel variables
|
||||||
self.createToplevel(newDNAToplevel, newNPToplevel)
|
self.createToplevel(newDNAToplevel, newNPToplevel)
|
||||||
|
# Create visible representations of all the paths and battle cells
|
||||||
|
self.createSuitPaths()
|
||||||
|
self.hideSuitPaths()
|
||||||
|
self.createBattleCells()
|
||||||
|
self.hideBattleCells()
|
||||||
|
|
||||||
def outputDNADefaultFile(self):
|
def outputDNADefaultFile(self):
|
||||||
f = Filename(self.styleManager.stylePathPrefix +
|
f = Filename(self.styleManager.stylePathPrefix +
|
||||||
@ -1585,8 +1603,9 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
|
|
||||||
def outputDNA(self,filename):
|
def outputDNA(self,filename):
|
||||||
print 'Saving DNA to: ', filename
|
print 'Saving DNA to: ', filename
|
||||||
self.DNAData.writeDna(Filename(filename),
|
binaryFilename = Filename(filename)
|
||||||
Notify.out(),DNASTORE)
|
binaryFilename.setBinary()
|
||||||
|
self.DNAData.writeDna(binaryFilename, Notify.out(),DNASTORE)
|
||||||
|
|
||||||
def saveColor(self):
|
def saveColor(self):
|
||||||
self.appendColorToColorPaletteFile(self.panel.colorEntry.get())
|
self.appendColorToColorPaletteFile(self.panel.colorEntry.get())
|
||||||
@ -1785,33 +1804,9 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
def getLastAngle(self):
|
def getLastAngle(self):
|
||||||
return self.lastAngle
|
return self.lastAngle
|
||||||
|
|
||||||
def placeSuitPoint(self):
|
def drawSuitEdge(self, edge, parent):
|
||||||
v = self.getGridSnapIntersectionPoint()
|
|
||||||
marker = self.suitPointMarker.instanceTo(self.NPParent)
|
|
||||||
if (self.currentSuitPointType == DNASuitPoint.STREETPOINT):
|
|
||||||
marker.setColor(0,0,0.6)
|
|
||||||
elif (self.currentSuitPointType == DNASuitPoint.FRONTDOORPOINT):
|
|
||||||
marker.setColor(0,0,1)
|
|
||||||
marker.setScale(0.5)
|
|
||||||
elif (self.currentSuitPointType == DNASuitPoint.SIDEDOORPOINT):
|
|
||||||
marker.setColor(0,0.2,0.4)
|
|
||||||
marker.setScale(0.5)
|
|
||||||
|
|
||||||
# v is relative to the grid
|
|
||||||
marker.setPos(direct.grid, v)
|
|
||||||
# get the absolute pos relative to the top level. That is what gets stored in the point
|
|
||||||
absPos = marker.getPos(self.NPToplevel)
|
|
||||||
print 'Suit point: ' + str(absPos)
|
|
||||||
# Store the point in the DNA. If this point is already in there, it returns
|
|
||||||
# the existing point
|
|
||||||
suitPoint = DNASTORE.storeSuitPoint(self.currentSuitPointType, absPos)
|
|
||||||
self.currentSuitPointIndex = suitPoint.getIndex()
|
|
||||||
|
|
||||||
if self.startSuitPoint:
|
|
||||||
self.endSuitPoint = suitPoint
|
|
||||||
|
|
||||||
# Draw a line from start to end
|
# Draw a line from start to end
|
||||||
edgeLine = LineNodePath(self.NPParent)
|
edgeLine = LineNodePath(parent)
|
||||||
edgeLine.lineNode.setName('suitEdge')
|
edgeLine.lineNode.setName('suitEdge')
|
||||||
edgeLine.setColor(VBase4(0.0, 0.0, 0.5 ,1))
|
edgeLine.setColor(VBase4(0.0, 0.0, 0.5 ,1))
|
||||||
edgeLine.setThickness(1)
|
edgeLine.setThickness(1)
|
||||||
@ -1821,16 +1816,47 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
# start and end positions relative to the parent, then draw
|
# start and end positions relative to the parent, then draw
|
||||||
# the arrow using those points
|
# the arrow using those points
|
||||||
tempNode = self.NPToplevel.attachNewNode('tempNode')
|
tempNode = self.NPToplevel.attachNewNode('tempNode')
|
||||||
tempNode.setPos(self.startSuitPoint.getPos())
|
mat = self.NPToplevel.getMat(parent)
|
||||||
relStartPos = tempNode.getPos(self.NPParent)
|
relStartPos = Point3(mat.xformPoint(edge.getStartPoint().getPos()))
|
||||||
tempNode.setPos(self.endSuitPoint.getPos())
|
relEndPos = Point3(mat.xformPoint(edge.getEndPoint().getPos()))
|
||||||
relEndPos = tempNode.getPos(self.NPParent)
|
edgeLine.drawArrow(relStartPos,
|
||||||
tempNode.remove()
|
relEndPos,
|
||||||
edgeLine.drawArrow(relStartPos, relEndPos,
|
|
||||||
15, # arrow angle
|
15, # arrow angle
|
||||||
1) # arrow length
|
1) # arrow length
|
||||||
edgeLine.create()
|
edgeLine.create()
|
||||||
|
return edgeLine
|
||||||
|
|
||||||
|
def drawSuitPoint(self, pos, type, parent):
|
||||||
|
marker = self.suitPointMarker.instanceTo(parent)
|
||||||
|
marker.setPos(pos)
|
||||||
|
if (type == DNASuitPoint.STREETPOINT):
|
||||||
|
marker.setColor(0,0,0.6)
|
||||||
|
marker.setScale(0.25)
|
||||||
|
elif (type == DNASuitPoint.FRONTDOORPOINT):
|
||||||
|
marker.setColor(0,0,1)
|
||||||
|
marker.setScale(0.5)
|
||||||
|
elif (type == DNASuitPoint.SIDEDOORPOINT):
|
||||||
|
marker.setColor(0,0.2,0.4)
|
||||||
|
marker.setScale(0.5)
|
||||||
|
# v is relative to the grid
|
||||||
|
return marker
|
||||||
|
|
||||||
|
def placeSuitPoint(self):
|
||||||
|
v = self.getGridSnapIntersectionPoint()
|
||||||
|
# get the absolute pos relative to the top level. That is what gets stored in the point
|
||||||
|
mat = direct.grid.getMat(self.NPToplevel)
|
||||||
|
absPos = Point3(mat.xformPoint(v))
|
||||||
|
print 'Suit point: ' + `absPos`
|
||||||
|
# Store the point in the DNA. If this point is already in there, it returns
|
||||||
|
# the existing point
|
||||||
|
suitPoint = DNASTORE.storeSuitPoint(self.currentSuitPointType, absPos)
|
||||||
|
if not self.pointDict.has_key(suitPoint):
|
||||||
|
marker = self.drawSuitPoint(absPos, self.currentSuitPointType, self.NPToplevel)
|
||||||
|
self.pointDict[suitPoint] = marker
|
||||||
|
self.currentSuitPointIndex = suitPoint.getIndex()
|
||||||
|
|
||||||
|
if self.startSuitPoint:
|
||||||
|
self.endSuitPoint = suitPoint
|
||||||
# Make a new dna edge
|
# Make a new dna edge
|
||||||
if DNAClassEqual(self.DNAParent, DNA_VIS_GROUP):
|
if DNAClassEqual(self.DNAParent, DNA_VIS_GROUP):
|
||||||
zoneId = self.DNAParent.getName()
|
zoneId = self.DNAParent.getName()
|
||||||
@ -1838,10 +1864,13 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
DNASTORE.storeSuitEdge(suitEdge)
|
DNASTORE.storeSuitEdge(suitEdge)
|
||||||
# Add the edge to the current vis group so it can be written out
|
# Add the edge to the current vis group so it can be written out
|
||||||
self.DNAParent.addSuitEdge(suitEdge)
|
self.DNAParent.addSuitEdge(suitEdge)
|
||||||
|
# Draw a line to represent the edge
|
||||||
|
edgeLine = self.drawSuitEdge(suitEdge, self.NPParent)
|
||||||
|
# Store the line in a dict so we can hide/show them
|
||||||
|
self.edgeDict[suitEdge] = edgeLine
|
||||||
print 'Added dnaSuitEdge to zone: ' + zoneId
|
print 'Added dnaSuitEdge to zone: ' + zoneId
|
||||||
else:
|
else:
|
||||||
print 'Error: DNAParent is not a dnaVisGroup. Did not add edge'
|
print 'Error: DNAParent is not a dnaVisGroup. Did not add edge'
|
||||||
|
|
||||||
# Reset
|
# Reset
|
||||||
self.startSuitPoint = None
|
self.startSuitPoint = None
|
||||||
self.endSuitPoint = None
|
self.endSuitPoint = None
|
||||||
@ -1850,34 +1879,118 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
# First point, store it
|
# First point, store it
|
||||||
self.startSuitPoint = suitPoint
|
self.startSuitPoint = suitPoint
|
||||||
|
|
||||||
def placeBattleCell(self):
|
def drawBattleCell(self, cell, parent):
|
||||||
v = self.getGridSnapIntersectionPoint()
|
marker = self.battleCellMarker.instanceTo(parent)
|
||||||
marker = self.battleCellMarker.instanceTo(self.NPParent)
|
# Greenish
|
||||||
# v is relative to the grid
|
|
||||||
marker.setPos(direct.grid, v)
|
|
||||||
marker.setColor(0.25,0.75,0.25,0.5)
|
marker.setColor(0.25,0.75,0.25,0.5)
|
||||||
# get the absolute pos relative to the top level. That is what gets stored in the point
|
marker.setPos(cell.getPos())
|
||||||
absPos = marker.getPos(self.NPToplevel)
|
# scale to radius which is width/2
|
||||||
print 'Battle cell: ' + str(absPos)
|
marker.setScale(cell.getWidth()/2.0,
|
||||||
|
cell.getHeight()/2.0,
|
||||||
|
1)
|
||||||
|
return marker
|
||||||
|
|
||||||
|
def placeBattleCell(self):
|
||||||
|
# Store the battle cell in the current vis group
|
||||||
|
if not DNAClassEqual(self.DNAParent, DNA_VIS_GROUP):
|
||||||
|
print 'Error: DNAParent is not a dnaVisGroup. Did not add battle cell'
|
||||||
|
return
|
||||||
|
|
||||||
|
v = self.getGridSnapIntersectionPoint()
|
||||||
|
mat = direct.grid.getMat(self.NPParent)
|
||||||
|
absPos = Point3(mat.xformPoint(v))
|
||||||
if (self.currentBattleCellType == '20w 20l'):
|
if (self.currentBattleCellType == '20w 20l'):
|
||||||
marker.setScale(10,10,1)
|
|
||||||
cell = DNABattleCell(20, 20, absPos)
|
cell = DNABattleCell(20, 20, absPos)
|
||||||
elif (self.currentBattleCellType == '20w 30l'):
|
elif (self.currentBattleCellType == '20w 30l'):
|
||||||
marker.setScale(10,15,1)
|
|
||||||
cell = DNABattleCell(20, 30, absPos)
|
cell = DNABattleCell(20, 30, absPos)
|
||||||
elif (self.currentBattleCellType == '30w 20l'):
|
elif (self.currentBattleCellType == '30w 20l'):
|
||||||
marker.setScale(15,10,1)
|
|
||||||
cell = DNABattleCell(30, 20, absPos)
|
cell = DNABattleCell(30, 20, absPos)
|
||||||
elif (self.currentBattleCellType == '30w 30l'):
|
elif (self.currentBattleCellType == '30w 30l'):
|
||||||
marker.setScale(15,15,1)
|
|
||||||
cell = DNABattleCell(30, 30, absPos)
|
cell = DNABattleCell(30, 30, absPos)
|
||||||
# Store the battle cell in the storage
|
# Store the battle cell in the storage
|
||||||
DNASTORE.storeBattleCell(cell)
|
DNASTORE.storeBattleCell(cell)
|
||||||
|
# Draw the battle cell
|
||||||
|
marker = self.drawBattleCell(cell, self.NPParent)
|
||||||
|
# Keep a handy dict of the visible markers
|
||||||
|
self.cellDict[cell] = marker
|
||||||
# Store the battle cell in the current vis group
|
# Store the battle cell in the current vis group
|
||||||
if DNAClassEqual(self.DNAParent, DNA_VIS_GROUP):
|
|
||||||
self.DNAParent.addBattleCell(cell)
|
self.DNAParent.addBattleCell(cell)
|
||||||
else:
|
|
||||||
print 'Error: DNAParent is not a dnaVisGroup. Did not add battle cell'
|
def createSuitPaths(self):
|
||||||
|
# Points
|
||||||
|
numPoints = DNASTORE.getNumSuitPoints()
|
||||||
|
for i in range(numPoints):
|
||||||
|
point = DNASTORE.getSuitPoint(i)
|
||||||
|
marker = self.drawSuitPoint(point.getPos(), point.getPointType(), self.NPToplevel)
|
||||||
|
self.pointDict[point] = marker
|
||||||
|
|
||||||
|
# Edges
|
||||||
|
visGroups = self.getDNAVisGroups(self.NPToplevel)
|
||||||
|
for visGroup in visGroups:
|
||||||
|
np = visGroup[0]
|
||||||
|
dnaVisGroup = visGroup[1]
|
||||||
|
numSuitEdges = dnaVisGroup.getNumSuitEdges()
|
||||||
|
for i in range(numSuitEdges):
|
||||||
|
edge = dnaVisGroup.getSuitEdge(i)
|
||||||
|
edgeLine = self.drawSuitEdge(edge, np)
|
||||||
|
self.edgeDict[edge] = edgeLine
|
||||||
|
|
||||||
|
def resetPathMarkers(self):
|
||||||
|
for edge, edgeLine in self.edgeDict.items():
|
||||||
|
edgeLine.remove()
|
||||||
|
self.edgeDict = {}
|
||||||
|
for point, marker in self.pointDict.items():
|
||||||
|
marker.remove()
|
||||||
|
self.pointDict = {}
|
||||||
|
|
||||||
|
def hideSuitPaths(self):
|
||||||
|
for edge, edgeLine in self.edgeDict.items():
|
||||||
|
edgeLine.hide()
|
||||||
|
for point, marker in self.pointDict.items():
|
||||||
|
marker.hide()
|
||||||
|
|
||||||
|
def showSuitPaths(self):
|
||||||
|
for edge, edgeLine in self.edgeDict.items():
|
||||||
|
edgeLine.show()
|
||||||
|
for point, marker in self.pointDict.items():
|
||||||
|
marker.show()
|
||||||
|
|
||||||
|
def createBattleCells(self):
|
||||||
|
# Edges
|
||||||
|
visGroups = self.getDNAVisGroups(self.NPToplevel)
|
||||||
|
for visGroup in visGroups:
|
||||||
|
np = visGroup[0]
|
||||||
|
dnaVisGroup = visGroup[1]
|
||||||
|
numCells = dnaVisGroup.getNumBattleCells()
|
||||||
|
for i in range(numCells):
|
||||||
|
cell = dnaVisGroup.getBattleCell(i)
|
||||||
|
marker = self.drawBattleCell(cell, np)
|
||||||
|
self.cellDict[cell] = marker
|
||||||
|
|
||||||
|
def resetBattleCellMarkers(self):
|
||||||
|
for cell, marker in self.cellDict.items():
|
||||||
|
marker.remove()
|
||||||
|
self.cellDict = {}
|
||||||
|
|
||||||
|
def hideBattleCells(self):
|
||||||
|
for cell, marker in self.cellDict.items():
|
||||||
|
marker.hide()
|
||||||
|
|
||||||
|
def showBattleCells(self):
|
||||||
|
for cell, marker in self.cellDict.items():
|
||||||
|
marker.show()
|
||||||
|
|
||||||
|
def colorZones(self):
|
||||||
|
# Give each zone a random color to see them better
|
||||||
|
visGroups = self.getDNAVisGroups(self.NPToplevel)
|
||||||
|
for visGroup in visGroups:
|
||||||
|
np = visGroup[0]
|
||||||
|
np.setColor(0.5 + random()/2.0,
|
||||||
|
0.5 + random()/2.0,
|
||||||
|
0.5 + random()/2.0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class LevelStyleManager:
|
class LevelStyleManager:
|
||||||
"""Class which reads in style files and manages class variables"""
|
"""Class which reads in style files and manages class variables"""
|
||||||
@ -2834,7 +2947,14 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
propsPage = notebook.add('Props')
|
propsPage = notebook.add('Props')
|
||||||
sceneGraphPage = notebook.add('SceneGraph')
|
sceneGraphPage = notebook.add('SceneGraph')
|
||||||
|
|
||||||
|
self.fPaths = IntVar()
|
||||||
|
self.fPaths.set(0)
|
||||||
|
self.pathButton = Checkbutton(suitPathPage,
|
||||||
|
text = 'Show Paths',
|
||||||
|
width = 6,
|
||||||
|
variable = self.fPaths,
|
||||||
|
command = self.toggleSuitPaths)
|
||||||
|
self.pathButton.pack(side = 'top', expand = 1, fill = 'x')
|
||||||
self.suitPointSelector = Pmw.ComboBox(
|
self.suitPointSelector = Pmw.ComboBox(
|
||||||
suitPathPage,
|
suitPathPage,
|
||||||
dropdown = 0,
|
dropdown = 0,
|
||||||
@ -2850,6 +2970,14 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
self.suitPointSelector.selectitem('street')
|
self.suitPointSelector.selectitem('street')
|
||||||
self.suitPointSelector.pack(expand = 1, fill = 'both')
|
self.suitPointSelector.pack(expand = 1, fill = 'both')
|
||||||
|
|
||||||
|
self.fCells = IntVar()
|
||||||
|
self.fCells.set(0)
|
||||||
|
self.cellButton = Checkbutton(battleCellPage,
|
||||||
|
text = 'Show Cells',
|
||||||
|
width = 6,
|
||||||
|
variable = self.fCells,
|
||||||
|
command = self.toggleBattleCells)
|
||||||
|
self.cellButton.pack(side = 'top', expand = 1, fill = 'x')
|
||||||
self.battleCellSelector = Pmw.ComboBox(
|
self.battleCellSelector = Pmw.ComboBox(
|
||||||
battleCellPage,
|
battleCellPage,
|
||||||
dropdown = 0,
|
dropdown = 0,
|
||||||
@ -3099,6 +3227,18 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
else:
|
else:
|
||||||
direct.grid.disable()
|
direct.grid.disable()
|
||||||
|
|
||||||
|
def toggleSuitPaths(self):
|
||||||
|
if self.fPaths.get():
|
||||||
|
self.levelEditor.showSuitPaths()
|
||||||
|
else:
|
||||||
|
self.levelEditor.hideSuitPaths()
|
||||||
|
|
||||||
|
def toggleBattleCells(self):
|
||||||
|
if self.fCells.get():
|
||||||
|
self.levelEditor.showBattleCells()
|
||||||
|
else:
|
||||||
|
self.levelEditor.hideBattleCells()
|
||||||
|
|
||||||
def toggleXyzSnap(self):
|
def toggleXyzSnap(self):
|
||||||
direct.grid.setXyzSnap(self.fXyzSnap.get())
|
direct.grid.setXyzSnap(self.fXyzSnap.get())
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user