faire passer un nom d'instance par une variable

Forum destiné aux questions et discussions en français
Forum rules
Règles du forum et informations utiles.

VEUILLEZ LIRE CECI AVANT DE DEMANDER DE L'AIDE
decxjo
Posts: 2
Joined: Mon Feb 10, 2020 1:55 pm

faire passer un nom d'instance par une variable

Postby decxjo » Mon Feb 10, 2020 3:20 pm

Bonjour je soumets le problème :
j'ai écrit un script qui marche mais avec un horrible exec( chaine) ligne 146 qui me permet d'inclure dans un procédure Freecad le nom de l'objet que je veux traiter
voici donc le script qui marche:

Code: Select all

"""   cette macro  agit sur un corps sélectionné , le coupe en tranche à partir d'une succession de coupe,  dont chacune est extrudé 
pour pouvoir être exporté en .dxf un fichier portant en indice celui de la coupe
ces fichiers dxf sont voués à être traités et convertis par le programme python dans  sunsxafo / CNC  a fin d'obtenir le fichier gcode capable
de guider le fraisage sur la face complexe convexe et ou concave selon le plan tangent à  Z du corps. historiquement uune "moitié de visse sans fin" coupé dans un plan axial
cf    voir si les variables depart, epcomplexe,epcoupe, et nbcoupes sont cohérente

+sélection de l'objet à trancher par sa propriété de visibilité. Donc il faut s'assurer qu'un seul objet soit visible et que c'est un corps solide (c'est le GUI de Freecad qui est sollicité
+ détermination du dossier de stockage par in terface Qt ..... et ainsi des autre variables

"""
# partie introductive  pour  bien choisir l'objet qui sera traitée par la routine de tranchage
document=""
doc_name=""
import FreeCAD, FreeCADGui, Draft, Part
from FreeCAD import Gui

def identification_document():
    fichier=App.ActiveDocument.FileName
    print(fichier)
    trajet=fichier.split("/")
    doc=trajet[len(trajet)-1]
    trajet=doc.split(".")
    doc=trajet[0]
    return doc

def getPartName():  # construit  un distionnaire    Name(interne Freecad)  : Label(de l'intrface graphque éventuellment renommé)
   dico={} 
   for i in App.ActiveDocument.Objects:
      pass
      #App.Console.PrintMessage(str(i.Name) + "  <->  " + i.Label + "\n")
      dico[i.Name]=i.Label
   return dico

def objet_a_traiter(): # retrouve le nom de l'objet que l'on souhaite trancher signaler par sa mise en visibilité
   obj=""
   for i in App.ActiveDocument.Objects:
      print(doc_name,i.Name)
      if Gui.getDocument(doc_name).getObject(i.Name).Visibility == True:
             print("trouvé")
             obj=i.Name
             break
      else:
             print("nontrouvé")
   return obj

doc_name=identification_document() # retrouver le nombe du document (fichier Freecad)

App.setActiveDocument(doc_name)
App.ActiveDocument=App.getDocument(doc_name)
ActiveDocument=Gui.getDocument(doc_name)
dico_objets=getPartName()  #  dico des objets contnue dans le document
print(dico_objets)
objet_a_traiter= objet_a_traiter() # nom de l'objet mis visibilité .... il faut qu'il soit le seul visible ATTENTION
print (objet_a_traiter)


########""""""""" fin de partie introductive
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit, QInputDialog, QApplication, QFileDialog)

from string import *

filename="**"
répertoire="*"
btn=""

class MCVE(QWidget):
    global filename,btn
    def __init__(self):
        super().__init__()
        self.initialize()

    def initialize(self):
        self.setWindowTitle('TRANCHEUR SURFACE COMPLEXE')
        self.setGeometry(50, 50, 400, 200)
        #btn = QPushButton('Sélection répertroire de travail', self)
        
       # btn.clicked.connect(self.clicked)
##
        #self.show()
   # def saisie(self):
       #self.champ = QLineEdit("Voici mon premier champ de texte")


    def clicked(self):
        global filename
        filename = QFileDialog.getOpenFileName( self, "Sélection du dossier de travail", "/home/", "All Files (*.*)")
 
#----------------------------------------------------------------------------------------------------------------------------------       

