birdeye绘制拓扑关系图

1.flex简单介绍

  Flex 是一个高效、免费的开源框架,可用于构建具有表现力的 Web应用程序,这些应用程序利用Adobe Flash PlayerAdobe AIR, 可以实现跨浏览器、桌面和操作系统。虽然只能使用 Flex 框架构建 Flex应用程序,但Adobe Flash Builder™(之前称为 Adobe Flex Builder™)软件可以通过智能编码、交互式遍历调试以及可视设计用户界面布局等功能加快开发。

  另外,FLEX的另一个组件Springgraph也可以做关系图,刚开始做项目的时候选择的就是这个,后来感觉SPRINGGRAPH的示例没有Birdeye详细,就依然抛弃掉了,不过在这里为大家提供一些帮助信息

  http://www.chaosreigns.com/code/springgraph/

2.birdeye简单介绍

  BirdEye是一个开源的Adobe Flex图表制作组件。用于创建多维数据分析可视化界面。birdeye 可以绘制 拓扑图,关系图,流程图,星空图,地图,饼图 等等..

  birdeye官网的源码现在如果不翻墙已经无法下载了,不过网上可以搜到非官网的源码以及一官网demo

3.birdeye应用于项目实战

  使用birdeye绘制出一个人员关系图,完成后的效果如下

初始化加载的时候,将某一人员的下一级全部展示出来,点击某一个人员选择人员关系,再将所有人员返回展示

4.一步步实现birdeye人员关系图

  1.借助官方demo的Level4示例

  官方展示出的图如下

  1>首先修改渲染的样式,代码如下:

vgraph.edgeRenderer = new DirectedBalloonEdgeRenderer(vgraph.edgeDrawGraphics);
//将这句改为
vgraph.itemRenderer=new ClassFactory(DefaultNodeRenderer);

  2>修改图形图标

  修改图标需要修改birdeye的源码,把下载好的源码导入项目,打开EmdeddedIcons.as这个类,添加图片绑定

[Bindable]
[Embed(source="nodes/99.png")]
static public var treeIcon:Class;

  接着在generateImage方法中添加如下代码:

case "tree":
img.source = EmbeddedIcons.treeIcon;

操作完成之后,在数据源里边即可使用新添加的图标

  3>初始化加载数据

  我在做测试的时候使用的是WebService,接口编写这里不再赘述,直接使用

  先添加WebService类

<mx:WebService id="ws1" wsdl="http://localhost:5000/FlexService.asmx?wsdl" result="onResult(event)">
<mx:operation name="getChildNodeXMLByID">
</mx:operation>
<mx:operation name="getXml">
</mx:operation>
<mx:operation name="getNodeXMLByFTID">
<mx:request>
<name></name>
</mx:request>
</mx:operation>
</mx:WebService>

  简单介绍一下,wsdl是接口地址,result是一回调函数,执行获取数据之后的操作,operation是接口中的方法,request是参数

  完成之后,接下来完成AS代码

  在creationComplete里边,初始化数据

//初始化加载 数据
ws1.getOperation("getChildNodeXMLByID").send();

  这里的初始化数据,只是去调用webservice,却并未能对返回的数据进行展示

  还需要再对Webservice的回调函数中,进行如下操作:

