CNC programozáshoz fontkészlet

Fórumok

Szeretnék egy billentyűzet negatívot kimarni fából CNC-vel, hogy szilikonnal kiöntve valami spectrum-like billentyűzetet nyerjek.

A gombokra azonban nem utólag szeretném ráfesteni a feliratokat, hanem eleve úgy marnám az öntőformát, hogy a feliratok magasabban legyenek, vagyis öntés után a mélyedésekbe festéket öntve megjelenjenek. Egy gombon egy betű és két BASIC kulcsszónak kell majd látszani általában.

Kerestem fontokat de valahogy egyik sem igazán erre készült. Azt pedig megúsznám, hogy egy fontot nagyobb munkával kelljen felhasználnom, mint amennyibe a konkrét karakterek megrajzolása kerülne.

Tehát olyan fontkészletet keresek, amiből egyszerűen kiolvashatók az egyes betűk alakjai, programmal könnyen feldolgozhatók. Az általános minimális billentyűzet karakterekre lenne szükségem: számok, angol betűk - egy méretben elég -, és a speciális jelek: $,%,;,",... nyilak.

Annyira nem találok ilyet, hogy lassan elkezdem magam definiálni az egyes karaktereket, de erős a gyanúm, hogy ezt már elég sokan végigszenvedték előttem. Lehet, csak rosszul kerestem?

Hozzászólások

Szerkesztve: 2023. 11. 10., p – 15:57

A truetype/opentype fontok jellemzoen valamilyen vektoros formaban vannak tarolva (talan Bezier gorbekkent), neked meg a CNC-hez pont vektoros formatum fog kelleni. A kerning miatt a szavakat erdemes egyben konvertalni, nem betukbol osszerakni (fura lenne a betutavolsag).

Ha nem akarsz kodolni, vannak olyan online szolgaltatasok, ahol egy adott targyra mart feliratot tudsz konvertaltatni (pl. easel.inventables.com tud ilyet, ld. youtu.be/hB4Cvbtu-lA videoban kb. 13:30-tol). Ha szinten nem akarsz kodolni, de futtatas meg belefer, chatgpt-vel probalnek generaltatni G code-ot (vagy pl. pythont, ami konvertal). Sok python lib letezik, erre valoszinuleg kepes.

Ha a font is kerdeses, a Google Fonts-on rengeteg van, bar ezen nem izgulnek ennyit. A fabol keszult ontoformas szilikononteses technika valoszinuleg nem bir el akkora felbontast, hogy a konkret font - par extra esetet kiveve - annyit szamitson. A jelenlegi billentyuzet gombok 19mm-re vannak egymastol, ebben a koztuk levo ter is benne van (ha szigetes). A gombok picivel kisebbek, gondolom maradnal a 16-18mm-es negyzetes alapnal, a fanak pedig erezete is van ugye, szoval nem bir el akarmit. Ha nincs vakuumkamrad, a buborekokkal is meg kell kuzdened, szoval a vekony, mely es eles vonalak is ki vannak zarva.

szerk: A fat nemtom honnan szedtem, ujraolvasva nem emlited. Aluval es hasonlokkal persze nincs ilyen gond.

A strange game. The only winning move is not to play. How about a nice game of chess?

Teljesen jogos!

Epp WC-n ulve olvastam a topicot, felretettem, hogy ide majd fogok geprol kommentelni, aztan amikor a hsz-t irtam, mar nem lattam a szovegben (annyira nem tekertem vissza).

A strange game. The only winning move is not to play. How about a nice game of chess?

G-code esetén számomra azért az inverz nem annyira triviális. Amiket találtam CNC fontkezelések, azok mind magát a fontot akarták belemarni az alapanyagba. Nekem megy ugye ennek az inverze kell, azaz marni egy négyzetet adott mélységben, és a fontok alakját kevésbé mélyre marni.

Egyelőre úgy képzelem, hogy ha beolvasom a betű/szó alakját, akkor egy adott Y koordinátához minden vonal esetén kell kapnom két X koordinátát (eleje, vége). Így ezeknél a pontoknál meg tudom emelni a marófejet, majd vissza, és így végigmenni a négyzeten. Egy truetype-ból egyelőre nem tudom kinyerni ezeket az adatokat. Biztos van valami célszerűbb fontformátum, vagy ilyen lib, de én még nem találtam meg.