import os
depart=0.1
nombase=""

app = QApplication(sys.argv)
ex = MCVE()
   ####################################""""

while True:
    #ex.initialize.show()   # ne marche pas
    #ex.initialize()              # ne marche pas
    #ex.btn.clicked.connect(ex.clicked)    # ne marche pas
    ex.clicked()    
    #print (filename)
    répertoire=filename[0]
    #print(répertoire)
    dossier=répertoire.split('/')
    #print(dossier)
    répertoire=""
    #print (len(dossier))
    for j in range(len(dossier)-1):
        répertoire=répertoire+dossier[j]+"/"
    répertoire=répertoire[:-1]  #   pour retirer le "/" de droite
    print(répertoire)
    ###################"
    nomdebase=répertoire      #input("répertoire de travail    :")
    print(nomdebase,"+++++++++++")
    if os.path.exists(nomdebase):
        break
    else:
        print("ce répertoire n'existe pas")
    print(nomdebase)
    print("\n")
#####################################
#ex.saisie()

nomcoupegénérique=input("nom générique des coupes avant indiçage   :")
# exemple "visse"
print("\n")
import Part
from FreeCAD import Base
epcomplexe=8   # valeur du rayon de la visse cf tableau
epcoupe=0.1 # finesse de la tranche pour un bonne définition spatiale
nbcoupes=round(epcomplexe/epcoupe)-1
print(nbcoupes)
for i in range(nbcoupes):
    if i==3: # pour test
        break #pour test
    print(i)
    nomcoupe=nomcoupegénérique+str(i)+".dxf"
    nomfichier=nomdebase+"/"+nomcoupe
    print(nomfichier)
    departcouche=round(depart+(i*epcoupe),1)
    print(departcouche)
    wires=list()  # vider la liste des vecteurs
    exec("shape=FreeCAD.getDocument(doc_name)."+objet_a_traiter+".Shape")
    
    for i in shape.slice(Base.Vector(0,0,1),departcouche):   # génération du périmètre de coupe
        wires.append(i)
    
    comp=Part.Compound(wires)
    slice=FreeCAD.getDocument(doc_name).addObject("Part::Feature","Cutspecial_cs")
    slice.Shape=comp
    slice.purgeTouched()
    del slice,comp,wires,shape    
    #  génération séquentielle des coupes  grace à une coupe éphémère paramétrée dans la boucle
    f = FreeCAD.getDocument(doc_name).addObject('Part::Extrusion', 'Extrudespecial')
    f = App.getDocument(doc_name).getObject('Extrudespecial')
    f.Base = App.getDocument(doc_name).getObject('Cutspecial_cs')
    f.DirMode = "Normal"
    f.DirLink = None
    f.LengthFwd = epcoupe
    f.LengthRev = 0.000000000000000
    f.Solid = True
    f.Reversed = False
    f.Symmetric = False
    f.TaperAngle = 0.000000000000000
    f.TaperAngleRev = 0.000000000000000
  
    f.Base.ViewObject.hide()
    App.ActiveDocument.recompute()
    # sauvegarde de la coupe dans un fichier DXF
    __objs__=[]
    __objs__.append(FreeCAD.getDocument(doc_name).getObject("Extrudespecial"))
    import importDXF
    importDXF.export(__objs__,nomfichier)
    del __objs__ 
    #  destruction de la couche qui vient d'être sauvegarder dans un DXF avec nom incrémenté
    App.getDocument(doc_name).removeObject("Extrudespecial")
    App.getDocument(doc_name).recompute()
    App.getDocument(doc_name).removeObject("Cutspecial_cs")
    App.getDocument(doc_name).recompute()

#  sys.exit(app.exec_()) # fermeture de l'application QT qui semble bloquer freecad
et voici mes efforts pour faire les choses plus proprement (ne vous moquez pas)...... mais pas moyen de faire admette à la ligne 80 que la variable objet contient bien le nom de l'objet à traiter alors que les print de test me satisfont !

Code: Select all

