`
cobo85
  • 浏览: 116920 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用VML实现动态关系图

阅读更多

         前段时间因项目需要实现一个能直观的表达出商品流向的功能。当初考虑了,SVG和VML以及生成图片来显示,因为系统一般在IE下使用,最后采用了VML实现,下面是实现后的几张贴图。

 

 

 由于时间比较仓促只实现了基本功能没有细化,看起来比较粗糙。

       下面主要简述下实现的思路及主要代码,废话不多说代码贴上。

 

 

       线及长方形的显示主要是由几个DTO来描述:

//矩形DTO
public class RectangleDTO {
    private double left;//矩形图左起点
    private double top;//矩形图顶点
    private double width;//矩形宽度
    private String enterpriseName;//图形名称
    private String rectangleColor;//矩形底色
    private String characterColor;//字体颜色
    private double lineX;//从矩形图引出线的X坐标
    private double lineY;//从矩形图引出线的Y坐标
    

    public double getLeft() {
        return left;
    }

    public void setLeft(double left) {
        this.left = left;
    }

    public double getTop() {
        return top;
    }

    public void setTop(double top) {
        this.top = top;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public String getEnterpriseName() {
        return enterpriseName;
    }

    public void setEnterpriseName(String enterpriseName) {
        this.enterpriseName = enterpriseName;
    }

    public String getRectangleColor() {
        return rectangleColor;
    }

    public void setRectangleColor(String rectangleColor) {
        this.rectangleColor = rectangleColor;
    }

    public String getCharacterColor() {
        return characterColor;
    }

    public void setCharacterColor(String characterColor) {
        this.characterColor = characterColor;
    }

    public double getLineX() {
        return lineX;
    }

    public void setLineX(double lineX) {
        this.lineX = lineX;
    }

    public double getLineY() {
        return lineY;
    }

    public void setLineY(double lineY) {
        this.lineY = lineY;
    }
}
//细化下矩形的点,为线的起始点做准备
public class RectangleAllDTO extends RectangleDTO{
    private double leftX;//矩形框左中点X坐标
    private double leftY;//矩形框左中点Y坐标
    private double rightX;//矩形框右中点X坐标
    private double rightY;//矩形框右中点Y坐标
    
   public double getLeftX() {
        return leftX;
    }

    public void setLeftX(double leftX) {
        this.leftX = leftX;
    }

    public double getLeftY() {
        return leftY;
    }

    public void setLeftY(double leftY) {
        this.leftY = leftY;
    }

    public double getRightX() {
        return rightX;
    }

    public void setRightX(double rightX) {
        this.rightX = rightX;
    }

    public double getRightY() {
        return rightY;
    }

    public void setRightY(double rightY) {
        this.rightY = rightY;
    }

}

//连线的DTO

public class LineDTO {
    private double startX;//起点X坐标
    private double startY;//起点Y坐标
    private double endX;//终点X坐标
    private double endY;//终点Y坐标
    private double controlX;//为绘曲线的控制点X坐标
    private double controlY;//为绘曲线的控制点Y坐标
    private double contentLeft;//内容文字左起点
    private double contentTop;//内容文字顶点
    private String content;//内容文字
    private double contentWidth;//文字宽度
    private double contentHeight;//文字高度
    private String lineColor;//曲线颜色
    private List contentList = new ArrayList();//文字内容列表

    public void addContent(LineContentDTO object){
        this.contentList.add(object);
    }
    public double getStartX() {
        return startX;
    }

    public void setStartX(double startX) {
        this.startX = startX;
    }

    public double getStartY() {
        return startY;
    }

    public void setStartY(double startY) {
        this.startY = startY;
    }

    public double getEndX() {
        return endX;
    }

    public void setEndX(double endX) {
        this.endX = endX;
    }

    public double getEndY() {
        return endY;
    }

    public void setEndY(double endY) {
        this.endY = endY;
    }

    public double getControlX() {
        return controlX;
    }

    public void setControlX(double controlX) {
        this.controlX = controlX;
    }

    public double getControlY() {
        return controlY;
    }

    public void setControlY(double controlY) {
        this.controlY = controlY;
    }

    public double getContentLeft() {
        return contentLeft;
    }

    public void setContentLeft(double contentLeft) {
        this.contentLeft = contentLeft;
    }

    public double getContentTop() {
        return contentTop;
    }

    public void setContentTop(double contentTop) {
        this.contentTop = contentTop;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public double getContentWidth() {
        return contentWidth;
    }

    public void setContentWidth(double contentWidth) {
        this.contentWidth = contentWidth;
    }

    public String getLineColor() {
        return lineColor;
    }

    public void setLineColor(String lineColor) {
        this.lineColor = lineColor;
    }

    public List getContentList() {
        return contentList;
    }

    public void setContentList(List contentList) {
        this.contentList = contentList;
    }

    public double getContentHeight() {
        return contentHeight;
    }

    public void setContentHeight(double contentHeight) {
        this.contentHeight = contentHeight;
    }
}
//线上文字的DTO

public class LineContentDTO {
    private double left;//文字内容左起点
    private double top; //文字内容顶点
    private double width;//文字内容在页面上所占宽度
    private String content;//文字具体内容

    public double getLeft() {
        return left;
    }

    public void setLeft(double left) {
        this.left = left;
    }

    public double getTop() {
        return top;
    }

    public void setTop(double top) {
        this.top = top;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

 

页面先生成矩形然后在生成连线,矩形的位置和连线的起始点根据自己的业务需求计算出来,这里就不在叙述。页面显示主要代码:

 

<div id="Graph_layer" style="position:absolute;z-index:1; left: 30px; top: 0px;">
            <#list rectangleList as rectangle>
                <v:RoundRect id="_x0000_s00201"
                             style="position:absolute;left:${rectangle.left?string('#.##')}px;top:${rectangle.top?string('#.##')}px;width:${rectangle.width?string('#.##')}px;height:20px;z-index:1"
                             fillcolor="${rectangle.rectangleColor}" strokeweight="1px" strokecolor="#5E80A4"
                             arcsize="0.1">
                    <v:shadow on="T" type="single" color="#b3b3b3" offset="3px,3px"/>
                </v:RoundRect>
                <v:shape inset="0px,0px,0px,0px" id="_x0000_s1025"
                         style="position:absolute;left:${rectangle.left?string('#.##')}px;top:${rectangle.top?string('#.##')}px;width:${rectangle.width?string('#.##')}px;height:30px;z-index:1;text-align:center">
                    <v:textbox><!--  <a onclick="forward('${rectangle.url}')" href="#" title="点击查看详细信息">--><span
                            class="nameStyle"
                            style="color:${rectangle.characterColor}">${rectangle.enterpriseName}</span></a></v:textbox>
                </v:shape>
            </#list>
            <#list lineList as line>
                <v:rect id="_x0000_s1044"
                        style="position:absolute;left:${(line.startX-3)?string('#.##')}px;top:${(line.startY-3)?string('#.##')}px;width:6px;height:6px;z-index:1"
                        filled="f" strokecolor="#436589"></v:rect>
                <v:rect id="_x0000_s1044"
                        style="position:absolute;left:${(line.endX-3)?string('#.##')}px;top:${(line.endY-3)?string('#.##')}px;width:6px;height:6px;z-index:1"
                        filled="f" strokecolor="#436589"></v:rect>
                <v:curve style="position:absolute;left:0px;top:0px;z-index:1"
                         from="${line.startX?string('#.##')}px,${line.startY?string('#.##')}px"
                         to="${line.endX?string('#.##')}px,${line.endY?string('#.##')}px" filled="f"
                         control1="${line.controlX?string('#.##')}px,${line.controlY?string('#.##')}px"
                         onclick="javascript:controlCase(this)"
                         strokecolor="${line.lineColor}" strokeweight="1.0px">
                    <v:stroke opacity="1" startarrow="none" endarrow="block" endarrowwidth="medium" endarrowlength="long"/>
                </v:curve>
                <v:rect id="_x0000_s1040"
                        style="position:absolute;left:${line.contentLeft?string('#.##')}px;top:${line.contentTop?string('#.##')}px;width:${line.contentWidth?string('#.##')}px;height:${line.contentHeight?string('#.##')}px;z-index:1"
                        fillcolor="#FFFFFF" stroked="f">
                    <v:fill type="frame" opacity="0.0"/>
                </v:rect>
                <v:shape inset="0px,0px,0px,0px" id="_x0000_s1025"
                         style="position:absolute;left:${line.contentLeft?string('#.##')}px;top:${line.contentTop?string('#.##')}px;width:${line.contentWidth?string('#.##')}px;height:${line.contentHeight?string('#.##')}px;z-index:1;text-align:left">
                    <v:textbox inset="0px,0px,0px,0px"><span class="lineContentStyle">${line.content}</span></v:textbox>
                </v:shape>
            </#list>
        </div>

 上面的是生成图形主要VML代码。在实现的过程中主要是参考了两个教程,下面也贴出来,喜欢的朋友拿去研究研究。

 

   PS:在实现的过程中想把显示的数字放置到线的中点处,探究发现VML中的曲线是贝塞尔曲线,关于更多的贝塞尔曲线可以参考维基百科。

  • 大小: 14.1 KB
  • 大小: 23 KB
  • vml.zip (2.2 MB)
  • 下载次数: 191
分享到:
评论
1 楼 bingtr 2012-02-29  
只支持ie啊?

相关推荐

    vml实现web拓扑图

    环境:sqlserver2005,vs2008。 说明:利用sql.sql创建数据库,所有东西在NewFolder1文件夹中,可以浏览其... 功能:从xml文件中读取对象(obj),然后再去数据库读取对象关系,利用vml在IE中展示对象关系,支持拖拽。

    VML实现工作流

    3. **VML与WebFlow的关系**:尽管"VML实现工作流"这个标题可能有些误导,因为VML通常不直接与WebFlow相关。但我们可以理解为,这可能是在讨论用图形化的方式(类似VML)来设计WebFlow的工作流模型。在实际开发中,...

    ASP VML走势图

    ASP VML走势图是一种...总结来说,"ASP VML走势图"是一种利用服务器端脚本和矢量图形技术来呈现动态数据图表的方法,它结合了ASP的强大数据处理能力和VML的图形绘制能力,为Web应用提供了丰富的数据可视化解决方案。

    VML 画图 统计图、柱状图、饼图、折线图

    在"VML 画图 统计图、柱状图、饼图、折线图 Powered by MicroSystem_cn.mht"这个文件中,很可能是提供了一个使用VML实现这些图形的示例,包括具体的代码和展示效果。通过查看这个文件,你可以深入学习如何在不支持...

    Think in VML教程

    这个"Think in VML"教程详细地介绍了如何有效地利用VML来创建这些图形。 在学习VML时,首先要理解它的基本语法和结构。VML基于XML,因此,所有的元素都需要闭合,并且遵循严格的命名规则。比如,`&lt;v:shape&gt;` 是一个...

    vml-rose流程图

    在描述中提到的"基于vml的web绘图代码",意味着这个压缩包可能包含了一系列用JavaScript或者其他客户端脚本语言编写的代码,这些代码利用了VML来动态生成和操作流程图。在Web开发中,这种技术通常用于那些需要在不...

    VML.zip_VML_vml 工作流_workflow v_工作流

    通过研究“VML.zip”内的资源,我们可以学习到如何利用VML进行图形化编程,创建用户友好的工作流设计器,并理解工作流管理系统的架构和实现原理。这对于提升我们的Web开发技能,特别是涉及到业务流程自动化和可视化...

    vml柱图,饼图,曲线图

    在JavaScript中,开发者可以利用VML来创建各种图表,如柱状图、饼图和曲线图,以可视化数据。下面我们将详细探讨这些图表的实现和相关知识点。 1. **VML基础** VML是一种基于XML的语言,它可以精确地描述图形元素...

    推荐一款VML工具,非常好和实用

    它可以实现动画效果、页面元素的动态更新以及与用户的实时交互。 .NET框架是由微软开发的一种全面的开发平台,用于构建Windows应用程序和服务。它包括一组丰富的类库、运行时环境和开发工具,支持多种编程语言,如...

    sfgantt.rar_ sfgantt.rar_SFGantt_VML

    描述中的“vml 基本的Gantt调用,希望对大家有帮助”意味着这个压缩包包含的基本Gantt图功能是通过VML实现的,可能包括创建任务条、设置时间轴、调整任务依赖关系等功能。对于开发者来说,这可能是一个学习如何在不...

    vml三维报表资料.rar

    三维报表通常包括柱状图、饼图、折线图等多种图表的三维版本,它们在商业智能、数据分析等领域有着广泛的应用,因为它们能有效地揭示数据之间的层次关系和趋势。 【文件内容】: 1. "成绩三维报表.htm":这个文件很...

    Echarts+ajax+java+mysql实现饼图+折线图+柱状图

    在这个项目中,Echarts与AJAX和Java后端结合,利用MySQL数据库来实现动态的数据展示。接下来,我们将详细讨论这个实现过程中的关键知识点。 1. **Echarts图表库**: Echarts是一个基于SVG/VML/Canvas的高性能、跨...

    echart_关系图

    ECharts是一款由百度开源的,基于...了解并掌握以上知识点,你将能够利用ECharts有效地创建和定制关系图,满足各种数据可视化需求。无论是简单的网络拓扑展示,还是复杂的多层关系分析,ECharts都能提供强大的支持。

    难得javascript画图源码

    在这个"难得的JavaScript画图源码"项目中,开发者利用VML来实现工作流的动态绘制。工作流是一种描述任务和决策之间关系的流程模型,常用于业务流程管理、软件设计等领域。动态定义意味着用户可以在运行时创建、修改...

    一个网友写的三维统计图

    这篇描述提到了一个由网友创建的三维统计图,该图是利用VML(Vector Markup Language)技术编写的,专为Internet Explorer浏览器设计。让我们深入探讨一下这个话题。 首先,我们要了解什么是VML。VML全称为Vector ...

    ASP统计图,折线图、饼图、拄状图等...

    在ASP中,我们可以利用各种技术来实现数据的可视化,如折线图、饼图、柱状图等统计图表,这些图表对于数据分析和展示至关重要。 统计图是数据可视化的关键工具,它能够帮助我们直观地理解复杂的数据信息。以下将...

    VML Map Browser-开源

    在VML Map Browser中,JavaScript与VML结合,实现了地图的动态渲染和用户操作响应。 3. **PHP**: PHP是一种服务器端脚本语言,常用于处理Web应用程序的数据交互。在VML Map Browser中,PHP负责与MySQL数据库通信...

    Js画矢量图.rar

    本文将深入探讨使用JavaScript进行矢量图绘制的方法,结合“Js画矢量图.rar”这个资源包中的实例,包括雷达图、柱形图、饼图等,我们将一起学习如何利用JS实现这些图表。 1. **VML与Canvas** 在IE浏览器中,由于...

    让IE兼容css3圆角

    如果要想在IE浏览器中实现圆角的效果,我们一般都会采用圆角图片的方式。...让IE支持CSS 3的解析方法有很多种,下面介绍一种实用的让IE支持CSS 3解析的方法——IE利用VML矢量可标记语言作为画笔绘出圆角:

Global site tag (gtag.js) - Google Analytics