利用jsplumb和碰撞检测自动生成流程图

Posted 会数数的小数点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用jsplumb和碰撞检测自动生成流程图相关的知识,希望对你有一定的参考价值。

  使用jsplumb构建流程图模型时,有一个需求要求,选项可以从选项表中拖拽到指定容器,并且两个选项要接触到的时候才能连接起来,不接触不能连接。效果图如下

略丑~

 因为这里用到了拖拽,拖放功能,所以用到的有jquery,jquery-ui,jsplumb,考虑到兼容ie8,用到的是jsplumb-1.7.10版本。
首先简单的布局

<style>
html,body {
    height:100%;
    padding:0;
    margin:0;
}
    #container{
        width:200px;
        height:500px;
    
        background:#eee;
        float:left;
        
    }
    #container .node {
        width:50px;
        height:50px;
        border:1px solid #000;
        margin-top:20px;
        margin-left:20px;
        z-index:999;
    }
    #wrapper {
        
        width:500px;
        height:500px;
        margin-left:200px;
        border:1px solid #5182E4;
        background:#ddd;
        position:relative;
        
    }
</style>

<div id="container">
        <div class="node" id="Node1">1</div>
        <div class="node" id="Node2">2</div>
        <div class="node" id="Node3">3</div>
</div>

<div id="wrapper">
        
</div>