"""   cette macro  agit sur un corps selectionné , le coupe en tranche à partir d'une succession de coupe,  dont chacune est extrudé 
pour pouvoir être exporté en .dxf un fichier portant en indice celui de la coupe
ces fichiers dxf sont voués à être traités et convertis par le programme pyhton dans  sunsxafo / CNC  a fin d'obtenir le fichier gcode capable
de guider le fraisage sur la face complexe convexe et ou concave selon le plan tangent à  Z du corps. historiquement uune "moitié de visse sans fin" coupé dans un plan axial
cf    voir si les variables depart, epcomplexe,epcoupe, et nbcoupes sont cohérente

+sélection de l'obejt à trancher par sa propriété de visibilité. Donc il faut s'assurer qu'un seu objet est visible et que c'est un corps solide (c'est le GUI de Freecad qui est sollicité
+ détermination du dossier de stockage par in terface Qt ..... et ainsi des autre variables

"""
# partie introductive  pour  bien coisir l'objet qui sera traitée par la routine de tranchage
document=""
doc_name=""
filename="**"
répertoire="*"
btn=""

import FreeCAD, FreeCADGui, Draft, Part
from FreeCAD import Gui
import os
depart=0.1
nombase=""
nomcoupegénérique=input("nom générique des coupes avant indiçage   :")
# exemple "visse"
print("\n")
import Part
from FreeCAD import Base
epcomplexe=8   # valeur du rayon de la visse cf tableau
epcoupe=0.1 # finesse de la tranche pour un bonne définition spatiale
nbcoupes=round(epcomplexe/epcoupe)-1
print(nbcoupes)
shape=""

def identification_document():
    fichier=App.ActiveDocument.FileName
    print(fichier)
    trajet=fichier.split("/")
    doc=trajet[len(trajet)-1]
    trajet=doc.split(".")
    doc=trajet[0]
    return doc

def getPartName():  # construit  un distionnaire    Name(interne Freecad)  : Label(de l'intrface graphque éventuellment renommé)
   dico={} 
   for i in App.ActiveDocument.Objects:
      pass
      #App.Console.PrintMessage(str(i.Name) + "  <->  " + i.Label + "\n")
      dico[i.Name]=i.Label
   return dico


def objet_a_traiter(): # retrouve le nom de l'objet que l'on souhaite trancher signaler par sa mise en visibilité
   selection = FreeCADGui.Selection.getSelection()
   objet=selection[0]
   print(objet)
#   for i in App.ActiveDocument.Objects:
#      print(doc_name,i.Name)
#      if Gui.getDocument(doc_name).getObject(i.Name).Visibility == True:
#             print("trouvé")
#             objet=i.Name
#             break
#      else:
#             print("nontrouvé")
   return objet


def fairelescoupes(objet):
    print( type(objet),"++++" ,objet.Name)
    for i in range(nbcoupes):
        if i==3: # pour test
            break #pour test
        print(i)
        nomcoupe=nomcoupegénérique+str(i)+".dxf"
        nomfichier=nomdebase+"/"+nomcoupe
        print(nomfichier)
        departcouche=round(depart+(i*epcoupe),1)
        print(departcouche)
        wires=list()  # vider la liste des vecteurs
        #exec("shape=FreeCAD.getDocument(doc_name)."+objet_a_traiter+".Shape")
        shape=FreeCAD.getDocument(doc_name).objet.Shape
        for i in shape.slice(Base.Vector(0,0,1),departcouche):   # génération du périmètre de coupe
            wires.append(i)
        
        comp=Part.Compound(wires)
        slice=FreeCAD.getDocument(doc_name).addObject("Part::Feature","Cutspecial_cs")
        slice.Shape=comp
        slice.purgeTouched()
        del slice,comp,wires,shape    
        #  génération séquentielle des coupes  grace à une coupe éphémère paramétrée dans la boucle
        f = FreeCAD.getDocument(doc_name).addObject('Part::Extrusion', 'Extrudespecial')
        f = App.getDocument(doc_name).getObject('Extrudespecial')
        f.Base = App.getDocument(doc_name).getObject('Cutspecial_cs')
        f.DirMode = "Normal"
        f.DirLink = None
        f.LengthFwd = epcoupe
        f.LengthRev = 0.000000000000000
        f.Solid = True
        f.Reversed = False
        f.Symmetric = False
        f.TaperAngle = 0.000000000000000
        f.TaperAngleRev = 0.000000000000000
      
        f.Base.ViewObject.hide()
        App.ActiveDocument.recompute()
        # sauvegarde de la coupe dans un fichier DXF
        __objs__=[]
        __objs__.append(FreeCAD.getDocument(doc_name).getObject("Extrudespecial"))
        import importDXF
        importDXF.export(__objs__,nomfichier)
        del __objs__ 
        #  destruction de la couche qui vient d'être sauvegarder dans un DXF avec nom incrémenté
        App.getDocument(doc_name).removeObject("Extrudespecial")
        App.getDocument(doc_name).recompute()
        App.getDocument(doc_name).removeObject("Cutspecial_cs")
        App.getDocument(doc_name).recompute()






