hpgl-> positions liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Sonntag 11. Januar 2009, 16:12

ist bestimmt ganz einfach nur häng ich mal wieder bei den kleinigkeiten rumm

so siehts aus

Code: Alles auswählen


"""
IN; IP 0,0,100,100; SC 0,100,0,100;
SP 1;
PA 179,102;
PD;
AA 203,102,360;
PU;
PA 281,102;
PD;
AA 305,102,360;
PU;
PA 382,102;
PD;
AA 406,102,360;
PU;
PA 484,102;
PD;
AA 508,102,360;
PU; SP 0; PA 0,0;
"""

#f = open("hpgl.txt")
data = []
for line in f.readlines():
    data.append(line)
#f.close()
print len(data)
pos=[]
for line in data:
    if 'PA' in line:
        line =line.replace(";"," ")
        zeile=line.split()
        pos.append(zeile[1])

for p in pos:
    print p
das ziel soll sein pos =[(x,y),(x,y)....]

es will einfach nicht so
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 11. Januar 2009, 16:23

Code: Alles auswählen

for line in data:
    for stmt in line.split(";"):
        stmt = stmt.lstrip()
        if stmt.startswith("PA"):
            pos.append(tuple(map(int, stmt[2:].split(","))))
Stefan
BlackJack

Sonntag 11. Januar 2009, 16:33

@sea-live: Und als Hilfe zur Selbsthilfe ``print``\e Dir doch mal `line` und `zeile` aus um zu sehen was die nach Deinen Aktionen jeweils enthalten.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Sonntag 11. Januar 2009, 16:45

Guck Dir auch noch mal die erste Schleife an. Die ist nicht besonders sinnvoll. Du kannst direkt schreiben:

Code: Alles auswählen

data=f.readlines()
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Sonntag 11. Januar 2009, 16:48

jo danke jetzt häng ich am dateinahmen der wird mit u,' geliefert und das will f.open nicht
ich sags ja kleinigkeiten

Code: Alles auswählen

    def Hpgl(self,event):
        dateipfad = None
        wildcard = "TXT (*.txt)|*.txt|"     \
           "Drill (*.drd)|*.drd|" \
           "HPGL (*.hpgl)|*.hpgl|"    \
           "All files (*.*)|*.*"
        dlg = wx.FileDialog(
            self, message="Eine Datei Wählen",
            defaultDir=os.getcwd(), 
            defaultFile="",
            wildcard=wildcard,
            style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR
            )
        if dlg.ShowModal() == wx.ID_OK:
            pfad = dlg.GetPaths()
            if len(pfad) == 1:
                dateipfad = pfad
        dlg.Destroy()
                
        if dateipfad :
            f = open("hp.txt")
            data = []
            for line in f.readlines():
                data.append(line)
            f.close()
            pos = []
            for line in data:
                for stmt in line.split(";"):
                    stmt = stmt.lstrip()
                    if stmt.startswith("PA"):
                        pos.append(tuple(map(int, stmt[2:].split(","))))
            print pos
   
so sieht das aus mit print dateinahme

Code: Alles auswählen

[u'C:\\Python25\\cnc\\hp.txt']
und wenn ich den in f.open("%s"%dateipfad) gibts noch nen schrägstrich mehr
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Sonntag 11. Januar 2009, 16:55

Offensichtlich ist dateiname eine Liste und kein String.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Sonntag 11. Januar 2009, 17:03

Danke wer lesen kann ist klar im vorteil Multiple rau und schon gets mit
GetPath(self)

Returns the full path (directory and filename) of the selected file.

Returns:
String

change dir gilt es auch zu überdenken !
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Sonntag 11. Januar 2009, 17:04

hendrikS hat geschrieben:Guck Dir auch noch mal die erste Schleife an. Die ist nicht besonders sinnvoll. Du kannst direkt schreiben:

Code: Alles auswählen

data=f.readlines()
Wobei dem generell smas Vorschlag vorzuziehen ist, da bei readlines und sea-lives Methode die Zeilen der Datei die ganze Zeit im Speicher liegen, bis der GC kommt.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Sonntag 11. Januar 2009, 17:06

Hier noch ein Einzeiler für das Problem von oben:

Code: Alles auswählen

pos = [map(int,l[l.find('PA')+2:-2].split(',')) for l in f.readlines() if 'PA' in l]
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Sonntag 11. Januar 2009, 17:12

es geht immer noch kürzer

danke

Code: Alles auswählen

