mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
173 lines
7.1 KiB
Python
173 lines
7.1 KiB
Python
#################################################################
|
|
# duplicateWindow.py
|
|
# Written by Yi-Hong Lin, yihhongl@andrew.cmu.edu, 2004
|
|
#################################################################
|
|
from direct.tkwidgets.AppShell import *
|
|
from direct.showbase.TkGlobal import *
|
|
|
|
import seSceneGraphExplorer
|
|
|
|
|
|
class duplicateWindow(AppShell):
|
|
#################################################################
|
|
# duplicateWindow(AppShell)
|
|
# This class is used to create a dialog window
|
|
# for handling the "dupicate" command from the sceneEditor
|
|
#
|
|
# Notice!
|
|
# The actual duplicating process is not happending here!
|
|
# The one handle the process is dataHolder...
|
|
#################################################################
|
|
appversion = '1.0'
|
|
appname = 'Duplication'
|
|
frameWidth = 450
|
|
frameHeight = 320
|
|
frameIniPosX = 250
|
|
frameIniPosY = 250
|
|
padx = 0
|
|
pady = 0
|
|
|
|
|
|
def __init__(self, parent = None, nodePath = None, **kw):
|
|
# Define the megawidget options.
|
|
optiondefs = (
|
|
('title', self.appname, None),
|
|
)
|
|
self.defineoptions(kw, optiondefs)
|
|
|
|
if parent == None:
|
|
self.parent = Toplevel()
|
|
AppShell.__init__(self, self.parent)
|
|
self.parent.geometry('%dx%d+%d+%d' % (self.frameWidth, self.frameHeight,self.frameIniPosX,self.frameIniPosY))
|
|
|
|
self.nodePath = nodePath
|
|
|
|
self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
|
|
|
|
def appInit(self):
|
|
print '----SideWindow is Initialized!!'
|
|
|
|
def createInterface(self):
|
|
# The interior of the toplevel panel
|
|
interior = self.interior()
|
|
mainFrame = Frame(interior)
|
|
self.inputZone = Pmw.Group(mainFrame, tag_text='Offset setting')
|
|
self.inputZone.pack(fill='both',expand=1)
|
|
settingFrame = self.inputZone.interior()
|
|
Label(settingFrame,text=' X ').place(anchor=NW,x=110,y=15)
|
|
Label(settingFrame,text=' Y ').place(anchor=NW,x=205,y=15)
|
|
Label(settingFrame,text=' Z ').place(anchor=NW,x=295,y=15)
|
|
self.move_x = Pmw.EntryField(settingFrame,label_text='Move :',labelpos='w',value='0.0', validate=Pmw.realvalidator)
|
|
self.move_x.component('entry').config(width=10)
|
|
self.move_y = Pmw.EntryField(settingFrame,value='0.0', validate=Pmw.realvalidator)
|
|
self.move_y.component('entry').config(width=10)
|
|
self.move_z = Pmw.EntryField(settingFrame, value='0.0', validate=Pmw.realvalidator)
|
|
self.move_z.component('entry').config(width=10)
|
|
self.move_x.place(anchor=NW,x=50,y=40)
|
|
self.move_y.place(anchor=NW,x=185,y=40)
|
|
self.move_z.place(anchor=NW,x=275,y=40)
|
|
|
|
self.rotate_x = Pmw.EntryField(settingFrame,label_text='Rotate:',labelpos='w',value='0.0', validate=Pmw.realvalidator)
|
|
self.rotate_x.component('entry').config(width=10)
|
|
self.rotate_y = Pmw.EntryField(settingFrame,value='0.0', validate=Pmw.realvalidator)
|
|
self.rotate_y.component('entry').config(width=10)
|
|
self.rotate_z = Pmw.EntryField(settingFrame, value='0.0', validate=Pmw.realvalidator)
|
|
self.rotate_z.component('entry').config(width=10)
|
|
self.rotate_x.place(anchor=NW,x=50,y=70)
|
|
self.rotate_y.place(anchor=NW,x=185,y=70)
|
|
self.rotate_z.place(anchor=NW,x=275,y=70)
|
|
|
|
self.scale_x = Pmw.EntryField(settingFrame,label_text='Scale :',labelpos='w',value='1.0', validate=Pmw.realvalidator)
|
|
self.scale_x.component('entry').config(width=10)
|
|
self.scale_y = Pmw.EntryField(settingFrame,value='1.0', validate=Pmw.realvalidator)
|
|
self.scale_y.component('entry').config(width=10)
|
|
self.scale_z = Pmw.EntryField(settingFrame, value='1.0', validate=Pmw.realvalidator)
|
|
self.scale_z.component('entry').config(width=10)
|
|
self.scale_x.place(anchor=NW,x=52,y=100)
|
|
self.scale_y.place(anchor=NW,x=185,y=100)
|
|
self.scale_z.place(anchor=NW,x=275,y=100)
|
|
|
|
self.numberOfCopy = Pmw.EntryField(settingFrame,label_text='Number of Copy :',labelpos='w',value='1', validate=Pmw.integervalidator)
|
|
self.numberOfCopy.component('entry').config(width=15)
|
|
self.numberOfCopy.place(anchor=NW,x=52,y=150)
|
|
|
|
settingFrame.pack(fill=BOTH,expand=1,padx=7,pady=7)
|
|
|
|
self.button_ok = Button(mainFrame, text="OK", command=self.ok_press,width=10)
|
|
self.button_ok.pack(fill=BOTH,expand=0,side=RIGHT)
|
|
|
|
mainFrame.pack(fill = 'both', expand = 1,padx=7,pady=7)
|
|
|
|
|
|
def createMenuBar(self):
|
|
self.menuBar.destroy()
|
|
|
|
def onDestroy(self, event):
|
|
messenger.send('DW_close')
|
|
'''
|
|
If you have open any thing, please rewrite here!
|
|
'''
|
|
pass
|
|
|
|
###############################
|
|
|
|
def ok_press(self):
|
|
#################################################################
|
|
# ok_press(self)
|
|
# Callback function
|
|
# This function will be called when user click on the "OK" button on the window.
|
|
# After collect all data we need for the duplication process,
|
|
# this function will send out a message with all data.
|
|
# 'DW_duplicating'
|
|
# This message will be caught by sceneEditor.
|
|
#################################################################
|
|
if not self.allEntryValid():
|
|
print '---- Duplication Window: Invalid value!!'
|
|
return
|
|
x = self.move_x.getvalue()
|
|
y = self.move_y.getvalue()
|
|
z = self.move_z.getvalue()
|
|
pos=Vec3(FloatType(x),FloatType(y),FloatType(z))
|
|
x = self.rotate_x.getvalue()
|
|
y = self.rotate_y.getvalue()
|
|
z = self.rotate_z.getvalue()
|
|
hpr=Vec3(FloatType(x),FloatType(y),FloatType(z))
|
|
x = self.scale_x.getvalue()
|
|
y = self.scale_y.getvalue()
|
|
z = self.scale_z.getvalue()
|
|
scale=Vec3(FloatType(x),FloatType(y),FloatType(z))
|
|
num = int(self.numberOfCopy.getvalue())
|
|
messenger.send('DW_duplicating',[self.nodePath,pos,hpr,scale,num])
|
|
self.quit()
|
|
|
|
def allEntryValid(self):
|
|
#################################################################
|
|
# allEntryValid(self)
|
|
# This function is used to check all data in the input entries are valid.
|
|
#
|
|
# For example, none of entries contains blank data.
|
|
#
|
|
#################################################################
|
|
if not self.move_x.valid():
|
|
return False
|
|
elif not self.move_y.valid():
|
|
return False
|
|
elif not self.move_z.valid():
|
|
return False
|
|
elif not self.rotate_x.valid():
|
|
return False
|
|
elif not self.rotate_y.valid():
|
|
return False
|
|
elif not self.rotate_z.valid():
|
|
return False
|
|
elif not self.scale_x.valid():
|
|
return False
|
|
elif not self.scale_y.valid():
|
|
return False
|
|
elif not self.scale_z.valid():
|
|
return False
|
|
elif not self.numberOfCopy.valid():
|
|
return False
|
|
|
|
return True
|