Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: qelurg 30. 01. 2022, 20:11:40
-
Chtěl bych si naprogramovat vlastní jednoduchý jazyk na kreslení vektorových obrázků, který bych překládal do SVG.
Hlavní záměry jsou tři a to:
1) zjednodušit ruční zápis svg (zbavení se XML omáčky)
2) umožnit používat proměnné pro definici bodu, definici pera a definici přechodu
3) zjednodušit si výpočty, takže třeba pro vykreslení čáry plánuji několik způsobů zadání (x1 y1 x2 y2), (b1 b2), (b1 delka uhel)
Formát by byl jednoduchý:
B b1 = 20 20
B b2 = 20 50
P pero = <definice pera>
L pero b1 b2
L pero b2 50 30°
Naprogramovat to chci v Pythonu. Jaký parser by pro to byl nejvhodnější? Moje znalosti končí znalostí existence nástrojů flex, yacc a bison z dávné minulosti, které jsem nikdy nepoužíval. Koukám, že dnes existuje nepřeberné množství podobných nástrojů. Viz třeba článek https://tomassetti.me/parsing-in-python/ Je toho tolik, že si vlastně neumím vybrat, co je pro mé potřeby nejvhodnější. Umím si představit, že bych to udělal i pomocí regexpu, ale pro pozdější údržbu a rozšiřování by asi bylo lepší mít nějakou gramatiku, ale zase nechci jít s kanonem na vrabce. Možná by se mi líbila i možnost výpočtů typu b3 = b2 + 50 30°.
-
Najprv by som si skúsil pozrieť čo nedokážem urobiť v metapost-e, či to tam nestačí len pridať. Až potom by som niečo začínal. A začínať výberom jazyka pokračovať hľadaním knižnice na parsovanie... neviem či je to správna cesta.
-
https://pypi.org/search/?q=svg
-
Ten jazyk co popisujes uz existuje. Vola sa postscript.
-
Ten jazyk co popisujes uz existuje. Vola sa postscript.
Ten je moc složitý a těžkopádný. Já ho chci co nejjednodušší, aby ho mohly používat i děti.
-
Najprv by som si skúsil pozrieť čo nedokážem urobiť v metapost-e, či to tam nestačí len pridať. Až potom by som niečo začínal. A začínať výberom jazyka pokračovať hľadaním knižnice na parsovanie... neviem či je to správna cesta.
Když kouknu na tohle https://www.root.cz/clanky/metapost-aneb-grafika-v-postscriptu/ tak je to také těžkopádné. Já potřebuji něco jednoduchého, co zvládnou děti na 1. stupni ZŠ, které se učí základy geometrie. Ta jednoduchost je základ.
-
Zkuste prosím odpovědět na dotaz, jakým nástrojem parsovat nadhozený jednoduchý jazyk. Nechce se mi zkoumat to množství nástrojů, abych poznal, který je nejvhodnější. Zbytek už si pořeším sám. Děkuji.
-
tak naprogramuj obrazek primo v pythonu, pocitani s promennymi primo v kodu akorat vypis budou primo sekvence svg xml, treba circle, elipse, text, path a souradnice, barvy, vlastnosti uz budes mit nachystane v promennych v pythonu.
tj. na co novy jazyk, kdyz to muzes mit primo v pythonu. tech par tagu svg je jak nic.
-
kdyz pro deti, tak treba ve scratchi. pomoci bloku say muzete vypsat xml svg tag, treba <circle> a z promennych nasypat hodnoty.
-
Zkuste prosím odpovědět na dotaz, jakým nástrojem parsovat nadhozený jednoduchý jazyk. Nechce se mi zkoumat to množství nástrojů, abych poznal, který je nejvhodnější. Zbytek už si pořeším sám. Děkuji.
No, ja ma dobre skusenosti s antlr. Ten generuje parser v pythone na zaklade gramatiky.
S cim budete mat dobre skusenosti vy sa dozviete az si nadefinujete gramatiku a pre nu si vyberiete vhodny parser alebo parser generator. Pisat tu gramatiku na zaklade toho aky parser vam niekto odporuci nieje prave ten najlepsi napad.
Ked tak pouzite antlr4 definiciu gramatiky, ta sa da pripadne konvertovat do ebnf, naopak je to problematicke.
A az tu gramatiku budete mat definovanu tak mozno zistite ze postscript s jeho obratenou polskou notaciou, je dobry napad. Naviac deti na 1 stupni este nie su tak skazene infixovou notaciou ;)
-
A začínať výberom jazyka pokračovať hľadaním knižnice na parsovanie... neviem či je to správna cesta.
Nebyla by, kdyby daný jazyk rozumné knihovny neměl. Jelikož to ale není zjevně případ Pythonu a lexerů/parserů, netrápil bych se tím. Dokonce si myslím, že by se to v tomto případě dalo udělat ručně s pomocí split() na dané řádce a pár podmínek. Obecný parser není nutný.
-
Zkuste prosím odpovědět na dotaz, jakým nástrojem parsovat nadhozený jednoduchý jazyk. Nechce se mi zkoumat to množství nástrojů, abych poznal, který je nejvhodnější. Zbytek už si pořeším sám. Děkuji.
No, ja ma dobre skusenosti s antlr. Ten generuje parser v pythone na zaklade gramatiky.
Děkuji za praktickou radu.
-
Co takhle klasiku HPGL ? https://www.root.cz/clanky/vektorovy-graficky-format-hpgl/ (https://www.root.cz/clanky/vektorovy-graficky-format-hpgl/)
-
A az tu gramatiku budete mat definovanu tak mozno zistite ze postscript s jeho obratenou polskou notaciou, je dobry napad. Naviac deti na 1 stupni este nie su tak skazene infixovou notaciou ;)
Děti je hlavně dobrý nápad učit to, co budou potřebovat. Nikoliv se na ZŠ zabývat akademickou genialitou polské notace.
-
Děti je hlavně dobrý nápad učit to, co budou potřebovat. Nikoliv se na ZŠ zabývat akademickou genialitou polské notace.
Fakt?
"Marinka ma dve jablcka a Janko ma tri jablcka, kolko jablcok maju spolu"
Tj, 2 3 +
Alebo "Janko ma 4 jablcka a 2 zje, kolko jablcok mu zostane"
Tj, 4 2 -
A az potom sa prechadza na infixovu notaciu, vy ste nikdy mozno polsku notaciu nepotreboval, ale mnohy z tohoto serveru mali/maju napr. programovatelnu kalkulacku
-
A začínať výberom jazyka pokračovať hľadaním knižnice na parsovanie... neviem či je to správna cesta.
Nebyla by, kdyby daný jazyk rozumné knihovny neměl. Jelikož to ale není zjevně případ Pythonu a lexerů/parserů, netrápil bych se tím. Dokonce si myslím, že by se to v tomto případě dalo udělat ručně s pomocí split() na dané řádce a pár podmínek. Obecný parser není nutný.
Tak, ja by som to videl na kolekciu, s regex ktore ma kazde priradeny callback na konkretny kod, kde sa tento callback bude volat s vysledkami toho konkretneho regexpu. Dava to potom moznost ze kazdy modul/plugin si do kolekcie prida svoje. Je tam ale riziko ze si neustrazi, to aby boli vysledky jednoznacne. Autor dotazu ale uz ma viziu vlastneho hranateho kolesa, len potrebuje nasmerovat ako ho ostruhat tak aby fungovalo aspom scasti tak dobre ako uz vymyslene koleso...
-
Je tu vela rad co pouzit prinicpialne. Ale tou cestou som si uz presiel.
Ci uz jednoduche parsovanie, rekurzivny zostup, regularne vyrazy, Shunting-yard (https://en.wikipedia.org/wiki/Shunting-yard_algorithm) uz som si tym presiel. Na zaciatku to vyzera jednoduchsie ale nebude a nstanu problemy. A ked budes chciet pridat novu vlastnost jazyka zacnes si trhat vlasy.
Zas pri polskej notacii si budu trhat vlasy tie deti a dospli nadavat, ze ktory kodil taku blbost.
Pouzi gramatiku a k tomu vhodny generator parseru. Usetris si plno kodu, nervov a ladenia.
Robim sice v inom jazyku a inom syntaktickom generatore, ale nieco take je s gramatikou na pol hodinu.
-
Tak prima, prototyp už funguje:
Tento kód:
SL obrys = 1 - #000 o o
SL arrow = 1 - #000 - >
P b1 = 20 20
P b2 = 50 20
U arrow
Lp b1 b2
La b2 50 30° 50 330° 50 0°
U obrys
P a = 100 100
P b = 200 100
P c = 100 200
P d = 200 200
P e = 150 250
Lp a b c d a
Lp a c e d b
U arrow
P x = 125 275
P y = 140 260
Lp x y
Vytvoří tento kód:
<html>
<body>
<svg width="400" height="300"
viewPort="0 0 400 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<style type="text/css" ><![CDATA[
._sl_ {stroke-width: 1.000000; stroke-linecap: square; stroke: #000000}
.obrys {stroke-width: 1.000000; stroke-linecap: round; stroke: #000}
.arrow {stroke-width: 1.000000; stroke-linecap: square; stroke: #000; marker-end: url(#triangle)}
]]></style>
<defs>
<marker id="circle" markerWidth="8" markerHeight="8" refX="4" refY="4">
<circle cx="4" cy="4" r="4" stroke="none" fill="#000"/>
</marker>
<marker id="triangle" markerWidth="10" markerHeight="10" refX="1" refY="5" viewBox="0 0 10 10" orient="auto" markerUnits="strokeWidth">
<path d="M 0 0 L 10 5 L 0 10 z" fill="#000"/>
</marker>
</defs>
<line x1="20.000000" y1="280.000000" x2="50.000000" y2="280.000000" class="arrow" />
<line x1="50.000000" y1="280.000000" x2="93.301270" y2="255.000000" class="arrow" />
<line x1="93.301270" y1="255.000000" x2="136.602540" y2="280.000000" class="arrow" />
<line x1="136.602540" y1="280.000000" x2="186.602540" y2="280.000000" class="arrow" />
<line x1="100.000000" y1="200.000000" x2="200.000000" y2="200.000000" class="obrys" />
<line x1="200.000000" y1="200.000000" x2="100.000000" y2="100.000000" class="obrys" />
<line x1="100.000000" y1="100.000000" x2="200.000000" y2="100.000000" class="obrys" />
<line x1="200.000000" y1="100.000000" x2="100.000000" y2="200.000000" class="obrys" />
<line x1="100.000000" y1="200.000000" x2="100.000000" y2="100.000000" class="obrys" />
<line x1="100.000000" y1="100.000000" x2="150.000000" y2="50.000000" class="obrys" />
<line x1="150.000000" y1="50.000000" x2="200.000000" y2="100.000000" class="obrys" />
<line x1="200.000000" y1="100.000000" x2="200.000000" y2="200.000000" class="obrys" />
<line x1="125.000000" y1="25.000000" x2="140.000000" y2="40.000000" class="arrow" />
</svg>
</body>
</html>
A teď už si s tím mohu hrát. Přidám další objekty, doplním vícenásobné definování bodů na jednom řádku, doplním matematiku atd.
-
Tak prima, prototyp už funguje:
No a co jsi teda použil?
-
No to je hnus teda ten prototyp :)
-
No to je hnus teda ten prototyp :)
Konkrétní výhrady, nebo jen estetika?
-
No to je hnus teda ten prototyp :)
Konkrétní výhrady, nebo jen estetika?
Já osobně bych použil normální prog. jazyk a do něj si napsal knihovnu. Pokud by to mělo být hodně vyzuální, tak by asi šel použít Scratch či podobné. Ale přijde mi, že děti nemají problém ani s tím zadávat počítači čistě textové příkazy.
Jinak ovšem nic proti hraní si s vlastním jazykem...
-
Tak zadavatel nikde nepisal ze ten jazyk budu pouzivat deti, on pisal ze ho chce tak jednoduchy aby ho vedeli pouzit aj deti...
To bolo v reakcii na to ze som sa pytal preco nepouzit postscript.
Ja myslim ze aj deti by pochopili princip zasobniku a RPN. Ved sa ako prve ucia matiku v RPN: Marka ma 2 jablcka a Janko 3 jablcka, kolko jablcok maju spolu?
-
No to je hnus teda ten prototyp :)
Konkrétní výhrady, nebo jen estetika?
Já osobně bych použil normální prog. jazyk a do něj si napsal knihovnu. Pokud by to mělo být hodně vyzuální, tak by asi šel použít Scratch či podobné. Ale přijde mi, že děti nemají problém ani s tím zadávat počítači čistě textové příkazy.
To nejsou konkrétní výhrady ;)
Třeba za mě, mě se to esteticky nelíbí. Ale konkrétní výhrady nemám, protože jsem ten zápis úplně nepochopil, protože mě to odradilo vizuálem, a tudíž jsem se tomu nevěnoval ani trochu.
-
Já tak nějak nevidím, v čem je ten šílenozápis lepší než to zatracované SVG - SVG rozumí každý a má spoustu dokumentace, ale ten šílenozápis, tomu rozumí snad jen jeho autor a každý kdo s tím bude ztrácet čas se bude učit něco co nikde nevyužije.
-
A neni lepší teda nainstalovat nějaký 2D CAD (Qcad, LibreCad) a kreslit ty 2D obrázky v něm?
Tam se v podstatě taky programuje a dopisují příkazy, hodnoty do cmdlajny, plus má to rovnou vizuální reprezentaci a kromě toho to může být do budoucna i užitečné umět.
Takové to ruční parsování a vyrobený specifický jazyk je imho vymýšlení kola...
Anebo co třeba inkscape scripting?
https://inkscape.org/~pakin/%E2%98%85simple-inkscape-scripting (https://inkscape.org/~pakin/%E2%98%85simple-inkscape-scripting)
Anebo co tvorba grafiky v pythonu, je tu spousta skvělých článků od pana Tišnovského
-
Takže např OpenSCAD :)
-
Anebo co třeba inkscape scripting?
https://inkscape.org/~pakin/%E2%98%85simple-inkscape-scripting (https://inkscape.org/~pakin/%E2%98%85simple-inkscape-scripting)
To je dobré. Díky za tip.
-
Nebo použít nějaký nastroj pro matematiku? Jako třeba Julia
https://docs.juliaplots.org/stable/tutorial/#tutorial
https://docs.juliaplots.org/stable/#Intro-to-Plots-in-Julia