A felbontás valóban kérdés... Ez majd kiderül.

A G code-on szerintem utolag tudsz muveleteket vegezni sajat koddal, nem olyan bonyolult. Amugy az itthoni billentyuzeteken jellemzoen kidudorodnak a betuk, nem bemelyednek, szoval pont olyan, amit a generatorod ad.

A strange game. The only winning move is not to play. How about a nice game of chess?

Igen, dobokockaknal pl. ezt a technikat alkalmazzak, szerintem is jol mukodne. Konnyu letorolni a friss festeket onnan, ahol veletlenul olyan lett, a lyukbol viszont nem jon ki. Bar ha szilikon, es emiatt nem merev, akkor idovel kipattoghat belole a festek, ha az viszont az.

Billentyuzeteknel eddig olyat lattam, amikor vagy sima volt (szitazassal vittek fel a festeket), vagy kidudorodott, es ott ert hozza a festekhez (gondolom valami festekes laphoz).

A strange game. The only winning move is not to play. How about a nice game of chess?

Így ezeknél a pontoknál meg tudom emelni a marófejet, majd vissza, és így végigmenni a négyzeten. Egy truetype-ból egyelőre nem tudom kinyerni ezeket az adatokat. Biztos van valami célszerűbb fontformátum, vagy ilyen lib, de én még nem találtam meg.

A kulcsszó, amire keresned kell, "outline", itt egy konkrét példa: FreeType2 használatával, ez kinyeri ttf (vagy otf) fontokból az általad vágyott vonallistát.

Ez azonban nem lesz elég, ugyanis:

1. ezek a fontok nem csak vonalakat tartalmaznak, hanem Bezier-íveket is. A TrueType font quadratikust, az OpenType pedig kubikust. Ebből én egy rekurzív középpont algoritmussal állítok elő vonallistát raszterizáláskor, mert az egyszerű és hatékony, lásd a kódot itt (4 rekurziós mélységnél már szinte nem is látszanak az egyes vonalak, de persze ez attól is függ, mekkorára képezed le. Nagyobb koordinátára rendszer -> nagyobb mélység szükséges). Ja, és nem kezelem külön a quadratikus és kubikus íveket, a quadratikusokat egyszerűen egy hasonló középpont művelettel kubikussá alakítom (azaz egy kontrollpontból két olyan kontrollpontot csinálok, amiknek az átlaga az eredeti a kontrollpont), és innentől ugyanazt a vonallista előállító kódot eresztem rá mindkét ívre.

2. a vonallista önmagában még nem elegendő ahhoz, hogy megtudd, hogy hol kell felemelni / leengedni a marófejet. Gondolj bele, az "O" esetén két teljesen ugyanolyan vonallistád van, csak az egyiknek kissebbek a koordinátái. Hogy kiderüljön, melyik a külső és melyik a belső, ahhoz a vonallistának zárnia kell (angol szakszó "closed path"), majd végigszkennelsz rajtuk, és megszámolod, hányszor metszette egy-egy vonal a rasztersort. Ha ezen metszések száma páratlan, akkor ki kell tölteni, ha páros, akkor nem (szakszó "odd-even polygonfill"). Ehhez itt egy jó leírás. (Megjegyzem, ez az algoritmus csak akkor működik, ha a vonalak nem keresztezik egymást, azonban ez elvárás minden fontnál.) Neked nyilván nem kitölteni kell majd, hanem a marófejet állítani.

Mégegy dolog, ha nem akarsz szenvedni a TTF dekódolással, akkor a sfnconv -A programommal átalakíthatod egy sima ASC szöveges adatfájllá, amit már gyerekjáték feldolgozni bármilyen programozási nyelven.

m (x),(y)                           - move to, kezdőkoordináta beállítása
l (x),(y)                           - line to, vonal húzása az előző koordinátától ide
q (x),(y) (a),(b)                   - quad to, quadratikus Bezier ív húzása ide
c (x),(y) (a),(b) (c),(d)           - cubic to, kubikus Bezier ív húzása ide

