4 changed files with 389 additions and 21 deletions
			
			
		@ -0,0 +1,67 @@ | 
				
			|||
<template> | 
				
			|||
  <BackgroundClip class='BG-01' :clipPath="getClipPath" | 
				
			|||
  :borderPath="getBorderPath"  | 
				
			|||
    bgColor="linear-gradient(180deg, #152E3CBB 0%, #163A45DD 100%)" | 
				
			|||
    borderColor="linear-gradient(180deg, rgba(40, 144, 167, 1), rgba(40, 144, 167, 0.38), rgba(40, 144, 167, 1))"> | 
				
			|||
    <slot /> | 
				
			|||
  </BackgroundClip> | 
				
			|||
</template> | 
				
			|||
 | 
				
			|||
<script> | 
				
			|||
import BackgroundClip from "./BackgroundClip.vue" | 
				
			|||
 | 
				
			|||
export default { | 
				
			|||
  name: 'BG-01', | 
				
			|||
  components: { | 
				
			|||
    BackgroundClip | 
				
			|||
  }, | 
				
			|||
  props: { | 
				
			|||
    width: { | 
				
			|||
      type: String, | 
				
			|||
      default: "18px" | 
				
			|||
    }, | 
				
			|||
    borderW: { | 
				
			|||
      type: String, | 
				
			|||
      default: "1px" | 
				
			|||
    } | 
				
			|||
  }, | 
				
			|||
  computed: { | 
				
			|||
    getClipPath() { | 
				
			|||
      return `polygon(${this.width} 0%, calc(100% - ${this.width}) 0%, 100% ${this.width}, 100% calc(100% - ${this.width}), calc(100% - ${this.width}) 100%, ${this.width} 100%, 0% calc(100% - ${this.width}), 0% ${this.width})` | 
				
			|||
    }, | 
				
			|||
    getBorderPath() { | 
				
			|||
      let deltaX = `calc(${this.borderW} * ${Math.sqrt(2) - 1})`; | 
				
			|||
      let deltaY = deltaX; | 
				
			|||
      return `polygon( | 
				
			|||
        50% 0%, | 
				
			|||
        calc(100% - ${this.width}) 0%, | 
				
			|||
        100% ${this.width}, | 
				
			|||
        100% calc(100% - ${this.width}), | 
				
			|||
        calc(100% - ${this.width}) 100%, | 
				
			|||
        ${this.width} 100%, | 
				
			|||
        0% calc(100% - ${this.width}), | 
				
			|||
        0 ${this.width}, | 
				
			|||
        ${this.width} 0,  | 
				
			|||
        51% 0, | 
				
			|||
 | 
				
			|||
        51% ${this.borderW}, | 
				
			|||
        calc(${this.width} + ${deltaX}) ${this.borderW}, | 
				
			|||
        ${this.borderW} calc(${this.width} + ${deltaY}), | 
				
			|||
        ${this.borderW} calc(100% - ${this.width} - ${deltaX}), | 
				
			|||
        calc(${this.width} + ${deltaX}) calc(100% - ${this.borderW}), | 
				
			|||
        calc(100% - ${this.width} - ${deltaX}) calc(100% - ${this.borderW}), | 
				
			|||
        calc(100% - ${this.borderW}) calc(100% - ${this.width} - ${deltaY}), | 
				
			|||
        calc(100% - ${this.borderW}) calc(${this.width} + ${deltaY}), | 
				
			|||
        calc(100% - ${this.width} - ${deltaX}) calc(${this.borderW}), | 
				
			|||
        50% ${this.borderW}, | 
				
			|||
        50% 0 | 
				
			|||
         | 
				
			|||
        )` | 
				
			|||
    } | 
				
			|||
  } | 
				
			|||
} | 
				
			|||
</script> | 
				
			|||
 | 
				
			|||
<style lang='scss' scoped> | 
				
			|||
.BG-01 {} | 
				
			|||
</style> | 
				
			|||
| 
		 After Width: | Height: | Size: 1.8 KiB  | 
@ -0,0 +1,234 @@ | 
				
			|||
<template> | 
				
			|||
<div class="compBox"> | 
				
			|||
    <div id="container" class="compCon"> | 
				
			|||
    </div> | 
				
			|||
</div> | 
				
			|||
</template> | 
				
			|||
     | 
				
			|||
<script> | 
				
			|||
import { Graph, Node, Point } from '@antv/x6' | 
				
			|||
 | 
				
			|||
