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/MindNet.ja...


From: Asko Soukka
Subject: [ff-cvs] fenfire/org/fenfire demo/mm.py fenmm/MindNet.ja...
Date: Sun, 17 Aug 2003 20:50:20 -0400

CVSROOT:        /cvsroot/fenfire
Module name:    fenfire
Branch:         
Changes by:     Asko Soukka <address@hidden>    03/08/17 20:50:20

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

Log message:
        fixing, refactoring, centering text on fillets...

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/demo/mm.py.diff?tr1=1.21&tr2=1.22&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenmm/MMNode.java?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenmm/MindNet.java.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/view/doublegeometer.py.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/view/lava/mindMapView2D.py.diff?tr1=1.25&tr2=1.26&r1=text&r2=text

Patches:
Index: fenfire/org/fenfire/demo/mm.py
diff -u fenfire/org/fenfire/demo/mm.py:1.21 fenfire/org/fenfire/demo/mm.py:1.22
--- fenfire/org/fenfire/demo/mm.py:1.21 Sun Aug 17 15:55:01 2003
+++ fenfire/org/fenfire/demo/mm.py      Sun Aug 17 20:50:19 2003
@@ -18,8 +18,7 @@
 # MA  02111-1307  USA
 # 
 
-
-# This demo is a for mindmap
+# This demo is for FenMM - Mind Mapping on Fenfire
 
 import java, jarray, math
 from java.lang import Math
@@ -42,10 +41,38 @@
     print 'mindMapView2D', s
 
 dbg = 0
-
 w.setCursor("wait")
 vob.putil.demo.usingNormalBindings = 1
 
+print """
+
+     ############################### 
+     ##                           ##
+     ##  LOADING FenMM1.0 v0.0    ##
+     ##                           ##
+     ###############################
+
+
+FenMM is brought to you by the Fenfire team (http://fenfire.org).
+ 
+Fenfire is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+ 
+Fenfire is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
+Public License for more details.
+ 
+You should have received a copy of the GNU Lesser General
+Public License along with Fenfire; if not, write to the Free
+Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+MA  02111-1307  USA
+ 
+
+"""
+
 # storm pool directory and mindmap file
 DIR = 'myFenfire/'
 FILE = DIR+'mindmap.rdf'
@@ -86,13 +113,12 @@
 fen.enfiladeOverlap = fen.txt.getTransclusionIndex()
 alphContent = ff.util.AlphContent(fen)
 
-textstyle = vob.GraphicsAPI.getInstance().getTextStyle("sans", 0, 24)
-nodeview = ff.view.TextNodeView(fen.txtfunc, textstyle, 1)
+textstyle = vob.GraphicsAPI.getInstance().getTextStyle("sansserif", 0, 24)
+nodeview = ff.view.TextNodeView(fen.txtfunc, textstyle)
 mindView = ff.view.lava.mindMapView2D.MindMapView2D(fen, nodeview)
 
 
-class Context(ff.view.buoy.AbstractMainNode2D.Context,
-              ff.view.lava.TextHandler.Context):
+class Context(ff.view.buoy.AbstractMainNode2D.Context):
     def __init__(self):
         self.rmb_switch = [ 'go', 'link', 'unlink' ]
         self.oldVS = None
@@ -115,7 +141,7 @@
 
     def drawCursor(self, vs, node, cs):
         xy = jarray.zeros(2, 'f')
-        nodeview.getXY(fen.graph, context.getAccursed(), context.offset, xy)
+        nodeview.getXY(fen.graph, context.getAccursed(), self.offset, xy)
         cs = vs.orthoCS(cs, "CURSOR", 0, xy[0]*self.scale, xy[1]*self.scale,
                         0, -textstyle.getHeight(self.scale))
         vs.put(vob.vobs.LineVob(0,0,0,1, java.awt.Color.black), cs)
@@ -185,7 +211,9 @@
            text.setCursorOffset(-1)
 
 context = Context()
-nodeview.setContext(context)
+ 
+## obsolete
+#nodeview.setContext(context)
 
 
 if not do_load_graph:
@@ -207,7 +235,7 @@
     def clicked(self, x,y):
         vs = context.oldVS
         node = vs.getKeyAt(0, x,y, None)
-        if dbg: p('key', node)
+        p('key', node)
 
         if node == None: return
 