//webservice返回数据之后的处理
internal function onResult(evt:ResultEvent):void
{
try
{
/* init a graph object with the XML data */
graph = new org.un.cava.birdeye.ravis.graphLayout.data.Graph("XMLAsDocsGraph",false,new XML(evt.result)); /* set the graph in the VGraph object, this automatically
* initializes the VGraph items;
* note: vgraph is the id of the mxml specified VisualGraph component */
vgraph.graph = graph; /* set the default layouter type */
layouter = new ConcentricRadialLayouter(vgraph);
vgraph.layouter = layouter; /* set autofit */
layouter.autoFitEnabled = true; /* set the layouter */
// vgraph.edgeRenderer =new DefaultEdgeRenderer;
vgraph.itemRenderer=new ClassFactory(DefaultNodeRenderer); /* set the layouter */
//vgraph.edgeRenderer = new DirectedBalloonEdgeRenderer(vgraph.edgeDrawGraphics);
/* set the visibility limit options, default 2
* a.k.a degrees of separation */
vgraph.maxVisibleDistance = ; /* select a root node, most layouters requires a root node
* Note: Id 1 is referring to node id in the XML file */
startRoot = graph.nodeByStringId("").vnode; /* set if edge labels should be displayed */
vgraph.displayEdgeLabels = true; /* the following kicks it off .... */
vgraph.currentRootVNode = startRoot;
initDone = true;
vgraph.draw(); }catch(e:Error)
{
Alert.show("没有下个节点!");
}
}

  至此,如果没有意外,关系图应该可以绘制出来了。

  4>添加右键菜单

  选中节点之后,弹出一个对话窗口,选择人员关系,绘制图形

  数据初始化完成之后,执行如下AS代码

private function showContextMenu():void{
var myContextMenu:ContextMenu=new ContextMenu();
var GoUrl1:ContextMenuItem=new ContextMenuItem("人员关系");
GoUrl1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,rightContextMenu);
var GoUrl2:ContextMenuItem=new ContextMenuItem("人档查询");
GoUrl2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,rightContextMenu);
var GoUrl3:ContextMenuItem=new ContextMenuItem("删除节点");
GoUrl3.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,rightContextMenu);
var GoUrl4:ContextMenuItem=new ContextMenuItem("删除子节点");
GoUrl4.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,rightContextMenu);
myContextMenu.customItems.push(GoUrl1);
myContextMenu.customItems.push(GoUrl2);
myContextMenu.customItems.push(GoUrl3);
myContextMenu.customItems.push(GoUrl4);
myContextMenu.hideBuiltInItems();
vgraph.contextMenu=myContextMenu;
//this.contextMenu=myContextMenu;
} private function rightContextMenu(event:ContextMenuEvent):void
{
if(event.mouseTarget["className"]=="DefaultNodeRenderer")
{
var sid:String=event.mouseTarget["data"].node.stringid;
if(event.currentTarget.caption=="人员关系"){
//弹出选择窗口
var ww:MyWindow;
ww = MyWindow(PopUpManager.createPopUp(this.parent,MyWindow));
ww.nodeid=sid;
PopUpManager.centerPopUp(ww); GraphRefush.dis.addEventListener(GraphRefush.EVENT_REFUSH,onfefush); //ws1.getOperation("getChildNodeXMLByID").send(sid); }else if(event.currentTarget.caption=="人档查询"){
ExternalInterface.call("rygxList","");
}else if(event.currentTarget.caption=="删除节点"){
Alert.show("确定要删除当前节点吗?");
}else{
Alert.show("确定要删除当前节点的所有子节点吗?");
}
}
else
{
Alert.show("请选中节点","提示信息");
}
}

  代码说明:

