F1V3.0-图形-绘图类库快速搭建一个页面绘图应用实例

一. 依赖项

  • jQuery2.2.4+
  • backbone1.3.3+
  • lodash3.10.1+
    以上是图形类库第三方依赖库,已经集成到平台图形的三方包插件中,我们可以作为简单了解。

二. nginx配置

1. Nginx server节点需要配置引入以jQuery2.2.4编译打包的平台前端组件包、平台三方包,配置代码如下:
    ################# 组件包的引入(包括组件包和三方包,基于jQuery2.2.4打包)#################
    # 平台前端组件包
    location ^~ /public2/ {
        alias $rootpath/public2_libraries/dist/;
    }
    ## 平台三方包
    location ^~ /jquery2/ {
        alias $rootpath/widget2_libraries/dist/;
    }
2. 引入第三方依赖、图形类库:
    ##图形三方包依赖配置
    location ^~ /graphplugins/ {
        alias $gisrootpath/graphplugins_libraries/;
    }

    ##图形类库微服务
    location ^~ /joint/ {
        set $temple $extend;
        alias $gisrootpath/graphjoint_bundle/$temple/;
        if (!-e $request_filename) {   
            set $temple $switch;
        }
    }

三、在自己的html页面引入所需js文件

1. 设置页面静态化脚本
    <script type="text/javascript"> 
        function getRootPath() {
            var pathName = window.location.pathname.substring(1);
            var webName = pathName == '' ? '' : pathName.substring(0, pathName.indexOf('/'));
            //return window.location.protocol + '//' + window.location.host + '/'+ webName + '/';
            return window.location.protocol + '//' + window.location.host + '/'+ webName+'/';
        }
        document.writeln("<base href='"+getRootPath()+"'/>");
    </script>
2. 引入图形依赖的平台组件类库
    <link rel="stylesheet" type="text/css" href="/jquery/css/blue/widget.bundle.css">
    <script type="text/javascript" src="/public2/dll.bundle.js"></script>
    <script type="text/javascript" src="/jquery2/scripts/widget.bundle.js"></script>
3. 引入图形类库主加载js文件
    <script src="/joint/loader.js"></script>
4. html内容布局代码
    <body class="f1-layout">
        <div class="stencil-container" region="west" style="width:170px; position:relative;" title="工具箱"></div>
        <div class="paper-container" region="center" style="position:relative; overflow:hidden;">
            <div class="toolbar-container" title="工具栏"></div>
            <div class="navigator-container" style="position:absolute; right: 0px; bottom: 0px; z-index: 1000;" title="鹰眼导航"></div>
        </div>
    </body>

初始化时图形类库会根据class类名作为选择器,进行渲染容器的查找,不要对class类名进行修改,否则将会找不到渲染的容器对象。

5. 定义工具栏js配置文件

新建一个app-toolbar-cfg.js文件,添加如下代码,定义工具栏显示按钮:

var demoAppToolbarCfg = {};