doc_name=identification_document() # retrouver le nombe du document (fichier Freecad)
App.setActiveDocument(doc_name)
App.ActiveDocument=App.getDocument(doc_name)
ActiveDocument=Gui.getDocument(doc_name)
dico_objets=getPartName()  #  dico des objets contnue dans le document
print(dico_objets)
objet= objet_a_traiter() # nom de l'objet mis visibilité .... il faut qu'il soit le seul visible ATTENTION
print(type(objet))
print (objet)


########""""""""" fin de partie introductive
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit, QInputDialog, QApplication, QFileDialog)

from string import *



class MCVE(QWidget):
    global filename,btn
    def __init__(self):
        super().__init__()
        self.initialize()

    def initialize(self):
        self.setWindowTitle('TRANCHEUR SURFACE COMPLEXE')
        self.setGeometry(50, 50, 400, 200)
        #btn = QPushButton('Sélection répertroire de travail', self)
        
       # btn.clicked.connect(self.clicked)
##
        #self.show()
   # def saisie(self):
       #self.champ = QLineEdit("Voici mon premier champ de texte")


    def clicked(self):
        global filename
        filename = QFileDialog.getOpenFileName( self, "Sélection du dossier de travail", "/home/", "All Files (*.*)")
 
#----------------------------------------------------------------------------------------------------------------------------------       



app = QApplication(sys.argv)
ex = MCVE()
   ####################################""""

while True:
    #ex.initialize.show()   # ne marche pas
    #ex.initialize()              # ne marche pas
    #ex.btn.clicked.connect(ex.clicked)    # ne marche pas
    ex.clicked()    
    #print (filename)
    répertoire=filename[0]
    #print(répertoire)
    dossier=répertoire.split('/')
    #print(dossier)
    répertoire=""
    #print (len(dossier))
    for j in range(len(dossier)-1):
        répertoire=répertoire+dossier[j]+"/"
    répertoire=répertoire[:-1]  #   pour retirer le "/" de droite
    print(répertoire)
    ###################"
    nomdebase=répertoire      #input("répertoire de travail    :")
    print(nomdebase,"+++++++++++")
    if os.path.exists(nomdebase):
        break
    else:
        print("ce répertoire n'existe pas")
    print(nomdebase)
    print("\n")
#####################################
#ex.saisie()
fairelescoupes(objet)

#  sys.exit(app.exec_()) # fermeture de l'application QT qui semble bloquer freecad
si vous pouvez m'éclairer merci
User avatar
flachyjoe
Posts: 650
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: faire passer un nom d'instance par une variable

Postby flachyjoe » Mon Feb 10, 2020 8:39 pm

Salut,
je t'ai nettoyé la première partie mais pas testé :

Code: Select all

import os
import Draft, Part, Base


def identification_document():
    """
        retourne le nom d'un fichier sans extension ni chemin
    """
    return os.path.splitext(os.path.split(App.ActiveDocument.FileName)[1])[0]


def objet_a_traiter():
    """
        Retourne le premier objet sélectionné
    """
    return Gui.Selection.getSelection()[0]