showContextMenu()方法的功能,主要是创建右键时的弹出菜单
rightContextMenu()方法的功能,主要是根据点击执行不同的操作。
rightContextMenu()方法里边有一个。MyWindow,该类是自定义的一MXML组件,主要是显示所有人员关系类型。代码如下:
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="" height="" close="titlewindow1_closeHandler(event)" title="人员关系选择">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.managers.PopUpManager; protected function titlewindow1_closeHandler(event:CloseEvent):void
{
// TODO Auto-generated method stub
PopUpManager.removePopUp(this);
}
protected function all_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
if(all.selected)
{
tz.selected=true;
tx.selected=true;
thk.selected=true;
t1.selected=true;
t2.selected=true;
t3.selected=true;
t4.selected=true;
t5.selected=true;
t6.selected=true;
}
else
{
tz.selected=false;
tx.selected=false;
thk.selected=false;
t1.selected=false;
t2.selected=false;
t3.selected=false;
t4.selected=false;
t5.selected=false;
t6.selected=false;
}
} public var nodeid:String=""; protected function save():void
{
// TODO Auto-generated method stub
var b:Birdeye =new Birdeye(); var result:String="";
if(tz.selected)
{
result="选中了同住";
} if(tx.selected)
{
if(result!="")
{
result+=";";
}
result+="选中了同乡";
} if(thk.selected)
{
if(result!="")
{
result+=";";
}
result+="选中了同户口";
}
//b.ws1.getOperation("getChildNodeXMLByID").send(nodeid);
b.reflash(result,nodeid); PopUpManager.removePopUp(this);
}
]]>
</fx:Script>
<fx:Style>
@namespace s "library://ns.adobe.com/flex/spark";
@namespace mx "library://ns.adobe.com/flex/mx"; .img{ }
</fx:Style>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations> <s:VGroup top="" width="100%" horizontalAlign="center" verticalAlign="middle">
<s:HGroup width="100%" horizontalAlign="center"> <s:VGroup width="33%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x1.png')" styleName="img"/><mx:CheckBox label="同住" id="tz"></mx:CheckBox>
</s:VGroup>
<s:VGroup width="34%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x2.png')" styleName="img"/><mx:CheckBox label="同乡" id="tx"></mx:CheckBox>
</s:VGroup>
<s:VGroup width="33%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x3.png')" styleName="img"/><mx:CheckBox label="同户口" id="thk"></mx:CheckBox>
</s:VGroup>
</s:HGroup>
<s:HGroup width="100%">
<s:VGroup width="33%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x4.png')" styleName="img"/><mx:CheckBox label="同住宿" id="t1"></mx:CheckBox>
</s:VGroup>
<s:VGroup width="34%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x5.png')" styleName="img"/><mx:CheckBox label="同车" id="t2"></mx:CheckBox>
</s:VGroup>
<s:VGroup width="33%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x6.png')" styleName="img"/><mx:CheckBox label="同学" id="t3"></mx:CheckBox>
</s:VGroup>
</s:HGroup>
<s:HGroup width="100%">
<s:VGroup width="33%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x7.png')" styleName="img"/><mx:CheckBox label="朋友" id="t4"></mx:CheckBox>
</s:VGroup>
<s:VGroup width="34%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x8.png')" styleName="img"/><mx:CheckBox label="同事" id="t5"></mx:CheckBox>
</s:VGroup>
<s:VGroup width="33%" horizontalAlign="center">
<s:Image source="@Embed('assets/imgs/x8.png')" styleName="img"/><mx:CheckBox label="同村" id="t6"></mx:CheckBox>
</s:VGroup>
</s:HGroup>
<s:HGroup width="100%" paddingTop="" horizontalAlign="center">
<s:HGroup horizontalAlign="left">
<mx:CheckBox id="all" label="全选" click="all_clickHandler(event)"
horizontalCenter="left"></mx:CheckBox>
</s:HGroup>
<s:HGroup horizontalAlign="center">
<s:Button label="确定" click="save()">
</s:Button>
</s:HGroup>
</s:HGroup>
</s:VGroup>
</s:TitleWindow>

5.中文乱码或报错问题解决

  源代码中的例子中,默认情况下输入中文是不显示的。原因是Ravis的例子中的内嵌了字体库MyriadWebPro.ttf和 MyriadWebPro-Bold.ttf,并通过style/main.css文件将这个字体库构造字体作为工程的默认字体,但是这个库没有包含中文 字体。

  内嵌中文字体的最大问题是生成swf文件非常大,内嵌入网页很不合适。

  解决办法是:打开style/main.css文件,删除下面这两个样式

@font-face
{
src: url("assets/fonts/MyriadWebPro.ttf");
font-family: main;
font-style: normal;
font-weight: normal;
} @font-face
{
src: url("assets/fonts/MyriadWebPro-Bold.ttf");
font-family: main;
font-style: normal;
font-weight: bold;
}

6.总结

  据上所述,需求功能基本上都已实现。里边有很多细节没有仔细去介绍,比如birdeye的节点单击事件,双击事件,右键时的事件操作,以及节点之间的关系,属性展示等,这些在官网的DEMO里边都有详细的说明。

  