Ezzel azért is jársz jobban, mert a FreeType2 használata nem triviális, a normál dokumentált működésen túl rengeteg heurisztikára lesz szükséged, ha való életbeli fontfájlokat akarsz beolvasni. Ez a proggi mindezt megteszi neked, és egy egységes, 256 x 256-os koordinátarendszerben adja vissza aránytartóan a glifeket. De mint említettem volt, a Bezier íveket neked kell (az általad kívánt részletességnek megfelelő számú) vonallá alakítani, valamint kitalálni, melyik rész van a glif-en belül illetve kívül.

Másik megoldás, a FontForge. Ez egy Szabad és Nyílt Forráskódú font szerkesztő, amivel be tudsz tölteni fontokat, majd le tudod menteni SplineFontDB formámtumban, ami megint csak egy sima szöveges formátum (bár szerény véleményem szerint sokkal macerásabb, mint a fenti ASC formátum).

EDIT: hogy egyszerűbb legyen az élet, beraktam egy új opciót, sfnconv -AL, ez átkonvertálja az íveket több vonallá, szóval ezzel a kapcsolóval a kimenetben csakis m (move to) és l (line to) sorok lehetnek. Egyelőre csak a forrást frissítettem, ma már késő van és fáradt vagyok, de holnap újrafordítom és felrakom a Linux meg Windows binárisokat is.

Na, jól elfelejtettem szólni, bocs, fent vannak az új binárisok.

Mégegyszer röviden:
sfnconv -AL (bármi.ttf|otf|woff) (kimenet.txt)
egy olyan szöveges fájllá alakítja a fontot, aminél minden sorban elég a legelső karaktert figyelni, ezek a következők lehetnek:

# - komment
$ - fejlécadat (pl. font neve, alapvonal helyzete stb.)
= - ez mondja meg, melyik karakter leírása következik
m - ez új vonallistát indít
l - vonalhúzás, a legutolsó koordinátája ugyanaz, mint az "m" soré

Minden más karakterrel kezdődő sort hagyj figyelmen kívül (van még pl. k, ami a kerning infó). Egy karakter tartalmazhat 0 (pl. szóköz), 1 (pl. W), vagy több (pl. Á-nál 3) "m"+"l" vonallistát.

Ezt a több vonallistából álló adathalmazt odd-even polygonfill algoritmussal kell feldolgoznod, hogy megtudd, mikor kell a marófejet felemelni / leengedni. Ha még ezzel sem akarsz szívni, akkor
sfnconv -AL -B 128 (bármi.ttf|otf|woff) (kimenet.txt)
raszterizilája neked a fontot a megadott méretben, ekkor minden "=" sor után 128 újabb sor fog szerepelni, amiben csak kétféle karakter lehet, "." és "X". Pl. "-B 16" esetén 16 sorod lesz, ilyenek:

===U+00FB01===w8=h16=x8=y0=o0="fi"===LIGATURE-FI===
........
........
..XXX...
.XX.XX..
.XX..XX.
.XX..XX.
XXXX....
.XX..XX.
.XX..XX.
.XX..XX.
.XX..XX.
XXXX XX.
........
........
........
........

Egyébként a "=" sorok formátuma:
===U+(UNICODE kódpont hexában)===w(szélesség)=h(magasság)=x(vízszintes toll pozíció)=y(függőleges toll pozíció)=o(vízszintes átfedés)="(UNICODE kódpont UTF-8-ban)"===(kódpont neve)===
Amikor több karaktert rajzolsz ki egymás mellé, akkor először kivonod a toll pozíciójából az "o"-t, majd kimaratsz "w" x "h" pontot, és hozzáadsz a toll pozíciójához "x"-et, "y"-t. Ez fontos, mert a toll mozgatás mértéke nem egyenlő a glif méretével. (Pl. talpas italic Sans-Serif esetén az "f" karakternek van egy alsó kunkori szára, amit az előző betű alá kell kirajzolni, ilyenkor az "o" nem nulla, aztán "x" egységnyivel rá kell kirajzolni a következő betűt, ami kissebb, mint a "w", mert a felső kunkori szárának meg a következő karakter fölé kell lógnia. "y" csak a kínai, kóreai és japán karaktereknél lehet nem nulla, mert azokat fentről lefelé kell írni.) Ez a toll mozgatás érvényes akkor is, ha vonallistád van, meg akkor is, ha "-B" kapcsolóval bitmappé alakítottad.