def fairelescoupes(objet):
    doc = App.ActiveDocument

    # objets temporaires pour process
    slice = doc.addObject("Part::Feature", "Cutspecial_cs")
    f = doc.addObject('Part::Extrusion', 'Extrudespecial')
    oz = Base.Vector(0, 0, 1)

    for i in range(nbcoupes):
        if i == 3:  # pour test
            break  # pour test
        nomcoupe = nomcoupegénérique + str(i) + ".dxf"
        nomfichier = os.path.join(nomdebase, nomcoupe)

        departcouche = round(depart + (i * epcoupe), 1)
        shape = objet.Shape

        # génération du périmètre de coupe
        wires = []  # vider la liste des vecteurs
        for i in shape.slice(oz, departcouche):
            wires.append(i)
        comp = Part.Compound(wires)

        # génération séquentielle des coupes  grace à une coupe éphémère paramétrée dans la boucle
        slice.Shape = comp
        slice.purgeTouched()

        f.Base = slice
        f.DirMode = "Normal"
        f.DirLink = None
        f.LengthFwd = epcoupe
        f.LengthRev = 0.000000000000000
        f.Solid = True
        f.Reversed = False
        f.Symmetric = False
        f.TaperAngle = 0.000000000000000
        f.TaperAngleRev = 0.000000000000000

        doc.recompute()
        # sauvegarde de la coupe dans un fichier DXF
        import importDXF
        importDXF.export([f], nomfichier)
        
    #  destruction des objets temporaires
    doc.removeObject("Extrudespecial")
    doc.removeObject("Cutspecial_cs")
    doc.recompute()


depart = 0.1
epcomplexe = 8   # valeur du rayon de la visse cf tableau
epcoupe = 0.1   # finesse de la tranche pour un bonne définition spatiale
nbcoupes = round(epcomplexe/epcoupe)-1
nomcoupegénérique = input("nom générique des coupes avant indiçage   :")
# exemple "visse"
print("\n")

ActiveDocument = App.ActiveDocument
objet = objet_a_traiter()



# #######""""""""" fin de partie introductive
NB :
  • dans les macro App et Gui sont déjà importés, et ce n'est pas la peine de préciser from FreeCAD pour importer les modules
  • ta variable objet contient déjà tout ce qu'il faut, ce n'est pas la peine d'aller rechercher son nom dans le document courant
  • tu cherchais le nom du doc courant pour le rendre (encore plus ?) courant...
  • os.path à des fonctions bien pratiques
  • pas la peine de refaire les objets temporaires à chaque tour de boucle puisqu'ils sont complètement redéfinis
  • les variables locales (définies dans les procédures) sont automatiquement vidées, pas la peine de les supprimer
- Flachy Joe -
alias FFW @ irc.freenode.net #freecad et #freecad-fr
"Puisqu’on ne peut changer la direction du vent, il faut apprendre à orienter les voiles." Anonyme
decxjo
Posts: 2
Joined: Mon Feb 10, 2020 1:55 pm

Re: faire passer un nom d'instance par une variable

Postby decxjo » Thu Feb 13, 2020 2:21 pm

:D MERCI MERCI flachyjoe
grâce à vous le programme tourne plus vite et je progresse.
du coup voilà la version corrigée qui marche. J'ai retiré l'étape de l'extrusion qui n'avait en faite aucune utilité .
après des traitements des fichier Gcode et ré-assemblage avec gestion des Z en conséquence nous obtenons un fichier Gcode pour fraiser une surface convexe "complexe" demi-vis sans fin par exemple je voudrais bien vous donner le ficheir Freecad qui va avec mais je trouve pas le trombone

Code: Select all

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 13 13:14:41 2020

@author: clopeau       et GROS coup de pouce de   flachyjoe  sur le forum    https://forum.freecadweb.org/posting.php?mode=reply&f=12&t=43268
"""

"""   
CECI EST UNE MACRO FREECAD
cette macro  agit sur un corps selectionné , le coupe en tranche à partir d'une succession de coupe,  dont chacune est extrudé 
pour pouvoir être exporté en .dxf un fichier portant en indice celui de la coupe
ces fichiers dxf sont voués à être traités et convertis par le programme pyhton dans  sunsxafo / CNC  a fin d'obtenir le fichier gcode capable
de guider le fraisage sur la face complexe convexe et ou concave selon le plan tangent à  Z du corps. historiquement uune "moitié de visse sans fin" coupé dans un plan axial
cf    voir si les variables depart, epcomplexe,epcoupe, et nbcoupes sont cohérente

