AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi SVG-Elemente mit SKIA parsen und bearbeiten?
Thema durchsuchen
Ansicht
Themen-Optionen

SVG-Elemente mit SKIA parsen und bearbeiten?

Ein Thema von PeterPanino · begonnen am 30. Jan 2023 · letzter Beitrag vom 23. Feb 2023
Antwort Antwort
Seite 1 von 2  1 2      
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#1

SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 30. Jan 2023, 14:24
Ich verwende Skia4Delphi in einer Delphi 11 Win32 VCL-Anwendung und lade eine SVG-Datei in ein TSkSvg-Steuerelement:

Code:
SkSvg1.Svg.Source := TFile.ReadAllText(aFile);
Wie kann ich alle SVG-Elemente und ihre jeweiligen Attribute im SVG parsen und sie in einer Baumansicht anzeigen, wobei die Hauptknoten die SVG-Elemente und die Knotenkinder die Elementattribute sind und die Knotenkinder der Elementattribute die bearbeitbaren Eigenschaften des jeweiligen Attributes sind?

Wenn ich dann in der Baumansicht ein Element auswähle, sollte dieses Element im TSkSvg-Steuerelement ausgewählt werden. Wenn ich dann einen Attribut-Knoten auswähle, sollte ich die Eigenschaften dieses Attributes einstellen können.
Geändert von PeterPanino, damit der Platz auf dem Bildschirm nicht so leer aussieht.
  Mit Zitat antworten Zitat
TiGü

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

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 30. Jan 2023, 15:55
Die Source müsste eine DOM-Property haben (ISkSVGDOM) und von dort aus über Root (ISkSVGSVG).
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 30. Jan 2023, 16:04
Die Source müsste eine DOM-Property haben (ISkSVGDOM) und von dort aus über Root (ISkSVGSVG).
SkSvg1.Svg.DOM.Root Aber wie kann ich von dort aus die SVG-Elemente finden?

DOM hat keine Methoden oder Eigenschaften zum Auffinden der SVG-Elemente:

https://app.screencast.com/E5rw3w8nz2Hzm

Wie man sieht, hat DOM die Methode FindNodeById(const AId: string), aber keine Methode, um alle NodeId-Elemente zu finden!
Geändert von PeterPanino, damit der Platz auf dem Bildschirm nicht so leer aussieht.

Geändert von PeterPanino (30. Jan 2023 um 19:59 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 31. Jan 2023, 09: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 10:09 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 17. Feb 2023, 11:27
Was ist denn hier raus geworden?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 17. Feb 2023, 12:23
eine Alternative?
https://learn.microsoft.com/en-us/wi...2d/svg-support
https://docwiki.embarcadero.com/RADS...henfl%C3%A4che
$2B or not $2B
  Mit Zitat antworten Zitat
TiGü

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

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 20. Feb 2023, 09:01
Ne, das reicht nicht, ohne sich allerhand neue Units von Dritten für die notwendigen Header-Übersetzungen reinzuziehen.
Die Delphi-Übersetzung für Direct2D geht nur bis Version 1.0 und für das notwendige ID2D1DeviceContext5::CreateSvgDocument (https://learn.microsoft.com/en-us/wi...atesvgdocument) braucht es Direct2D 1.3 mit allen was dazugehört (DXGI und Direct3D 11).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 20. Feb 2023, 11:53
Wenn Delphi das mal eben aktualisieren würde, dann könnte man auch mal andere Dinge nutzen, wie z.B. die Desktop Duplication API.

Sollten wir schnell mal 'nen FeatureRequest stellen?
Mit der 1.3 sind die bestimmt fertig, wenn wir die 1.5 benötigen.
$2B or not $2B
  Mit Zitat antworten Zitat
TiGü

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

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 20. Feb 2023, 14:23
Sinnlos!
Für dringenden Need gibt's zwei, drei Projekte auf Sourceforge/GitHub, die man problemlos verwenden kann.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#10

AW: SVG-Elemente mit SKIA parsen und bearbeiten?

  Alt 22. Feb 2023, 18:56
Wenn Delphi das mal eben aktualisieren würde, dann könnte man auch mal andere Dinge nutzen, wie z.B. die Desktop Duplication API.

Sollten wir schnell mal 'nen FeatureRequest stellen?
Mit der 1.3 sind die bestimmt fertig, wenn wir die 1.5 benötigen.
Auch wenn's jemand anderes sinnlos findet fände ich einen request doch sinnvoll und würde auch dafür stimmen.
Wenn die das beste Entwicklungstool für WIndows sein wollen, dann müssen die da auch up to date bleiben!

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz