# -*- coding: utf-8 -*- # # by Michel Claveau informatique # http://mclaveau.com # from __future__ import with_statement GlobalPVersion='1.11' import time,os,os.path,sys,types,shutil import win32api,win32gui,win32con import ponx def relance(titre,reptravail,commande): def traitehandle(h, rlist): rlist.append((h, win32gui.GetWindowText(h))) listwin=[] win32gui.EnumWindows(traitehandle, listwin) h=None for w in listwin: if w[1].find(titre)>-1 and w[1].find('Sapeur>>>')<0 : h=w[0] #print w[1],' handle:',w[0] break #ponx.msginfo("33",reptravail) #ponx.msginfo("34",commande) if h is None: if reptravail=='': os.system('start "'+commande+'" cmd /k'+commande) else: os.system('start "'+commande+'" /D '+reptravail+' /I cmd /k'+commande) return win32gui.SetForegroundWindow(h) win32gui.ShowWindow(h, 1) time.sleep(0.05) def kantislash(): win32api.keybd_event(win32con.VK_RMENU, 0, 0, 0) win32api.keybd_event(win32con.VK_CONTROL, 0, 0, 0) win32api.keybd_event(ord('8'), 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.01) win32api.keybd_event(ord('8'), 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.01) win32api.keybd_event(win32con.VK_CONTROL, 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(win32con.VK_RMENU, 0, win32con.KEYEVENTF_KEYUP, 0) def kmoins(): win32api.keybd_event(win32con.VK_SUBTRACT, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.01) win32api.keybd_event(win32con.VK_SUBTRACT, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.01) def knum(ch): win32api.keybd_event(win32con.VK_SHIFT, 0, 0, 0) win32api.keybd_event(ord(ch), 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) #time.sleep(0.01) win32api.keybd_event(ord(ch), 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) #time.sleep(0.01) win32api.keybd_event(win32con.VK_SHIFT, 0, win32con.KEYEVENTF_KEYUP, 0) def kslash(): win32api.keybd_event(win32con.VK_DIVIDE, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.01) win32api.keybd_event(win32con.VK_DIVIDE, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.01) def kunder(): win32api.keybd_event(win32con.VK_SHIFT, 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(ord('8'), 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.01) win32api.keybd_event(ord('8'), 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.01) def k2points(): win32api.keybd_event(0xBF, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.01) win32api.keybd_event(0xBF, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.01) def kpoint(): win32api.keybd_event(win32con.VK_DECIMAL, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.01) win32api.keybd_event(win32con.VK_DECIMAL, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.01) def kstar(): win32api.keybd_event(win32con.VK_MULTIPLY, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.01) win32api.keybd_event(win32con.VK_MULTIPLY, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.01) def keyb(ch,shift=False): for b in ch: if b=='\\': kantislash() elif b=='_': kunder() elif b=='/': kslash() elif b=='.': kpoint() elif b==':': k2points() elif b=='*': kstar() elif b=='-': kmoins() elif b>='0' and b<='9': knum(b) else: c=b if (b>='A' and b<='Z') or shift: win32api.keybd_event(win32con.VK_SHIFT, 0, 0, 0) if b>='a' and b<='z': c=b.upper() cord=ord(c) win32api.keybd_event(cord, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) #time.sleep(0.01) win32api.keybd_event(cord, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) #time.sleep(0.01) if (b>='A' and b<='Z') or shift: win32api.keybd_event(win32con.VK_SHIFT, 0, win32con.KEYEVENTF_KEYUP, 0) def keyd(cod,shift=False): if shift: win32api.keybd_event(win32con.VK_SHIFT, 0, 0, 0) win32api.keybd_event(cod, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.05) win32api.keybd_event(cod, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) time.sleep(0.05) if shift: win32api.keybd_event(win32con.VK_SHIFT, 0, win32con.KEYEVENTF_KEYUP, 0) keyb(commande+"\r") class sci(object): def __init__(self): """ import win32com.client self.pv = win32com.client.Dispatch('Ponxv.Mci') self.pd = win32com.client.Dispatch('Ponxd.Mci') self.px = win32com.client.Dispatch('Ponx.Mci') """ self.px=ponx.ponx() self.g = None #import persapeur #self.persapeur=persapeur.sapeur(self) #execfile('D:\\dev\\python\\sapeur\\persapeur.py',globals(),globals()) execfile(ponx.ponxdir()+'\\sapeur\\persapeur.py',globals(),globals()) self.persapeur=sapeur(self) self.text = "" self.filenamecurrent = "" self.scriptdir = "" self.workdir = "" self.macro=[] self.gmacro=None self.pcherche=[] self.chainecherche="" self.template={} self.tclefs={} def setscriptdir(self, scriptdir="D:\\dev\\python\\sapeur"): self.scriptdir = str(scriptdir) def safter(txt,debut): try: vret= txt[len(debut):] except: vret="" return vret self.template={} self.tclefs={} source='' tnom='' ligs=iter(open(self.scriptdir+'\\sapeur.tmpl.txt','rb').readlines()) while True: try: lig=ligs.next() #.encode('utf-8','replace') except: break if lig.startswith('@@@'): if source!="": if tnom!='': self.template[tnom]=source for clef in tclefs: if clef in self.tclefs: self.tclefs[clef].append(tnom) else: self.tclefs[clef]=[tnom] tnom='' #print tnom #print tclefs #print source #print "-"*55 source="" if lig.startswith('@@@nom:'): tnom = safter(lig,'@@@nom:').strip().decode('utf-8','replace') elif lig.startswith('@@@classement:'): temp=safter(lig,'@@@classement:') source="" tclefs=[ clef.strip().decode('utf-8','replace') for clef in temp.split(',')] else: if tnom!='': source = source+lig """ for t in self.template: print '-'*55 print t print self.template[t] print "*"*66 for c in self.tclefs: print c,self.tclefs[c] """ def setworkdir(self, workdir="D:\\dev\\python\\sapeur", fichiercourant=''): self.workdir = str(workdir) if fichiercourant!='': self.filenamecurrent=fichiercourant #ponx.msginfo("110",self.workdir) def setlanguage(self,lang="fra"): #voir http://www.sil.org/iso639-3/codes.asp #ponx.msginfo("112",os.getcwd()) #ponx.msginfo("113",self.scriptdir+"\\\\"+lang+".ini") if os.path.isfile(self.scriptdir+"\\\\"+lang+".ini"): os.chdir(self.scriptdir) cmd=ponx.ponxdir()+"\\inifusion.py sapeur.menu.ini "+lang+".ini" ponx.msginfo("116",cmd) os.system(cmd) def gettemplateclefs(self): #retourne la liste des clefs des templates lret=self.tclefs.keys() lret.sort() return lret def gettemplateclef(self,clef): #retourne la liste des templates d'une clef return self.tclefs[clef] def gettemplate(self,nom,seldeb,selfin): """Retourne un template (source), après remplacement de la sélection s'il y a lieu """ temp=self.template[nom] #ponx.msginfo(str(seldeb),str(selfin)) selection="" if selfin>seldeb: selection=self.text[seldeb:selfin] #ponx.msginfo("122",str(selection)) vret=temp.replace('--SELECTION--',selection) #ponx.msginfo("124",vret) return vret def version(self): return 'agui '+GlobalPVersion def u1252(self, chu): try: if type(chu) is unicode: return chu.encode('cp1252','replace') else: return chu except: return repr(chu) def alert(self,txt1="TITRE",txt2="Texte."): ponx.msginfo(txt1,txt2) def sendtxt(self,txt=""): t=txt.replace(u'\r\n',u'\n') self.text=t.replace(u'\n',u'\r\n') #self.text=txt # +++ def artxt(self,txt=""): t=txt.replace(u'\r\n',u'\n') self.text=t.replace(u'\n',u'\r\n') return self.text def gettxt(self): return self.text def getextrait(self, deb,fin): txt=self.text txt=txt.encode('utf-8','ignore') txt=txt.replace('\r\n','\n') t=txt.replace('\n','\r\n') return t[deb:fin] def openfile(self,filename): if os.path.exists(filename): txt=open(filename,"rb").read() else: txt="" #ponx.msginfoA("179",txt) #txt = txt.replace("\r\n","\n") self.text=txt #.decode('utf-8','ignore') self.filenamecurrent=filename return(self.text) def setcurrentfile(self,filename=''): if filename!='': self.filenamecurrent=filename def openfile1252(self,filename): if os.path.exists(filename): txt=open(filename,"rb").read() else: txt="" self.text=txt.decode('cp1252','replace').encode('utf-8','replace') self.filenamecurrent=filename return(self.text) def savefile(self,filename='',contenu=''): if filename=='': filename=self.filenamecurrent if contenu=='': txt=self.text else: txt=contenu.encode('utf-8','ignore') #ponx.msginfoA("339",str(type(txt))) #txt=ttxt.encode('cp1252','replace') #ponx.msginfoA("200",ttxt.decode('cp1252','replace')) #open(filename,"wb").write(ttxt.encode('cp1252','replace')) txt=txt.replace('\r\n','\n') txt=txt.replace('\n','\r\n') try: try: shutil.copyfile(filename,"recup.000") except: pass open(filename,"wb").write(txt) except: try: open(filename+".bak1","w").write(txt) except: try: open(filename+".bak2","wb").write(txt) except: try: open(filename+".bak3","wb").write(self.text) except: ponx.msginfoA(u"Problème d'enregistrement",u"Au pire, regardez le fichier recup.000\r\nAVANT d'enregistrer à nouveau.") self.filenamecurrent=filename return(self.text) def openmacro(self,filename): self.macro=[] if os.path.exists(filename): def tparam(ch): s=ch t=s.replace('","','|') lt=t.split(",") lret=[ l.replace('|',',') for l in lt] return lret lmac=open(filename,"rb").readlines() itermac=iter(lmac) while True: try: l=itermac.next()[:-2] if l<>"": while l[-1]=="_": l = l[:-1] +'\r\n'+ itermac.next()[:-2] except: break if l.startswith("#") or l==(" "*len(l)): pass else: self.macro.append(tparam(l)) self.gmacro=iter(self.macro) return(len(self.macro)) def nextligmacro(self): try: return(self.gmacro.next(),) except: self.gmacro=iter(self.macro) return(['END'],) def lanceurconsole(self,typelancement="POSTMORTEM", reptravail=''): """Lance un script Python dans une console orpheline faisant parler les morts. 'orpheline': qui n'a pas de parent (pour une console indépendante) 'faire parler les morts': avec déboguage 'post mortem' """ if reptravail=='': if self.workdir!='': reptravail=self.workdir fichierlong=self.filenamecurrent pathcomplet=os.path.abspath(fichierlong) cdir=os.path.dirname(pathcomplet).replace('\\','\\\\') os.chdir(cdir) #print "typelancement",typelancement #os.system('start "" cmd /ksapeur_lanceur.py '+typelancement+' '+fichierlong) if reptravail=='': os.system('start "'+fichierlong+'" cmd /k'+self.scriptdir+'\\sapeur_lanceur.py '+typelancement+' '+fichierlong) else: os.system('start "'+fichierlong+'" /D '+reptravail+' /I cmd /k'+self.scriptdir+'\\sapeur_lanceur.py '+typelancement+' '+fichierlong) #os.system('start "'+fichierlong+'" /I cmd /k'+self.scriptdir+'\\sapeur_lanceur.py '+typelancement+' '+fichierlong) def runconsole(self, reptravail=''): """Lance un script Python dans une console orpheline , SANS lanceur 'orpheline': qui n'a pas de parent (pour une console indépendante) """ if reptravail=='': if self.workdir!='': reptravail=self.workdir fichierlong=self.filenamecurrent pathcomplet=os.path.abspath(fichierlong) cdir=os.path.dirname(pathcomplet).replace('\\','\\\\') os.chdir(cdir) relance(str(fichierlong),str(reptravail),str(fichierlong)) """ #ponx.msginfo("386",cdir) #ponx.msginfo("387",fichierlong) if reptravail=='': os.system('start "'+fichierlong+'" cmd /k'+fichierlong) else: os.system('start "'+fichierlong+'" /D '+reptravail+' /I cmd /k'+fichierlong) #os.system('start "'+fichierlong+'" /I cmd /k'+fichierlong) """ def runironconsole(self, ironpythonconsole='', reptravail=''): """Lance un script IronPython dans une console orpheline , SANS lanceur 'orpheline': qui n'a pas de parent (pour une console indépendante) """ if reptravail=='': if self.workdir!='': reptravail=self.workdir fichierlong=self.filenamecurrent pathcomplet=os.path.abspath(fichierlong) cdir=os.path.dirname(pathcomplet).replace('\\','\\\\') ironcde=ironpythonconsole #.replace('\\','\\\\') os.chdir(cdir) relance(str(fichierlong),str(reptravail),ironcde+' '+str(fichierlong)) def lanceur(self, reptravail=''): """Lance un script Python en récupérant le résultat. Attention : impossible de faire de l'interactif par ce biais. """ if reptravail=='': if self.workdir!='': reptravail=self.workdir fichierlong=self.filenamecurrent pathcomplet=os.path.abspath(fichierlong) cdir=os.path.dirname(pathcomplet).replace('\\','\\\\') exdir= self.scriptdir.replace('\\','\\\\') r = self.px.PRun('cmdpp4(["cmd /c'+exdir+'\\\\sapeur_lanceur.py normal '+fichierlong+'",],"'+reptravail+'")') #vret=r.encode('cp1252','replace') vret=r return vret def callthe(self, fichier): """Lance THE avec le fichier en paramètre """ r = self.px.PRun('cmdpp4(["cmd /cD:\\\\Marath\\\\site\\\\static\\\\the.py D:\\\\Marath\\\\site\\\\template\\\\"'+fichier+'",],"D:\\\\marath\\\\site\\\\static")') vret=r return vret def search(self,rtxt=u"",pos=0, contenu=''): """ recherche une chaine à  partir de la position indiquée (ou courante par défaut) la recherche respecte la casse """ self.pcherche=[] if contenu=='': txt=self.text else: txt=contenu.encode('utf-8','ignore') txt=txt.replace('\r\n','\n') txt=txt.replace('\n','\r\n') self.chainecherche=rtxt try: if pos<1: vret=txt.find(self.chainecherche) else: vret=txt.find(self.chainecherche,pos) except: rr=self.chainecherche ponx.msginfo("501",str(rr)) if pos<1: vret=txt.find(rr) else: vret=txt.find(rr,pos) self.pcherche.append(vret) return vret def searchnext(self,rtxt=u"",pos=0, contenu=''): """ recherche l'occurence suivante """ if contenu=='': txt=self.text else: txt=contenu.encode('utf-8','ignore') #txt=txt.replace('\r\n','\n') #txt=txt.replace('\n','\r\n') self.chainecherche=rtxt if pos<1: vret=txt.find(self.chainecherche) else: vret=txt.find(self.chainecherche,0,pos+2) return vret def searchprior(self,rtxt=u"",pos=-1, contenu=''): """ recherche l'occurence précédente (vers le haut) (avec respect de la casse) """ if contenu=='': txt=self.text else: txt=contenu.encode('utf-8','ignore') #txt=txt.replace('\r\n','\n') #txt=txt.replace('\n','\r\n') self.chainecherche=rtxt if pos<0: pos=len(self.text) try: if pos<1: vret=txt.rfind(self.chainecherche) else: vret=txt.rfind(self.chainecherche,0,pos) except: rr=self.chainecherche if pos<1: vret=txt.rfind(rr) else: vret=txt.rfind(rr,0,pos) return vret def searchinfiles(self,dir,pattern,cherche): #import ponx #ponx.msginfo(str(cherche),str(pattern)) lret=ponx.findfinfiles(dir,pattern,cherche) return lret def pyperso(self,*param): #ponx.msginfo("142",str(param)) if param[0]=='F5': if self.g: vret = self.g.send(param) if vret[0]=='END': self.g=None return(vret,) else: vret=self.persapeur.f5(*param) if type(vret) in (types.GeneratorType,): self.g=vret vret = self.g.next() if vret[0]=='END': self.g=None return(vret,) else: self.g=None if vret is None: vret=['END'] if type(vret) in (types.ListType,types.TupleType): return(vret,) else: return((vret),) elif param[0]=='F6': if self.g: vret = self.g.send(param) if vret[0]=='END': self.g=None return(vret,) else: vret=self.persapeur.f6(*param) if type(vret) in (types.GeneratorType,): self.g=vret vret = self.g.next() if vret[0]=='END': self.g=None return(vret,) else: self.g=None if vret is None: vret=['END'] if type(vret) in (types.ListType,types.TupleType): return(vret,) else: return((vret),) elif param[0]=='F7': if self.g: vret = self.g.send(param) if vret[0]=='END': self.g=None return(vret,) else: vret=self.persapeur.f7(*param) if type(vret) in (types.GeneratorType,): self.g=vret vret = self.g.next() if vret[0]=='END': self.g=None return(vret,) else: self.g=None if vret is None: vret=['END'] if type(vret) in (types.ListType,types.TupleType): return(vret,) else: return((vret),) elif param[0]=='F8': if self.g: vret = self.g.send(param) if vret[0]=='END': self.g=None return(vret,) else: vret=self.persapeur.f8(*param) if type(vret) in (types.GeneratorType,): self.g=vret vret = self.g.next() if vret[0]=='END': self.g=None return(vret,) else: self.g=None if vret is None: vret=['END'] if type(vret) in (types.ListType,types.TupleType): return(vret,) else: return((vret),) elif param[0]=='OPENFILE': if self.g: vret = self.g.send(param) if vret[0]=='END' or vret[0]=='ABANDON': self.g=None return(vret,) else: vret=self.persapeur.openfile(*param) if type(vret) in (types.GeneratorType,): self.g=vret vret = self.g.next() if vret[0]=='END' or vret[0]=='ABANDON': self.g=None return(vret,) else: self.g=None if vret is None: vret=['END'] if type(vret) in (types.ListType,types.TupleType): return(vret,) else: return((vret),) elif param[0]=='SAVEFILE': if self.g: vret = self.g.send(param) if vret[0]=='END' or vret[0]=='ABANDON': self.g=None return(vret,) else: vret=self.persapeur.savefile(*param) if type(vret) in (types.GeneratorType,): self.g=vret vret = self.g.next() if vret[0]=='END' or vret[0]=='ABANDON': self.g=None return(vret,) else: self.g=None if vret is None: vret=['END'] if type(vret) in (types.ListType,types.TupleType): return(vret,) else: return((vret),) else: vret=['END'] self.g=None return(vret,)