Apologies for unclear text, something happened on send. function zoomFit(){ var graphBBox = d3.select("svg g#mainG").node().getBBox(), graphScreen = $("svg");
var scaleAmount = Math.min(graphScreen.width()/(graphBBox.width), graphScreen.height()/(graphBBox.height)); var xOffSet = graphBBox.x > 0 ? -Math.abs(graphBBox.x) : Math.abs(graphBBox.x), yOffSet = graphBBox.y > 0 ? -Math.abs(graphBBox.y) : Math.abs(graphBBox.y); var tx = (xOffSet*scaleAmount + (graphScreen.width()/scaleAmount - graphBBox.width) * scaleAmount/2), ty = (yOffSet*scaleAmount + (graphScreen.height()/scaleAmount - graphBBox.height) * scaleAmount/2); zoom.translate([tx, ty]).scale(scaleAmount); zoom.event(svg);} On Fri, Jan 30, 2015 at 12:01 PM, Jerad Rutnam <je...@wso2.com> wrote: > Hi All, > > After days of search I found an example [1] which have the zoom-out to fit > view-port functionality. It's base on d3.js and cola.v3.js. So I was able > to get a calculation idea from it. See the code below [Solved]. > > [1] - http://marvl.infotech.monash.edu/webcola/examples/browsemovies.html > > function zoomFit(){ > var graphBBox = d3.select("svg g#mainG").node().getBBox(), > graphScreen = $("svg"); > > var scaleAmount = Math.min(graphScreen.width()/(graphBBox.width), > graphScreen.height()/(graphBBox.height)); > > var xOffSet = graphBBox.x > 0 ? -Math.abs(graphBBox.x) : > Math.abs(graphBBox.x), > yOffSet = graphBBox.y > 0 ? -Math.abs(graphBBox.y) : > Math.abs(graphBBox.y); > > var tx = (xOffSet*scaleAmount + (graphScreen.width()/scaleAmount - > graphBBox.width) * scaleAmount/2), > ty = (yOffSet*scaleAmount + (graphScreen.height()/scaleAmount - > graphBBox.height) * scaleAmount/2); > > zoom.translate([tx, ty]).scale(scaleAmount); > zoom.event(svg); > } > > Thanks! > Jerad > > > On Thu, Jan 29, 2015 at 10:55 AM, Jerad Rutnam <je...@wso2.com> wrote: > >> Hi, >> >> Centering graph works fine with below calculation. But it effects the >> *zoom.event* which works fine at the moment. So I had to revert it back >> to the old method. >> >> var graphBBoxClient = graph[1].getBoundingClientRect(); >> >> var x = graphBBox.x > 0 ? (graphScreen.width() - graphBBoxClient.width) - >> Math.abs(graphBBox.x) : (graphScreen.width() - graphBBoxClient.width) + >> Math.abs(graphBBox.x); >> var y = graphBBox.y > 0 ? (graphScreen.height() - graphBBoxClient.height) - >> Math.abs(graphBBox.y) : (graphScreen.height() - graphBBoxClient.height) + >> Math.abs(graphBBox.y); >> >> d3.select("svg g#mainG").transition().attr("transform", >> "scale("+scaleAmount+") translate("+x+","+y+")"); >> >> So i'm trying to calculate it properly using the current values, which >> i'm getting already. but bounding box coordinate values cause a problem. If >> anyone can help me to figure it out the centering graph would be appreciate. >> >> Here is my current code, >> >> var zoom = d3.behavior.zoom().on("zoom", redraw); >> >> function getCenter() { >> var center = { >> x : this.width / 2, >> y : this.height / 2 >> }; >> return center; >> } >> >> function zoomIn(){ >> var coor = zoom.translate(); >> var x = (coor[0] - getCenter().x) * 1.1 + getCenter().x; >> var y = (coor[1] - getCenter().y) * 1.1 + getCenter().y; >> >> zoom.scale(zoom.scale() * 1.1); >> zoom.translate([x, y]); >> >> zoom.event(svg); >> } >> >> function zoomOut(){ >> var coor = zoom.translate(); >> var x = (coor[0] - getCenter().x) * 0.9 + getCenter().x; >> var y = (coor[1] - getCenter().y) * 0.9 + getCenter().y; >> >> zoom.scale(zoom.scale() * 0.9); >> zoom.translate([x, y]); >> >> zoom.event(svg); >> } >> >> function zoomFit(){ >> >> var graph = [d3.select("svg").node(),d3.select("svg g#mainG").node()], >> svgBBox = graph[0].getBBox(), >> graphBBox = graph[1].getBBox(), >> graphScreen = $("svg"); >> >> var graphScreenWidth = graphScreen.width() / graphBBox.width, >> graphScreenHeight = graphScreen.height() / graphBBox.height, >> scaleAmount = graphScreenWidth > graphScreenHeight ? graphScreenHeight : >> graphScreenWidth; >> >> var xOffSet = graphBBox.x > 0 ? -Math.abs(graphBBox.x) : Math.abs >> (graphBBox.x), >> yOffSet = graphBBox.y > 0 ? -Math.abs(graphBBox.y) : Math.abs(graphBBox.y >> ); >> >> // Where the calculation should be done >> var x = getCenter().x - scaleAmount * getCenter().x; >> var y = getCenter().y - scaleAmount * getCenter().y; >> >> zoom.scale(scaleAmount); >> zoom.translate([x, y]); >> >> zoom.event(svg); >> } >> >> Thanks, >> Jerad >> >> >> On Wed, Jan 28, 2015 at 11:32 AM, Jerad Rutnam <je...@wso2.com> wrote: >> >>> Hi, >>> >>> I found that issue is not the way I calculate, but it was causing by a >>> SVG Group (g) Element Bounding Box X,Y coordinates. So I just had to >>> subtract it. >>> >>> If anyone needs to get the svg boundingBox values use the code (this >>> returns an array), >>> >>> d3.select("svg g#groupElement").node().getBBox(); >>> >>> d3.select("svg g#groupElement").node().getBoundingClientRect(); >>> >>> If wants to get from jquery, >>> >>> $("svg").find("g")[0].getClientRects()[0]; >>> >>> Thanks, >>> Jerad >>> >>> On Mon, Jan 26, 2015 at 1:54 PM, Jerad Rutnam <je...@wso2.com> wrote: >>> >>>> Hi All, >>>> >>>> I'm working on a feature in G-Reg (Dependency Graph) using D3. And >>>> having an issue to centering the graph after zoom-out to screen-size in >>>> viewport. >>>> >>>> Currently I'm getting these values, >>>> >>>> graphScreen = "svg"; >>>> >>>> mainGraphGroup = "svg g" >>>> >>>> var topOffset = (graphScreen.width() - mainGraphGroupWidth)/2, >>>> leftOffset = (graphScreen.height() - mainGraphGroupHeight)/2; >>>> >>>> Is there anyway I can achieve centering by these values? or is there a >>>> method to achieving this? Any help will be appreciate. Searched on web but >>>> couldn't find a proper solution for it yet. >>>> >>>> Thanks, >>>> Jerad >>>> -- >>>> *Jerad Rutnam* >>>> *Software Engineer - UI* >>>> >>>> WSO2 Inc. >>>> lean | enterprise | middleware >>>> M : +94 77 959 1609 | E : je...@wso2.com | W : www.wso2.com >>>> >>> >>> >>> >>> -- >>> *Jerad Rutnam* >>> *Software Engineer - UI* >>> >>> WSO2 Inc. >>> lean | enterprise | middleware >>> M : +94 77 959 1609 | E : je...@wso2.com | W : www.wso2.com >>> >> >> >> >> -- >> *Jerad Rutnam* >> *Software Engineer* >> >> WSO2 Inc. >> lean | enterprise | middleware >> M : +94 77 959 1609 | E : je...@wso2.com | W : www.wso2.com >> > > > > -- > *Jerad Rutnam* > *Software Engineer* > > WSO2 Inc. > lean | enterprise | middleware > M : +94 77 959 1609 | E : je...@wso2.com | W : www.wso2.com > -- *Jerad Rutnam* *Software Engineer* WSO2 Inc. lean | enterprise | middleware M : +94 77 959 1609 | E : je...@wso2.com | W : www.wso2.com
_______________________________________________ Dev mailing list Dev@wso2.org http://wso2.org/cgi-bin/mailman/listinfo/dev