Browse Source

*** empty log message ***

Mark Mine 25 years ago
parent
commit
b827edb766

+ 4 - 4
direct/src/particles/ForceGroup.py

@@ -99,11 +99,11 @@ class ForceGroup(DirectObject):
 		    radius = f.getRadius()
 		    radius = f.getRadius()
 		    falloffType = f.getFalloffType()
 		    falloffType = f.getFalloffType()
 		    ftype = 'FTONEOVERR'
 		    ftype = 'FTONEOVERR'
-		    if (falloffType == LinearDistanceForce.LinearDistanceForce.FTONEOVERR):
+		    if (falloffType == LinearDistanceForce.FTONEOVERR):
 		    	ftype = 'FTONEOVERR'
 		    	ftype = 'FTONEOVERR'
-		    elif (falloffType == LinearDistanceForce.LinearDistanceForce.FTONEOVERRSQUARED):
+		    elif (falloffType == LinearDistanceForce.FTONEOVERRSQUARED):
 		    	ftype = 'FTONEOVERRSQUARED'
 		    	ftype = 'FTONEOVERRSQUARED'
-		    elif (falloffType == LinearDistanceForce.LinearDistanceForce.FTONEOVERRCUBED):
+		    elif (falloffType == LinearDistanceForce.FTONEOVERRCUBED):
 		    	ftype = 'FTONEOVERRCUBED'
 		    	ftype = 'FTONEOVERRCUBED'
 		    forceCenter = f.getForceCenter()
 		    forceCenter = f.getForceCenter()
 		    if isinstance(f, LinearSinkForce):
 		    if isinstance(f, LinearSinkForce):
@@ -117,7 +117,7 @@ class ForceGroup(DirectObject):
 		elif isinstance(f, LinearNoiseForce):
 		elif isinstance(f, LinearNoiseForce):
 		    file.write(fname + ' = LinearNoiseForce(%.4f, %d)\n' % (amplitude, massDependent))
 		    file.write(fname + ' = LinearNoiseForce(%.4f, %d)\n' % (amplitude, massDependent))
 		elif isinstance(f, LinearVectorForce):
 		elif isinstance(f, LinearVectorForce):
-		    vec = f.getLocalVector()
+		    vec = f.getVector()
 		    file.write(fname + ' = LinearVectorForce(Vec3(%.4f, %.4f, %.4f), %.4f, %d)\n' % (vec[0], vec[1], vec[2], amplitude, massDependent))
 		    file.write(fname + ' = LinearVectorForce(Vec3(%.4f, %.4f, %.4f), %.4f, %d)\n' % (vec[0], vec[1], vec[2], amplitude, massDependent))
 	    elif isinstance(f, AngularForce):
 	    elif isinstance(f, AngularForce):
 		if isinstance(f, AngularVectorForce):
 		if isinstance(f, AngularVectorForce):

+ 93 - 39
direct/src/tkpanels/ParticlePanel.py

@@ -119,6 +119,20 @@ class ParticlePanel(AppShell):
                   'Select effect to configure or create new effect')
                   'Select effect to configure or create new effect')
         self.effectsLabelMenu.add_command(label = 'Create New Effect',
         self.effectsLabelMenu.add_command(label = 'Create New Effect',
                                           command = self.createNewEffect)
                                           command = self.createNewEffect)
+        self.effectsLabelMenu.add_command(
+            label = 'Select Particle Effect',
+            command = lambda s = self: direct.select(s.particleEffect))
+        self.effectsLabelMenu.add_command(
+            label = 'Place Particle Effect',
+            command = lambda s = self: Placer.place(s.particleEffect))
+        def togglePEVis(s = self):
+            if s.particleEffect.isHidden():
+                s.particleEffect.show()
+            else:
+                s.particleEffect.hide()
+        self.effectsLabelMenu.add_command(
+            label = 'Toggle Effect Vis',
+            command = togglePEVis)
         self.effectsEnableMenu = Menu(self.effectsLabelMenu, tearoff = 0)
         self.effectsEnableMenu = Menu(self.effectsLabelMenu, tearoff = 0)
         self.effectsLabelMenu.add_cascade(label = 'Enable/Disable',
         self.effectsLabelMenu.add_cascade(label = 'Enable/Disable',
                                           menu = self.effectsEnableMenu)
                                           menu = self.effectsEnableMenu)