Index: fenfire/org/fenfire/fenmm/MindNet.java
diff -u fenfire/org/fenfire/fenmm/MindNet.java:1.2 
fenfire/org/fenfire/fenmm/MindNet.java:1.3
--- fenfire/org/fenfire/fenmm/MindNet.java:1.2  Sun Aug 17 15:55:01 2003
+++ fenfire/org/fenfire/fenmm/MindNet.java      Sun Aug 17 20:50:20 2003
@@ -34,15 +34,21 @@
 import java.util.HashMap;
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.lang.Integer;
 
 public class MindNet {
     public static final String rcsid = "$Id:";
 
     private final static int INITIAL_CAPACITY = 10;
 
-    private HashMap net = null;
+    private final HashMap net;
 
-    public MindNet() {net = new HashMap(); }
+    private final HashMap data;
+
+    public MindNet() {
+       net = new HashMap();
+       data = new HashMap();
+    }
 
     /** Check if node a has been marked to be linked with node b.
      * @param a The first node.
@@ -61,13 +67,38 @@
      * @param a The first node.
      * @param b The second node.
      */
-    public void link(Object node, Object with) {
-       linkImpl(node, with);
-       linkImpl(with, node);
+    public void link(Object a, Object b) {
+       linkImpl(a, b);
+       linkImpl(b, a);
+    }
+
+    public Iterator iterator() { return net.keySet().iterator(); }
+    public Iterator iterator(Object a) { 
+        if (net.get(a) == null) return null;
+       else return ((ArrayList)net.get(a)).iterator();
+    }
+
+    private void linkImpl(Object a, Object b) {
+        if (net.get(a) == null) net.put(a, new ArrayList(INITIAL_CAPACITY));
+        ((ArrayList)net.get(a)).add(b);
+    }
+
+    public Object set(Object a, Object pl, int depth) {
+       return data.put(a, new MMNode(pl, depth));
+    }
+    
+    public MMNode get(Object a) {
+        if (data.get(a) == null) return null;
+       return (MMNode)data.get(a);
+    }
+
+    public Object getPlace(Object a) {
+        if (data.get(a) == null) return null;
+       return ((MMNode)data.get(a)).object;
     }
 
-    private void linkImpl(Object node, Object with) {
-        if (net.get(node) == null) net.put(node, new 
ArrayList(INITIAL_CAPACITY));
-        ((ArrayList)net.get(node)).add(with);
+    public int  getDepth(Object a) {
+        if (data.get(a) == null) return -1;
+       return ((MMNode)data.get(a)).depth;
     }
 }
Index: fenfire/org/fenfire/view/doublegeometer.py
diff -u fenfire/org/fenfire/view/doublegeometer.py:1.5 
fenfire/org/fenfire/view/doublegeometer.py:1.6
--- fenfire/org/fenfire/view/doublegeometer.py:1.5      Sun Aug 17 06:04:40 2003
+++ fenfire/org/fenfire/view/doublegeometer.py  Sun Aug 17 20:50:20 2003
@@ -1,3 +1,5 @@
+# (c): Tuomas J. Lukka, Matti J. Katila
+
 import vob
 from org import fenfire as ff
 
Index: fenfire/org/fenfire/view/lava/mindMapView2D.py
diff -u fenfire/org/fenfire/view/lava/mindMapView2D.py:1.25 
fenfire/org/fenfire/view/lava/mindMapView2D.py:1.26
--- fenfire/org/fenfire/view/lava/mindMapView2D.py:1.25 Sun Aug 17 15:55:02 2003
+++ fenfire/org/fenfire/view/lava/mindMapView2D.py      Sun Aug 17 20:50:20 2003
@@ -18,7 +18,6 @@
 # MA  02111-1307  USA
 # 
 
-
 from __future__ import nested_scopes
 import java, jarray, math
 from java.lang import Math
@@ -30,6 +29,8 @@
 from org.fenfire.vocab.lava import MINDSTRUCT as MIND
 from org.fenfire.swamp import Nodes
 
+from org.fenfire.fenmm import MindNet
+
 def p(*s):
     print 'mindMapView2D', s
 
@@ -42,6 +43,9 @@
 whiteground_accursed = vob.gl.GLRen.createFixedPaperQuad(paper_accursed, 0, 0, 
1, 1, 0, 10, 10, 10)
 whiteground_unused = vob.gl.GLRen.createFixedPaperQuad(paper_unused, 0, 0, 1, 
1, 0, 10, 10, 10)
 
+pikakakku = java.util.HashMap()
+
+
 class MindMapMainNode2D(ff.view.buoy.MainNode2D):
     def __init__(self, plane, view2d, focus, controller):
        ff.view.buoy.MainNode2D.__init__(self, plane, view2d, controller);
@@ -103,36 +107,6 @@
         if self.context and self.context.getAccursed() == node:
             self.context.drawCursor(vs, node, cs)
 
-class MindNet:
-    """ Keeps up nodes in hashmap of 'linked to' nodes in hashmap.
-        Point-to-point list of connections.    """
-    def __init__(self):
-        self.n = java.util.HashMap()
-    def hasBeenLinked(self, node, with):
-        if self.n.get(node) == None: return 0
-        iter = self.n.get(node).keySet().iterator()
-        while iter.hasNext():
-            if iter.next() == with: return 1
-        return 0
-    def link(self, node, with):
-        self._link(node, with)
-        self._link(with, node)
-    def _link(self, node, with):
-        if self.n.get(node) == None:
-            self.n.put(node, java.util.HashMap())
-        self.n.get(node).put(with, '1')
-
-class Node:
-    def __init__(self, node, depth):
-        self._node = node
-        self._depth = depth
-        # self.x ??
-        # self.y ??
-        
-    def getDepth(self): return self._depth
-    
-
-
 class MindMapView2D(ff.view.View2D):
     def __init__(self, fen, nodef):
         self.fen = fen
@@ -141,8 +115,8 @@
         self.nodef = nodef
         self.context = None
         self.maxDepth = 5
-        self.nodeScale = 17.5
-        self.distanceScale = 5.
+        self.nodeScale = 15
+        self.distanceScale = 4.
         self.rotation = 0.
 
         # Stored data to help interpolation to nodes next to accursed
@@ -173,10 +147,6 @@
         self.tblsize = 20
         self.mode = 0
 
-    def getSize(self, node, wh):
-        s = -1 # s = 240
-        wh[0], wh[1] = s, s
-
     def getNodeSize(self, depth):
         """Node size is relative to depth as 1-math.log10(depth)."""
         assert depth <= self.maxDepth, 'Depth is greater than maxDepth.'
@@ -210,11 +180,7 @@
        paper2screen = vs.concatCS(box2screen, 'mindMap_CONCAT',
                                    paper2box)
 
-        # nodes which has been handled
-        self.nodes = java.util.HashMap()
-        self.doLink = java.util.HashMap()
-
-        # links between nodes.
+        # links between nodes and also storin nodes currently.
         self.net = MindNet()
 
         box = jarray.zeros(2, 'f')
@@ -224,7 +190,7 @@
 
         ### Get the cs for center node
         pl = self.getPlace(vs, paper2screen, 0,0, node, 0,0)
-        self.nodes.put(node, pl)
+        self.net.set(node, pl, 0)
 
         # If update interpolation help data only, if has moved
         if self.current['centerNode'] != node: self.previous = 
self.current.copy()
@@ -241,7 +207,9 @@
                 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:
+            self.net.setDepth(node, 0)
+            self.net.link(node, node) # XXX probably not the right way
         if len(links) > 0:
             rotationAngle = 2*Math.PI / float(len(links))
 
@@ -261,17 +229,17 @@
         self.current['centerNode'] = node
 
     def drawMindMap(self, vs):
-        i = self.net.n.keySet().iterator()
+        i = self.net.iterator()
         while i.hasNext():
             node = i.next()
-            pl = self.nodes.get(node)
+            pl = self.net.getPlace(node)
             if pl == None: continue
             c = [ pl[0] ]
 
-            it = self.net.n.get(node).keySet().iterator()
+            it = self.net.iterator(node)
             while it.hasNext():
                 n = it.next()
-                pl2 = self.nodes.get(n)
+                pl2 = self.net.getPlace(n)
                 if pl2 == None: continue
                 c.append(pl2[0])
                 if dbg: p('info:', pl2[0], pl2[1], pl2[2])
@@ -281,12 +249,13 @@
                 if self.context and self.context.getAccursed() == node:
                     vs.put(vob.putil.misc.getDListNocoords("Color 1. 0. 0."))
                 vs.put(conns, cs+c)
+#                print cs, c, node
 
             # draw fillets
             vob.fillet.light3d.drawFillets(self, vs, pc)
 
-            cs = pl[0]
             # draw text etc..
+            cs = vs.coords.translate(pl[0], 0,0, -100)
             vs.matcher.add(self.matchingParent, cs, node)
             self.putNodeContent(vs, node, cs)
 
@@ -314,20 +283,19 @@
                 if self.net.hasBeenLinked(centerNode, link): continue
                 self.net.link(centerNode, link)
             
-                if self.nodes.get(link) == None:
+                if self.net.getPlace(link) == None:
                     pl = self.getPlace(vs, into, x, y, link, 
startAngle+rotationAngle*i, depth)
                     if dbg: p('new node', pl)
-                    self.nodes.put(link, pl)
-                    self.doLink.put(link, '1')
+                    self.net.set(link, pl, depth)
                 else:
-                    pl = self.nodes.get(link)
+                    pl = self.net.getPlace(link)
                     if dbg: p('old node', pl)
 
         # debugging..
         if dbg:
             p('main node:',self.alphContent.getText(centerNode))
             for link in links:
-                p('    ',self.alphContent.getText(link),self.nodes.get(link))
+                p('    
',self.alphContent.getText(link),self.net.getPlace(link))
 
         if depth >= maxDepth: return
         for i in range(len(links)):
@@ -336,7 +304,7 @@
             if 1: # Ask mudyc about this, how this will affect
 #            if self.doLink.get(link) != None:
 #               self.doLink.put(link, None)
-                place = self.nodes.get(link)
+                place = self.net.getPlace(link)
                 newLinks = self.getLinks(fen, link)
                 newAngle = Math.PI*2./float(len(newLinks))
 
@@ -356,7 +324,8 @@
         x,y = xy[0], xy[1]
 
         s = self.getNodeSize(depth)
-        cs = vs.orthoBoxCS(into,'foo'+str(key),0, x-s/2.0,y-s/2.0, 1,1, s,s)
+        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('come:',x0,y0, angle)
             p(cs, xy, angle, s)
@@ -372,22 +341,36 @@
 
 
     def putNodeContent(self, vs, node, cs):
-        p = self.nodef.f(self.fen.graph, node)
+#        into = jarray.zeros(3, 'f')
+#        vs.coords.transformPoints3(cs, [0,0,0], into)
+        
+        # scaling
+        depth = self.net.getDepth(node)
+        scale = depth+4
+        if self.maxDepth > 40: scale *= 40./self.maxDepth
+        scale = 1-math.log10(scale/4.)
 
-        box = jarray.zeros(2, 'f')
-        vs.coords.getSqSize(cs, box)
+#        self.nodef.setScale(scale)
 
-        cs = vs.translateCS(cs, 'trans', 0,0, -1200)
-        
-        x = box[0]/2.0 - p.getWidth()/2.0
-        y = box[1]/2.0 - p.getHeight()/2.0
+        if self.context and self.context.getAccursed() == node:
+            p = self.nodef.f(self.fen.graph, node) 
+            pikakakku.put(node, p)
+        else:
+            p = pikakakku.get(node)
+            if not p:
+                p = self.nodef.f(self.fen.graph, node)
+                pikakakku.put(node, p)
+#        self.nodef.setScale(1.)
+
+        x = self.getNodeSize(depth)/2 - p.getWidth()/2.0
+        y = self.getNodeSize(depth)/2 - p.getHeight()/2.0
 
-        cs_background = vs.orthoCS(cs,'background',0, x,y, p.getWidth(), 
p.getHeight())
+        cs_background = vs.orthoCS(cs,'background',0, x,y, p.getWidth()*scale, 
p.getHeight()*scale)
         if self.context and self.context.getAccursed() == node:
             vs.put(whiteground_accursed, cs_background)
         else: vs.put(whiteground, cs_background)
 
-        cs = vs.orthoBoxCS(cs,node,0, x,y, 1,1, p.getWidth(), p.getHeight())
+        cs = vs.orthoBoxCS(cs,node,0, x,y, scale, scale, p.getWidth(), 
p.getHeight())
         p.place(vs, cs)
         vs.coords.activate(cs)
 




reply via email to

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