+sélection de l'obejt à trancher par sa propriété de visibilité. Donc il faut s'assurer qu'un seu objet est visible et que c'est un corps solide (c'est le GUI de Freecad qui est sollicité
+ détermination du dossier de stockage par in terface Qt ..... et ainsi des autre variables

"""
# partie introductive  pour  bien coisir l'objet qui sera traitée par la routine de tranchage
document=""
doc_name=""
import FreeCAD, FreeCADGui, Draft, Part
from FreeCAD import Gui
from FreeCAD import Base
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit, QInputDialog, QApplication, QFileDialog)
from string import *
import os
import importDXF

def identification_document():
    """
        retourne le nom d'un fichier sans extension ni chemin
    """
    return os.path.splitext(os.path.split(App.ActiveDocument.FileName)[1])[0]

def getPartName():  # construit  un distionnaire    Name(interne Freecad)  : Label(de l'intrface graphque éventuellment renommé)
   dico={} 
   for i in App.ActiveDocument.Objects:
      pass
      #App.Console.PrintMessage(str(i.Name) + "  <->  " + i.Label + "\n")
      dico[i.Name]=i.Label
   return dico

def objet_a_traiter(): # retrouve le nom de l'objet que l'on souhaite trancher signaler par sa mise en visibilité
    """
        Retourne le premier objet sélectionné
    """
    return Gui.Selection.getSelection()[0]

def fairelescoupes(objet):
     doc = App.ActiveDocument

    # objets temporaires pour process
     slice = doc.addObject("Part::Feature", "Cutspecial_cs")
     oz = Base.Vector(0, 0, 1)
     for i in range(nbcoupes):
#        if i == 3:  # pour test
#           break  # pour test
        nomcoupe = nomcoupegénérique + str(i) + ".dxf"
        nomfichier = os.path.join(nomdebase, nomcoupe)
        departcouche = round(depart + (i * epcoupe), 1)
        shape = objet.Shape
        # génération du périmètre de coupe
        wires = []  # vider la liste des vecteurs
        for i in shape.slice(oz, departcouche):
            wires.append(i)
        comp = Part.Compound(wires)

        # génération séquentielle des coupes  grace à une coupe éphémère paramétrée dans la boucle
        slice=doc.addObject("Part::Feature","Cutspecial_cs")
        slice.Shape = comp
        slice.purgeTouched()
        del slice,comp,wires,shape    
    #  génération séquentielle des coupes  grace à une coupe éphémère paramétrée dans la boucle
    # sauvegarde de la coupe dans un fichier DXF
        __objs__=[]
        __objs__.append(doc.getObject("Cutspecial_cs"))
        #  import importDXF
        #importDXF.export(doc.getObject("Cutspecial_cs"),nomfichier)
        importDXF.export(__objs__,nomfichier)        
        doc.removeObject("Cutspecial_cs")   # effacement de l'objet temporaire
        #doc.recompute()

nomcoupegénérique=input("nom générique des coupes avant indiçage   :")
# exemple "visse"
print("\n")
epcomplexe=8   # valeur du rayon de la visse cf tableau
epcoupe=0.1 # finesse de la tranche pour un bonne définition spatiale
nbcoupes=round(epcomplexe/epcoupe)-1
print(nbcoupes)



########""""""""" fin de partie introductive


filename="**"
répertoire="*"
btn=""

class MCVE(QWidget):
    global filename,btn
    def __init__(self):
        super().__init__()
        self.initialize()

    def initialize(self):
        self.setWindowTitle('TRANCHEUR SURFACE COMPLEXE')
        self.setGeometry(50, 50, 400, 200)
        #btn = QPushButton('Sélection répertroire de travail', self)
        
       # btn.clicked.connect(self.clicked)
##
        #self.show()
   # def saisie(self):
       #self.champ = QLineEdit("Voici mon premier champ de texte")


    def clicked(self):
        global filename
        filename = QFileDialog.getOpenFileName( self, "Sélection du dossier de travail", "/home/", "All Files (*.*)")
 
#----------------------------------------------------------------------------------------------------------------------------------       
def epurépertoire ():
    global répertoire,dossier,nomdebase
    répertoire=""
    print (dossier)
    for j in range(len(dossier)-1):
        répertoire=répertoire+dossier[j]+"/"
    répertoire=répertoire[:-1]  #   pour retirer le "/" de droite
    print(répertoire)
    ###################"
    nomdebase=répertoire      #input("répertoire de travail    :")
    print(nomdebase,"+++++++++++")
    if os.path.exists(nomdebase):
        pass
    else:
        print("ce répertoire n'existe pas")
        print(nomdebase)
        print("\n")
###################"

depart=0.1
nombase=""

app = QApplication(sys.argv)
ex = MCVE()
   ####################################""""

#while True:
    #ex.initialize.show()   # ne marche pas
    #ex.initialize()              # ne marche pas
    #ex.btn.clicked.connect(ex.clicked)    # ne marche pas
ex.clicked()    
    #print (filename)
répertoire=filename[0]
    #print(répertoire)
dossier=répertoire.split('/')
    #print(dossier)
répertoire=""
    #print (len(dossier))
epurépertoire()

#####################################
#ex.saisie()
#sys.exit(app.exec_()) # fermeture de l'application QT qui semble bloquer freecad
#exit(app.exec())
ex.hide()
#   tranchage de l'objet Freecad   vers DXF

ActiveDocument = App.ActiveDocument
objet = objet_a_traiter()
fairelescoupes(objet)

# puis  traduction en Gcode   traitement et fusion  vers   totel  Gcode
"""
ce programme
-prend dans un répertoire les fichiers indicés, d'entete définie, et d'extension dxf issu de la macro de tranchage de freecad
- les soumets au programme dxf2gcode pour en obtenir le gcode
- en s'appuyant sur les valeurs d'incide qui constituront les noms des gcodes et donc issu du tranchage par la macro freecad
- il reconstuera le Gcode en ajoutant à chaque couhe sa valeur de Z  calculer en fonction des Z initiaux dans Freecad

dans le cas de la visse il s'agit d'otenir les gcodes des coupes Freecad produite en dxf
pour une CNC 3 axes et donc une fois assemblées formeront le corps 3 D de la visse
"""
import os

path=  répertoire   #input("répertoire à traité      : ")
# exemple  path = '/home/clopeau/sunsxafo/contruction_robot/essai'

entete= nomcoupegénérique   #input("entête des fichier à cibler    :")     #exemple visse
longueurentete=len(entete)
#extension=input("valeur de l'extension à cibler   :")
extension=".dxf"
epaisseurcoupe= epcoupe   #input("épaisseur des coupe   :")   # doit concorder avec valeur de la macro de freecad
#epaisseurcoupe=float(epaisseurcoupe)
listenumero=[]      # pour stocker puis ranger les indices en ordre croissant coupe 0, 1 ,2 etc
listetest=[]   #utile pour test de continuité
bloc=[]
finbloc=False
fichiergcode=""
exclusionligne=False
#****************************************
def dxf2gcode():
    commande='dxf2gcode -q  '+path+'/'+fichier+' -e'+path+'/'+fichiergcode
    #print(commande)
    os.system(commande)
#****************
def traitement1(l):
    global exclusionligne,bloc,finbloc
    lignetraitée=""
    lignetraitée = str()
    if l[0]==";" or l[0]=="(":
        l=[]
        lignetraitée="".join(l)
    l="".join(l)

    if "G1 Z  -3.000" in l:
        #print("OUI3")
        l=""
        lignetraitée=l
        exclusionligne=True
        finbloc=True
    elif ("G1 Z   3.000" in l) and (exclusionligne==True) :
        exclusionligne=False
        lignetraitée=l
    elif ("G1 Z   3.000" in l) and (exclusionligne==False) :
        #finbloc=True   # signal de fin de bloc
        bloc.append(l) #sauvegarde dans bloc de la ligne
        lignetraitée=l
    elif ("T"in l)or("M"in l)or("S"in l)or("G64"in l):     
        l=""
        lignetraitée=l
    elif "G0 X   0.000 Y   0.000" in l:
        l=""
        lignetraitée=l
    elif exclusionligne==True:
        l=""
        lignetraitée=l
    else:
        #print("+++",l)
        if "G1 Z  -1.500" in l: # la premier passe en Z doit se faire au z0 réglé à la surface du matériau
            l="G1 Z "+ str(epaisseurcoupe)+"\n" # si la distance entre couche est de 0,2 mm  par exemple
        bloc.append(l) #sauvegarde dans bloc de la ligne
        #print(bloc)
        lignetraitée=l
    return lignetraitée

#**********************
files = os.listdir(path)
for fichier in files:
    if extension in fichier:  # ici on ne traite que les fichiers qui ont une extension dxf pour les faire traduire par dxf2gccode
        if entete in fichier:
            if entete[0]==fichier[0]: # pour écarter les fichiers qui ne commence pas par l'entete

              fichiergcode=fichier[:-4] # pour retirer l'extension  le programme dxf2gcode rajoute la sienne
              fichiergcode=fichiergcode[longueurentete:] # pour retirer l'entete
              try:
               indicegc=int(fichiergcode)      # valeur numérique de l'indice en cours
               listenumero.append(indicegc)    # sauvegarde 
               #print(fichiergcode)  # seulment pour les test
              except:
                  print("ATTENTION  ERREUR  un indice invalide ignoré")
                  continue
listenumero.sort(reverse=True) # range les indices en ordre décroissant
l=len(listenumero)
#listenumero=listenumero[1:] #test de mise en erreur suppression du premier élément
# ici vient le controle que la liste des indices est continue
listetest=list(range(l))   #création d'une liste d'entier croissante continue
listetest.sort(reverse=True)
if listenumero==listetest: # controler si la liste des indices et croissante continue
    print("bravo")
else:
    print("ERREUR")   # il manque une couche
#print(listenumero)
# et on lance la conversion dxf ->  Gcode selon la valeur croissante des indices fichiers
##
for i in listenumero:
    fichier= entete+str(i)+".dxf"
    fichiergcode=str(i)
    dxf2gcode()

# puis effacer la deuxième passe imposer par dfx2gcode
total=path+"/total.ngc"
t=open(total,"w")
for i in range(len(listenumero)): 
    indicegc=listenumero[i] # indice de la coupe sauvegardée dans listenumero
    couche=listenumero[0]-listenumero[i] # nombre de passe incrémentiel en Z selon la profondeur de la coupe
    print("++++++++++  ",listenumero[0],listenumero[i],couche)
    fichier= path+"/"+str(indicegc)+".ngc"
    f= open(fichier,"r")
    fichiertraité=path+"/"+str(indicegc)+".gc"
    d=open(fichiertraité,"w")
    #exclusionligne=False
    for ligne in f:   # pour chaque ligne issue de dfx2gc
        lignetraitée=traitement1(ligne) # épuration des codes inutiles
        #print(lignetraitée)
        if lignetraitée!="" and lignetraitée!="\n" : # si la ligne aprèes traitment n'est pas vide
          #print("finbloc  ",finbloc)
          if finbloc==True:                          # si la fin d'un parcours a été détecté lors du traitement
            #print("ligne",lignetraitée)
            d.write(lignetraitée)
            t.write(lignetraitée)
            for numerocouche in range(couche): # le but ici est de répéter le motif d'autant que l'indice de coupe décroit il faut creuser plus
                print(numerocouche)
                for l in bloc :
                    print(l)
                    if "G1 Z 0.1" in l:  #c'est le GZ négatif produit par dxf2gc 
                        l= "G1 Z -"+str((epaisseurcoupe*(numerocouche+2)))+"\n"   # voilà la profondeur de la couche de travail jsuqu'à la couche résultat
                        print(numerocouche,str((epaisseurcoupe*(numerocouche+2))),l)
                    d.write(l)
                    t.write(l)
            finbloc=False
            #print("BB  ",bloc)    #print(l,)    #print(l,)
    #print("+++",l)
    # ce traitement de ligne dépend de la structure du fichier Gcode issu de la conversion du dxf
    # détecte les doublons et règle les z initiaux à 0
    # la profondeur de fraisage et le nombre de passe sont liés à l'indice de la coupe
    #print("+++",l)
    # ce traitement de ligne dépend de la structure du fichier Gcode issu de la conversion du dxf
    # détecte les doublons et règle les z initiaux à 0
    # la profondeur de fraisage et le nombre de passe sont liés à l'indice de la coupe
            bloc=[]
          else:    
            d.write(lignetraitée)
            t.write(lignetraitée)
    d.close()
    f.close()  
t.close()