利用Flex组件birdeye绘制拓扑关系图的更多相关文章

  1. 前台利用jcrop做头像选择预览,后台通过django利用Uploadify组件上传图最终使用PIL做图像裁切

    之前一直使用python的PIL自定义裁切图片,今天有需求需要做一个前端的选择预览页面,索性就把这个功能整理一下,分享给大家. 实现思路: 1.前端页面: 用户选择本地一张图片,然后通过鼠标缩放和移动 ...

  2. 【UML九种图系列】之如何利用三层来绘制类图、时序图?

    UML并发视图:实体之间行为的交互,是动态.分为:时序图.协作图.状态图.活动图 一.时序图简述: 时序图(Sequence Diagram):描述对象之间的交互行为,按照时间顺序排列. 元素: 角色 ...

  3. Android自己定义组件系列【9】——Canvas绘制折线图

    有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了非常多插件,可是非常多时候我们须要依据详细项目自己定义这些图表,这一篇文章我们一起来看看怎样在Android中使用Can ...

  4. Android自定义组件系列【9】——Canvas绘制折线图

    有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas ...

  5. 利用matlibplot绘制雷达图

    之前在一些数据分析案例中看到用 Go 语言绘制的雷达图,非常的漂亮,就想着用matlibplot.pyplot也照着画一个,遗憾的是matlibplot.pyplot模块中没有直接绘制雷达图的函数,不 ...

  6. 利用 Dijit 组件框架打造丰富的用户界面

    原文出处:Joe Lennon 从头开始学习 Dojo,第 3 部分 利用 Dijit 组件框架打造丰富的用户界面 Dijit 是什么? Dijit 是 Dojo 工具包的富组件用户界面库.这些组件完 ...

  7. 利用javascript和WebGL绘制地球 【翻译】

    利用javascript和WebGL绘制地球 [翻译] 原翻译:利用javascript和WebGL绘制地球 [翻译] 在我们所有已知的HTML5API中,WebGL可能是最有意思的一个,利用这个AP ...

  8. 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...

  9. 【带着canvas去流浪(7)】绘制水球图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 文字淹水效果的实现 五. 关于canvas抗锯齿 六. 小结 示例代码托管在:http://www.github.com/dashnowor ...

随机推荐

  1. install google chrome

    32bit: wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb sudo dpkg -i go ...

  2. 关于vue.js中列表渲染练习

    html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...

  3. 【转载】javascript与C#的语法区别

    由于博主不允许的情况下不允许转载,我在这里只放上链接 http://blog.csdn.net/ranlianjie/article/details/2484139

  4. (zhuan) Deep Reinforcement Learning Papers

    Deep Reinforcement Learning Papers A list of recent papers regarding deep reinforcement learning. Th ...

  5. JVM 参数分配

    http://stackoverflow.com/questions/41216388/java-jvm-parameter-xms-doesnt-take-effect-immediately It ...

  6. SQL 语言 - 数据库系统原理

    SQL 发展历程 从 1970 年美国 IBM 研究中心的 E.F.Codd 发表论文到 1974 年 Boyce 和 Chamberlin 把 SQUARE 语言改为 SEQUEL 语言,到现在的 ...

  7. How to create/restore a slave using GTID replication in MySQL 5.6

    MySQL 5.6 is GA! Now we have new things to play with and in my personal opinion the most interesting ...

  8. Oracle学习笔记(二)

    2.Oracle用户管理 (1)创建用户:create user 用户名 identified by 密码(需要dba权限); sql>create user yzw identified by ...

  9. shiro 自动登录

    1.出现的错误:did not match the expected credentials---密码不匹配,后来自己写密码验证,其实作用不大: 配置 <!-- Shiro权限过滤过滤器定义 - ...

  10. C#调试器导航

    本快速入门演示如何在 Visual Studio 调试会话中导航,以及如何在会话中查看和更改程序状态. 本 快速入门适用于不熟悉用 Visual Studio 进行调试的开发人员,以及要详细了解在 V ...