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 Tick

    Diese 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ß


Anmelden zum Antworten