接下来就是功能实现,第一步拖拽

 $(\'#container .node\').draggable({
          helper:\'clone\',
          revert: \'invalid\',//放置不到位自动恢复原位     
          stop:function(event,ui){
            //准备碰撞检测所需要的条件
              var r1 = ui.offset.left+ui.helper.context.offsetWidth;
              var l1 = ui.offset.left;
              var b1 = ui.offset.top+ui.helper.context.offsetHeight;
              var t1 = ui.offset.top;

              var L = $(\'#wrapper\')[0].offsetLeft;

              var T = $(\'#wrapper\')[0].offsetTop;

              var id= ui.helper.context.id;

              var len = $(\'#wrapper\').children(\'.node\').length;

        
             var uid = \'dragNode\'+len;

              var arr=[];
          
              $(\'#wrapper\').children(\'.node\').each(function(){

                  
                  var json={};

                  json.id = $(this).context.id;
                  json.left = $(this).context.offsetLeft+L;
                  json.right = $(this).context.offsetLeft+L+$(this)[0].offsetWidth;
                  json.top = $(this).context.offsetTop+T;
                  json.bottom = $(this).context.offsetTop+T+$(this)[0].offsetHeight;

                  arr.push(json);

              });

        
            //jsplumb 设置样式
              var common = {
                          anchors:[\'Left\',\'Right\'],
                          endpoint:[\'Dot\',{radius:2}],
                      
                          paintStyle:{
                            strokeStyle:\'#1e8151\',
                            fillStyle:\'transparent\',
                            radius:2,
                            lineWidth:2,
                        }
                    
                          
                      };

          

              for(var i=0;i<arr.length;i++){
                  if(arr[i].id!=uid){

                      var id3= arr[i].id;
                    //碰撞检测
                      if(r1<arr[i].left||b1<arr[i].top||l1>arr[i].right||t1>arr[i].bottom){

                          $(\'#\'+id3).css(\'background\',\'red\')
                          console.log(2);
                      }else {
                          $(\'#\'+id3).css(\'background\',\'green\');

                      //碰撞后,连接到一起
                        jsPlumb.connect({
                            source:uid,
                            target:arr[i].id,
                            scope:\'\',
                            connector:[
                                \'Straight\',
                                {
                                    stub:[10,10],
                                    gap:0
                                }
                            ],
                            overlays:[
                                [\'Arrow\',{width:10,height:10,location:0.9}],
                                [\'Label\',{label:\'hello\',location:0.5}]
                            ]
                        },common);

                        var lef = ui.offset.left+50;

                        //jsPlumb 动画,选项连接后自动分离开一段距离

                        jsPlumb.animate(uid,{left:lef},{duration:350,easing:\'easeOutBack\'});

                      }

                  }
              }

    
          }
        });

选项可以拖拽后,还要有放置的地儿,当然draggable里也可以,这里使用droppable;

$(\'#wrapper\').droppable({
            
            drop:function(event,ui){

                var leng = $(\'#wrapper\').children(\'.node\').length+1;

                 var arr=[];

                var id = "dragNode"+leng;

                var id2 = ui.draggable[0].id;

                var left = parseInt(ui.offset.left-$(this).offset().left);
                var top = parseInt(ui.offset.top-$(this).offset().top);

                var width = ui.draggable[0].clientWidth;
                var height = ui.draggable[0].clientHeight;
            
        

                var len = $(this).children(\'.node\').length;

            //判断容器内拖拽的是否重复
                if(!len){
                    $(this).append($(\'<div style="position:absolute;" class="node" id="\'+id+\'">\'+$(ui.helper).html()+\'</div>\'));
                    $(\'#\'+id).css(\'left\',left).css(\'top\',top);
                    $(\'#\'+id).css(\'width\',width).css(\'height\',height);

                    $(\'#\'+id).css(\'border\',\'1px solid #000\');
                }else {
                        $(this).children(\'.node\').each(function(){
                             // console.log($(this).html());

                             arr.push($(this).html());

                        });

                    

                        if(arr.indexOf($(ui.helper).html())>-1){
                            alert(\'已存在!\');
                            return;
                        }else {
                            $(this).append($(\'<div style="position:absolute;" class="node" id="\'+id+\'">\'+$(ui.helper).html()+\'</div>\'));
                            $(\'#\'+id).css(\'left\',left).css(\'top\',top);
                            $(\'#\'+id).css(\'width\',width).css(\'height\',height);

                            $(\'#\'+id).css(\'border\',\'1px solid #000\');
                        }
                }

            
                arr.push(id2);
            
            //限制容器内选项的拖拽范围
                jsPlumb.draggable(id,{
                    containment:\'parent\'
                });

            //
                var connectorPaintStyle={
                    lineWidth:4,
                    strokeStyle:\'#61B7CF\',
                    joinstyle:\'round\',
                    
                };
                var connectorHoverStyle = {
                    lineWidth:4,
                    strokeStyle:\'#216477\',
                    
                };
                var defaults = {
                    endpoint:[\'Dot\',{radius:2}],
                    connectorStyle:connectorPaintStyle,
                    connectorHoverStyle:connectorHoverStyle,
                    paintStyle:{
                        strokeStyle:\'#1e8151\',
                        fillStyle:\'transparent\',
                        radius:2,
                        lineWidth:2,

                    },
                    isSource:true,
                    connector:[\'Flowchart\',{stub:[40,60],gap:5,cornerRadius:5,alwaysRespectStubs:true}],
                    isTarget:true,
                    maxConnections:-1,
                    connectorOverlays:[
                        [\'Arrow\',{width:10,length:10,location:1}],
                        [\'Label\',{label:\'yes\',width:10,height:10}]
                        ]
                };

                //在添加连接点
                jsPlumb.addEndpoint(id,{anchors:\'TopCenter\'},defaults);
                jsPlumb.addEndpoint(id,{anchors:\'BottomCenter\'},defaults);
                jsPlumb.addEndpoint(id,{anchors:\'RightMiddle\'},defaults);
                jsPlumb.addEndpoint(id,{anchors:\'LeftMiddle\'},defaults);


    

                
            }
            
        });

利用jsplumb与碰撞检测,自动生成流程图的过程基本就这样了。

 

以上是关于利用jsplumb和碰撞检测自动生成流程图的主要内容,如果未能解决你的问题,请参考以下文章

jsPlumb - 如何获取锚点的位置

android 游戏 碰撞检测

基于jsplumb的流程图展示

Unity3D利用物体碰撞检测键盘输入处理完成平衡球游戏

JsPlumb流程图没有自连接

vue+jsPlumb制成的流程图项目