fenfire-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ff-cvs] fenfire/org/fenfire demo/mm.py fenmm/MMNode.jav...


From: Asko Soukka
Subject: [ff-cvs] fenfire/org/fenfire demo/mm.py fenmm/MMNode.jav...
Date: Mon, 25 Aug 2003 03:27:51 -0400

CVSROOT:        /cvsroot/fenfire
Module name:    fenfire
Branch:         
Changes by:     Asko Soukka <address@hidden>    03/08/25 03:27:51

Modified files:
        org/fenfire/demo: mm.py 
        org/fenfire/fenmm: MMNode.java MindNet.java 
        org/fenfire/view/lava: mindMapView2D.py 
Added files:
        org/fenfire/fenmm: MMGeometry.java MMPlace.java 

Log message:
        abstracting geometery, though, it's now temporarily broken, rotating 
makes feel dizzy =)

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/demo/mm.py.diff?tr1=1.34&tr2=1.35&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenmm/MMGeometry.java?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenmm/MMPlace.java?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenmm/MMNode.java.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenmm/MindNet.java.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/view/lava/mindMapView2D.py.diff?tr1=1.37&tr2=1.38&r1=text&r2=text

Patches:
Index: fenfire/org/fenfire/demo/mm.py
diff -u fenfire/org/fenfire/demo/mm.py:1.34 fenfire/org/fenfire/demo/mm.py:1.35
--- fenfire/org/fenfire/demo/mm.py:1.34 Sun Aug 24 06:52:11 2003
+++ fenfire/org/fenfire/demo/mm.py      Mon Aug 25 03:27:51 2003
@@ -29,6 +29,7 @@
 from org.fenfire.vocab import *
 from org.fenfire.vocab.lava import *
 from org.fenfire.swamp import Nodes
+from org.fenfire.fenmm import MMGeometry
 from org.nongnu.libvob.util import PUIClipboard
 import org.nongnu.alph as alph
 import org.nongnu.storm as storm
@@ -208,10 +209,6 @@
     def setSlowAnimation(self):
         self.fastMouseChg = 0
         self.replaceVS = None
-    def getScale(self, depth):
-        return 1-(Math.log(depth+1)/Math.E)
-    def getTextScale(self, depth):
-        return 1-(Math.log(depth+1)/Math.E)/2
 
 class Action:
     def __init__(self, fen, context):
@@ -250,7 +247,7 @@
             scale = 1./main.getFocus().getZoom()
 
             # scaling
