zoukankan      html  css  js  c++  java
  • GoJS API学习

    var node = {};
        node["key"] = "节点Key";
        node["loc"] = "0 0";//节点坐标
        node["text"] = "节点名称";
    // 添加节点 通过按钮点击,添加新的节点到画布
    myDiagram.model.addNodeData(node);
    if (myDiagram.commandHandler.canDeleteSelection()) {
        // 删除选中节点或线,页面上有个按钮点击,可以删除选择的节点和线
        myDiagram.commandHandler.deleteSelection();
        return;
    }
    // 获得当前画布的json,获取当前画布的所有元素的json,用来保存    
    var model= myDiagram.model.toJson();
    //model=eval('('+model+')');若格式异常抓一下
    var nodes=model.nodeDataArray;取出所有节点
    var Links=model.linkDataArray;取出所有线
    // 加载json刷新画布,一般用来刷新和加载画布上的元素
    model=myDiagram.model.toJson()
    myDiagram.model = go.Model.fromJson(model);
    // 通过节点key获取节点,知道节点key ,拿到这个节点的详细信息
    var node = myDiagram.model.findNodeDataForKey('key');
    var node = myDiagram.model.findNodeDataForKey('key');
    //首先拿到这个节点的对象
    myDiagram.model.setDataProperty(node, 'color', "#ededed");
    //然后对这个对象的属性进行更改,更改节点属性值,更改节点的颜色,或者大小等
    // 获取获得焦点的第一个元素,可为节点或者线
    var node=myDiagram.selection.first();
    console.log(node.data.key);
    //用例获取选中的节点或线
    var nodeOrLinkList=myDiagram.selection;
    nodeOrLinkList.each(function(nodeOrLink) {
    console.log(nodeOrLink.data);
    });
    // 获取画布所有节点对象myDiagram.nodes获取所有获得焦点的节点
    var items='';
      for(var nit=myDiagram.nodes;nit.next();){
            var node=nit.value;
           if(node.isSelected){
               items+=node.data.key+",";
             }
         }
    console.log(items);
    // 遍历整个画布的节点信息写法
    for(var nit=myDiagram.nodes;nit.next();){
        var node=nit.value;
        var key=node.data.key;
        var text=node.data.text;
    }
    // 给节点添加线
    myDiagram.model.addLinkData({ from: "节点的Key", to: "连到另一节点的key" })
    // 删除线
    myDiagram.model.removeLinkData(linkData);

    //批量删除线

    {Array|iterator} removeLinks

    removeLinkDataCollection(removeLinks);

    var removeLinks=[];
    //首先拿到这个节点的对象
    var node = myDiagram.findNodeForKey('key');
    //获取节点所有线
    node.findLinksConnected().each(function(link) { 
         removeLinks.push(link.data);
        }
     );
    myDiagram.model.removeLinkDataCollection(removeLinks);
    // 模糊获取线(版本1.68以上)注意值类型,字符串和数值 匹配 方式和模糊获取节点的规则一致

    myDiagram.findLinksByExample(data);

    //注意值类型,字符串和数值

    //如果json中是from:1.1,写成from:"1.1"就会查询不到

    var links=myDiagram.findLinksByExample({from:1.1, to:2.1});

    links.iterator.each(function (link) {

         console.log(link.data);

    });

     

    var newdata = { "text":"AAAA", "key":-33,"loc":"0 0" };
        myDiagram.model.addNodeData(newdata);
        var newdat2= myDiagram.model.findNodeDataForKey('-3');
        console.log(newdat2);
        var node = myDiagram.findNodeForData(newdat2);
        console.log(node);
    myDiagram.select(node);//选中节点
    // 特殊案例API用法
    myDiagram.findNodeForData(objNode);
    myDiagram.findLinkForData(objLink);
    // 其中objNode或者objLink,只能从画布的json 对象取出,不能直接手写例如
    var newdata={"text":"AAAA","key":-33,"loc":"0 0"};
    var node = myDiagram.findNodeForData(newdat2);
    // 除了刚好是新建的节点外,,不然是获取不到这个对象的,因为添加节点时,gojs会自动给节点或者线添加一个属性
    // 节点选中改变事件 selectionChanged: 回调的函数方法名
    //该属性要写在$(go.Node,)内用大括号括起来
    myDiagram.nodeTemplate =
       $(go.Node, "Horizontal",
            { selectionChanged: nodeSelectionChanged },
              //节点选中改变事件,nodeSelectionChanged为回调的方法名
            $(go.Panel, "Auto",
               $(go.Shape,//节点形状和背景颜色的设置
                    { fill: "#1F4963" },
                     new go.Binding("fill", "color")
               ),
            )
        );//go.Node的括号
     
    //回调方法 节点选中的时候是一种颜色,取消选中是另一种颜色
    function nodeSelectionChanged(node) {
          if(node.isSelected) {//
             //节点选中执行的内容
             console.log(node.data);//节点的属性信息
             console.log(node.data.key);//拿到节点的Key,拿其他属性类似
             var node1 = myDiagram.model.findNodeDataForKey(node.data.key);
             myDiagram.model.setDataProperty(node1, "fill", "#ededed");
          } else {
             //节点取消选中执行的内容
             var node1 = myDiagram.model.findNodeDataForKey(node.data.key);
             myDiagram.model.setDataProperty(node1, 'fill', "1F4963 ");       
          }
    }
    // 节点双击事件
    doubleClick : function(e, node){
      //node为当前双击的节点的对象信息
    }
    //该属性要写在$(go.node,)内用大括号括起来
    myDiagram.nodeTemplate =
       $(go.Node, "Horizontal",
            $(go.Panel, "Auto",
               $(go.Shape,//节点形状和背景颜色的设置
                    { fill: "#1F4963" },
                     new go.Binding("fill", "color")
               ),
               {doubleClick : function(e, node){// 双击事件
                                 handlerDC(e, node);//双击执行的方法
                              }
               }
            )
        );//go.Node的括号
     
    //双击执行的方法
    function handlerDC(e, obj) {
         var node = obj.part;//拿到节点的json对象,后面要拿什么值就直接.出来
         var procTaskId = node.data.key;
         var procTaskName = node.data.text;
         var description = node.data.description;
         var procTmplId = node.data.tmplId;
    }
    // 该例子主要应用场景为,双击节点,得到节点的详细信息,弹出窗口修改节点的信息
    // 从Palette拖过来节触发的事件
    myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
            console.log(e);
    });
    
    myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
            e.subject.each(function(n){
                //得到从Palette拖过来的节点
                     console.log(n.data.key);
             });
    });
    // 当前画布被拖动的节点     未测试
    myDiagram.addDiagramListener("Modified", function(e) {
            myDiagram.isModified = false;
     
            iter = myDiagram.selection.iterator;
            
            while (iter.next()) {
                var part = iter.value;
                if (part instanceof go.Link) {
                   if ( ( part.data.from == 0 || part.data.from == undefined) || ( part.data.to == 0 || part.data.to == undefined )  ) {
                        myDiagram.model.setDataProperty(part.data, 'link-color', 'red');
                        console.log(part.data);
                        console.log("非法");
                   } else if(part.data.from > 0 || part.data.from < 0 ) {
                        var node = myDiagram.findNodeForKey(part.data.from);
                        if (!node) {
                            console.log("非法");
                        }
                   }else if(part.data.to > 0 || part.data.to < 0 ) {
                        var node = myDiagram.findNodeForKey(part.data.to);
                        if (!node) {
                            console.log("非法");
                        }
                   }
                }
            }
    var $ = go.GraphObject.make;
    // 定义画布的基本属性 这里绑定画布所用的div,并保存在myDiagram中,后续的节点设置均使用这个变量,意思是在这个画布上定义节点和操作节点
    myDiagram = $(go.Diagram, "myDiagram", //画布绑定的Div的ID
        {
            initialContentAlignment: go.Spot.Center, // 画布的位置设置(居中,靠左等)
            allowDrop: true, // must be true to accept drops from the Palette
            "LinkDrawn": showLinkLabel, //
            "LinkRelinked": showLinkLabel,
            "animationManager.duration": 600, // 画布刷新的加载速度
            "undoManager.isEnabled": true, // "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
            allowZoom: true    // 允许缩放,false为否
            isReadOnly: false // 是否禁用编辑 false否,    
            true是 //ismodelfied:true //禁止拖拽
                   
    });
    // 定义单种节点
    myDiagram.nodeTemplate=$(go.Node,***)
    //***为对节点的定义
    myDiagram.nodeTemplate =
       $(go.Node, "Horizontal",
            { selectionChanged: nodeSelectionChanged },
              //节点选中改变事件,nodeSelectionChanged为回调的方法名
            $(go.Panel, "Auto",
                $(go.Shape,//节点形状和背景颜色的设置
                    { fill: "#1F4963", stroke: null }
                ),
                $(go.TextBlock,
                    { font: "bold 13px Helvetica, bold Arial, sans-serif",//字体
                      editable:true,
                      stroke: "white",//颜色
                      margin: 3 },
                      new go.Binding("text", "key")
                )//go.TextBlock,的括号
           )//go.Panel 的括号
        );//go.Node的括号
    // 定义多种节点(画布上有多种节点)
    myDiagram.nodeTemplateMap.add("A种节点",$(go.Node,***))
    //一种类型的节点
    myDiagram.nodeTemplateMap.add("Start",
           $(go.Node, "Spot",
                $(go.Panel, "Auto",
                     $(go.Shape, "Circle", {
                         minSize: new go.Size(40, 40),
                         fill: "#79C900",
                         stroke: null
                     })
                )
            )//go.Node的括号
    );
    //另一种类型的节点
    myDiagram.nodeTemplateMap.add("End",
           $(go.Node, "Spot",
                $(go.Panel, "Auto",
                     $(go.Shape, "Circle", {
                         minSize: new go.Size(40, 40),
                         fill: "#DC3C00",
                         stroke: null
                     })
                )
           )//go.Node的括号
    );
     
    //添加不同种类的节点
          var node = {};
          node["text"] = "2222";
          node["key"] = "33";
          node["loc"] = "0 0";
          node["category"] = "Start";//category
          myDiagram.model.addNodeData(node);
    // 定义线
    myDiagram.linkTemplate=$(go.Link,***);
    //添加监听节点生成事件
    myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
            e.subject.each(function(n){
                    console.log(n.data.key);
               });
    });
    //添加监听线生成事件
    myDiagram.addDiagramListener("LinkDrawn", function(e) {
        console.log(e.subject.data.to);
    })
    //监听节点删除事件
    myDiagram.addDiagramListener("SelectionDeleted", function(e) {
            e.subject.each(function(n){
            console.log(n.data.key);
        });
    })
    //节点
    //获取节点实际边界(宽高)    
    node.naturalBounds 返回值Rect(0,0,126,31)
    //添加节点    
    myDiagram.model.addNodeData(nodeData);
    //删除节点    
    myDiagram.model.removeNodeData(nodeData);
    //选中单个节点或线    
    myDiagram.select(node);
    //更改属性值    
    myDiagram.model.setDataProperty(nodeData, 'color', "#ededed");
    //根据节点数据对象更改节点属性
    myDiagram.model.updateTargetBindings(nodeData);
    var nodeData = myDiagram.model.findNodeDataForKey('4.1');
    nodeData.text = "2333"
    nodeData.color = "#000000";
    myDiagram.model.updateTargetBindings(nodeData);
    //获取节点对象
    var node=myDiagram.findNodeForKey('key');
    //获取节点data    
    var nodeData=myDiagram.model.findNodeDataForKey('key');
    //批量删除节点
    myDiagram.model.removeNodeDataCollection(nodes)
    var removeNodes = []; 
    var aNodeData = myDiagram.model.findNodeDataForKey('Akey');
    var bNodeData = myDiagram.model.findNodeDataForKey('Bkey');
    removeNodes.push(aNodeData );
    removeNodes.push(bNodeData);
    myDiagram.model.removeNodeDataCollection(removeNodes);
    
    //模糊获取节点(版本1.68以上)注意值类型,字符串和数值
    myDiagram.findNodesByExample(data);
    匹配方式默认为===运算符进行比较。
    /abc/ 匹配包含“abc”的任何字符串
    /abc/i 匹配包含“abc”的任何字符串,忽略大小写
    /^no/i 匹配任何以“no”开头的字符串,忽略大小写
    /ism$/匹配任何以“ism”结尾的字符串
    /(green|red) apple/ 匹配包含“green apple”或“red apple”的字符串
    
    //注意值类型,字符串和数值,
    //如果json中是1.1,写成"1.1"就会查询不到
    var data={};
       data.text="设计";
    // data.text=/设计/;
    // data.text=/设计/i;
    // data.text=/^设计/;
    // data.text=/设计$/;
    // data.text=/(勘|察)设计/;
    var nodes = myDiagram.findNodesByExample(data);
        nodes.iterator.each(function (node) {
          console.log(node.data);
    });
    //更改属性值    
    myDiagram.model.setDataProperty(linkData, 'from', "-2");
    //获取节点的线
    {string | null =} PID 端口ID
    findLinksConnected(PID)
    var node=myDiagram.findNodeForKey('key');
    node.findLinksConnected().each(function(link) {console.log(link.data)});
    //获取进入节点的线
    {string | null =} PID 端口ID
    findLinksInto(PID)
    var node=myDiagram.findNodeForKey('key');
    node.findLinksInto().each(function(link) {console.log(link.data)});
    //获取从节点出来的线
    {string | null =} PID 端口ID
    findLinksOutOf(PID)
    var node=myDiagram.findNodeForKey('key');
    node.findLinksOutOf().each(function(link) {console.log(link.data)});
    //获取A-B节点之间的线
    {node } othernode B节点对象
    {string | null =} PID 端口ID
    {string | null =} otherPID B节点端口ID
    findLinksBetween(othernode, PID, otherPID)
    var nodeA=myDiagram.findNodeForKey('key');
    var nodeB=myDiagram.findNodeForKey('key');
    nodeA.findLinksBetween(nodeB).each(function(link) {console.log(link.data)});
    //树节点
    //根据甲,找甲的所有父级(包括甲)
    node.findTreeParentChain();
    node.findTreeParentChain().each(function(pNode) {
    console.log(pNode.data)
    });
    //根据甲,找甲的所有子级(包括甲)
    node.findTreeParts();
    node.findTreeParts().each(function(sNode) {
    console.log(sNode.data)
    });
    //根据甲,找甲的父亲
    node.findTreeParentNode();  
    var pNode=node.findTreeParentNode();  
    //根据甲,找甲的孩子们
    node.findTreeChildrenNodes();
    node.findTreeChildrenNodes().each(function(cNode) {
    console.log(cNode.data)
    });
    基础画布定义API
    //画布初始位置 
    initialContentAlignment: go.Spot.Center,
    //画布位置,定义后就不能拖动画布了,画布位置交由gojs管理 contentAlignment:go.Spot.Center,
    //初始坐标
    initialPosition: new go.Point(0, 0)
    //禁止移动节点 
    allowMove:false
    //禁止复制 
    allowCopy: false
    //禁止删除
    allowDelete:false
    //禁止选中 
    allowSelect:false
    //禁止缩放  
    allowZoom: false
    //禁止撤销和重做  
    "undoManager.isEnabled": false
    //禁止水平滚动条 
    allowHorizontalScroll: false
    //禁止垂直滚动条
    allowVerticalScroll: false
    //只读 
    isReadOnly: true
    //画布初始化动画时间 
    "animationManager.duration": 600
    //禁止画布初始化动画 
    "animationManager.isEnabled": false
    //画布比例
    scale:1.5
    //画布比例自适应
    autoScale:go.Diagram.Uniform,
    //画布比例自适应
    autoScale:go.Diagram.UniformToFill,
    //默认值不自适应
    autoScale:go.Diagram.None,
    //画布最小比例 
    minScale:1.2,
    //画布最大比例 
    maxScale:2.0,
    //显示网格 
    "grid.visible":true,
    //画布边距
    padding
    padding:80或者new go.Margin(2, 0)或new go.Margin(1, 0, 0, 1)
    
    画布节点连线定义
    //只允许有一个父节点
    validCycle:go.Diagram.CycleDestinationTree 
    
    validCycle:go.Diagram.CycleNotUndirected
    
    validCycle:go.Diagram.CycleNotDirected
    
    validCycle:go.Diagram.CycleSourceTree
    
    //禁止鼠标拖动区域选中
    dragSelectingTool "dragSelectingTool.isEnabled" : false,
    //或者在画布对象myDiagram创建后再调用
    myDiagram.toolManager.dragSelectingTool.isEnabled = false ;
    
    validCycle
    默认无限制 validCycle:go.Diagram.CycleAll  节点之间连线随便连
    一个节点只允许有一个父节点,并且没有定向循环(仅允许维护树结构的链接)
    
    validCycle:go.Diagram.CycleDestinationTree
    禁止A→C,B→C
    
    节点的有效链接不会在图中产生有向循环
    validCycle:go.Diagram.CycleNotDirected
    
    禁止A-B-C-A
    节点的有效链接不会在图中产生无向循环
    validCycle:go.Diagram.CycleNotUndirected
    
    一个节点只允许有一个子节点并且没有定向循环。 validCycle:go.Diagram.CycleSourceTree 禁止A→B,A→C
    
    画布监听事件API
    节点生成事件 externalobjectsdropped
    线生成事件 LinkDrawn
    线重新连接事件 LinkRelinked
    删除后事件 SelectionDeleted
    删除前事件 SelectionDeleting 例子入口
    节点移动事件 SelectionMoved
    //监听节点或线的删除事件
    myDiagram.addDiagramListener("SelectionDeleted", function(e) {
        e.subject.each(function(n){
            console.log(n.data.key);
        });
    })

    自动布局API

    //网格布局 
    go.GridLayout
    //力导向布局 
    go.ForceDirectedLayout
    //树形布局 
    go.TreeLayout
    //径向布局(需要引RadialLayout.js) 
    RadialLayout
    // 用例定义画布节点为网格布局
    myDiagram =
        $(go.Diagram, "myDiagramDiv", // 画布定义
            {
                layout: $(go.GridLayout, //自动布局定义,设置为网格布局
                    {
                        comparer: go.GridLayout.smartComparer, //设置从小到大排序
                        spacing: go.Size.parse("20 20"), //设置节点间隔
                        comparer: function (a, b) {
                            //重写布局算法,根据其他属性值重新增设置顺序
                            var ay = a.data.type;
                            var by = b.data.type;
                            if (!!ay && !!by) {
                                if (ay > by) return -1;
                                if (ay < by) return 1;
                            } else if (!!ay) {
                                return -1;
                            } else if (!!by) {
                                return 1;
                            }
                        }
                    });
            });

    GoJS API

  • 相关阅读:
    听较强节奏的歌曲,能让你更长时间投入到学习中
    小康网站维护笔记
    apache基础
    python安装多版本
    apache负载调优
    docker 进阶
    openstack 网络更改版
    linux 搭建testlink的问题总结
    26. Remove Duplicates from Sorted Array(LeetCode)
    Add to List 172. Factorial Trailing Zeroes(LeetCode)
  • 原文地址:https://www.cnblogs.com/Alwaysbecoding/p/11846943.html
Copyright © 2011-2022 走看看