Aus einem SVG (mit Inkscape erstellt) soll ein Pfad in Koordinaten von
gleichmässig verteilten Punkten umgewandelt werden. Das angefügte SVG
zeigt den Pfad. Keine Angst, ich mache schon einen einzigen Pfad daraus,
wenn es denn soweit ist! Mit welchem Programm/Script kann ich das
bewerkstelligen?
Hintergrund: Von der Steuerung meiner Modelleisenbahn kann ich die
Position eines Zuges erhalten und würde die gerne graphisch anzeigen.
Also ein roter Kreis oder so der auf der Linie entlangfährt. Wenn ich
nun eine Tabelle hätte mit einigen hundert Punkten wäre der Rest für
mich kein Problem. Zwischenwerte kann ich interpolieren! Manuelles
eintragen von so vielen Punkten würde ich gerne vermeiden...
Vielleicht gibt es ja auch noch andere, einfachere Lösungen! Freue mich
auf Ideen!
Gruss Chregu
Ups, sehe gerade, ich habe eine ungültige SVG-Datei hochgeladen. Diese
Datei habe ich abgespeckt, bis sie gerade noch ladbar ist für:
https://www.unionbytes.de/downloads/VectorGraphic.pbi
Im Anhang die gültige SVG.
Im Zuge meiner Recherche ziehe ich auch einen Umweg über Gcode in
Betracht, da habe ich schon mal Koordinaten - aber noch noch keine
gleichmässigen Wegstücke.
Gruss Chregu
Christian M. schrieb:> Mit welchem Programm/Script kann ich das> bewerkstelligen?Christian M. schrieb:> da habe ich schon mal Koordinaten - aber noch noch keine> gleichmässigen Wegstücke.
Was willst Du mit den Punkten am Ende machen? In welcher Form brauchst
Du die Punkte?
Das ist eine recht einfache Programmieraufgabe, um sich mal ein bischen
mit diskreter Geometrie zu beschäftigen.
Schritt 1: Parametrische Kurve darstellen
Schritt 2: Linienintegral entlang der Kurve bestimmen.
Schritt 3: Gewünschte Punktabstände bestimmen.
Schritt 4: Linie ein zweites Mal im gewünschten Punktabstand
abschreiten.
Walter T. schrieb:> Christian M. schrieb:>> da habe ich schon mal Koordinaten - aber noch noch keine>> gleichmässigen Wegstücke.>> Was willst Du mit den Punkten am Ende machen? In welcher Form brauchst> Du die Punkte?
Korrektur: Ich brauche nicht unbedingt gleichmässige Wegstücke. Ich
stelle mir eine Tabelle vor etwa so:
1
| Wegstrecke | X | Y |
2
+------------+----+----+
3
| 0 | 25 | 10 |
4
| 2.2 | 27 | 10 |
5
usw.
Ich bekomme also von der Steuerung den gefahrenen Weg, z.B. 1.1, und die
Tabelle gibt mir dann mit Interpolation X=26 und Y=10 zurück. Dort male
ich dann einen roten Kreis oder so.
Walter T. schrieb:> Das ist eine recht einfache Programmieraufgabe, um sich mal ein bischen> mit diskreter Geometrie zu beschäftigen.
:-)) Da muss ich mich einlesen. Juhu, eine neue Herausforderung!
Gruss Chregu
Inkscape kann dir dabei helfen, Koordinaten äquidistanter Wegpunkte zu
generieren:
Mit "Extensions/Generate from Path/Distribute Along Path" kannst du ein
Objekt (am besten einen kleinen Kreis) wiederholt als Kopie auf einem
gegebenen Pfad platzieren. Der Abstand zwischen den einzelnen Kopien
entlang des Pfads kann durch den Parameter "Space between copies"
festgelegt werden. Das Kästchen "Follow path orientation" sollte
deaktiviert sein, denn dadurch werden die Kopien nur verschoben und
nicht rotiert was die Ermittlung der absoluten Koordinaten (s.u.)
vereinfacht. Weitere Infors liefert der "Help"-Tab des Dialogs.
Die neu generierten Objekte sind in einer Gruppe zusammengefasst und
sehen in der SVG-Datei wie folgt aus:
Die Koordinaten cy und cy sind dabei diejenigen des ursprünglichen
Objekts und für alle Kopien gleich. Zu diesen Koordinaten muss die
Verschiebung in "transform" hinzuaddiert werden, um die absoluten
Koordinaten der Punkte zu erhalten.
Moment, vielleicht habe ich die Fragestellung nicht verstanden: Soll das
laufend gemacht werden, (z.B. um "Knoten" auf der Linie äquidistant
abzubilden), oder nur einmal (z.B. um Bohrungen für LEDs auf einer
Anzeigeplatte zu positionieren)?
Meine obige Antwort ging vom ersten Fall aus.
Wenn es nur darum geht, das ein einziges Mal zu machen, sollte das jedes
CAD können. Bei mir tritt diese Aufgabe z.B. regelmäßig auf, wenn ich
Schablonen mit Nahtlöchern herstelle. Ich mache das dann mit TurboCAD.
Daß es dafür ein Inkscape-Plugin gibt, ist natürlich auch klasse!
Yalu X. schrieb:> Mit "Extensions/Generate from Path/Distribute Along Path"
Das funktioniert hervorragend!
Yalu X. schrieb:> am besten einen kleinen Kreis
Weiss jetzt auch warum! ;-)
Yalu X. schrieb:> Inkscape kann dir dabei helfen, Koordinaten äquidistanter Wegpunkte zu> generieren
Ich dachte schon, dass es einen Hack gibt!
Gruss Chregu
Daniel A. schrieb:> Falls das später im Browser läuft, könntest du die Punkte euch einfach> per CSS & JS auf dem Pfad platzieren.
Ja jetzt bin ich ein bisschen im Dilemma. Das geht im Browser so schön
einfach! Eigentlich wollte ich ein Windows-Window nehmen und das Ganze
mit PureBasic umsetzen. Dafür fehlten mir nur die Koordinaten.
Aber im Browser muss ich ja noch die Datenübernahme machen. Sowas mache
ich normalerweise mit SpiderBasic und Inline-JS, wie:
Beitrag "Browsercache ausschalten" aber die ganzen Callbacks
schrecken mich wieder ab...
Gruss Chregu
Yalu X. schrieb:> Die neu generierten Objekte sind in einer Gruppe zusammengefasst und> sehen in der SVG-Datei wie folgt aus:
Hallo Yalu,
geht doch nicht so ganz einfach:
-einen Kreis (circle) kann ich nicht auf den Pfad anwenden, kommt ein
Python-Error*. Und ein Path hat dann 8 Nodes und gibt viele Daten
-nachher muss ich noch "Zerlegen", damit es einzelne Objekte sind, aber
das ist kein Problem
*
1
Traceback (most recent call last):
2
File "pathalongpath.py", line 292, in <module>
3
e.affect()
4
File "inkex.py", line 289, in affect
5
self.effect()
6
File "pathalongpath.py", line 209, in effect
7
self.prepareSelectionList()
8
File "pathalongpath.py", line 145, in prepareSelectionList
9
self.objectsToPaths(self.patterns)
10
File "pathmodifier.py", line 241, in objectsToPaths
11
newnode=self.objectToPath(node,doReplace)
12
File "pathmodifier.py", line 235, in objectToPath
13
inkex.errormsg(_("Please first convert objects to paths! (Got [%s].)") % node.tag)
14
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 9: ordinal not in range(128)
Christian M. schrieb:> Yalu X. schrieb:>> Mit "Extensions/Generate from Path/Distribute Along Path">> Das funktioniert hervorragend!Christian M. schrieb:> geht doch nicht so ganz einfach:
Was ist passiert? Ist zwischenzeitlich ein Meteorit eingeschlagen? ;-)
> Please first convert objects to paths!
Vermutlich hast du eine andere Inkscape-Version (ich habe 1.3.2), bei
der das zu verteilende Objekt zwingend ein Path sein muss (ein Kreis ist
keiner). Mit "Path/Object to Path" kannst du den Kreis in einen Path
konvertieren, dann sollte es funktionieren.
Bei mir werden nach der Konvertierung die Kreise durch vier
90°-Kreisbögen dargestellt:
Der Bezugspunkt liegt nun aber nicht mehr im Mittelpunkt des Kreises,
sondern an seinem rechten Rand. Das muss bei der Umrechnung in absolute
Koordinaten berücksichtigt werden, indem von der x-Koordinate noch der
Kreisradius (hier 0.5) subtrahiert wird.
Yalu X. schrieb:> Vermutlich hast du eine andere Inkscape-Version (ich habe 1.3.2)
Habe 0.92, Windows. Habe mal eine neuere Version installiert gehabt,
aber wieder gewechselt, bin nicht damit zurechtgekommen...
Habe unterdessen einen kurzen Strich genommen, der wird auch schön um
die Kurven gelegt. Bekomme dann einen Datensatz wie:
Christian M. schrieb:> Habe unterdessen einen kurzen Strich genommen
Ja, das geht natürlich auch. Der Strich ist wahrscheinlich das
einfachste Objekt, dass als Path durchgeht.
So habe nun einen rudimentären Anzeiger programmiert. Was jetzt mit dem
TrackBar einstellbar ist, kommt dann von der Zug-Steuerung. Bild, Source
und .exe im Anhang! Bild flackert noch, weil immer neu gezeichnet -
mach's dann mit einem Sprite!
Vielen Dank an Alle für die Hilfe!
Gruss Chregu