-            nodeScale = self.context.getTextScale(100+into[2])
+            nodeScale = ff.fenmm.MMGeometry.getTextScale(int(100+into[2]))
 
             if node == self.context.main.getPlane(): # from border to linked
                 cursor.setOffset((x-into[0])/scale/nodeScale, 
(y-into[1])/scale/nodeScale)
@@ -325,9 +322,13 @@
         self.mindMouse.setListener(1, 0,'Moving the pan around or the node if 
accursed.', \
                           PanMover(fen, self.context))
 
-        self.view = ff.view.lava.mindMapView2D.MindMapView2D(fen, 
self.context, 5)
+        self.view = ff.view.lava.mindMapView2D.MindMapView2D(fen, self.context)
         self.main = ff.view.lava.mindMapView2D.MindMapMainNode2D(fen, 
self.context, self.view, self.mindMouse)
         self.context.main = self.main
+        dimensions = w.getSize()
+        self.view.filletLength = dimensions.width * 1./4.
+        self.view.filletWidth = dimensions.height * 1./15.
+        self.view.depth = 5
 
         # flag for cursor('wait')
         self.startup = 1 
@@ -346,10 +347,10 @@
             self.axes = [None, None, None]
 
             if self.naxes >= 1:
-                self.axes[0] = vob.input.impl.StandardBoundedFloatModel(0.001, 
self.view.filletWidth*2,
+                self.axes[0] = vob.input.impl.StandardBoundedFloatModel(1, 
self.view.filletWidth*2,
                     actionPerformed = lambda x: 
vob.AbstractUpdateManager.chg())
             if self.naxes >= 2:
-                self.axes[1] = vob.input.impl.StandardBoundedFloatModel(0.001, 
self.view.filletLength*2,
+                self.axes[1] = vob.input.impl.StandardBoundedFloatModel(1, 
self.view.filletLength*2,
                     actionPerformed = lambda x: 
vob.AbstractUpdateManager.chg())
             if self.naxes >= 3:
                 self.axes[2] = vob.input.impl.WrappingBoundedFloatModel(0, 
Math.PI*2, 
@@ -370,7 +371,7 @@
         # custom controller support
         if self.naxes >= 1: self.view.filletWidth = self.axes[0].getValue()
         if self.naxes >= 2: self.view.filletLength = self.axes[1].getValue()
-        if self.naxes >= 3: self.view.rotation = -self.axes[2].getValue()
+        if self.naxes >= 3: self.view.initRotation = -self.axes[2].getValue()
 
         accursed = self.context.c.getAccursed()
         # adding accursed to multiplexer
Index: fenfire/org/fenfire/fenmm/MMNode.java
diff -u fenfire/org/fenfire/fenmm/MMNode.java:1.1 
fenfire/org/fenfire/fenmm/MMNode.java:1.2
--- fenfire/org/fenfire/fenmm/MMNode.java:1.1   Sun Aug 17 20:50:20 2003
+++ fenfire/org/fenfire/fenmm/MMNode.java       Mon Aug 25 03:27:51 2003
@@ -24,7 +24,7 @@
  * Written by Matti J. Katila, Asko Soukka
  */
 
-/** MMNode structure stores the Node and its related MM spesific information.
+/** MMNode structure stores a Node and its related MM spesific information.
  * The drawing depth is quite important factor in FenMM structure view.
  * Since nodes are not necessarily drawn in depth order, it should be
  * stored with node.
Index: fenfire/org/fenfire/fenmm/MindNet.java
diff -u fenfire/org/fenfire/fenmm/MindNet.java:1.4 
fenfire/org/fenfire/fenmm/MindNet.java:1.5
--- fenfire/org/fenfire/fenmm/MindNet.java:1.4  Sun Aug 17 21:07:15 2003
+++ fenfire/org/fenfire/fenmm/MindNet.java      Mon Aug 25 03:27:51 2003
@@ -83,7 +83,7 @@
         ((ArrayList)net.get(a)).add(b);
     }
 
-    public Object put(Object a, Object pl, int depth) {
+    public Object put(Object a, MMPlace pl, int depth) {
        return data.put(a, new MMNode(pl, depth));
     }
     
@@ -92,12 +92,12 @@
        return (MMNode)data.get(a);
     }
 
-    public Object getPlace(Object a) {
+    public MMPlace getPlace(Object a) {
         if (data.get(a) == null) return null;
-       return ((MMNode)data.get(a)).object;
+       return (MMPlace)((MMNode)data.get(a)).object;
     }
 
-    public int  getDepth(Object a) {
+    public int getDepth(Object a) {
         if (data.get(a) == null) return -1;
        return ((MMNode)data.get(a)).depth;
     }
Index: fenfire/org/fenfire/view/lava/mindMapView2D.py
diff -u fenfire/org/fenfire/view/lava/mindMapView2D.py:1.37 
fenfire/org/fenfire/view/lava/mindMapView2D.py:1.38
--- fenfire/org/fenfire/view/lava/mindMapView2D.py:1.37 Sun Aug 24 06:52:11 2003
+++ fenfire/org/fenfire/view/lava/mindMapView2D.py      Mon Aug 25 03:27:51 2003
@@ -26,8 +26,8 @@
 import org.fenfire as ff
 from org.fenfire.vocab import STRUCTLINK, RDF
 from org.fenfire.vocab.lava import MINDSTRUCT
-
-from org.fenfire.fenmm import MindNet
+from org.fenfire.util.lava import Traversals
+from org.fenfire.fenmm import MindNet, MMGeometry
 
 def p(*s):
     print 'mindMapView2D', s
@@ -115,23 +115,16 @@
         vs.coords.activate(cs)
 
 class MindMapView2D(ff.view.View2D):
-    def __init__(self, fen, context, depth):
+    def __init__(self, fen, context):
         self.fen = fen
         self.context = context
 
         self.multiplexer = self.context.multiplexer
 
-        self.filletWidth = 15. # divider
-        self.filletLength = 4. # divider
-        self.rotation = 0.
-
-        self.maxDepth = depth
-
-        self.box = None
-
-        # Stored data to help interpolation to nodes next to accursed
-        self.current = {'centerNode': None, 'startAngle': 0., 'rotationAngle': 
0.}
-        self.previous = {'centerNode': None, 'startAngle': 0., 
'rotationAngle': 0.}
+        self.depth = 5
+        self.filletWidth = 20
+        self.filletLength = 150
+        self.initRotation = 0
         
         # fillet set up
         self.angle = 1
@@ -155,90 +148,33 @@
         self.tblsize = 20
         self.mode = 0
 
-    def getNodeSize(self, depth):
-        """Node size is relative to depth as 1-(Math.log(depth)/Math.E)."""
-        assert depth <= self.maxDepth, 'Depth is greater than maxDepth.'
-
-        s =(self.box[1] * 1./self.filletWidth) * self.context.getScale(depth)
-        if dbg: p('fillet size:', s)
-        return s
-
-    def getDistance(self, depth):
-        """Node distance is relative to depth as 1-(Math.log(depth)/Math.E)."""
-        assert depth <= self.maxDepth, 'Depth is greater than maxDepth.'
-        if depth == 0: return 0
-
-        d = (self.box[0] * 1./self.filletLength) * self.context.getScale(depth)
-        if dbg: p('fillet length: ', d)
-        return d
+        self.oldCenter = None
 
     def render(self, vs, node,
                matchingParent, box2screen, box2plane):
         self.matchingParent = matchingParent
-#        p("Rendering view.")
-
-#      if dbg:
-#            p('Drawing screenbox')
-#          dbg1 = vs.unitSqCS(box2screen, "UNIT_SCREEN")
-#          vs.put(vob.coloredQuad((0,1,0)), dbg1)
-
-#      paper2box = vs.invertCS(box2plane, "minMap_INv")
-#      paper2screen = vs.concatCS(box2screen, 'mindMap_CONCAT',
-#                                   paper2box)
 
        paper2screen = vs.concatCS(box2screen, 'mindMap_CONCAT',
                                    box2plane)
         box = jarray.zeros(2, 'f')
         vs.coords.getSqSize(box2screen, box)
-        self.box = box
-
        paper2screen = vs.translateCS(paper2screen, 'mindMap_TRANS',
                                    box[0], box[1], 0)
         # XXX
         self.zoomPanCS = paper2screen
         
-        # links between nodes and also storin nodes currently.
-        self.net = MindNet()
-
-
-        ### Get the cs for center node
-        pl = self.getPlace(vs, paper2screen, 0,0, node, 0,0)
-        self.net.put(node, pl, 0)
-
-        # If update interpolation help data only, if has moved
-        if self.current['centerNode'] != node: self.previous = 
self.current.copy()
-                         
-        links = self.getLinks(self.fen, node)
-
-        # Now, let's see, where we have came from...
-        previousIndex = None
-        currentIndex = None
-        if (self.previous['centerNode'] != None):
-            previousLinks = self.getLinks(self.fen, 
self.previous['centerNode'])
-            try:
-                previousIndex = previousLinks.index(node)
-                currentIndex = links.index(self.previous['centerNode'])
-            except ValueError: pass
-
-        if len(links) == 0:
-            self.net.link(node, node) # XXX probably not the right way
-        if len(links) > 0:
-            rotationAngle = 2*Math.PI / float(len(links))
-
-            # Calculates the "correct" starting angle
-            if previousIndex != None and currentIndex != None:
-                startAngle = self.previous['startAngle'] \
-                             + 
self.previous['rotationAngle']*float(previousIndex)-Math.PI \
-                             + rotationAngle*float(len(links)-currentIndex)
-            else: startAngle = 0
-
-            for i in range(2, self.maxDepth+1):
-                self.doMindMapCS(vs, paper2screen, node, None, links, 0,0,
-                                 startAngle + self.rotation, rotationAngle, 1, 
i)
-            self.current['startAngle'] = startAngle
-            self.current['rotationAngle'] = rotationAngle
+        path = Traversals.findShortestPath((self.oldCenter or node),
+                                          STRUCTLINK.linkedTo,
+                                          node, self.fen.graph)
+        if not path or path.size() == 0:
+            path = java.util.ArrayList(1)
+            path.add(node)
+         
+        geometry = MMGeometry(self.fen.graph, self.filletLength, 
self.filletWidth,
+                              self.initRotation, self.depth)
+        self.net = geometry.buildMindNet(vs, paper2screen, path)
         self.drawMindMap(vs)
-        self.current['centerNode'] = node
+        self.oldCenter = node
 
     def drawMindMap(self, vs):
         i = self.net.iterator()
@@ -246,15 +182,15 @@
             node = i.next()
             pl = self.net.getPlace(node)
             if pl == None: continue
-            c = [ pl[0] ]
+            c = [ pl.cs ]
 
             it = self.net.iterator(node)
             while it.hasNext():
                 n = it.next()
                 pl2 = self.net.getPlace(n)
                 if pl2 == None: continue
-                c.append(pl2[0])
-                if dbg: p('info:', pl2[0], pl2[1], pl2[2])
+                c.append(pl2.cs)
+                if dbg: p('info:', pl2.cs, pl2.x, pl2.y)
 
             if dbg: p('Fillet coordinates:', c)
             def pc(conns, cs):
@@ -266,93 +202,21 @@
             vob.fillet.light3d.drawFillets(self, vs, pc)
 
             # draw text etc..
-            cs = vs.coords.translate(pl[0], 0,0, -100)
+            cs = vs.coords.translate(pl.cs, 0,0, -100)
             vs.matcher.add(self.matchingParent, cs, node)
             self.putNodeContent(vs, node, cs)
 
-    def getLinks(self, fen, node):
-        """Get all links available with node."""
-        nodes = []
-        iter = fen.graph.findN_11X_Iter(node, STRUCTLINK.linkedTo)
-        while iter.hasNext():
-            nodes.append(iter.next())
-        iter = fen.graph.findN_X11_Iter(STRUCTLINK.linkedTo, node)
-        while iter.hasNext():
-            nodes.append(iter.next())
-        if dbg: p('Found linked nodes: ', nodes)
-        return nodes
-
-    def doMindMapCS(self, vs, into, centerNode, oldCenter, links, x, y,
-                    startAngle, rotationAngle, depth, maxDepth):
-        """ Recursively go through all cs """
-        fen = self.fen
-
-        if depth < maxDepth:
-            for i in range(len(links)):
-                link = links[i]
-                if link == centerNode: raise 'own node!!'
-                if self.net.hasBeenLinked(centerNode, link): continue
-                self.net.link(centerNode, link)
-            
-                if self.net.getPlace(link) == None:
-                    pl = self.getPlace(vs, into, x, y, link, 
startAngle+rotationAngle*i, depth)
-                    if dbg: p('Add a new node', pl)
-                    self.net.put(link, pl, depth)
-                else:
-                    pl = self.net.getPlace(link)
-                    if dbg: p('Reached an old node', pl)
-
-        if depth >= maxDepth: return
-        for i in range(len(links)):
-            link = links[i]
-            if link == oldCenter: continue
-
-            place = self.net.getPlace(link)
-            newLinks = self.getLinks(fen, link)
-            newAngle = Math.PI*2./float(len(newLinks))
-
-            fromIndex = None
-            try: fromIndex = newLinks.index(centerNode)
-            except ValueError: pass
-            if fromIndex != None:
-                newStartAngle = (startAngle+rotationAngle*i-Math.PI) \
-                                + newAngle*float(len(newLinks)-fromIndex)
-            else: newStartAngle = 0
-            
-            self.doMindMapCS(vs, into, link, centerNode, newLinks, place[1], 
place[2],
-                             newStartAngle, newAngle, depth + 1, maxDepth)
-            
-    def getPlace(self, vs, into, x0,y0, key, angle, depth):
-        xy = self.getXY(x0,y0, angle, depth)
-        x,y = xy[0], xy[1]
-
-        s = self.getNodeSize(depth)
-        if (dbg): print 'size', s
-        cs = vs.orthoBoxCS(into,'foo'+str(key),depth, x-s/2.0,y-s/2.0, 1,1, 
s,s)
-        if dbg:
-            p('Place seed:',x0, y0, angle)
-            p('Constructed place:',cs, xy, angle, s)
-        return [cs, x, y, angle]
-
-    def getXY(self, x0, y0, angle, depth):
-        if depth == 0: return [0,0]
-
-        r = self.getDistance(depth)
-        x = x0 + Math.sin(angle) * r
-        y = y0 + Math.cos(angle) * r
-        return [x,y, r]
-
-
     def putNodeContent(self, vs, node, cs):
         # scaling after depth
         depth = self.net.getDepth(node)
-        scale = self.context.getTextScale(depth)
+        scale = ff.fenmm.MMGeometry.getScale(depth)
+        textScale = ff.fenmm.MMGeometry.getTextScale(depth)
 
         p = self.multiplexer.f(self.fen.graph, node) 
 
-        x = self.getNodeSize(depth)/2 - (p.getWidth()*scale)/2.0
-        y = self.getNodeSize(depth)/2 - (p.getHeight()*scale)/2.0
+        x = (self.filletWidth*scale)/2 - (p.getWidth()*textScale)/2.0
+        y = (self.filletWidth*scale)/2 - (p.getHeight()*textScale)/2.0
 
-        cs = vs.orthoBoxCS(cs,node,0, x,y, scale, scale, p.getWidth(), 
p.getHeight())
+        cs = vs.orthoBoxCS(cs,node,0, x,y, textScale, textScale, p.getWidth(), 
p.getHeight())
         p.place(vs, cs)
         vs.coords.activate(cs)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]