Seite 1 von 1
hpgl-> positions liste
Verfasst: Sonntag 11. Januar 2009, 16:12
von sea-live
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
Verfasst: Sonntag 11. Januar 2009, 16:23
von sma
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
Verfasst: Sonntag 11. Januar 2009, 16:33
von BlackJack
@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.
Verfasst: Sonntag 11. Januar 2009, 16:45
von hendrikS
Guck Dir auch noch mal die erste Schleife an. Die ist nicht besonders sinnvoll. Du kannst direkt schreiben:
Verfasst: Sonntag 11. Januar 2009, 16:48
von sea-live
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
und wenn ich den in f.open("%s"%dateipfad) gibts noch nen schrägstrich mehr
Verfasst: Sonntag 11. Januar 2009, 16:55
von Darii
Offensichtlich ist dateiname eine Liste und kein String.
Verfasst: Sonntag 11. Januar 2009, 17:03
von sea-live
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 !
Verfasst: Sonntag 11. Januar 2009, 17:04
von cofi
hendrikS hat geschrieben:Guck Dir auch noch mal die erste Schleife an. Die ist nicht besonders sinnvoll. Du kannst direkt schreiben:
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.
Verfasst: Sonntag 11. Januar 2009, 17:06
von hendrikS
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]
Verfasst: Sonntag 11. Januar 2009, 17:12
von sea-live
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()
Verfasst: Sonntag 11. Januar 2009, 17:12
von BlackJack
@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.
Verfasst: Sonntag 11. Januar 2009, 17:16
von hendrikS
@BlackJack
stellt alles sicher.
Ich lasse meine Dinge eigentlich immer laufen bevor ich was poste.
Verfasst: Sonntag 11. Januar 2009, 17:20
von sea-live
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
Verfasst: Sonntag 11. Januar 2009, 18:17
von BlackJack
@hendrikS: Weder bei mehreren Befehlen in einer Zeile, noch wenn 'PA' nicht Bestandteil des Musters 'PA zahl,zahl;' ist, funktioniert Dein Quelltext.
Verfasst: Sonntag 11. Januar 2009, 22:27
von hendrikS
@ 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.