Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 31. Jan 2023, 08:40
Ah ja, verstehe.
Das parsen und durch den DOM navigieren scheint so nicht vorgesehen zu sein, wenn ich die richtige SKIA-Dokumentation anschaue.
https://api.skia.org/SkSVGDOM_8h_source.html
https://api.skia.org/classSkSVGSVG.html

Aber am Ende ist eine SVG auch nur eine XML, die du mit den üblichen Bordmitteln parsen, verarbeiten und darstellen kannst.
Hier mal was hingeschludert zum drauf aufbauen. Wie die Knoten dargestellt werden musst du deinen Wünschen natürlich anpassen.
Von den einzelnen TreeNodes wieder zurückzugehen per id und das dann in SkSvg1.Svg.DOM.FindNodeById() zu stecken ist dann nur noch eine Fingerübung.


Delphi-Quellcode:
unit Unit2;

interface

uses
    System.SysUtils, System.Variants, System.Classes, System.IOUtils,
    Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.ComCtrls,
    Skia, Skia.Vcl,
    Xml.XMLIntf, Xml.XMLDoc;

type
    TForm1 = class(TForm)
        SkSvg1: TSkSvg;
        Button1: TButton;
        Memo1: TMemo;
        TreeView1: TTreeView;
        procedure Button1Click(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
    SvgFilePath, SvgAsText: string;
    XMLDoc: IXMLDocument;
    XMLNode: IXMLNode;
    TreeNode: TTreeNode;

    procedure Fill(Nodes: IXMLNodeList; Item: TTreeNode);
    var
        Node: IXMLNode;
        Item2: TTreeNode;

    begin
        Node := Nodes.First;
        while Assigned(Node) do
        begin
            Item2 := TreeView1.Items.AddChildObject(Item, Node.NodeName, nil);
            if Node.HasAttribute('id') then
            begin
                Item2.Text := Item2.Text + ' - id: ' + Node.Attributes['id'];
            end;

            if Node.HasChildNodes then
                Fill(Node.ChildNodes, Item2);
            Node := Node.NextSibling;
        end;
    end;

begin
    SvgFilePath := '..._PfadZuEinenTestSVG_...\Skia4Delphi\Samples\Demo\Assets\gorilla.svg';

    SvgAsText := TFile.ReadAllText(SvgFilePath);

    Memo1.Lines.Text := SvgAsText;
    XMLDoc := NewXMLDocument;
    XMLDoc.LoadFromXML(SvgAsText);

    TreeView1.Items.BeginUpdate;
    try
        TreeView1.Items.Clear;
        TreeNode := TreeView1.Items.AddChild(nil, 'Root');

        Fill(XMLDoc.DocumentElement.ChildNodes, TreeNode)
    finally
        TreeView1.FullExpand;
        TreeView1.Items.EndUpdate;
    end;

    SkSvg1.Svg.Source := SvgAsText;
end;

end.
Miniaturansicht angehängter Grafiken
screenshot-2023-01-31-094024.png  

Geändert von TiGü (31. Jan 2023 um 09:09 Uhr)
  Mit Zitat antworten Zitat