Most jutottam ismét a fontokhoz. Letöltöttem, és kipróbáltam egy Google fonttal:

./sfnconv -AL font/static/OpenSans-Regular.ttf out.txt

Az eredmény:

  No kerning information
free(): double free detected in tcache 2
Félbeszakítva

Megpróbáltam a ttf helyett a fonts mappádban lévő FreeSans.sfn fájllal is. Azzal rendben működött.

U.i.: Ez a -B nagyon hasznos! Köszi! :)

Szívesen!

kipróbáltam egy Google fonttal

Tudnál linket adni hozzá? Nem szabadna ilyen problémának lennie, de rengeteg a hibás font a neten, és hát a FreeType2 sincs épp a helyzet magaslatán. Mindesetre kidebuggolnám.
Megpróbálam ezzel, de nálam nem volt gond vele. Mármint nem crashelt el, hanem kiírt egy rakat hibát:

$ ./sfnconv -AL OpenSans-Regular.ttf out.txt
Loaded 'OpenSans-Regular.ttf' (FreeType2, 0 - 10FFFF)
  Name 'Open Sans' num_glyphs: 1140, units_per_EM: 2048, ascender: 2189, underline: -125, vector
libsfn: inconsistent font: U+0000E6, xMax 1660 != xMin+w 1661    
libsfn: inconsistent font: U+0001FD, xMax 1660 != xMin+w 1661    
libsfn: inconsistent font: U+0004D5, xMax 1660 != xMin+w 1661    
libsfn: inconsistent font: ascender 2189 != max(yMax) 2146    
  Numchars: 1010, Bounding box: (-1051, -557), (2460, 2146) dx 3511 dy 2703, w: 2335, h: 2320, baseline: 2146
  Scaling to 2335 x 2335, average: 973 x 1426
libsfn: scaling error U+000028 px 50 py 270 c1x 40 c1y 256 c2x 0 c2y 0
libsfn: scaling error U+000029 px 17 py 270 c1x 29 c1y 257 c2x 0 c2y 0
libsfn: scaling error U+00002c px 14 py 263 c1x 17 c1y 255 c2x 0 c2y 0
libsfn: scaling error U+00003b px 14 py 263 c1x 17 c1y 255 c2x 0 c2y 0
libsfn: scaling error U+000040 px 84 py 255 c1x 98 c1y 255 c2x 0 c2y 0
libsfn: scaling error U+00004a px 17 py 276 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000051 px 137 py 272 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00005b px 49 py 270 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00005d px 0 py 255 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00005f px 99 py 268 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000067 px 49 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00006a px 17 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000070 px 18 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000071 px 87 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000079 px 50 py 271 c1x 56 c1y 263 c2x 0 c2y 0
libsfn: scaling error U+00007b px 70 py 270 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00007c px 15 py 289 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00007d px 0 py 270 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000a1 px 24 py 275 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000a6 px 15 py 289 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000b5 px 18 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000b6 px 109 py 263 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000b8 px 44 py 266 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000bf px 25 py 255 c1x 17 c1y 249 c2x 0 c2y 0
libsfn: scaling error U+0000c7 px 91 py 266 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000e7 px 72 py 266 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000fd px 50 py 271 c1x 56 c1y 263 c2x 0 c2y 0
libsfn: scaling error U+0000fe px 18 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0000ff px 50 py 271 c1x 56 c1y 263 c2x 0 c2y 0
libsfn: scaling error U+000104 px 120 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000105 px 80 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000118 px 67 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000119 px 74 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00011d px 49 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00011f px 49 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000121 px 49 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000122 px 86 py 260 c1x 88 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+000123 px 49 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00012e px 15 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00012f px 15 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000132 px 39 py 276 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000133 px 44 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000134 px 17 py 276 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000135 px 17 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000136 px 61 py 260 c1x 64 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+000137 px 50 py 260 c1x 52 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+00013b px 55 py 260 c1x 57 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+00013c px 24 py 260 c1x 26 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+000145 px 72 py 260 c1x 75 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+000146 px 59 py 260 c1x 62 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+00014a px 84 py 276 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00014b px 69 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000156 px 61 py 260 c1x 63 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+000157 px 24 py 260 c1x 26 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+00015e px 68 py 266 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+00015f px 64 py 266 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000162 px 81 py 266 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000163 px 66 py 266 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000172 px 83 py 259 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000173 px 81 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000177 px 50 py 271 c1x 56 c1y 263 c2x 0 c2y 0
libsfn: scaling error U+000192 px 47 py 272 c1x 51 c1y 263 c2x 0 c2y 0
libsfn: scaling error U+0001ea px 72 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0001eb px 54 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0001ec px 75 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0001ed px 54 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0001f0 px 17 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000218 px 56 py 260 c1x 59 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+000219 px 52 py 260 c1x 54 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+00021a px 69 py 260 c1x 72 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+00021b px 53 py 260 c1x 56 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+000237 px 17 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0002db px 15 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0002f3 px 24 py 295 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000323 px 11 py 273 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000326 px 24 py 260 c1x 26 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+000327 px 44 py 266 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+000328 px 15 py 261 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0003ae px 100 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0003b2 px 18 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0003b3 px 58 py 271 c1x 60 c1y 261 c2x 0 c2y 0
libsfn: scaling error U+0003b6 px 85 py 262 c1x 89 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+0003b7 px 100 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0003bc px 18 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0003be px 85 py 262 c1x 89 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+0003c1 px 18 py 255 c1x 18 c1y 246 c2x 0 c2y 0
libsfn: scaling error U+0003c2 px 85 py 263 c1x 89 c1y 254 c2x 0 c2y 0
libsfn: scaling error U+0003c6 px 75 py 288 c1x 0 c1y 0 c2x 0 c2y 0
libsfn: scaling error U+0003c7 px 97 py 264 c1x 95 c1y 259 c2x 0 c2y 0
libsfn: scaling error U+0003c8 px 76 py 288 c1x 0 c1y 0 c2x 0 c2y 0
...még jó sok ilyen

