![]() |
ganz simples Vektor-Grafikformat
Hallo,
ich bin am überlegen, dem DFM-Editor eine funktion bereitzustellen um Vektorgrafiken darzustellen. Diese soll benutzt werden, um unbekannte controls darzustellen. Bedingungen: - definition im textformat (für Speicherung in ini) - ohne header etc. - nur einfache Befehle wie linie, rechteck, kreis, text, farbe setzen, etc. - relative definition (%) ich hab mir schonmal SVG und WMF angeschaut, wobei SVG einen nicht unbedeutenden Header mitbringt, und somit der Parser ziemlich riesig ist und WMF nicht textbasiert ist. vielleicht hat der eine oder andere sowas schonmal geschrieben, in der Forumsuche hab ich noch nichts passendes gefunden. habe mir auch schon Gedanken (in Anlehnung an SVG und den Canvas-Methoden) gemacht, wie man sowas realisieren könnte: Linie: LXXYYXXYY (XX,YY => zweistellige prozentuale Angaben, anfangs und Zielpunkt) Rechteck: RXXYYXXYY Elipse: EXXYYXXYY Stifteigenschaften setzen: PSRGB (S=>Style/Mode,1 HexDigit pro Farbkanal, wird gedoppelt [F=>FF]) Hintergrund: BSRGB Schriftfarbe: FSRGB die Definition ggf. per Komma getrennt (wegen besserer Lesbarkeit und Einlesen in stringlist :) ) nur beim Text bin ich noch am grübeln, da ich sowas wie Positionierung/Ausrichtung und schriftgröße mit einbauen müsste... TASXXYY:hier_der_text (A=>Alignment[R,C,L],S=>size[%]) vielleicht fällt jemanden eine bessere Idee an... :) Gruß Frank |
Re: ganz simples Vektor-Grafikformat
Als ich den Titel gesehen hab musst ich spontan an XML denken. Damit ließe sich die Sache leicht realisieren.
mfg, Björn |
Re: ganz simples Vektor-Grafikformat
Hallo,
Zitat:
Gruß xaromz |
Re: ganz simples Vektor-Grafikformat
Evtl. gleich ein Delphi-Win32-Projekt aufsetzen das XAML (jedenfalls die GUI-Beschreibung) als Beschreibung verwendet.
|
Re: ganz simples Vektor-Grafikformat
Zitat:
XML-Code:
Ließe sich einfach mit ein paar Zeilen parsen:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grafik> <element> <typ>linie</typ> <farbe>rot</farbe> <start>(0:0)</start> <ende>(10:10)</ende> </element> </grafik>
Delphi-Quellcode:
Im Beispiel für das XML Mit einen TJvSimpleXMl der JEDIS verarbeitet. Okay ein richtiges Vektorformat ist es nicht aber vielleicht ein guter Anfang.
function StrToPoint(Str: string): TPoint;
var s, s1: string; p: integer; begin s := StringReplace(Str, '(', '', []); s := StringReplace(s, ')', '', []); p := Pos(':', s); s1 := Copy(s, 1, p-1); result.X := StrToInt(s1); Delete(s, 1, p); result.Y := StrToInt(s); end; procedure TForm1.Button1Click(Sender: TObject); var i: integer; s: string; start, ende: TPoint; Element: TJclSimpleXMLElems; begin Refresh; XML.LoadFromString(Editor.Lines.Text); for i := 0 to XML.Root.Items.Count - 1 do begin Element := XML.Root.Items[i].Items; if Assigned(Element.ItemNamed['typ']) then begin if Element.ItemNamed['typ'].Value = 'linie' then begin if Assigned(Element.ItemNamed['farbe']) then begin s := Element.ItemNamed['farbe'].Value; if s = 'rot' then begin Canvas.Pen.Color := clred; end; // usw. // viell. html farbcodes parsen end; if Assigned(Element.ItemNamed['start'])and Assigned(Element.ItemNamed['ende']) then begin start := StrToPoint(Element.ItemNamed['start'].Value); ende := StrToPoint(Element.ItemNamed['ende'].Value); Canvas.MoveTo(start.X, start.Y); Canvas.LineTo(ende.X, ende.Y); end; end; if Element.ItemNamed['typ'].Value = 'rechteck' then begin //... end; end; // else Fehler behandeln end; end; mfg, Björn |
Re: ganz simples Vektor-Grafikformat
Wie gesagt, das ganze soll ziemlich kompakt sein, da ich dies mit in meine vorhandenen (INI-) Konfigurationsdateien einbauen kann...
weiterhin möchte ich auf XML-Routinen verzichten, da mir unter D3 der entsprechende Parser fehlt bzw. diesen nachzurüsten den Nutzen übersteigt... Gruß Frank |
Re: ganz simples Vektor-Grafikformat
1, Inidateien stoßen schnell an ihre grenzen wenn es geht gruppierte Elemente zu verwenden
2, Ein eigenes XML-Format wird schnell komplexer als man denkt da man über der laufe der Zeit immer mehr Elemente benötigt. Und wenn man sich an ein bestehendes Format (SVG) ranhängt braucht man sich neue Tags keine gedanken zu machen. Man unterstützt halt mehr Elemente. Ein Ansatz wäre evtl. das Tiny-SVG-Format das gegenüber dem "normalen" SVG-Format schon eingeschränkt ist. Für den anfang hat man halt keine 100%ige Tiny-SVG-Unterstützung. |
Re: ganz simples Vektor-Grafikformat
wen es interessiert, ich hab mal angefangen ein eigenes Format zu implementieren, um Vektor-Grafiken relativ platzsparend im Textmodus zu definieren (etwa so wie im ersten Posting).
![]() vielleicht kann es noch jemand anderes gebrauchen ;) Gruß Frank |
Re: ganz simples Vektor-Grafikformat
Moin moin,
Zitat:
Und lesbar ist es auch nicht gerade. Warum verwendest Du nicht vorhandenes ? Z.B. PostScript:
Delphi-Quellcode:
Ist Text, ist nicht so exotisch, braucht auch nicht viel Platz.
0 0 m % moveto
0 200 l % lineto 200 200 l 200 0 l 0 0 l 1 1 0 sc % setrgbcolor f % fill 1 0 0 sc 50 180 m (Hallo) show |
Re: ganz simples Vektor-Grafikformat
Da fällt mir noch HPGL ein, eine ziemlich alte Grafik-Sprache von Hewlett-Packard für ihre Plotter. Es scheint jedoch immer noch aktuell zu sein. Vielleicht ist das etwas für Dich.
PostScript ist zwar genauso gut, nur ist die zu implementierende Stack-Maschine nicht ganz so trivial, wie ein simpler HPGL-Interpreter. Das gilt allerdings nur, wenn man die gesamte Postscript-Sprache implementieren will, ansonsten nehmen die beiden Sprachen sich nicht viel. |
Re: ganz simples Vektor-Grafikformat
Hi alzaimer,
Zitat:
Zitat:
Ein einfacher Parser reicht doch schon. War mal ne Übung für mich, um Delphi zu lernen :mrgreen: Aber irgendwann bastel ich mir aber noch mal meinen eigenen PS-Interpreter :wink: PS hat den Charme, dass man mit Ghostview bereits einen PreViewer hat. |
Re: ganz simples Vektor-Grafikformat
Zitat:
gut, lesbar ist so ne sache, aber ist ja auch noch der Anfang, evtl bau ich noch trennzeichen ein, um die befehle optisch zu trennen. ist aber eigentlich nicht notwendig, da es dafür irgendwann mal nen Editor geben soll. Zitat:
da dürfte meine definition aber kürzer sein, oder täusche ich mich da ;)
Delphi-Quellcode:
Ansonsten bin ich für verbesserungsvorschläge zu haben :)
//postscript scheint absolute positionsangaben zu haben...ich hab prozentuale :)
R*FF000009999 //mit der 99 wird noch geändert damit 100% möglich ist, farbe hab ich jetzt mal FFFF00 genommen, Stift: den aktuellen //dürften die ersten 7 zeilen sein :) TF0000030605Hallo //die letzten 3 Gruß Frank |
Re: ganz simples Vektor-Grafikformat
Zitat:
Zitat:
Es gibt: - absolute - relative - transformierte/skalierte Bewegungen Man kann schön übersichtlichen oder aber kompakten Code erzeugen, lediglich Space als Trenner reicht. Also Zeilen orientiert oder als Stream, das ist völlig egal. Nur um Missverständnissen vor zu beugen: - Ich will Dich nicht von irgendwas überzeugen/abbringen. - Ich beabsichtige nur, Dir Vorhandenes auf zu zeigen. |
Re: ganz simples Vektor-Grafikformat
Zitat:
Zitat:
sorry, wenn es vielleicht anders rüberkam. ich muss halt nur schauen, ob es meinen Anforderungen gerecht wird. hab mir jetzt halt die mühe gemacht, das irgendwie zu implementieren und würde ungern alles verwerfen. aber sicher lässt sich das eine oder andere mit einbauen bzw. an meinem Konzept verbessern. von daher nützen mir die Tips schon, auch wenn ich das format selbst vermutlich nicht übernehme... ich brauche halt nur überall den relativen bezug auf die Zeichenfläche (bei der schrift haut das noch nicht so hin, wie es soll). ich beabsichtige mit dem code das komplette canvas auszufüllen, nicht nur irgendwas skalierbar zu malen. und z.b. eine liniendefinition mittels moveto/lineto finde ich nicht so gut wie einen linienbefehl der beide endpunkte beinhaltet. Auch aus dem Grund, da man das moveto eigentlich nirgends anders verwenden kann, oder sehe ich das falsch? Gruß Frank |
Re: ganz simples Vektor-Grafikformat
Hallo,
Zitat:
Delphi-Quellcode:
und schon wäre es um eine Funktion erweitert, welche Start- und Endkoordinaten benötigt.
/line { 4 -2 roll
moveto lineto } def Zitat:
Also quasi die Bewegung mit angehobenem Stift. Zitat:
Liesse sich aber auch realisieren :dancer2: Nur wozu braucht man Größendefinitionen relativ zur Zeichenfläche ? :gruebel: Also für geometrische Objekte kann ich mir das ja noch vorstellen, aber für Text ? :gruebel: Wenn es nur darum geht, eine Seite immer gleich aussehen zu lassen, egal ob auf A5 oder A0, dann geht das mit PS mit Sicherheit eleganter. Zitat:
Ich wollte nur klar stellen, dass ich Dich nicht von irgendetwas zwanghaft überzeugen will. Ausserdem ist das hier ein Delphi-Forum und keine PS-Bastelecke :mrgreen: Erzähl doch mal, was Du eigentlich genau beabsichtigst mit diesem Format ? |
Re: ganz simples Vektor-Grafikformat
Hallo,
eventuell ist das Datenformat DVKAZ interessant. Das Format DVKAZ enthält Vektordaten zur Darstellung der amtlichen Verkehrszeichen und Symbole. Hier mal ein paar Links: ![]() ![]() ![]() |
Re: ganz simples Vektor-Grafikformat
Da hat wohl IGES Pate gestanden :kotz:
Das ist alles, aber nicht kompakt, sorry :duck: |
Re: ganz simples Vektor-Grafikformat
Hallo,
hab ich auch nicht geschrieben :) Dachte halt das er sich da eventuell Anregungen holen kann. |
Re: ganz simples Vektor-Grafikformat
Hallo,
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
es geht also um eine reine Bildschirmdarstellung...nicht für den druck die Konfiguration des DFM-Editors beruht auf mehrere Ini-Dateien, somit würde ich die Definition auch gerne in diese einarbeiten. ini habe ich deswegen genommen, da es keinen einfachen XML/SVG-Parser für D3 gibt (zumindest hab ich noch keinen funktionierenden finden können) und diese für meine bisherigen Einstellungen ausgereicht haben. Da die Definition evtl. sehr komplex werden kann, sollte das format ziemlich kompakt sein und keine Zeilenumbrüche etc enthalten, da es in inis auch gewissen Grenzen gibt :) es geht auch weniger um die lesbarkeit...ist ja nicht so, dass man da ständig was dran ändert. btw. ich überlege aber auch schon, das ganze dynamisch (an die jeweiligen Eigenschaften gekoppelt) zu definieren. aber da ist mir noch nichts sinnvolles eingefallen. Dafür müsste man natürlich ein komplexeres Format nehmen Hoffe etwas mehr klarheit in die Sache gebracht zu haben :) Gruß Frank |
Re: ganz simples Vektor-Grafikformat
Hallo Frank,
Zitat:
Zitat:
Nach Deinem letzten posting ist klar, was Du Dir dabei gedacht hast. In diesem Fall wäre PS denkbar ungeeignet. Eigentlich brauchst Du nur Polylines und Text, den Rest kann davon ableiten. |
Re: ganz simples Vektor-Grafikformat
das mit den Polylines hab ich mal aufgegriffen :) man kann nun bis zu 15-eckige polygone erstellen mit einem line-befehl (offen/geschlossen).
der Line-Befehl hat jetzt ein byte mehr vor der ersten position (count-byte), danach kommen count*4bytes als Eckpunkte und wenn das Polygon geschlossen werden soll noch ein '*'. weis denn jemand etwas zu dem text, also wie man den stauchen kann, momentan berechne ich ja nur anhand der höhe die entsprechende TFont.size aus. Dies haut natürlich bei bestimmten proportionen (höher als breiter) nicht wirklich hin, daher wär eine stauch-funktion ganz praktisch. Hab leider noch nicht wirklich was gefunden dazu... evtl. fällt jemand noch eine optimierung ein :) Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz