This example is a VisDock integration into a static SVG image. The image consists of multiple layers of SVG path elements. Users can use various selection tools, lasso, rectangle, ellipse and lines to query parts of the image and use the Pan-and-Zoom tool to transform the image for their conveniences. The image was found here on Wikipedia.
xxxxxxxxxx
<meta charset="utf-8">
<body>
<link href="https://rawgithub.com/VisDockHub/NewVisDock/master/master/visdock.css" rel="stylesheet" type="text/css"/>
<script src="https://d3js.org/d3.v3.min.js"></script>
<script src="https://rawgithub.com/visdockhub/newvisdock/master/master/visdock.js"></script>
<script src="https://rawgithub.com/visdockhub/newvisdock/master/master/2d.js"></script>
<script src="https://rawgithub.com/visdockhub/newvisdock/master/master/intersectionutilities.js"></script>
<script src="https://rawgithub.com/visdockhub/newvisdock/master/master/visdock.utils.js"></script>
<script>
VisDock.init("body", {width: 1000, height: 800});
var viewport = VisDock.getViewport();
var path_query = [];
var mouse_click = [];
var mouse_loc = [];
d3.xml("pic.svg", "image/svg+xml", function(xml) {
for (var i = 0; i < xml.documentElement.children.length; ){
viewport[0][0].appendChild(xml.documentElement.children[i])
}
})
d3.selectAll("#svg2").remove();
Panel.x = 200;
Panel.y = 200;
Panel.setTransform();
function compare(shape1, shape2, inclusive){
var hits = [];
for (var i = 0; i < shape2.length; i++){
if (i != 12 && i < 78 && i != 79 || i > 84){
var captured = shape1.intersectPath([shape2[i]], inclusive)
if (captured.length == 1){
hits.push(captured[0])
path_query[num].push(i)
}
}
}
return hits;
}
VisDock.eventHandler = {
getHitsPolygon : function(points, inclusive) {
var path = d3.selectAll("path")[0]
var shapebound = new createPolygon(points);
if (path_query[num] == undefined) path_query[num] = [];
return compare(shapebound, path, inclusive);
},
getHitsLine : function(points, inclusive) {
var shapebound = new createLine(points);
return shapebound.intersectPath(d3.selectAll("path")[0], inclusive)
},
getHitsEllipse : function(points, inclusive) {
var path = d3.selectAll("path")[0]
var shapebound = new createEllipse(points);
if (path_query[num] == undefined) path_query[num] = [];
return compare(shapebound, path, inclusive);
},
setColor : function(hits) {
for (var i = 0; i < hits.length; i++) {
var str = hits[i].getAttributeNS(null, "transform")
VisDock.utils.addPathLayer(hits[i], "fill: " + VisDock.color[num - 1] + "; opacity: 0.5");
QueryManager.layers[num - 1][i][0][0].setAttributeNS(null, "id", "Group" + (num - 1))
QueryManager.layers[num - 1][i][0][0].setAttributeNS(null, "transform", str)
}
setup();
},
changeColor : function(color, query, index) {
var vis = VisDock.utils.getQueryVisibility(index);
for (var i = 0; i < query.length; i++) {
query[i][0][0].setAttributeNS(null, "style", "fill: " + color + "; opacity: " + vis)
}
},
changeVisibility : function(vis, query) {
var color = VisDock.utils.getQueryColor(index);
for (var i = 0; i < query.length; i++) {
query[i][0][0].setAttributeNS(null, "style", "fill: " + color + "; opacity: " + vis)
}
},
removeColor : function(hits, index) {
for (var i = 0; i < hits.length; i++) {
hits[i].remove();
}
},
QueryClick : function(query, index) {
}
}
function setup(){
mouse_click[num-1] = false;
VisDock.startChrome()
var path = d3.selectAll("path")[0]
d3.selectAll("#Group" + (num-1)).on("mousedown", function() {
var str = this.getAttributeNS(null, "id").split("Group")[1]
var index = parseInt(str)
var group = this;
if (mouse_loc[index] == undefined){
mouse_loc[index] = d3.mouse(d3.selectAll("svg")[0][0]);
}
d3.selectAll("#Group" + index).attr("pointer-events", "none")
mouse_click[index] = true;
d3.selectAll("svg").on("mousemove", function(){
if (mouse_click[index]){
var displace_x = d3.mouse(d3.selectAll("svg")[0][0])[0] - mouse_loc[index][0];
var displace_y = d3.mouse(d3.selectAll("svg")[0][0])[1] - mouse_loc[index][1];
for (var j = 0; j<path_query[index].length; j++){
var n = path_query[index][j];
path[n].setAttributeNS(null, "transform", "translate(" + displace_x + "," + displace_y + ")")
}
d3.selectAll("#Group" + index)
.attr("transform", "translate(" + displace_x + "," + displace_y + ")")
}
})
d3.selectAll("svg").on("mouseup", function(){
mouse_click[index] = false;
d3.selectAll("#Group" + index).attr("pointer-events", "visiblePainted")
})
})
VisDock.finishChrome();
}
BirdView.init(viewport, 1050, 850)
d3.select(self.frameElement).style("width", "1050px")
d3.select(self.frameElement).style("height", "850px")
</script>
Modified http://d3js.org/d3.v3.min.js to a secure url
Modified http://rawgithub.com/VisDockHub/NewVisDock/master/master/visdock.js to a secure url
Modified http://rawgithub.com/VisDockHub/NewVisDock/master/master/2D.js to a secure url
Modified http://rawgithub.com/VisDockHub/NewVisDock/master/master/IntersectionUtilities.js to a secure url
Modified http://rawgithub.com/VisDockHub/NewVisDock/master/master/visdock.utils.js to a secure url
https://d3js.org/d3.v3.min.js
https://rawgithub.com/VisDockHub/NewVisDock/master/master/visdock.js
https://rawgithub.com/VisDockHub/NewVisDock/master/master/2D.js
https://rawgithub.com/VisDockHub/NewVisDock/master/master/IntersectionUtilities.js
https://rawgithub.com/VisDockHub/NewVisDock/master/master/visdock.utils.js