Oké, sikerült reprodukálnom a hibát. Naná, hogy FreeType2 bug már megint...

==17378== Invalid free() / delete / delete[] / realloc()
==17378==    at 0x81EF12F: free (vg_replace_malloc.c:974)
==17378==    by 0x179511: ft_free (in /home/bzt/Documents/scalable-font2/sfnconv/sfnconv)
==17378==    by 0x175D8E: ft_mem_free (in /home/bzt/Documents/scalable-font2/sfnconv/sfnconv)
==17378==    by 0x19AF08: tt_face_free_name (in /home/bzt/Documents/scalable-font2/sfnconv/sfnconv)
==17378==    by 0x190CD0: sfnt_done_face (in /home/bzt/Documents/scalable-font2/sfnconv/sfnconv)
==17378==    by 0x1B80EF: tt_face_done (in /home/bzt/Documents/scalable-font2/sfnconv/sfnconv)
==17378==    by 0x169DD3: destroy_face (in /home/bzt/Documents/scalable-font2/sfnconv/sfnconv)
==17378==    by 0x16C3C6: FT_Done_Face (in /home/bzt/Documents/scalable-font2/sfnconv/sfnconv)
==17378==    by 0x13EA43: ft2_parse (vector.c:687)

Feltettem egy workaroundot. Ez memleakel a legtöbb font esetében, de legalább nincs benne double free...

Bocs, gondolhattam volna rá, hogy megadjam a fontot. De a javítás segített, most már ezzel is lefut! (Egyébként az OpenSans volt.)

Elég hatékonyan lehet vele dolgozni. Már elkészült a billentyűzet 0. verziója. Még csak laser fejjel készít feliratokat síkban, de innen már nem lesz nehéz 3D-be átvinni. Ezek a fontok voltak, amiket nem láttam át, hogy fognak elkészülni. Majd keresek még valami keskenyebb fontot a feliratokhoz.

Nem csak a Google fejlesztett ingyenes fontokat, hanem sok más cég, fejlesztői csapat, adott ki ingyeneseket az URW, Adobe, Microsoft is, és van egy csomó egyénileg fejlesztett ingyenes is. Az tuti nem korlát. A Type 1-3, TrueType, OpenTpye fontok is tuti használhatók, pont amiatt mert vektorosak. Itt a kérdés inkább az, hogy a kollégának milyen CNC gépe van, milyen szoftverrel hajtja, az milyen vektoros formátumokat fogad, vagy tud importálni.

