Page 1 of 1

Wie transformiert die Gruppe programmgesteuert in der SVG -Datei?

Posted: 12 Apr 2025, 23:34
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.