Wie transformiert die Gruppe programmgesteuert in der SVG -Datei?Java

Java-Forum
Anonymous
 Wie transformiert die Gruppe programmgesteuert in der SVG -Datei?

Post by Anonymous »

Ich habe eine SVG -Datei mit dem folgenden Bild:

Jeder der Pfeile wird durch einen Code wie diesen dargestellt:

Code: Select all

South, 180
sodipodi:nodetypes="ccc"
inkscape:connector-curvature="0"
id="path4251"
d="m 30.022973,250.04026 4.965804,-2.91109 4.988905,2.91109"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.6855976px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />


Ich möchte die absolute Position des Rechtecks ​​berechnen (

Code: Select all

rect
Knoten). Um dies zu tun, muss ich den Ausdruck in der Transformation des Tags des G -Tags (Tag (code> () bewerten (

Code: Select all

matrix(-1,0,0,-1,149.82549,457.2455)
im obigen Beispiel).
Wie kann ich das tun?

Code: Select all

import java.io.IOException;

import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;

import org.w3c.dom.Document;

try {
String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
String uri = "http://www.example.org/diagram.svg";
Document doc = f.createDocument(uri);
} catch (IOException ex) {
// ...
}
Soweit ich weiß, kann doc auf svgdocument gegossen werden. Ich möchte diesen Code wiederverwenden).

Code: Select all

public final class BatikTest {
@Test
public void test() throws XPathExpressionException {
try {
final File initialFile =
new File("src/main/resources/trailer/scene05_signs.svg");
InputStream sceneFileStream = Files.asByteSource(initialFile).openStream();

String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
String uri = "http://www.example.org/diagram.svg";
final SVGOMDocument doc = (SVGOMDocument) f.createDocument(
uri, sceneFileStream);

final NodeList nodes =
doc.getDocumentElement().getElementsByTagName("g");
SVGOMGElement signSouth = null;

for (int i=0; (i < nodes.getLength()) && (signSouth == null); i++) {
final Node curNode = nodes.item(i);
final Node id = curNode.getAttributes().getNamedItem("id");
if ("signS".equals(id.getTextContent())) {
signSouth = (SVGOMGElement) curNode;
}

System.out.println("curNode: " + nodes);
}
System.out.println("signSouth: " + signSouth);

final NodeList rectNodes = signSouth.getElementsByTagName("rect");
System.out.println("rectNodes: " + rectNodes);

SVGOMRectElement rectNode = (SVGOMRectElement) rectNodes.item(0);

System.out.println("rectNode: " + rectNode);

final SVGMatrix m2 =
signSouth.getTransformToElement(rectNode);

System.out.println("m2: " + m2);
} catch (IOException ex) {
Assert.fail(ex.getMessage());
}
}
}
Anrufe an m2.geta () --

Code: Select all

m2.getF()
Ergebnis in nullPointerexception s.

Code: Select all

final SVGSVGElement docElem = (SVGSVGElement)
doc.getDocumentElement();
final SVGPoint svgPoint = docElem.createSVGPoint();
svgPoint.setX((float) x);
svgPoint.setY((float) y);
final SVGPoint svgPoint1 =
svgPoint.matrixTransform(signSouth.getScreenCTM()); // Line 77

System.out.println("x: " + svgPoint1.getX());
System.out.println("y: " + svgPoint1.getY());
< /code>
Ergebnis: < /p>
java.lang.NullPointerException
at org.apache.batik.dom.svg.SVGLocatableSupport$3.getAffineTransform(Unknown Source)
at org.apache.batik.dom.svg.AbstractSVGMatrix.getA(Unknown Source)
at org.apache.batik.dom.svg.SVGOMPoint.matrixTransform(Unknown Source)
at org.apache.batik.dom.svg.SVGOMPoint.matrixTransform(Unknown Source)
at [...].BatikTest.test(BatikTest.java:77)
UPDATE 3
Ich muss die Methoden auf magische Weise implementieren, und die Methoden
Für Dreiecke. e. Mit der Verwendung muss ich in Java -Code berechnen. Bibliotheken, die legal für kommerzielle Zwecke verwendet werden können. Ich habe es geschafft, den Test mit der Intellij Idea Community Edition 14.1.5 zu kompilieren.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post