A legtöbb normális billentyűzeten valami talpatlan (sans-serif), állandó (vagy relatíve állandó) vastagságú, geometriailag szabályos (groteszk, újgroteszk, humanista, mértani) betűtípus van, Helvetica, Palatino, Optima, Myriad, Gill Sans, Arial, Nimbus Sans, Futura, Lucida, Verdana, Frutiger, Vera Sans, Roboto, Noto sans, stb.. Ezekből a Helvetica és annak klónjai (Arial, Liberation Sans, Open Sans, Nimbus Sans, stb.) a legnépszerűbbek, leginkább használtak billentyűzeteken, persze van mindenféle ezen kívül is, főleg az utóbbi években sok spéci és gaming billentyűzeten mindenféle elvont, szögletes, vicces betűtípus van. Mivel a kolléga fogja használni, ezért neki kéne keresni ehhez betűtípust, tele van a net ezekkel a betűtípusgyűjteményes, tesztelős oldalakkal, FontFace, MyFonts, Font Squirrel, Adobe Fonts. Ezeken fizetős betűtípusok is tesztelhetők.

Némelyik font licencet igényelne, de ha a kolléga csak a saját billentyűire akarja rámaratni, akkor nem lesz belőle baja. Csak akkor lenne gáz, ha termékként árulná, de a legtöbb esetben minden klasszikus, elterjedt betűtípusnak van már free/open licences klónja, ami 99-99,99%-ban ugyanúgy néz ki. Még maratás előtt méretazonosan nyomtassa ki, hogy lássa a végleges méretben, mennyire vastag, mennyire olvasható. Akár sok font le is warezolható, de azokban szokott korlátozás lenni, sok spéci, Unicode karakter nincs bennük, meg OpenType feature-ök vannak megnyirbálva, de ez nem is lényeges, ha csak billentyűzetre kellenek alap karaktereknek. Ez csak akkor lenne fontos, ha profi nyomdai minőségű kiadványba kellene az adott betűtípus.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

3d nyomtatott negativon nem gondolkodtal? Mennyire melegszik fel a szilikon? 

Ezen én is elgondolkodtam...

Az FDM technológia felbontása ide kevés lenne, nem elég sima a képzett felület.

Resint még nem használtam, de amiket láttam, azok alapján el tudom képzelni, hogy  megfelelő eredményt kapnánk. Itt még nem korlátozna a resines nyomtatók amúgy kicsi építési térfogata, és  mivel "még" nincs meg a 3D nyomtató, el lehet gondolkodni, hogy egy projekthez érdemes-e venni egy nyomtatót. 

A tükrözés problémája ezzel a módszerrel  biztosan nem merülne fel.

"Normális ember már nem kommentel sehol." (c) Poli

Milyen maroid vannak? Egy kisebb, 2-3 mm-es maro valoszinuleg durva lenne a betukhoz. Egy grafirozofej (nekem 0.1mm-es van) meg a vilag vegeig nem marna ki magukat a gombokat. Szerszamcserelod van a gephez, vagy kezzel szoktad?

Kivancsisagbol elkezdtem GhatGPT-vel iratni egy kodot, az utolso 2 kodreszlet erdekes innen. Viszont a melyiteshez kellene egy kicsit tobb info.

A strange game. The only winning move is not to play. How about a nice game of chess?

Itt akadtam el végül én is. Van 0.1-es maróm, és nagyobb is, de mivel negatív lenne a szöveg, a 0.1-es fejjel kellene a teljes gomb felületét végigmarni. Ráadásul mivel csak kézzel cserélek fejet, eredetileg egy fejjel akartam volna az egészet kimarni, de az teljesen esélytelennek tűnik így.

A 0.1 es fejjel csak le kell tisztázni, nem? Ha jól értettem akkor a betű kidudorodna az ötőforma aljából, theát a nagy részét valami hatékonyabb fejjel ki lehetne marni. Esetleg két külön "marási tervet" készíteni, az első kinagyolja, a második meg csak letisztázza a betűket. Bár én inkább egy aluminium tömbből marnám.

(fingom sincs a CNC esztergálásról :D ) 

// Hocus Pocus, grab the focus
winSetFocus(...)

