Ich habe ein d3
generiert Kraftlayout-Diagramm, ich muss es zu png
mit der aktuellen (benutzerdefinierten) Skalierung intakt exportieren.Zeigen Sie voll SVG mit Skalierung intakt
Durch meine Argumentation dies wird dann wachsen die SVG
Breite und Höhe, so dass, wenn die svg
1920x1080
ist, und es ist ‚gezoomt‘ in die exportierte svg
wahrscheinlich eine viel größere Breite und Höhe zur Aufnahme dieser haben sollte.
Ich habe alles versucht, und mir fehlt etwas, ich kann einfach nicht scheinen, dynamisch die korrekten Werte für den Ausgang zu berechnen, den ich benötige.
Hier ist ein example meiner exportierten SVG
, beachten Sie, dass es viel mehr Informationen, es ist einfach nicht sichtbar in dieser Größenordnung.
EDIT
Hier ist mein Grund ausführenden Code, vor allem aus highcharts angepasst:
serializeSvg: function() {
/**
* serialize a xml object to string
* @param {type} xmlNode the node to use
* @returns {String|@exp;[email protected];xml|@exp;[email protected];[email protected];@call;serializeToString}
*/
function serializeXmlNode(xmlNode) {
if (typeof window.XMLSerializer !== 'undefined') {
return (new window.XMLSerializer()).serializeToString(xmlNode);
} else if (typeof xmlNode.xml !== 'undefined') {
return xmlNode.xml;
}
return '';
}
var svg = serializeXmlNode(document.getElementsByTagName('svg')[0]),
factor = 2;
svg = '<svg'
+ ' xmlns="http://www.w3.org/2000/svg"' // xml namespace
+ ' version="1.1"'
+ ' xmlns:xlink="http://www.w3.org/1999/xlink"' // for images
+ ' ' + svg.substring(svg.indexOf('<svg ') + 5);
// highcharts svg sanitizer
svg = svg.replace(/width="([^"]+)"/, function(m, width) {
return 'width="' + (width * factor) + '"';
}).replace(/height="([^"]+)"/, function(m, height) {
return 'height="' + (height * factor) + '"';
}).replace(/<rect class="drag"[^<]+<\/rect>/, '')
// IE specific
.replace(/<IMG /g, '<image ')
.replace(/height=([^" ]+)/g, 'height="$1"')
.replace(/width=([^" ]+)/g, 'width="$1"')
.replace(/id=([^" >]+)/g, 'id="$1"')
.replace(/class=([^" ]+)/g, 'class="$1"')
.replace(/ transform /g, ' ')
.replace(/:(path|rect)/g, '$1')
.replace(/style="([^"]+)"/g, function(s) {
return s.toLowerCase();
});
return svg;
}
und der Haupt Zoom/Skalierung Start für das d3 Layout:
var layout = d3.layout.force();
var DEFAULT_SIZE = 64;
var GROWTH_SCALE = 1.15;
var SHRINK_SCALE = 1.05;
// creates a new force layout
var force = layout
.size([w, h])
.gravity(.06)
.distance(110)
//.friction(0.6)
//.linkStrength(0.4)
.charge(-((DEFAULT_SIZE * GROWTH_SCALE) * 10))
.on('tick', tick);
// creates the svg context
var svg = d3.select('.la-container').append('svg:svg')
.attr('width', w)
.attr('height', h)
.attr('pointer-events', 'all') // set for the pan/zooming
.append('svg:g') // add a g element for capturing zoom and pan
.call(d3.behavior.zoom().scaleExtent([0.6, 6.0]).on('zoom', redraw))
.append('svg:g');
svg.append('svg:rect')
.attr('class', 'drag')
.attr('width', w)
.attr('height', h)
.attr('fill', 'white');
Verwenden Sie das Zoom-Verhalten in d3, um Ihr Bild zu skalieren? Sie sollten in der Lage sein, zoom.scale() zu verwenden, um die Zoomstufe zu erfassen und das Ausgabe-SVG entsprechend zu transformieren. Mehr Informationen (und Javascript-Code) wären hilfreich, um genau herauszufinden, was Sie versuchen zu tun? – RoryB
Ja, ich benutze 'd3.behavior.zoom()' und 'd3.behavior.drag()', nehmen wir an, ein Benutzer wird auf einen Graphknoten mit 500 Knoten im Abstand von 100 Pixeln gezoomt, er muss ziehen Um andere Knoten zu sehen, was ich will ist, dass, wenn er auf den exportierten Zoom klickt, das komplette 500-Knoten-Diagramm in eine SVG-Datei exportiert werden soll, wo das Ganze bei dieser Zoom-Stufe sichtbar ist. – epoch
Ist Ihr Problem mit der Erfassung der Zoomstufe oder mit dem eigentlichen Exportprozess? Es wird schwierig sein, Ihnen zu helfen, ohne eine Vorstellung davon zu haben, welches Javascript Sie tatsächlich verwenden und welche Fehlermeldungen usw. Ihr aktueller Code erzeugt. – RoryB