Hmm... Ja.. vielleicht Protokoll zerlegung?
-
Halli Hallo,
ich bin gerade dabei eine Software zu schreiben, welche Dateien in HPGL Format handelt. Jetzt bin ich an einem Punkt angekommen wo ich nicht mehr nur speziell auf ein HPGL Command Konzentriert sonder auf mehrere.
Hier einmal die Liste:
Commands
Instruction Arguments
AA Arc Absolute x,y,angle(,tolerance)
AF Advance page
AH Advance page
AP Automatic Pen Operations n
AR Arc Relative x,y,angle(,tolerance)
AS Acceleration Select acceleration(,pennumber)
BF Buffer Plot
BL Buffer label string
CA Select Alternative Charset set
CC Character chord angle angle
CI Circle radius(,tolerance)
CM Character Selection Mode switchmode(,fallbackmode)
CP Character Plot spaces,lines
CS Select Standard Charset set
CT Chord Tolerance n
CV Curved line generator n(,inputdelay)
CD Digitize Clear
DF Default
DI Absolute Direction run,rise
DL Define Download character charnumber(,pencontrol),x,y(...)
DP Digitze Point
DR Relative Direction run.rise
DS Designate Charset slot,set
DT Define Label Terminator terminator
EA Edge Rectangle Absolute x,y
EP Edge Polygon
ER Edge Rectangle Relative x,y
ES Extra Space spaces(,lines)
EW Edge Wedge radius,startangle,sweepangle(,tolerance)
FP Fill Polygon
FS Force Select force(.pennumber)
FT Fill Type type(,spacing(,angle))
GC Group Count countnumber
GM Graphics Memory (polygonbuff)(,downloadbuff)(,replotbuff)(,vectorbuff)
GP Group Pen (groupnumber(,pennumber(,numberofpens,(length))))
IM Input Mask emaskvalue(,smaskvalue(,pmaskvalue))
IN Initialize
IP Input p1 and p2 x,y(,x,y)
IV Invoke Character Slot slot,(left)
IW Input Window x,y,x,y
KY Define Key key(,function)
LB Label string
LO Label Origin positionnumber
LT Line Type patternnumber(,patternlength)
NR Not Ready
PA Plot Absolute x,y(,...)
PB Print Buffered Label
PD Pen Down x,y(,...)
PG Page Feed n
PM Polygon Mode n
PR Plot Relative x,y(,...)
PT Pen Thickness thickness
PU Pen Up x,y(,...)
RA Fill Rectangle Absolute x,y
RO Rotate Coordinate System n
RP Replot n
RR Fill Rectangle Relative x,y
SA Select Alternative Charset
SC Scale x,y,x,y(,type(,left,bottom))
SG Select Pen Group groupnumber
SI Absolute Character Size width,height
SL Character Slant tantheta
SM Symbol Mode character
SP Select Pen pennumber
SR Relative Character Size width,height
SS Select Standard Charset
TL Tick Length tp(,tn)
UC User Defined Character (pencontrol,)x,y
UF User Defined Fill gap1(,gap2,...gap20)
VS Velocity Select speed(,pennumber)
WD Write to Display string
WG Fill Wedge radius,startangle,sweepangle(,tolerance)
XT X Tick
YT Y TickDiese Commands liegen in einer einfachen Textdatei vor.
Wie z.B.IN;
PU;
SP1;
PA 1000,2300;usw....
Bis jetzt habe ich mein Programm immer nur auf das PA Command gesetzt.
Wie funktioniert es aber wenn ich hier mehrere solcher Commands habe das ich auf diese dann speziell mit Subroutinen reagieren kann wie bei einer switch case funktion?
Also nochmals.
Ich habe eine Datei in der die oben genannten Commands vorkommen.
Wie schreibt man dazu eine routine die eine Auswertung jeder zeile macht und dann eine Subroutine ausführt?
Ich hätte es jetzt so gemacht, aber mit scheint dies kein guter Lösungsansatz:
sscanf(LINE, "%s;", &String); if (String == "IN") { Initialisation(); } if (String == "PU") { Heben(); } // ---------- Extremes Beispiel --------- if (String == "PA") { sscanf (LINE, "PA %i, %i;P%c;", &Xwert, &Ywert, &Zupdown); Fahren(Xwert, Ywert, Zupdown); } ...Ist das der Richtige weg? Oder geht es angenehmer?
Grüße
-
würde ein Hashtable anlegen... dieser beinhalte alle Befehle! Wobei du wahrscheinlich mit C arbeitetest, da legst ein eigenes Array an mit den befehlen... danach durchsuchst dieses nach dem Command, und kannst bei jedem eintrag spez. aufgaben vergeben über funktionspointer...
-
Du koenntest dir auch mal Lex und Yacc anschauen. Zwei sehr nuetzliche Tools, ist bei mir aber schon ein bischen her, dass ich die benutzt habe...
-
BorisDieKlinge schrieb:
Wobei du wahrscheinlich mit C arbeitetest, da legst ein eigenes Array an mit den befehlen... danach durchsuchst dieses nach dem Command, und kannst bei jedem eintrag spez. aufgaben vergeben über funktionspointer...
Ich würde dir in dem Fall eine Map empfehlen. Der zugriff ist da etwas schneller.
-
ah ja danke für die Antworten... aber gibts dazu auch einmal Codeschnippsel?
Weil ich hab mir bis jetzt alles in C selbst beigebracht und das ist mir neu... also bräuchte ich ein Beispiel