@@ -242,7 +256,7 @@ class ParticlePanel(AppShell):
             ('Factory', 'Mass',
             ('Factory', 'Mass',
              'Average particle mass',
              'Average particle mass',
              self.setFactoryParticleMass,
              self.setFactoryParticleMass,
-             0.0, None),
+             0.001, None),
             ('Factory', 'Mass Spread',
             ('Factory', 'Mass Spread',
              'Variation in particle mass',
              'Variation in particle mass',
              self.setFactoryParticleMassSpread,
              self.setFactoryParticleMassSpread,
@@ -625,8 +639,12 @@ class ParticlePanel(AppShell):
 
 
         self.addForceButton.pack(expand = 0)
         self.addForceButton.pack(expand = 0)
 
 
+        # Scrolled frame to hold force widgets
+        self.sf = Pmw.ScrolledFrame(forcePage, horizflex = 'elastic')
+        self.sf.pack(fill = 'both', expand = 1)
+        self.forceFrame = self.sf.interior()
         # Notebook to hold force widgets as the are added
         # Notebook to hold force widgets as the are added
-        self.forceGroupNotebook = Pmw.NoteBook(forcePage, tabpos = None)
+        self.forceGroupNotebook = Pmw.NoteBook(self.forceFrame, tabpos = None)
         self.forceGroupNotebook.pack(fill = X)
         self.forceGroupNotebook.pack(fill = X)
         
         
         self.factoryNotebook.setnaturalsize()
         self.factoryNotebook.setnaturalsize()
@@ -679,10 +697,6 @@ class ParticlePanel(AppShell):
                       maxVelocity = 10.0, **kw):
                       maxVelocity = 10.0, **kw):
         kw['text'] = text
         kw['text'] = text
         kw['min'] = min
         kw['min'] = min
-        if min != None:
-            kw['initialValue'] = min
-        else:
-            kw['initialValue'] = 0.0
         kw['maxVelocity'] = maxVelocity
         kw['maxVelocity'] = maxVelocity
         kw['resolution'] = resolution
         kw['resolution'] = resolution
         widget = apply(Floater.Floater, (parent,), kw)
         widget = apply(Floater.Floater, (parent,), kw)
@@ -710,7 +724,6 @@ class ParticlePanel(AppShell):
         kw['text'] = text
         kw['text'] = text
         kw['min'] = min
         kw['min'] = min
         kw['max'] = max
         kw['max'] = max
-        kw['initialValue'] = min
         kw['resolution'] = resolution
         kw['resolution'] = resolution
         widget = apply(EntryScale.EntryScale, (parent,), kw)
         widget = apply(EntryScale.EntryScale, (parent,), kw)
         # Do this after the widget so command isn't called on creation
         # Do this after the widget so command isn't called on creation
@@ -817,7 +830,7 @@ class ParticlePanel(AppShell):
     def updateEffectsMenus(self):
     def updateEffectsMenus(self):
         # Get rid of old effects entries if any
         # Get rid of old effects entries if any
         self.effectsEnableMenu.delete(0, 'end')
         self.effectsEnableMenu.delete(0, 'end')
-        self.effectsLabelMenu.delete(2, 'end')
+        self.effectsLabelMenu.delete(5, 'end')
         self.effectsLabelMenu.add_separator()
         self.effectsLabelMenu.add_separator()
         # Add in a checkbutton for each effect (to toggle on/off)
         # Add in a checkbutton for each effect (to toggle on/off)
         keys = self.effectsDict.keys()
         keys = self.effectsDict.keys()
