#!/usr/bin/python # Copyright (C) 2006 - Giorgio Griffon # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from Tkinter import * from random import randint from math import pow,sqrt,acos,pi,cos,sin import string nomefile="linee.txt" nomecodice="codcam.txt" scl=10#scala, px/mm c_base=800#dimensioni del riquadro di lavoro c_altezza=600 lg=2#lato maglia quadrata della griglia [mm] listapunti=[]#elenco dei punti componenti una linea elenco_pallini=[]#contiene la lista dei punti colorati che compaiono elenco_linee=[] punti_griglia=[] circonferenza='' colorepunti="#3460ff" colorelinee="#ffffff" coloregriglia="#ffffff" colorecentri="#ffff00" rg=3#raggio/semilato pallini cattura=0#punti catturati ai vertici della griglia o no n_linee=1 arco_orario=0 arco_antiorario=0 centro_arco=0 raggio=1 xV1=0 yV1=0 xV2=0 yV2=0 angoloiniziale=0 angolofinale=0 def segnapunto(evento): global arco_orario,arco_antiorario, centro_arco,raggio,xV1,yV1,xV2,yV2,angoloiniziale,angolofinale,circonferenza x=canvas.canvasx(evento.x) y=canvas.canvasy(evento.y) if cattura==1:#snap attivato,sposta il punto sulla griglia x=lg*scl*round(x/(lg*scl)) y=lg*scl*round(y/(lg*scl)) l=len(listapunti) if (arco_orario==1 and centro_arco==1):#il punto appena segnato è il centro dell'arco listapunti.append('centro arco orario') raggio=sqrt(pow(scl*listapunti[l-2]-x,2)+pow(scl*listapunti[l-1]-y,2)) print 'raggio ='+str(raggio) xV1=x-raggio#vertici del quadrato circoscritto,servono per definire la circ. yV1=y-raggio xV2=x+raggio yV2=y+raggio circonferenza=canvas.create_arc(xV1,yV1,xV2,yV2,start=0,extent=359,outline=colorelinee,style="arc") #elenco_linee.append(circonferenza) centro_arco=0 print 'indicare il punto finale dell\'arco sulla circonferenza' print 'se si indica un punto fuori della circonferenza, verrà scelto il punto della circonferenza più vicino a quello indicato' angoloiniziale=180.0*acos((scl*listapunti[l-2]-x)/raggio)/pi if (scl*listapunti[l-1]>y): angoloiniziale=360.0-angoloiniziale print 'angolo iniziale='+str(angoloiniziale)+'°' elif (arco_orario==1 and centro_arco==0): angolofinale=acos((x-scl*listapunti[l-2])/sqrt(pow(x-scl*listapunti[l-2],2)+pow(y-scl*listapunti[l-1],2))) if (y>scl*listapunti[l-1]): angolofinale=2*pi-angolofinale x=scl*listapunti[l-2]+raggio*cos(angolofinale) y=scl*listapunti[l-1]-raggio*sin(angolofinale) angolofinale=angolofinale*180.0/pi print 'angolo finale ='+str(angolofinale)+'°' ampiezza=angolofinale-angoloiniziale-360.0 print 'ampiezza ='+str(ampiezza) canvas.delete(circonferenza) #toglie la circ. provvi e aggiunge l'arco definitivo circonferenza=canvas.create_arc(xV1,yV1,xV2,yV2,start=angoloiniziale,extent=ampiezza,outline=colorelinee,style="arc") elenco_linee.append(circonferenza) arco_orario=0 elif (arco_antiorario==1 and centro_arco==1):#il punto appena segnato è il centro dell'arco listapunti.append('centro arco antiorario') raggio=sqrt(pow(scl*listapunti[l-2]-x,2)+pow(scl*listapunti[l-1]-y,2)) print 'raggio ='+str(raggio) xV1=x-raggio#vertici del quadrato circoscritto,servono per definire la circ. yV1=y-raggio xV2=x+raggio yV2=y+raggio circonferenza=canvas.create_arc(xV1,yV1,xV2,yV2,start=0,extent=359,outline=colorelinee,style="arc") #elenco_linee.append(circonferenza) centro_arco=0 print 'indicare il punto finale dell\'arco sulla circonferenza' print 'se si indica un punto fuori della circonferenza, verrà scelto il punto della circonferenza più vicino a quello indicato' angoloiniziale=180.0*acos((scl*listapunti[l-2]-x)/raggio)/pi if (scl*listapunti[l-1]>y): angoloiniziale=360.0-angoloiniziale print 'angolo iniziale='+str(angoloiniziale)+'°' elif (arco_antiorario==1 and centro_arco==0): angolofinale=acos((x-scl*listapunti[l-2])/sqrt(pow(x-scl*listapunti[l-2],2)+pow(y-scl*listapunti[l-1],2))) if (y>scl*listapunti[l-1]): angolofinale=2*pi-angolofinale x=scl*listapunti[l-2]+raggio*cos(angolofinale) y=scl*listapunti[l-1]-raggio*sin(angolofinale) angolofinale=angolofinale*180.0/pi print 'angolo finale ='+str(angolofinale)+'°' if angolofinale>=angoloiniziale: ampiezza=angolofinale-angoloiniziale else: ampiezza=360+angolofinale-angoloiniziale print 'ampiezza ='+str(ampiezza) canvas.delete(circonferenza) #toglie la circ. provvi e aggiunge l'arco definitivo circonferenza=canvas.create_arc(xV1,yV1,xV2,yV2,start=angoloiniziale,extent=ampiezza,outline=colorelinee,style="arc") elenco_linee.append(circonferenza) arco_antiorario=0 else:#si tratta di segmento rettilineo if l>0: segmento=canvas.create_line(scl*listapunti[l-2],scl*listapunti[l-1],x,y,fill=colorelinee) elenco_linee.append(segmento) listapunti.append(x/scl) listapunti.append(y/scl) if (arco_orario==1 or arco_antiorario==1): pallino=canvas.create_rectangle(x-rg,y-rg,x+rg,y+rg,fill=colorecentri) else: pallino=canvas.create_rectangle(x-rg,y-rg,x+rg,y+rg,fill=colorepunti) elenco_pallini.append(pallino) print str(x/scl)+' mm - '+str((c_altezza-y)/scl)+' mm' def chiudilinea(evento): global listapunti,n_linee print 'terminata linea con '+str(len(listapunti)/2)+' punti' if len(listapunti)>0: f=open(nomefile,'a') f.write('\n') l=len(listapunti) i=0 centroarco=0 while i\n') centroarco=1 elif listapunti[i]=='centro arco antiorario': f.write('\n') centroarco=1 else: f.write(str(listapunti[i])+'\n') i=i+1 f.write(str(listapunti[i])+'\n') if centroarco==1: f.write('\n') centroarco=0 i=i+1 f.write('\n') n_linee=n_linee+1 f.close() listapunti=[] def pulizia(): global elenco_pallini,elenco_linee,listapunti,arco_orario,arco_antiorario #cancella il disegno event. presente e i punti registrati l=len(elenco_pallini) i=0 while i'': if riga[0:6]=='\n':#non interpreta i tag riga=f.readline() elif riga=='\n': pass elif riga=='\r\n': pass elif riga=='\n': riga=f.readline() xC=scl*float(riga) riga=f.readline() yC=scl*float(riga) riga=f.readline()#tag chiuso raggio=sqrt(pow(xC-xv,2)+pow(yC-yv,2)) angoloiniziale=180.0*acos((xv-xC)/raggio)/pi if (yv>yC): angoloiniziale=360.0-angoloiniziale xV1=xC-raggio#vertici del quadrato circoscritto yV1=yC-raggio xV2=xC+raggio yV2=yC+raggio #legge coord. punto finale riga=f.readline() x=scl*float(riga) riga=f.readline() y=scl*float(riga) riga=f.readline() pallino=canvas.create_rectangle(x-rg,y-rg,x+rg,y+rg,fill=colorepunti)#,outline=colorepunti) elenco_pallini.append(pallino) angolofinale=acos((x-xC)/sqrt(pow(x-xC,2)+pow(y-yC,2))) if (y>yC): angolofinale=2*pi-angolofinale angolofinale=angolofinale*180/pi ampiezza=angolofinale-angoloiniziale-360.0 circonferenza=canvas.create_arc(xV1,yV1,xV2,yV2,start=angoloiniziale,extent=ampiezza,outline=colorelinee,style="arc") elenco_linee.append(circonferenza) xv=x yv=y nuovalinea=0 elif riga=='\n': riga=f.readline() xC=scl*float(riga) riga=f.readline() yC=scl*float(riga) riga=f.readline()#tag chiuso raggio=sqrt(pow(xC-xv,2)+pow(yC-yv,2)) angoloiniziale=180.0*acos((xv-xC)/raggio)/pi if (yv>yC): angoloiniziale=360.0-angoloiniziale xV1=xC-raggio#vertici del quadrato circoscritto yV1=yC-raggio xV2=xC+raggio yV2=yC+raggio #legge coord. punto finale riga=f.readline() x=scl*float(riga) riga=f.readline() y=scl*float(riga) riga=f.readline() pallino=canvas.create_rectangle(x-rg,y-rg,x+rg,y+rg,fill=colorepunti)#,outline=colorepunti) elenco_pallini.append(pallino) angolofinale=acos((x-xC)/sqrt(pow(x-xC,2)+pow(y-yC,2))) if (y>yC): angolofinale=2*pi-angolofinale angolofinale=angolofinale*180/pi if angolofinale>=angoloiniziale: ampiezza=angolofinale-angoloiniziale else: ampiezza=360+angolofinale-angoloiniziale circonferenza=canvas.create_arc(xV1,yV1,xV2,yV2,start=angoloiniziale,extent=ampiezza,outline=colorelinee,style="arc") elenco_linee.append(circonferenza) xv=x yv=y nuovalinea=0 else: x=scl*float(riga) riga=f.readline() y=scl*float(riga) riga=f.readline() pallino=canvas.create_rectangle(x-rg,y-rg,x+rg,y+rg,fill=colorepunti)#,outline=colorepunti) elenco_pallini.append(pallino) if nuovalinea==1: xv=x yv=y segmento=canvas.create_line(xv,yv,x,y,fill=colorelinee) elenco_linee.append(segmento) xv=x yv=y nuovalinea=0 def generacodice(): g=open(nomecodice,'w') g.write("(codice generato da cammino.py\n(Ing. G. Griffon - Venezia\n") g.write("[BILLET X200 Y50 Z35\n")#<-INSERIRE QUI LE DIMENSIONI DEL PEZZO g.write("[TOOLDEF T1 L0 D8\n")#<- INSERIRE QUI LE DIMENSIONI "L" E "D" DEL PRIMO UTENSILE g.write("N10 G92\nN20 G49\nN30 G91\nN40 G28 X0 Y0 Z0\nN50 G90\nN60 M06 T01\nN70 G43 H01\n") g.write("N80 M03 S1000\n")#<- VELOCITA' DI ROTAZIONE DELLA FRESA [giri/min] g.write("N90 F10\n")#<- VELOCITA' DI AVANZAMENTO DELLA FRESA [mm/min] z0=float(ind_z0.get())#profondità movimenti rapidi (sopra il pezzo) z1=float(ind_z1.get())#profondità di lavoro finale (dentro il pezzo) m=1 n=100#numeri righe interni al codice np=int(ind_np.get())#n. passate da eseguire,ognuna a z più profonda while m<=np: g.write("(passata n."+str(m)+' di '+str(np)+'\n') z=z1*m/np f=open(nomefile,'r') riga=f.readline() while riga<>'': if riga[0:6]=='\n':#non interpreta i tag g.write('N'+str(n)+' G01 Z'+str(z0)+'\n')#esce a vel.di lavoro n=n+10 riga=f.readline() elif riga=='\n': riga=f.readline() xC=float(riga) riga=f.readline() yC=c_altezza/scl-float(riga) riga=f.readline()# riga=f.readline()#x punto finale x=float(riga) riga=f.readline()#y punto finale y=c_altezza/scl-float(riga) riga=f.readline() g.write('N'+str(n)+' G02 X'+str(x)+' Y'+str(y)+' I'+str(xC)+' J'+str(yC)+'\n') n=n+10 elif riga=='\n': riga=f.readline() xC=float(riga) riga=f.readline() yC=c_altezza/scl-float(riga) riga=f.readline()# riga=f.readline()#x punto finale x=float(riga) riga=f.readline()#y punto finale y=c_altezza/scl-float(riga) riga=f.readline() g.write('N'+str(n)+' G03 X'+str(x)+' Y'+str(y)+' I'+str(xC)+' J'+str(yC)+'\n') n=n+10 else: x=float(riga) riga=f.readline() y=c_altezza/scl-float(riga) riga=f.readline() if nuovalinea==1: g.write('N'+str(n)+' G00 X'+str(x)+' Y'+str(y)+'\n')#va in rapido all'inizio linea n=n+10 g.write('N'+str(n)+' G01 Z'+str(z)+'\n')#scende a profondità di lavoro n=n+10 else:#la linea era già cominciata,avanzamento a vel.di lavoro fino al nuovo punto g.write('N'+str(n)+' G01 X'+str(x)+' Y'+str(y)+'\n') n=n+10 nuovalinea=0 f.close() m=m+1 g.write('(fine passate\n') g.write('N'+str(n)+' G00 Z10\n') n=n+10 g.write('N'+str(n)+' G49\n') n=n+10 g.write('N'+str(n)+' G91\n') n=n+10 g.write('N'+str(n)+' G28 X0 Y0 Z0\n') n=n+10 g.write('N'+str(n)+' G90\n') n=n+10 g.write('N'+str(n)+' M30\n') n=n+10 g.close() print 'codice registato in '+nomecodice def latogriglia():#imposta il valore desiderato del lato della griglia,in mm global punti_griglia,lg lg=ind_griglia.get() print 'lato delle maglie della griglia impostato a '+str(lg)+' mm' l=len(punti_griglia)#cancella la griglia se presente e la ridisegna con la nuova maglia for i in range(0,l): pallino=punti_griglia[i] canvas.delete(pallino) vedigriglia() def vedigriglia(): global punti_griglia,lg lg=float(ind_griglia.get())#lato della griglia in mm si=grigliavisibile.get() delta=lg*scl#lato della griglia in pixel if si==1: y=c_altezza while y>=0: x=0 while x<=c_base: pallino=canvas.create_oval(x-1,y-1,x+1,y+1,fill=coloregriglia) punti_griglia.append(pallino) x=x+delta y=y-delta # Nx=int(c_base/(lg*scl)) # Ny=int(c_altezza/(lg*scl)) # y=Ny # while y>0: # x=0 # while x<=Nx:#disegna i punti della griglia regolare # pallino=canvas.create_oval(x*lg*scl-1,y*lg*scl-1,x*lg*scl+1,y*lg*scl+1,fill=coloregriglia) # punti_griglia.append(pallino) # x=x+1 # y=y-1 else: l=len(punti_griglia) for i in range(0,l): pallino=punti_griglia[i] canvas.delete(pallino) def snap():#attiva la cattura dei punti ai nodi della griglia global cattura cattura=catturapunti.get() print 'cattura dei punti ai nodi della griglia attivata' def scala():#definisce la scala del disegno global scl scl=int(ind_scala.get()) print 'scala del disegno impostata a '+str(scl)+' pixel/mm' l=len(punti_griglia)#cancella la griglia se presente e la ridisegna con la nuova maglia for i in range(0,l): pallino=punti_griglia[i] canvas.delete(pallino) vedigriglia() apri() def arco_or(): global arco_orario, centro_arco if len(listapunti)>0: arco_antiorario=0 arco_orario=1 centro_arco=1 print 'arco di circonferenza in senso orario:' print 'indicare il centro dell\'arco' else: arco_antiorario=0 arco_orario=0 centro_arco=0 print 'deve essere specificato il primo punto dell\'arco prima di chiamare la funzione' def arco_antior(): global arco_antiorario, centro_arco if len(listapunti)>0: arco_antiorario=1 arco_orario=0 centro_arco=1 print 'arco di circonferenza in senso antiorario:' print 'indicare il centro dell\'arco' else: arco_antiorario=0 arco_orario=0 centro_arco=0 print 'deve essere specificato il primo punto dell\'arco prima di chiamare la funzione' def riscala():#riscrive il doc. linee moltiplicando tutte le coord.per il fattore indicato nella casella fattorescala=float(ind_riscala.get()) print "cambio di scala del disegno secondo il fattore "+str(fattorescala)+" in corso... attendere" f=open(nomefile,'r') g=open('temp','w') print "scrittura del file temporaneo" riga=f.readline() while riga<>'': if riga[0]=='<':#è un tag aperto o chiuso,va trascritto com'è g.write(riga) elif riga=='\n':#eventuale riga vuota,meglio che sia in grado di saltarla pass elif riga=='\r\n':#a capo per S.O. diversi da quelli buoni pass else: n=float(riga)#la riga letta dovrebbe proprio essere una coordinata;sennò va a finir male! n=n*fattorescala g.write(str(n)+'\n') riga=f.readline() g.close() f.close() f=open(nomefile,'w') g=open('temp','r') print "riscrittura del file delle linee" riga=g.readline() while riga<>'': f.write(riga) riga=g.readline() f.close() apri() def trasla_x():#riscrive il doc. linee sommando a tutte le coord. x il deltax indicato nella casella delta=float(ind_traslax.get()) print "traslazione in x del disegno in corso... attendere" f=open(nomefile,'r') g=open('temp','w') x=1#ricorda se l'ultima coordinata letta era una x o una y print "scrittura del file temporaneo" riga=f.readline() while riga<>'': if riga[0]=='<':#è un tag aperto o chiuso,va trascritto com'è g.write(riga) elif riga=='\n':#eventuale riga vuota,meglio che sia in grado di saltarla pass elif riga=='\r\n':#a capo per S.O. diversi da quelli buoni pass else: if x==1:#è una coordinata x, si aggiunge delta n=float(riga)#la riga letta dovrebbe proprio essere una coordinata;sennò va a finir male! n=n+delta g.write(str(n)+'\n') x=0 else:#è una coordinata y,si lascia così g.write(riga) x=1 riga=f.readline() g.close() f.close() f=open(nomefile,'w') g=open('temp','r') print "riscrittura del file delle linee" riga=g.readline() while riga<>'': f.write(riga) riga=g.readline() f.close() apri() def trasla_y():#riscrive il doc. linee sommando a tutte le coord. y il deltay indicato nella casella delta=float(ind_traslay.get()) print "traslazione in y del disegno in corso... attendere" f=open(nomefile,'r') g=open('temp','w') x=1#ricorda se l'ultima coordinata letta era una x o una y print "scrittura del file temporaneo" riga=f.readline() while riga<>'': if riga[0]=='<':#è un tag aperto o chiuso,va trascritto com'è g.write(riga) elif riga=='\n':#eventuale riga vuota,meglio che sia in grado di saltarla pass elif riga=='\r\n':#a capo per S.O. diversi da quelli buoni pass else: if x==1:#è una coordinata x, si lascia così g.write(riga) x=0 else:#è una coordinata y,si lascia così n=float(riga)#la riga letta dovrebbe proprio essere una coordinata;sennò va a finir male! n=n-delta g.write(str(n)+'\n') x=1 riga=f.readline() g.close() f.close() f=open(nomefile,'w') g=open('temp','r') print "riscrittura del file delle linee" riga=g.readline() while riga<>'': f.write(riga) riga=g.readline() f.close() apri() #ABBOZZI DI FUNZIONI PER CANCELLARE I PUNTI GIA' INSERITI # def ritorna():#elimina l'ultimo punto inserito in una linea non ancora chiusa # print "funzione ritorna" # l=len(listapunti) # ce=0#numero di coordinate eliminate;bisogna toglierne le due dell'ultimo punto segnato # while l>0 and ce<2: # if listapunti[l][0]<>'c': # ce=ce+1 # listapunti.pop() # # def cancella(): # raggio=5#intorno del punto cliccato entro cui cercare il punto da cancellare # x=canvas.canvasx(evento.x) # y=canvas.canvasy(evento.y) # r1='' # r2='' # r3='' # r4='' # r5='' # r6='' # f=open(nomelinee,'r') # riga=f.readline() # while riga<>'': # r1=r2 # r2=r3 # r3=r4 # r4=r5 # r5=r6 # r6=riga # riga=f.readline() root=Tk() root.title("cammino") canvas=Canvas(root,width=c_base,height=c_altezza,bd=2,bg="#000000",xscrollincrement=20,yscrollincrement=20,cursor="cross") canvas.grid(row=0,column=0,rowspan=15) canvas.bind("",segnapunto) canvas.bind("",chiudilinea) P_nuovo=Button(root,text="nuovo doc",command=nuovo,width=12) P_nuovo.grid(row=0,column=1) P_apri=Button(root,text="apri doc",command=apri,width=12) P_apri.grid(row=1,column=1) P_genera=Button(root,text="genera codice",command=generacodice,width=12) P_genera.grid(row=2,column=1) Label(root,text="z movim.rapido").grid(row=3,column=1) #P_z0=Button(root,text="z movim.rapido",command=scala,width=12) #P_z0.grid(row=3,column=1) ind_z0=Entry(width=5) ind_z0.grid(row=3,column=2) ind_z0.insert(0,"1") Label(root,text="z lavoro").grid(row=4,column=1) #P_z1=Button(root,text="z lavoro",command=,width=12) #P_z1.grid(row=4,column=1) ind_z1=Entry(width=5) ind_z1.grid(row=4,column=2) ind_z1.insert(0,"-3") Label(root,text="n. passate").grid(row=5,column=1) #P_np=Button(root,text="n. passate",command=,width=12) #P_np.grid(row=5,column=1) ind_np=Entry(width=5) ind_np.grid(row=5,column=2) ind_np.insert(0,"3") P_scala=Button(root,text="scala [px/mm]",command=scala,width=12) P_scala.grid(row=6,column=1) ind_scala=Entry(width=5) ind_scala.grid(row=6,column=2) ind_scala.insert(0,"10") P_griglia=Button(root,text="lato griglia [mm]",command=latogriglia,width=12) P_griglia.grid(row=7,column=1) ind_griglia=Entry(width=5) ind_griglia.grid(row=7,column=2) ind_griglia.insert(0,lg) grigliavisibile=IntVar() P_vdgriglia=Checkbutton(root,text="vedi griglia",variable=grigliavisibile,command=vedigriglia) P_vdgriglia.grid(row=8,column=1) catturapunti=IntVar() P_snap=Checkbutton(root,text="cattura punti",variable=catturapunti,command=snap) P_snap.grid(row=9,column=1) P_circ_or=Button(root,text="arco orario",command=arco_or,width=12) P_circ_or.grid(row=10,column=1) P_circ_antior=Button(root,text="arco antiorario",command=arco_antior,width=12) P_circ_antior.grid(row=11,column=1) P_riscala=Button(root,text="Riscala disegno",command=riscala,width=12) P_riscala.grid(row=12,column=1) ind_riscala=Entry(width=5) ind_riscala.grid(row=12,column=2) ind_riscala.insert(0,"1") P_traslax=Button(root,text="Trasla +x [mm]",command=trasla_x,width=12) P_traslax.grid(row=13,column=1) ind_traslax=Entry(width=5) ind_traslax.grid(row=13,column=2) ind_traslax.insert(0,"0") P_traslay=Button(root,text="Trasla +y [mm]",command=trasla_y,width=12) P_traslay.grid(row=14,column=1) ind_traslay=Entry(width=5) ind_traslay.grid(row=14,column=2) ind_traslay.insert(0,"-0") root.mainloop()