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
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