(function() {

    'use strict';

    demoAppToolbarCfg.toolbar1 = {
        groups: {
            'group1': { index: 1 },
            'group2': { index: 2 },
            'group3': { index: 3},
            'group4': { index: 4 },
            'group5': { index: 5 },
            'group6': { index: 6 },
            'group7': { index: 7 },
            'group8': { index: 8},
            'group9': { index: 9 },
            'group10': { index: 10 }
        },
        tools: [
            {
                type: "save",
                name: "btn-save",
                group: "group1",
                text: "保存",
                iconCls: "icon-storage",
                attrs: {
                    button: {
                        title: "保存"
                    }
                }
            },
            {
                type: "load",
                name: "btn-open",
                group: "group1",
                text: "打开",
                iconCls: "icon-open",
                attrs: {
                    button: {
                        'data-tooltip': '打开图形数据从服务端',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: 'separator',
                group: 'group2'
            },
            {
                type: 'undo',
                name: 'undo',
                group: 'group2',
                text: "撤销",
                iconCls: "icon-cancel",
                attrs: {
                    button: {
                        'data-tooltip': '撤销',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },{
                type: 'redo',
                name: 'redo',
                group: 'group2',
                text: "重做",
                iconCls: "icon-cw",
                attrs: {
                    button: {
                        'data-tooltip': '重做',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },{
                type: 'deletebutton',
                name: 'btn-delete',
                group: 'group2',
                text: "删除",
                iconCls: "icon-close",
                attrs: {
                    button: {
                        'data-tooltip': '删除',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: 'separator',
                group: 'group3'
            },
            {
                type: 'zoom-to-fit',
                name: 'zoom-to-fit',
                group: 'group3',
                text: "全图",
                iconCls: "icon-gis-zoomto-extent",
                attrs: {
                    button: {
                        'data-tooltip': '显示全部内容',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: 'zoom-in',
                name: 'zoom-in',
                group: 'group3',
                text: "放大",
                iconCls: "icon-zoom-in",
                attrs: {
                    button: {
                        'data-tooltip': '放大画布',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: 'zoom-out',
                name: 'zoom-out',
                group: 'group3',
                text: "缩小",
                iconCls: "icon-zoom-out",
                attrs: {
                    button: {
                        'data-tooltip': '缩小画布',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: 'separator',
                group: 'group4'
            },
            {
                type: "importData",
                name: "btn-import",
                group: "group4",
                text: "导入",
                iconCls: "icon-gis-import-svg",
                attrs: {
                    button: {
                        'data-tooltip': '导入SVG文档',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "exportData",
                name: "btn-export",
                group: "group4",
                text: "导出",
                iconCls: "icon-gis-export-svg"
            },
            {
                type: "separator",
                group: "group5"
            },
            {
                type: "setGraphLayerName",
                name: "layer-name",
                group: "group5",
                text: "图层名称",
                iconCls: "icon-gis-set-stationcode",
                attrs: {
                    button: {
                        'data-tooltip': '设置图层名称',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "setPaperWidthAndHeight",
                name: "btn-paper",
                group: "group5",
                text: "画布",
                iconCls: "icon-gis-set-extentbounds"
            },
            {
                type: "setPaperBackground",
                name: "btn-paper-bg",
                group: "group5",
                text: "背景",
                iconCls: "icon-book"
            },
            {
                type: "separator",
                group: "group6"
            },
            {
                type: "aligncells",
                f1type: "menubutton",
                name: "align-menu",
                group: "group6",
                text: "对齐",
                iconCls: "icon-gis-align-v",
                data: [
                    { id: 'top-align', text: '顶端对齐' },
                    { id: 'left-align', text: '左对齐' },
                    { id: 'right-align', text: '右对齐' },
                    { id: 'bottom-align', text: '底端对齐' },
                    "-",
                    { id: 'h-center-align', text: '水平中心对齐', iconCls: "icon-gis-align-h" },
                    { id: 'v-center-align', text: '垂直中心对齐', iconCls: "icon-gis-align-v" },
                    { id: 'center-align', text: '中心对齐' },
                    { id: 'size-align', text: '大小相同' }
                ],
                attrs: {
                    button: {
                        'data-tooltip': '对齐',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "separator",
                group: "group7"
            },
            {
                type: "styleDialog",
                name: "btn-batch-style",
                group: "group7",
                text: "样式",
                iconCls: "icon-gis-set-textstyle"
            },
            {
                type: "voltageLevel",
                name: "btn-voltage-level",
                group: "group7",
                text: "电压等级",
                iconCls: "icon-stats",
                attrs: {
                    button: {
                        'data-tooltip': '批量设置电压等级',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "setSwitchStatus",
                name: "btn-switch-status",
                group: "group7",
                text: "开合状态",
                iconCls: "icon-switch",
                attrs: {
                    button: {
                        'data-tooltip': '设置开合状态',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "tofront",
                name: "btn-to-front",
                group: "group7",
                text: "置于顶层",
                iconCls: "icon-arrow-top",
                attrs: {
                    button: {
                        'data-tooltip': '置于顶层',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "tofront",
                name: "btn-to-front",
                group: "group7",
                text: "置于底层",
                iconCls: "icon-arrow-bottom",
                attrs: {
                    button: {
                        'data-tooltip': '置于顶层',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "separator",
                group: "group8"
            },
            {
                type: "clear",
                name: "btn-clear",
                group: "group8",
                text: "清空",
                iconCls: "icon-delete",
                attrs: {
                    button: {
                        'data-tooltip': '清空画布内容',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "separator",
                group: "group9"
            },

            {
                type: "help",
                name: "btn-help",
                group: "group9",
                text: "帮助",
                iconCls: "icon-question"
            },
            {
                type: "button",
                name: "btn-onAdjustVertices",
                group: "group9",
                text: "多回线",
                iconCls: "icon-question"
            },
            {
                type: "button",
                name: "btn-offAdjustVertices",
                group: "group9",
                text: "关闭多回线",
                iconCls: "icon-question"
            },
            {
                type: "checkConencted",
                name: "btn-check-conencted",
                group: "group9",
                text: "连通性检查",
                iconCls: "icon-gis-check-pointconnect",
                attrs: {
                    button: {
                        'data-tooltip': '为提高准确性,请先保存数据,在执行检查',
                        'data-tooltip-position': 'top',
                        'data-tooltip-position-selector': '.toolbar-container'
                    }
                }
            },
            {
                type: "loadOpenLayersLayers",
                name: "btn-open-ol-layer-list",
                group: "group9",
                text: "打开OpenLayers图层",
                iconCls: "icon-question"
            },
            {
                type: "autoLayoutByCim",
                name: "btn-auto-layout-cim",
                group: "group9",
                text: "CIM成图",
                iconCls: "icon-question"
            },
            {
                type: "autoLayoutByConfig",
                name: "btn-auto-layout-config",
                group: "group9",
                text: "典型配置成图",
                iconCls: "icon-question"
            },
            {
                type: "button",
                name: "btn-custom-test",
                group: "group9",
                text: "这是一个自定义按钮",
                iconCls: "icon-question"
            }
        ]
    };
})();

这里列举了图形主要的功能按钮,有点多,开发时可以根据业务需要,定义自己所需要的按钮即可。

6. 添加初始化js代码

新建index.js文件,添加如下代码:

    $(function(){
        // 定义应用app主视图
        var app = new joint.app.MainView({
            el: document.body,
            f1toolbar: true,
            toolbarCfg: demoAppToolbarCfg.toolbar1
        });

        //创建右键菜单
        app.contextMenu = new joint.ui.F1ContextMenu({
            menus: [
                { id: 'menu_style_dialog', text: '设置样式', iconCls: "icon-gis-set-textstyle" },
                { id: 'menu_voltage_level', text: '电压等级' },
                { id: 'menu_switch_status', text: '开关状态', iconCls: "icon-switch" },
                "-",
                { id: 'menu_input_text', text: '输入文字' }
            ]
        });
        //右键菜单的菜单项注册事件
        app.contextMenu.on({
            "action:menu_style_dialog": function(evt){
            // 调用工具栏中按钮事件,key为定义工具栏按钮时配置的name值
                app.toolbar["btn-batch-style_Widget"].pointerdown();
            },
            "action:menu_voltage_level": function(){
                app.toolbar["btn-voltage-level_Widget"].pointerdown();
            },
            "action:menu_switch_status": function(){
                app.toolbar["btn-switch-status_Widget"].pointerdown();
            },

            "action:menu_input_text": function(evt, cellView){
                artDialog.prompt("标签文字", function(text){
                    if(!text){text = ""}
                    if(cellView.model.isElement() && _.startsWith(cellView.model.get("type"), "electricity.") 
                            && cellView.model.get("type")!="electricity.Busbar"){
                        cellView.model.attr("text/ref-y", cellView.model.get("size").height+15);
                    }
                    cellView.model.attr("text/text", text);
                }, cellView.model.attr("text/text"));
            }
        });
        // 注册图形上下文菜单事件,右键单击图形时显示菜单
        app.paper.on("cell:contextmenu", function(cellView, evt, x, y){
            evt = joint.util.normalizeEvent(evt);
            app.contextMenu.show({x: evt.clientX, y: evt.clientY, target: cellView, evt: evt});
        });

        /**
         * 注册工具栏自定义按钮事件
         */
        var graph_filter = new joint.ui.Filter({graph: app.graph});
        app.toolbar.on({
            "action:btn-custom-test": function(){
                alert("这是一个工具栏自定义按钮的事件");
            }
        });

        // 根据图层Id,加载图形数据到画布中
        var layerId = joint.util.getUrlParam("layerId") || "C72B8691-0910-0001-B218-5B1011A96290";
        if(layerId){
            app.serverManager.load(layerId);
        }
    });
7. 将工具栏配置、初始化图形设置警js文件引入html页面
    <script src="/joint/demo/apps/app-toolbar-cfg.js"></script>
    <script src="/joint/demo/apps/index.js"></script>

完整的html页面如下:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>jointJS Application Demo</title>

            <script type="text/javascript"> 
               function getRootPath() {
                   var pathName = window.location.pathname.substring(1);
                   var webName = pathName == '' ? '' : pathName.substring(0, pathName.indexOf('/'));
                   //return window.location.protocol + '//' + window.location.host + '/'+ webName + '/';
                   return window.location.protocol + '//' + window.location.host + '/'+ webName+'/';
               }
               document.writeln("<base href='"+getRootPath()+"'/>");
            </script>

            <link rel="stylesheet" type="text/css" href="/jquery/css/blue/widget.bundle.css">
            <script type="text/javascript" src="/public2/dll.bundle.js"></script>
            <script type="text/javascript" src="/jquery2/scripts/widget.bundle.js"></script>

            <script src="/joint/loader.js"></script>

            <script src="/joint/demo/apps/app-toolbar-cfg.js"></script>
            <script src="/joint/demo/apps/index.js"></script>
        </head>
        <body class="f1-layout">
            <div class="stencil-container" region="west" style="width:170px; position:relative;" title="工具箱"></div>
            <div class="paper-container" region="center" style="position:relative; overflow:hidden;">
                <div class="toolbar-container" ></div>
                <div class="navigator-container" style="position:absolute; right: 0px; bottom: 0px; z-index: 1000;"></div>
            </div>
        </body>
    </html>

这样就快速定义好了一个在线版的图形app应用页面,接下来您可以扩展自己需要的功能到应用页面中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值