@@ -963,6 +976,7 @@ class ParticlePanel(AppShell):
             parent = self.parent)
             parent = self.parent)
         if particleFilename:
         if particleFilename:
             self.particleEffect.loadConfig(Filename(particleFilename))
             self.particleEffect.loadConfig(Filename(particleFilename))
+            self.selectEffectNamed(self.particleEffect.getName())
 
 
     def saveParticleEffectToFile(self):
     def saveParticleEffectToFile(self):
         # Find path to particle directory
         # Find path to particle directory
@@ -1532,7 +1546,12 @@ class ParticlePanel(AppShell):
             self.forceGroupNotebook.pack(fill = X)
             self.forceGroupNotebook.pack(fill = X)
             self.forcePageName = (self.particleEffect.getName() + '-' +
             self.forcePageName = (self.particleEffect.getName() + '-' +
                                   self.forceGroup.getName())
                                   self.forceGroup.getName())
-            self.forcePage = self.forcePagesDict[self.forcePageName]
+            self.forcePage = self.forcePagesDict.get(
+                self.forcePageName, None)
+            # Page doesn't exist, add it
+            if self.forcePage == None:
+                self.addForceGroupNotebookPage(
+                    self.particleEffect, self.forceGroup)
             self.forceGroupNotebook.selectpage(self.forcePageName)
             self.forceGroupNotebook.selectpage(self.forcePageName)
         else:
         else:
             self.forceGroupNotebook.pack_forget()
             self.forceGroupNotebook.pack_forget()
@@ -1635,6 +1654,23 @@ class ParticlePanel(AppShell):
             pass
             pass
         self.forceGroupNotebook.setnaturalsize()
         self.forceGroupNotebook.setnaturalsize()
 
 
+    def createForceFrame(self, forcePage, forceName, force):
+        frame = Frame(forcePage, relief = RAISED, borderwidth = 2)
+        lFrame = Frame(frame, relief = FLAT)
+        def removeForce(s = self, f = force, fr = frame):
+            s.forceGroup.removeForce(f)
+            fr.pack_forget()
+        b = Button(lFrame, text = 'X',
+                   command = removeForce)
+        b.pack(side = 'right', expand = 0)
+        Label(lFrame, text = forceName,
+              foreground = 'Blue',
+              font=('MSSansSerif', 12, 'bold'),
+              ).pack(expand = 1, fill = 'x')
+        lFrame.pack(fill = 'x', expand =1)
+        frame.pack(pady = 3, fill = 'x', expand =0)
+        return frame
+
     def createLinearForceWidgets(self, frame, pageName, forceName, force):
     def createLinearForceWidgets(self, frame, pageName, forceName, force):
         def setAmplitude(amp, f = force):
         def setAmplitude(amp, f = force):
             f.setAmplitude(amp)
             f.setAmplitude(amp)
@@ -1648,12 +1684,14 @@ class ParticlePanel(AppShell):
             f.setVectorMasks(xMask, yMask, zMask)
             f.setVectorMasks(xMask, yMask, zMask)
         self.createFloater(frame, pageName, forceName + ' Amplitude',
         self.createFloater(frame, pageName, forceName + ' Amplitude',
                            'Force amplitude multiplier',
                            'Force amplitude multiplier',
-                           command = setAmplitude)
+                           command = setAmplitude,
+                           initialValue = force.getAmplitude())
         cbf = Frame(frame, relief = FLAT)
         cbf = Frame(frame, relief = FLAT)
         self.createCheckbutton(cbf, pageName, forceName + ' Mass Dependent',
         self.createCheckbutton(cbf, pageName, forceName + ' Mass Dependent',
                                ('On: force depends on mass; ' +
                                ('On: force depends on mass; ' +
                                 'Off: force does not depend on mass'),
                                 'Off: force does not depend on mass'),
-                               toggleMassDependent, 0)
+                               toggleMassDependent,
+                               force.getMassDependent())
         self.createCheckbutton(cbf, pageName, forceName + ' Mask X',
         self.createCheckbutton(cbf, pageName, forceName + ' Mask X',
                                'On: enable force along X axis',
                                'On: enable force along X axis',
                                setVectorMasks, 1)
                                setVectorMasks, 1)
