[Top][All Lists]
[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)