http://c2.com/cgi/wiki?FunnyThingsSeenInSourceCodeAndDocumentation

Pontosan ezt szoktak profibb gepeken. Van egy nagyolo es egy simito fazis a vegen. A nagyobb gepeken szokott lenni automata szerszamcserelo, amibe be tudod fogni elore a szerszamaidat, es pl. egy dobtarba bele tudod oket tenni, aztan a megfelelo G-code parancsokra a kiadott szamut beteszi a marodba. Elozo munkahelyemen beszereztek par regi cnc gepet, aminek a vezerleset mi ujitottunk fel. Amikor a szerszamcsere kodjat irtam, meg arra is figyeltem, hogy elore oda tudja kesziteni a kovetkezo szerszamot, igy a csere mar gyors lehet, Pl:

t1 m6
t2
...
m6

Itt a t1 eloszedi az 1-es szerszamot, az m6 beteszi a gepbe. A t2 elokesziti a 2-eset, es miutan az elsovel vegzett, az m6 beteszi a korabban elokeszitettet (es utana az 1-et visszateszi a helyere, ha nem t1 a kovetkezo parancs).

Kisebb, otthoni, hobbi gepeken (meg nagyobbakon, ha speci celu) nem szokott lenni cserelo, itt kezzel tudod cserelgetni a szerszamaidat. Viszont ekkor a hegye szinte biztos elmozdul, utana kulon be kell allitani, ami maceras, es elronthatja a pontossagot. Ezert ha meg lehet uszni, celszeru. A konkret esetben valoszinuleg praktikusabb cserelni, azert is kerdeztem ra milyen gepe meg maroi vannak.

A gep a munkadarab anyagat is meghatarozza. A poliaxot acelon teszteltuk, teljesen jol vitte, de hat eleg nehez gep volt. Itthon egy 3018pro-m van, ennek extrudalt aluminiumbol van a vaza, szoval a puhabb anyagokhoz eleg csak a merevsege. Fat, muanyagot es hasonlokat gond nelkul visz, alut csak kis elotolassal, acel viszont teljesen eselytelen.

Ja, itt most marasrol van szo. Esztergaval csak nagyon erdekes alaku billentyuzeteket lehet kesziteni :)

A strange game. The only winning move is not to play. How about a nice game of chess?

Blender ugyan nem egy gépészeti modellező program, de elég pontosan lehet parametrizálni és a kész modell olyan fomátumba exportálod amivel majd tud mit kezdeni a maród.
Fogod a billentyűzetedet és ledefiniálod/modellezed a gombokat pozitívban. úgy, hogy valamelyik síkra merőlegesek legyenek a gombfelületek. A kurzort úgy helyezed el, hogy  billentyűzet közepén és a gombfelület tetejének a síkjában legyen. Object módban hozzáadsz egy text objektumot, a megfelelő TTFel megszerkeszted, méretezed és a gombok síkjához lockolva elmozgatod a megfelelő pozícióba. Ezt végigcsinálod az összes felirattal. Mikor kész akkor text kiválasztása, jobbklikk, convert to... -> convert to mesh. Ezt addig ismételgeted míg az összes feliratod mesh  lesz. Ezeket mesheket összejoinolod, és extrudálod a begravírozás mélységéig. A gombokat szintén joinolod, a feliratokat pozícionálod és egy boolean művelettel kivonod a billentyű objectből. Ezután fogsz egy téglatestet ami a kimarandó  fadarabod méretére igazítasz és a gravírozott gombokat objectjét kivonod belőle.  Az így elkészült negatív mintát kiexportálod a neked tetsző modell típusba és G kódot generálsz belőle.

 

"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "

A Fusion 360 hobbi célra ingyenesen használható profi CAD aminek van CAM modulja is ahol lehet szerszám pályát is generálni.

Van betű emboss funkció is.

A negatív formában az egyes gombok utólag behelyezhető külön darabok legyenek (egyébként készítés közben garantált hogy 1-2-4... gomb marása után derül ki valami gikszer). 

A gombokat tervezd meg => 3d bérnyomtatás.

Ha mindenáron magad akarod, akkor a gombokat normál alakban mard ki pl. alumíniumból és műanyagból öntsd ki a negatívot amit behelyezel a végső öntőformába (ez elég munkaigényes folyamat)...