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
81873319f7
commit
8d3665d4e6
@ -21,7 +21,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
# Override class variables here
|
# Override class variables here
|
||||||
appname = 'Mopath Recorder Panel'
|
appname = 'Mopath Recorder Panel'
|
||||||
frameWidth = 450
|
frameWidth = 450
|
||||||
frameHeight = 600
|
frameHeight = 510
|
||||||
usecommandarea = 0
|
usecommandarea = 0
|
||||||
usestatusarea = 0
|
usestatusarea = 0
|
||||||
count = 0
|
count = 0
|
||||||
@ -117,6 +117,8 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.controlStart = 0.0
|
self.controlStart = 0.0
|
||||||
self.controlStop = 0.0
|
self.controlStop = 0.0
|
||||||
self.refineStop = 0.0
|
self.refineStop = 0.0
|
||||||
|
self.cropFrom = 0.0
|
||||||
|
self.cropTo = 0.0
|
||||||
self.fAdjustingValues = 0
|
self.fAdjustingValues = 0
|
||||||
# Set up event hooks
|
# Set up event hooks
|
||||||
self.undoEvents = [('undo', self.undoHook),
|
self.undoEvents = [('undo', self.undoHook),
|
||||||
@ -286,9 +288,9 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.mainNotebook = Pmw.NoteBook(interior)
|
self.mainNotebook = Pmw.NoteBook(interior)
|
||||||
self.mainNotebook.pack(fill = BOTH, expand = 1)
|
self.mainNotebook.pack(fill = BOTH, expand = 1)
|
||||||
self.recordPage = self.mainNotebook.add('Record')
|
self.recordPage = self.mainNotebook.add('Record')
|
||||||
|
self.resamplePage = self.mainNotebook.add('Resample')
|
||||||
self.refinePage = self.mainNotebook.add('Refine')
|
self.refinePage = self.mainNotebook.add('Refine')
|
||||||
# Put this here so it isn't called right away
|
self.cropPage = self.mainNotebook.add('Crop')
|
||||||
self.mainNotebook['raisecommand'] = self.updateInfo
|
|
||||||
|
|
||||||
## RECORD PAGE ##
|
## RECORD PAGE ##
|
||||||
recordFrame = Frame(self.recordPage, relief = SUNKEN,
|
recordFrame = Frame(self.recordPage, relief = SUNKEN,
|
||||||
@ -385,21 +387,15 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
# This gets the widgets to spread out
|
# This gets the widgets to spread out
|
||||||
self.gridFrame.grid_columnconfigure(1,weight = 1)
|
self.gridFrame.grid_columnconfigure(1,weight = 1)
|
||||||
recordFrame.pack(fill = X, pady = 2)
|
recordFrame.pack(fill = X, pady = 2)
|
||||||
# Desample
|
|
||||||
desampleFrame = Frame(
|
## RESAMPLE PAGE
|
||||||
self.recordPage, relief = SUNKEN, borderwidth = 2)
|
label = Label(self.resamplePage, text = 'RESAMPLE CURVE',
|
||||||
Label(desampleFrame, text = 'DESAMPLE CURVE',
|
font=('MSSansSerif', 12, 'bold'))
|
||||||
font=('MSSansSerif', 12, 'bold')).pack()
|
label.pack(fill = X)
|
||||||
widget = self.createEntryScale(
|
|
||||||
desampleFrame, 'Resample', 'Points Between Samples',
|
|
||||||
'Recompute curve using every nth point',
|
|
||||||
resolution = 1, max = 100, command = self.setDesampleFrequency)
|
|
||||||
widget.component('hull')['relief'] = RIDGE
|
|
||||||
widget.onRelease = widget.onReturnRelease = self.desampleCurve
|
|
||||||
desampleFrame.pack(fill = X, expand = 0, pady = 2)
|
|
||||||
# Resample
|
# Resample
|
||||||
resampleFrame = Frame(
|
resampleFrame = Frame(
|
||||||
self.recordPage, relief = SUNKEN, borderwidth = 2)
|
self.resamplePage, relief = SUNKEN, borderwidth = 2)
|
||||||
label = Label(resampleFrame, text = 'RESAMPLE CURVE',
|
label = Label(resampleFrame, text = 'RESAMPLE CURVE',
|
||||||
font=('MSSansSerif', 12, 'bold')).pack()
|
font=('MSSansSerif', 12, 'bold')).pack()
|
||||||
widget = self.createEntryScale(
|
widget = self.createEntryScale(
|
||||||
@ -414,6 +410,18 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.setEven, self.fEven,
|
self.setEven, self.fEven,
|
||||||
side = LEFT, fill = BOTH, expand = 0)
|
side = LEFT, fill = BOTH, expand = 0)
|
||||||
resampleFrame.pack(fill = X, expand = 0, pady = 2)
|
resampleFrame.pack(fill = X, expand = 0, pady = 2)
|
||||||
|
# Desample
|
||||||
|
desampleFrame = Frame(
|
||||||
|
self.resamplePage, relief = SUNKEN, borderwidth = 2)
|
||||||
|
Label(desampleFrame, text = 'DESAMPLE CURVE',
|
||||||
|
font=('MSSansSerif', 12, 'bold')).pack()
|
||||||
|
widget = self.createEntryScale(
|
||||||
|
desampleFrame, 'Resample', 'Points Between Samples',
|
||||||
|
'Recompute curve using every nth point',
|
||||||
|
resolution = 1, max = 100, command = self.setDesampleFrequency)
|
||||||
|
widget.component('hull')['relief'] = RIDGE
|
||||||
|
widget.onRelease = widget.onReturnRelease = self.desampleCurve
|
||||||
|
desampleFrame.pack(fill = X, expand = 0, pady = 2)
|
||||||
|
|
||||||
## REFINE PAGE ##
|
## REFINE PAGE ##
|
||||||
refineFrame = Frame(self.refinePage, relief = SUNKEN,
|
refineFrame = Frame(self.refinePage, relief = SUNKEN,
|
||||||
@ -421,6 +429,16 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
label = Label(refineFrame, text = 'REFINE CURVE',
|
label = Label(refineFrame, text = 'REFINE CURVE',
|
||||||
font=('MSSansSerif', 12, 'bold'))
|
font=('MSSansSerif', 12, 'bold'))
|
||||||
label.pack(fill = X)
|
label.pack(fill = X)
|
||||||
|
|
||||||
|
frame = Frame(refineFrame)
|
||||||
|
widget = self.createCheckbutton(
|
||||||
|
frame, 'Refine Page', 'Refining Path',
|
||||||
|
('On: Next record session refines current path ' +
|
||||||
|
'Off: Next record session records a new path'),
|
||||||
|
self.toggleRefine, 0,
|
||||||
|
side = LEFT, expand = 0)
|
||||||
|
frame.pack(expand = 1, fill = X)
|
||||||
|
|
||||||
widget = self.createEntryScale(refineFrame,
|
widget = self.createEntryScale(refineFrame,
|
||||||
'Refine Page', 'Refine From',
|
'Refine Page', 'Refine From',
|
||||||
'Begin time of refine pass',
|
'Begin time of refine pass',
|
||||||
@ -448,31 +466,35 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
widget.onRelease = widget.onReturnRelease = self.getPostPoints
|
widget.onRelease = widget.onReturnRelease = self.getPostPoints
|
||||||
refineFrame.pack(fill = X)
|
refineFrame.pack(fill = X)
|
||||||
|
|
||||||
frame = Frame(refineFrame)
|
|
||||||
widget = self.createCheckbutton(
|
## CROP PAGE ##
|
||||||
self.frame, 'Refine Page', 'Refining Path',
|
cropFrame = Frame(self.cropPage, relief = SUNKEN,
|
||||||
('On: Next record session refines current path ' +
|
borderwidth = 2)
|
||||||
'Off: Next record session records a new path'),
|
label = Label(cropFrame, text = 'CROP CURVE',
|
||||||
self.toggleRefine, 0,
|
font=('MSSansSerif', 12, 'bold'))
|
||||||
side = LEFT, fill = BOTH, expand = 1)
|
label.pack(fill = X)
|
||||||
widget.pack_forget()
|
|
||||||
widget.grid(row=0, column=0, sticky = NSEW)
|
widget = self.createEntryScale(
|
||||||
widget.configure(relief = RAISED, borderwidth = 2,
|
cropFrame,
|
||||||
anchor = CENTER, width = 10)
|
'Crop Page', 'Crop From',
|
||||||
widget = self.createButton(
|
'Delete all curve points before this time',
|
||||||
frame, 'Refine Page', 'Start Refining',
|
resolution = 0.01,
|
||||||
'Start refining path using current refining settings',
|
command = self.setCropFrom)
|
||||||
self.startRefining,
|
|
||||||
side = LEFT, expand = 1)
|
widget = self.createEntryScale(
|
||||||
widget.pack_forget()
|
cropFrame,
|
||||||
widget.grid(row=0, column=1, sticky = NSEW)
|
'Crop Page', 'Crop To',
|
||||||
frame.pack(expand = 1, fill = x)
|
'Delete all curve points after this time',
|
||||||
|
resolution = 0.01,
|
||||||
|
command = self.setCropTo)
|
||||||
|
|
||||||
|
self.createButton(cropFrame, 'Crop Page', 'Crop Curve',
|
||||||
|
'Crop curve to specified from to times',
|
||||||
|
self.cropCurve, fill = NONE)
|
||||||
|
cropFrame.pack(fill = X)
|
||||||
|
|
||||||
self.mainNotebook.setnaturalsize()
|
self.mainNotebook.setnaturalsize()
|
||||||
|
|
||||||
def updateInfo(self, page = 'System'):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def pushUndo(self, fResetRedo = 1):
|
def pushUndo(self, fResetRedo = 1):
|
||||||
direct.pushUndo([self['nodePath']])
|
direct.pushUndo([self['nodePath']])
|
||||||
|
|
||||||
@ -676,7 +698,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.prePoints = []
|
self.prePoints = []
|
||||||
self.postPoints = []
|
self.postPoints = []
|
||||||
# Reset flag
|
# Reset flag
|
||||||
self.fRefine = 0
|
self.setRefineFlag(0)
|
||||||
# Compute curve
|
# Compute curve
|
||||||
self.computeCurves()
|
self.computeCurves()
|
||||||
# Now you can change record modes
|
# Now you can change record modes
|
||||||
@ -765,6 +787,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
def updateCurveInfo(self):
|
def updateCurveInfo(self):
|
||||||
if not self.xyzNurbsCurve:
|
if not self.xyzNurbsCurve:
|
||||||
return
|
return
|
||||||
|
self.fAdjustingValues = 1
|
||||||
# Widgets depending on max T
|
# Widgets depending on max T
|
||||||
maxT = '%.2f' % self.xyzNurbsCurve.getMaxT()
|
maxT = '%.2f' % self.xyzNurbsCurve.getMaxT()
|
||||||
self.getWidget('Playback', 'Time').configure(max = maxT)
|
self.getWidget('Playback', 'Time').configure(max = maxT)
|
||||||
@ -781,12 +804,19 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
widget = self.getWidget('Refine Page', 'Refine To')
|
widget = self.getWidget('Refine Page', 'Refine To')
|
||||||
widget.configure(max = maxT)
|
widget.configure(max = maxT)
|
||||||
widget.set(float(maxT))
|
widget.set(float(maxT))
|
||||||
|
widget = self.getWidget('Crop Page', 'Crop From')
|
||||||
|
widget.configure(max = maxT)
|
||||||
|
widget.set(float(0.0))
|
||||||
|
widget = self.getWidget('Crop Page', 'Crop To')
|
||||||
|
widget.configure(max = maxT)
|
||||||
|
widget.set(float(maxT))
|
||||||
self.maxT = float(maxT)
|
self.maxT = float(maxT)
|
||||||
# Widgets depending on number of samples
|
# Widgets depending on number of samples
|
||||||
numSamples = self.xyzCurveFitter.getNumSamples()
|
numSamples = self.xyzCurveFitter.getNumSamples()
|
||||||
self.getWidget('Resample', 'Points Between Samples')['max'] = (
|
self.getWidget('Resample', 'Points Between Samples')['max'] = (
|
||||||
numSamples)
|
numSamples)
|
||||||
self.getWidget('Resample', 'Num. Samples')['max'] = 3 * numSamples
|
self.getWidget('Resample', 'Num. Samples')['max'] = 3 * numSamples
|
||||||
|
self.fAdjustingValues = 0
|
||||||
|
|
||||||
def selectRecordNodePathNamed(self, name):
|
def selectRecordNodePathNamed(self, name):
|
||||||
nodePath = None
|
nodePath = None
|
||||||
@ -1038,8 +1068,12 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
# Update info
|
# Update info
|
||||||
self.updateCurveInfo()
|
self.updateCurveInfo()
|
||||||
|
|
||||||
|
def toggleRefine(self):
|
||||||
|
self.fRefine = self.getVariable('Refine Page', 'Refining Path').get()
|
||||||
|
|
||||||
def setRefineFlag(self, val = 1):
|
def setRefineFlag(self, val = 1):
|
||||||
self.fRefine = val
|
self.fRefine = val
|
||||||
|
self.getVariable('Refine Page', 'Refining Path').set(val)
|
||||||
|
|
||||||
def setRefineStart(self,value):
|
def setRefineStart(self,value):
|
||||||
self.refineStart = value
|
self.refineStart = value
|
||||||
@ -1055,6 +1089,8 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.refineStart)
|
self.refineStart)
|
||||||
if self.refineStart > self.refineStop:
|
if self.refineStart > self.refineStop:
|
||||||
self.getWidget('Refine Page', 'Refine To').set(self.refineStart)
|
self.getWidget('Refine Page', 'Refine To').set(self.refineStart)
|
||||||
|
# Move playback node path to specified time
|
||||||
|
self.getWidget('Playback', 'Time').set(value)
|
||||||
self.fAdjustingValues = 0
|
self.fAdjustingValues = 0
|
||||||
|
|
||||||
def getPrePoints(self):
|
def getPrePoints(self):
|
||||||
@ -1085,6 +1121,8 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
if self.controlStart > self.refineStop:
|
if self.controlStart > self.refineStop:
|
||||||
self.getWidget('Refine Page', 'Refine To').set(
|
self.getWidget('Refine Page', 'Refine To').set(
|
||||||
self.controlStart)
|
self.controlStart)
|
||||||
|
# Move playback node path to specified time
|
||||||
|
self.getWidget('Playback', 'Time').set(value)
|
||||||
self.fAdjustingValues = 0
|
self.fAdjustingValues = 0
|
||||||
|
|
||||||
def setControlStop(self, value):
|
def setControlStop(self, value):
|
||||||
@ -1102,6 +1140,8 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
if self.controlStop > self.refineStop:
|
if self.controlStop > self.refineStop:
|
||||||
self.getWidget('Refine Page', 'Refine To').set(
|
self.getWidget('Refine Page', 'Refine To').set(
|
||||||
self.controlStop)
|
self.controlStop)
|
||||||
|
# Move playback node path to specified time
|
||||||
|
self.getWidget('Playback', 'Time').set(value)
|
||||||
self.fAdjustingValues = 0
|
self.fAdjustingValues = 0
|
||||||
|
|
||||||
def setRefineStop(self, value):
|
def setRefineStop(self, value):
|
||||||
@ -1119,6 +1159,8 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
if self.refineStop < self.controlStop:
|
if self.refineStop < self.controlStop:
|
||||||
self.getWidget('Refine Page', 'Control Stop').set(
|
self.getWidget('Refine Page', 'Control Stop').set(
|
||||||
self.refineStop)
|
self.refineStop)
|
||||||
|
# Move playback node path to specified time
|
||||||
|
self.getWidget('Playback', 'Time').set(value)
|
||||||
self.fAdjustingValues = 0
|
self.fAdjustingValues = 0
|
||||||
|
|
||||||
def getPostPoints(self):
|
def getPostPoints(self):
|
||||||
@ -1152,6 +1194,57 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.xyzCurveFitter.addPoint(adjustedTime, pos)
|
self.xyzCurveFitter.addPoint(adjustedTime, pos)
|
||||||
self.hprCurveFitter.addPoint(adjustedTime, hpr)
|
self.hprCurveFitter.addPoint(adjustedTime, hpr)
|
||||||
|
|
||||||
|
def setCropFrom(self,value):
|
||||||
|
self.cropFrom = value
|
||||||
|
# Someone else is adjusting values, let them take care of it
|
||||||
|
if self.fAdjustingValues:
|
||||||
|
return
|
||||||
|
self.fAdjustingValues = 1
|
||||||
|
if self.cropFrom > self.cropTo:
|
||||||
|
self.getWidget('Crop Page', 'Crop To').set(
|
||||||
|
self.cropFrom)
|
||||||
|
# Move playback node path to specified time
|
||||||
|
self.getWidget('Playback', 'Time').set(value)
|
||||||
|
self.fAdjustingValues = 0
|
||||||
|
|
||||||
|
def setCropTo(self,value):
|
||||||
|
self.cropTo = value
|
||||||
|
# Someone else is adjusting values, let them take care of it
|
||||||
|
if self.fAdjustingValues:
|
||||||
|
return
|
||||||
|
self.fAdjustingValues = 1
|
||||||
|
if self.cropTo < self.cropFrom:
|
||||||
|
self.getWidget('Crop Page', 'Crop From').set(
|
||||||
|
self.cropTo)
|
||||||
|
# Move playback node path to specified time
|
||||||
|
self.getWidget('Playback', 'Time').set(value)
|
||||||
|
self.fAdjustingValues = 0
|
||||||
|
|
||||||
|
def cropCurve(self):
|
||||||
|
# Keep handle on old points
|
||||||
|
oldPoints = self.pointSet
|
||||||
|
# Create new point set
|
||||||
|
self.createNewPointSet()
|
||||||
|
# Copy over points between from/to
|
||||||
|
# Reset curve fitters
|
||||||
|
self.xyzCurveFitter.reset()
|
||||||
|
self.hprCurveFitter.reset()
|
||||||
|
# Set flag
|
||||||
|
self.fHasPoints = 0
|
||||||
|
for time, pos, hpr in oldPoints:
|
||||||
|
# Is it within the time?
|
||||||
|
if ((time > self.cropFrom) &
|
||||||
|
(time < self.cropTo)):
|
||||||
|
# Add it to the curve fitters
|
||||||
|
t = time - self.cropFrom
|
||||||
|
self.xyzCurveFitter.addPoint(t, pos )
|
||||||
|
self.hprCurveFitter.addPoint(t, hpr)
|
||||||
|
# And the point set
|
||||||
|
self.pointSet.append([t, pos, hpr])
|
||||||
|
self.fHasPoints = 1
|
||||||
|
# Compute curve
|
||||||
|
self.computeCurves()
|
||||||
|
|
||||||
## WIDGET UTILITY FUNCTIONS ##
|
## WIDGET UTILITY FUNCTIONS ##
|
||||||
def addWidget(self, widget, category, text):
|
def addWidget(self, widget, category, text):
|
||||||
self.widgetDict[category + '-' + text] = widget
|
self.widgetDict[category + '-' + text] = widget
|
||||||
@ -1183,11 +1276,11 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
return (frame, label, entry)
|
return (frame, label, entry)
|
||||||
|
|
||||||
def createButton(self, parent, category, text, balloonHelp, command,
|
def createButton(self, parent, category, text, balloonHelp, command,
|
||||||
side = 'top', expand = 0):
|
side = 'top', expand = 0, fill = X):
|
||||||
widget = Button(parent, text = text)
|
widget = Button(parent, text = text)
|
||||||
# Do this after the widget so command isn't called on creation
|
# Do this after the widget so command isn't called on creation
|
||||||
widget['command'] = command
|
widget['command'] = command
|
||||||
widget.pack(side = side, fill = X, expand = expand)
|
widget.pack(side = side, fill = fill, expand = expand)
|
||||||
self.bind(widget, balloonHelp)
|
self.bind(widget, balloonHelp)
|
||||||
self.widgetDict[category + '-' + text] = widget
|
self.widgetDict[category + '-' + text] = widget
|
||||||
return widget
|
return widget
|
||||||
|
Loading…
x
Reference in New Issue
Block a user