export default { | 
				
			|||
    name: 'sensors', | 
				
			|||
    data(){ | 
				
			|||
        return { | 
				
			|||
             | 
				
			|||
        } | 
				
			|||
    }, | 
				
			|||
    components: { | 
				
			|||
    }, | 
				
			|||
    mounted(){ | 
				
			|||
        this.initGraph(); | 
				
			|||
    }, | 
				
			|||
    methods: { | 
				
			|||
        initGraph(){ | 
				
			|||
 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
            Graph.registerNode( | 
				
			|||
                'sensor', | 
				
			|||
                { | 
				
			|||
                    width: 180, | 
				
			|||
                    height: 42, | 
				
			|||
                    markup: [ | 
				
			|||
                        { | 
				
			|||
                            tagName: 'rect', | 
				
			|||
                            selector: 'box', | 
				
			|||
                        }, | 
				
			|||
                        { | 
				
			|||
                            tagName: 'image', | 
				
			|||
                            selector: 'bg', | 
				
			|||
                        }, | 
				
			|||
                        { | 
				
			|||
                            tagName: 'text', | 
				
			|||
                            selector: 'title', | 
				
			|||
                        }, | 
				
			|||
                    ], | 
				
			|||
                    attrs: { | 
				
			|||
                        box: { | 
				
			|||
                            refWidth: '100%', | 
				
			|||
                            refHeight: '100%', | 
				
			|||
                            fill: 'transparent', | 
				
			|||
                            // stroke: '#5F95FF', | 
				
			|||
                            strokeWidth: 1, | 
				
			|||
                            rx: 0, | 
				
			|||
                            ry: 0, | 
				
			|||
                            pointerEvents: 'visiblePainted', | 
				
			|||
                        }, | 
				
			|||
                        avatar: { | 
				
			|||
                            width: 48, | 
				
			|||
                            height: 48, | 
				
			|||
                            refX: 8, | 
				
			|||
                            refY: 6, | 
				
			|||
                        }, | 
				
			|||
                        title: { | 
				
			|||
                            refWidth: '100%', | 
				
			|||
                            refHeight: '100%', | 
				
			|||
                            refX: "50%", | 
				
			|||
                            refY: "50%", | 
				
			|||
                            fill: '#fff', | 
				
			|||
                            "textAnchor": "middle", | 
				
			|||
                            "textVerticalAnchor": "middle", | 
				
			|||
                            fontFamily: 'Courier New', | 
				
			|||
                            fontSize: 15, | 
				
			|||
                            fontWeight: '800' | 
				
			|||
                        }, | 
				
			|||
                        bg: { | 
				
			|||
                            "xlink:href": require('./img/sensorItem.svg') | 
				
			|||
                        } | 
				
			|||
                    }, | 
				
			|||
                }, | 
				
			|||
                true, | 
				
			|||
            ) | 
				
			|||
 | 
				
			|||
            Graph.registerEdge( | 
				
			|||
                'dashed', | 
				
			|||
                { | 
				
			|||
                    zIndex: -1, | 
				
			|||
                    attrs: { | 
				
			|||
                        line: { | 
				
			|||
                            strokeDasharray: 5, | 
				
			|||
                            fill: 'none', | 
				
			|||
                            strokeLinejoin: 'round', | 
				
			|||
                            strokeWidth: 1, | 
				
			|||
                            stroke: '#05D5F6', | 
				
			|||
                            sourceMarker: null, | 
				
			|||
                            targetMarker: null, | 
				
			|||
                        }, | 
				
			|||
                    }, | 
				
			|||
                }, | 
				
			|||
                true, | 
				
			|||
            ) | 
				
			|||
 | 
				
			|||
            const graph = new Graph({ | 
				
			|||
                container: document.getElementById('container'), | 
				
			|||
                autoResize: true, | 
				
			|||
                grid: false, | 
				
			|||
                panning: false, | 
				
			|||
                mousewheel: false, | 
				
			|||
                connecting: { | 
				
			|||
                    anchor: 'orth', | 
				
			|||
                }, | 
				
			|||
            }) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
            function createSub(x, y, title) { | 
				
			|||
                return graph.addNode({ | 
				
			|||
                    x, | 
				
			|||
                    y, | 
				
			|||
                    shape: 'sensor', | 
				
			|||
                    attrs: { | 
				
			|||
                        title: { | 
				
			|||
                            text: title, | 
				
			|||
                            wordSpacing: '-5px', | 
				
			|||
                            letterSpacing: 0, | 
				
			|||
                            fontSize: 13, | 
				
			|||
                            fontFamily: 'Arial', | 
				
			|||
                            letterSpacing: 0, | 
				
			|||
                        } | 
				
			|||
                    }, | 
				
			|||
                }) | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            function link(source, target, vertices) { | 
				
			|||
                return graph.addEdge({ | 
				
			|||
                    source: { | 
				
			|||
                        cell: source, | 
				
			|||
                        anchor: { | 
				
			|||
                            name: 'center', | 
				
			|||
                            args: { | 
				
			|||
                                dx: 0, | 
				
			|||
                            }, | 
				
			|||
                        }, | 
				
			|||
                    }, | 
				
			|||
                    target: { | 
				
			|||
                        cell: target, | 
				
			|||
                        anchor: { | 
				
			|||
                            name: 'right' | 
				
			|||
                        }, | 
				
			|||
                    }, | 
				
			|||
                    shape: 'dashed', | 
				
			|||
                }) | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            const main = graph.addNode({ | 
				
			|||
                shape: 'circle', | 
				
			|||
                x: 310, | 
				
			|||
                y: 80, | 
				
			|||
                width: 16, | 
				
			|||
                height: 16, | 
				
			|||
                attrs: { | 
				
			|||
                    body:{ | 
				
			|||
                        fill: "#05D5F6", | 
				
			|||
                        stroke: "#FFFFFF66" | 
				
			|||
                    } | 
				
			|||
                } | 
				
			|||
            }) | 
				
			|||
 | 
				
			|||
            let subItems = [ | 
				
			|||
                "可变新消息标志", | 
				
			|||
                "气象检测器", | 
				
			|||
                "一类交通量调查站", | 
				
			|||
                "枪机", | 
				
			|||
                "球机", | 
				
			|||
                "雷达", | 
				
			|||
                "路段语音广播系统", | 
				
			|||
                "疲劳唤醒系统", | 
				
			|||
                "护栏碰撞预警系统", | 
				
			|||
                "合流区预警系统", | 
				
			|||
                "智能行车诱导系统", | 
				
			|||
                "光纤在线监测系统", | 
				
			|||
                "智慧锥桶" | 
				
			|||
            ] | 
				
			|||
 | 
				
			|||
            subItems.forEach((item, index) => { | 
				
			|||
                let temp = createSub(0, index * 68, item); | 
				
			|||
                link(main, temp); | 
				
			|||
            }) | 
				
			|||
 | 
				
			|||
            // const sub01 = createSub(0, 0, '气象检测器') | 
				
			|||
            // const sub02 = createSub(0, 100, '一类交通量调查站') | 
				
			|||
            // const sub03 = createSub(0, 200, '可变新消息标志') | 
				
			|||
 | 
				
			|||
            // link(main, sub02, [ | 
				
			|||
            //     { | 
				
			|||
            //         x: 385, | 
				
			|||
            //         y: 180, | 
				
			|||
            //     }, | 
				
			|||
            // ]) | 
				
			|||
            // link(main, sub01, [ | 
				
			|||
            //     { | 
				
			|||
            //         x: 385, | 
				
			|||
            //         y: 180, | 
				
			|||
            //     }, | 
				
			|||
            //     { | 
				
			|||
            //         x: 175, | 
				
			|||
            //         y: 180, | 
				
			|||
            //     }, | 
				
			|||
            // ]) | 
				
			|||
            // link(main, sub03, [ | 
				
			|||
            //     { | 
				
			|||
            //         x: 385, | 
				
			|||
            //         y: 180, | 
				
			|||
            //     }, | 
				
			|||
            //     { | 
				
			|||
            //         x: 585, | 
				
			|||
            //         y: 180, | 
				
			|||
            //     }, | 
				
			|||
            // ]) | 
				
			|||
 | 
				
			|||
            // graph.zoomToFit({ padding: 0, maxScale: 1, mainScale: 1 }) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
             | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
</script> | 
				
			|||
     | 
				
			|||
<style lang='scss' scoped> | 
				
			|||
.compBox{ | 
				
			|||
    .compCon{ width:100%; height: 100%;} | 
				
			|||
} | 
				
			|||
</style> | 
				
			|||
     | 
				
			|||
					Loading…
					
					
				
		Reference in new issue