-
ich würd boost::spirit verwenden.
Schau mal im Magazin, da gibt es nen Artikel dazu. Und natürlich die Doku auf boost.org.
-
Magge2k schrieb:
ah ja danke für die Antworten... aber gibts dazu auch einmal Codeschnippsel?
--> http://www-user.tu-chemnitz.de/~heha/viewzip.cgi/hs_freeware/hp2xx_hs.zip/
(hpgl.c)

-
Oh ja sehr cool, vielen Dank!
-
Hiho,
so hab n neues Problem, aber ich dachte ich kann des auch in diesem Thread erfragen, weil dann brauch ich keinen neuen aufmachen....
Folgendes:
Ich habe ja eine Datei in dem die X und Y Koordinaten der Fahrwege für eine Fräse gegeben sind. Dies schaut Folgender Maßen aus "PA122,1234;" also PA (X-Wert),(Ywert); Dieser befehl kann entweder mehrmals in einer Zeile vorkommen oder Zeilenweise anhängig vom Programm mit dem die Datei erstellt wurde.
Ich möchte jetzt diese datei mit c++ öffnen, die werte auslesen und in dieser form speichern.
z.B.
PA1234,3456;
PA3452,7434;in
Koordinaten[0].x = 1234;
Koordinaten[0].y = 3456;
Koordinaten[1].x = 3452;
Koordinaten[1].y = 7434;
...
usw.
...Jetzt wollte ich diesen Programmcode verwenden nur sehe ich da ein Problem... je nach dem können die Koordinaten zwischen 1 und 99999999999999 variieren.. und ich möchte ja nicht schon von vornherein so viel speicher platz reservieren, weil das müsste ich wenn ich folgenden Code verwende. Da ich Koordinaten[12] ja definieren muss und eigentlich sollte das variabel sein je nach dem was ich für eine Datei öffne...
typedef struct tagVERTEX { int x, y, z; } VERTEX; VERTEX Koordinaten[9999]; ... void main... FILE *filein; char oneline[255]; char Line[255]; filein = fopen(OpenDialog1->FileName.c_str(), "rt"); // File to load fseek(filein, 0, SEEK_SET); int loop = 0; int wert = 0; //for (int loop = 0; loop < 12; loop++) do { fgets(oneline, 100, filein); if (sscanf(oneline, "PA%i,%i;%s", &x, &y, &zup)) { Memo1->Lines->Add(oneline); if (zup[0] == 'P' && zup[1] == 'U') { z = 0; } if (zup[0] == 'P' && zup[1] == 'D') { z = 1; } //x = x / 1000; //y = y / 1000; Koordinaten[wert].x = x; Koordinaten[wert].y = y; Koordinaten[wert].z = z; wert++; } loop++; } while (loop != 23); fclose(filein);Oder gibt es eine elegantere Art das Problem zu lösen?
Gruß