# -*- coding: cp1252 -*-
import os
import wx
class HPGL(wx.Frame):
    def __init__(
            self, parent = None, ID = 1, title = "CNC_Test V1.0", pos=wx.DefaultPosition,
            size=(400,400), style= wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER | wx.MAXIMIZE_BOX)
            ):

        wx.Frame.__init__(self, parent, ID, title, pos, size, style)
        #Anzeigefeld
        self.panel = wx.Panel(self, -1)
        self.panel.SetBackgroundColour("sky blue")
        #Button
        self.button = wx.Button(self.panel, 1003, "Beenden",(163, 340), wx.DefaultSize)
        self.bu_start = wx.Button(self.panel, -1, "Start",(60, 300), wx.DefaultSize)
        self.bu_hpgl = wx.Button(self.panel, -1, "HPGL",(250, 300), wx.DefaultSize)
        self.bu_MotXon = wx.Button(self.panel, -1, "MotXon",(15, 250), wx.DefaultSize)
        self.bu_MotXoff = wx.Button(self.panel, -1, "MotXoff",(15, 225), wx.DefaultSize)
        self.bu_MotYon = wx.Button(self.panel, -1, "MotYon",(100, 250), wx.DefaultSize)
        self.bu_MotYoff = wx.Button(self.panel, -1, "MotYoff",(100, 225), wx.DefaultSize)
        self.bu_MotZon = wx.Button(self.panel, -1, "MotZon",(185, 250), wx.DefaultSize)
        self.bu_MotZoff = wx.Button(self.panel, -1, "MotZoff",(185, 225), wx.DefaultSize)
        self.buttoncolor = (236, 236, 236, 100)
        #Bindungen
        self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
        self.Bind(wx.EVT_BUTTON, self.Hpgl, self.bu_hpgl)

    def OnCloseMe(self, event):
        self.Close(True)

    def OnCloseWindow(self, event):
        self.Destroy()

    def Hpgl(self,event):
        dateipfad = None
        wildcard = "TXT (*.txt)|*.txt|"     \
           "Drill (*.drd)|*.drd|" \
           "HPGL (*.hpgl)|*.hpgl|"    \
           "All files (*.*)|*.*"
        dlg = wx.FileDialog(
            self, message="Eine Datei Wählen",
            defaultDir=os.getcwd(), 
            defaultFile="",
            wildcard=wildcard,
            style=wx.OPEN | wx.CHANGE_DIR
            )
        if dlg.ShowModal() == wx.ID_OK:
            dateipfad = dlg.GetPath()
        dlg.Destroy()
        if dateipfad :
            f = open(dateipfad)
            pos = [map(int,l[l.find('PA')+2:-2].split(',')) for l in f.readlines() if 'PA' in l] 
            f.close()
            print pos
        
def main():
    
    app = wx.PySimpleApp()
    fenster = HPGL()
    fenster.Center()
    fenster.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()
BlackJack

Sonntag 11. Januar 2009, 17:12

@hendrikS: Das ``.readlines()`` kannst Du weglassen und ``'PA' in l`` ist nicht robust genug, man muss schon prüfen, ob es am *Anfang* steht. Und eigentlich auch noch an ';' splitten wie sma das gemacht hat, weil bei HPGL auch mehrere Anweisungen auf einer Zeile stehen dürfen. Sieht man beim Beispiel zum Beispiel an der ersten Zeile ganz gut.

Dann ist aber der "Einzeiler" schon wieder etwas zu komplex für nur eine Zeile. :-)
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Sonntag 11. Januar 2009, 17:16

@BlackJack

Code: Alles auswählen

l.find('PA')
stellt alles sicher.

Ich lasse meine Dinge eigentlich immer laufen bevor ich was poste.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Sonntag 11. Januar 2009, 17:20

Da die diskusion so schön läuft

meine maschine läuft schon seit jahren mit nur 3programmen und ich wollten un mal ne echte cnc con CAD via Hpgl nach CNC in angriff nehmen
mit LPT wird die maschine verfahren da klappt auch wunderbar

ISO standart ist HPGL 40 Units / mm die maschine
macht 100 FULL oder 200HAFSTEP Units/mm

ich hätte nun gerne die punkte grafisch angezeigt
Platinegrösse vorerst mal 160/100 Europlatine macht also 160x40 6400pixel inX
und 4000pixel in Y

Euer Vorschlag für das anzeigefenster sollte mit dem dc. angezeigt werden mit scrollbars

brauche da einen HINT
DANKE
BlackJack

Sonntag 11. Januar 2009, 18:17

@hendrikS: Weder bei mehreren Befehlen in einer Zeile, noch wenn 'PA' nicht Bestandteil des Musters 'PA zahl,zahl;' ist, funktioniert Dein Quelltext.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Sonntag 11. Januar 2009, 22:27

@ BlackJack
Ich gehe natürlich von aus, daß sea-live in seiner Problembeschreibung alle für ihn relevanten Fälle berücksichtigt hat. Es wäre ungeschickt das nicht zu tun. Für diese o.a. Formatbeschreibung ist der Code OK.
Für die von Dir beschriebenen Fälle geht der Code nicht.
BTW: Man darf auch nicht immer alles so verbissen sehen. Leute wollen eine schnelle und praktikable Lösung.
Nebenbei habe ich meine Lösung mit uralten Matlab HPGL exports laufen lassen. Da gibt es noch den Sonderfall, daß auch Floats nach PA auftauchen können, für die die Lösung auch nicht geht.
Antworten