@@ -1678,34 +1716,34 @@ class ParticlePanel(AppShell):
         def setVec(vec, f = force):
         def setVec(vec, f = force):
             f.setVector(vec[0], vec[1], vec[2])
             f.setVector(vec[0], vec[1], vec[2])
         forceName = 'Vector Force-' + `count`
         forceName = 'Vector Force-' + `count`
-        frame = Frame(forcePage, relief = RAISED, borderwidth = 2)
+        frame = self.createForceFrame(forcePage, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
+        vec = force.getVector()
         self.createVector3Entry(frame, pageName, forceName,
         self.createVector3Entry(frame, pageName, forceName,
                                 'Set force direction and magnitude',
                                 'Set force direction and magnitude',
-                                command = setVec)
+                                command = setVec,
+                                initialValue = [vec[0], vec[1], vec[2]])
         self.createForceActiveWidget(frame, pageName, forceName, force)
         self.createForceActiveWidget(frame, pageName, forceName, force)
-        frame.pack(fill = 'x', expand =0)
 
 
     def createLinearRandomForceWidget(self, forcePage, pageName, count,
     def createLinearRandomForceWidget(self, forcePage, pageName, count,
                                 force, type):
                                 force, type):
         forceName = type + ' Force-' + `count`
         forceName = type + ' Force-' + `count`
-        frame = Frame(forcePage, relief = RAISED, borderwidth = 2)
+        frame = self.createForceFrame(forcePage, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
         self.createForceActiveWidget(frame, pageName, forceName, force)
         self.createForceActiveWidget(frame, pageName, forceName, force)
-        frame.pack(fill = 'x', expand =0)
 
 
     def createLinearFrictionForceWidget(self, forcePage, pageName,
     def createLinearFrictionForceWidget(self, forcePage, pageName,
                                         count, force):
                                         count, force):
         def setCoef(coef, f = force):
         def setCoef(coef, f = force):
             f.setCoef(coef)
             f.setCoef(coef)
         forceName = 'Friction Force-' + `count`
         forceName = 'Friction Force-' + `count`
-        frame = Frame(forcePage, relief = RAISED, borderwidth = 2)
+        frame = self.createForceFrame(forcePage, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
-        self.createFloater(frame, pageName, forceName,
+        self.createFloater(frame, pageName, forceName + ' Coef',
                            'Set linear friction force',
                            'Set linear friction force',
-                           command = setCoef, min = None)
+                           command = setCoef, min = None,
+                           initialValue = force.getCoef())
         self.createForceActiveWidget(frame, pageName, forceName, force)
         self.createForceActiveWidget(frame, pageName, forceName, force)
-        frame.pack(fill = 'x', expand =0)
 
 
     def createLinearCylinderVortexForceWidget(self, forcePage, pageName,
     def createLinearCylinderVortexForceWidget(self, forcePage, pageName,
                                               count, force):
                                               count, force):
@@ -1716,19 +1754,21 @@ class ParticlePanel(AppShell):
             f.setLength(length)
             f.setLength(length)
         def setRadius(radius, f = force):
         def setRadius(radius, f = force):
             f.setRadius(radius)
             f.setRadius(radius)
-        frame = Frame(forcePage, relief = RAISED, borderwidth = 2)
+        frame = self.createForceFrame(forcePage, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
-        self.createFloater(frame, pageName, 'Coefficient',
+        self.createFloater(frame, pageName, forceName + ' Coef',
                            'Set linear cylinder vortex coefficient',
                            'Set linear cylinder vortex coefficient',
-                           command = setCoef)
-        self.createFloater(frame, pageName, 'Length',
+                           command = setCoef,
+                           initialValue = force.getCoef())
+        self.createFloater(frame, pageName, forceName + ' Length',
                            'Set linear cylinder vortex length',
                            'Set linear cylinder vortex length',
-                           command = setLength)
-        self.createFloater(frame, pageName, 'Radius',
+                           command = setLength,
+                           initialValue = force.getLength())
+        self.createFloater(frame, pageName, forceName + ' Radius',
                            'Set linear cylinder vortex radius',
                            'Set linear cylinder vortex radius',
-                           command = setRadius)
+                           command = setRadius,
+                           initialValue = force.getRadius())
         self.createForceActiveWidget(frame, pageName, forceName, force)
         self.createForceActiveWidget(frame, pageName, forceName, force)
-        frame.pack(fill = 'x', expand =0)
 
 
     def createLinearDistanceForceWidget(self, forcePage, pageName,
     def createLinearDistanceForceWidget(self, forcePage, pageName,
                                         count, force, type):
                                         count, force, type):
@@ -1747,22 +1787,36 @@ class ParticlePanel(AppShell):
         def setRadius(radius, f = force):
         def setRadius(radius, f = force):
             f.setRadius(radius)
             f.setRadius(radius)
         forceName = type + ' Force-' + `count`
         forceName = type + ' Force-' + `count`
-        frame = Frame(forcePage, relief = RAISED, borderwidth = 2)
+        frame = self.createForceFrame(forcePage, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
         self.createLinearForceWidgets(frame, pageName, forceName, force)
-        self.createOptionMenu(frame, pageName, forceName + ' Falloff Type',
-                              'Set force falloff type',
-                              ('FT_ONE_OVER_R',
-                               'FT_ONE_OVER_R_SQUARED',
-                               'FT_ONE_OVER_R_CUBED'),
-                              command = setFalloffType)
-        self.createVector3Entry(frame, pageName, forceName + ' Force Center',
+        var = self.createOptionMenu(
+            frame, pageName, forceName + ' Falloff',
+            'Set force falloff type',
+            ('FT_ONE_OVER_R',
+             'FT_ONE_OVER_R_SQUARED',
+             'FT_ONE_OVER_R_CUBED'),
+            command = setFalloffType)
+        self.getWidget(pageName, forceName + ' Falloff').configure(
+            label_width = 16)
+        falloff = force.getFalloffType()
+        if falloff == LinearDistanceForce.FTONEOVERR:
+            var.set('FT_ONE_OVER_R')
+        elif falloff == LinearDistanceForce.FTONEOVERRSQUARED:
+            var.set('FT_ONE_OVER_R_SQUARED')
+        elif falloff == LinearDistanceForce.FTONEOVERRCUBED:
+            var.set('FT_ONE_OVER_R_CUBED')
+        vec = force.getForceCenter()
+        self.createVector3Entry(frame, pageName, forceName + ' Center',
                                 'Set center of force',
                                 'Set center of force',
-                                command = setForceCenter)
+                                command = setForceCenter,
+                                label_width = 16,
+                                initialValue = [vec[0], vec[1], vec[2]])
         self.createFloater(frame, pageName, forceName + ' Radius',
         self.createFloater(frame, pageName, forceName + ' Radius',
                            'Set falloff radius',
                            'Set falloff radius',
-                           command = setRadius)
+                           command = setRadius,
+                           min = 0.01,
+                           initialValue = force.getRadius())
         self.createForceActiveWidget(frame, pageName, forceName, force)
         self.createForceActiveWidget(frame, pageName, forceName, force)
-        frame.pack(fill = 'x', expand =0)
 
 
 ######################################################################
 ######################################################################
 
 

+ 1 - 1
direct/src/tkwidgets/Floater.py

@@ -69,7 +69,7 @@ class Floater(Pmw.MegaWidget):
                                           text = self['text'],
                                           text = self['text'],
                                           width = 12,
                                           width = 12,
                                           anchor = 'center',
                                           anchor = 'center',
-                                          font = "Arial 12 bold")
+                                          font = "Arial 10 bold")
         self.label.pack(side='left', expand = 1, fill = 'x')
         self.label.pack(side='left', expand = 1, fill = 'x')
 
 
         # Now pack the frame
         # Now pack the frame