Difficultes pour modifier la macro airfoil import vers freecad 0.17

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by mario52 »

Bonjour

pas tout a fait, ici il faut le nom du document et pas un objet document

Code: Select all

        importAirfoilDAT.insert(filename, monDocument.Name)
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by blonblon »

j'ai ajouté un edit pour entrer un nom, ca fonctionne partiellement, si je modifie ces lignes dans le code comme ceci le document prend bien le nom

Code: Select all

monDocument = App.newDocument(self.s1.text()) # utiliser une variable et utilisez la dans votre code
et
importAirfoilDAT.insert(filename,monDocument.Name)
mais la ligne ne se crée pas et le Wire non plus, il y a donc une erreur, je pense quelle vient de ces lignes

Code: Select all

                App.getDocument("Sans_nom").removeObject("DWire")
                FreeCAD.getDocument("Sans_nom").getObject("BSpline").MakeFace = False
        
                App.getDocument("Sans_nom").recompute() 
J'ai essayé de remplacer Sans_nom par monDocument.Name ou monDocument ou Name, sans succés.
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by mario52 »

Bonjour

ce serait plus facile de mettre le code complet

pour voir les éventuelles erreurs vous devez commenter le try et le except correspondant et adapter les lignes pour les erreurs d'indentation

mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by blonblon »

Désolé je pensais que ce n'était pas utile :oops:

le code
Airfoil_V2.txt
(6.7 KiB) Downloaded 69 times
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by mario52 »

Bonjour

j'ai commenté le "tray ...except" pour voir où se situent les erreurs
maintenant le document n'est plus "Sans_nom"

Code: Select all

FreeCAD.getDocument("Sans_nom").getObject("BSpline").MakeFace = False
il prend le nom entré

Code: Select all

                FreeCAD.getDocument(monDocument.Name).getObject("BSpline").MakeFace = False
# ou avec la variable               FreeCAD.getDocument(self.s1.text()).getObject("BSpline").MakeFace = False
le code modifié

Code: Select all

### -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# # # #
#
# AIRFOIL IMPORT & SCALE v2.1
# 
# Imports and scales an Airfoil in the form of a Draft Wire (DWire) or Basic Spline (BSpline)
#
# For FreeCAD Versions = 0.17
#
# Works best with OCC/OCE = or > 6.7
#
#source WEB --- https://aero-modelisme.com/conception-avion-dessiner-profil-d-aile-logiciel-de-dessin-gratuit/
#
# # # #
 
 
from PySide import QtCore, QtGui
from PySide.QtGui import QLineEdit, QRadioButton
import FreeCAD, FreeCADGui, Draft
import importAirfoilDAT
import PartDesignGui
 
# Select .dat airfoil data file to be imported
 
# PySide returns a tuple (filename, filter) instead of just a string like in PyQt
filename, filefilter = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'Open An Airfoil File',u'C:/Users/Acer/Documents/PreDim/PredimRC_V2.58f/dat/','*.dat')

class p():
 
    def proceed(self):
        global filename

        Gui.activateWorkbench("PartDesignWorkbench")
#       App.newDocument("Sans_nom")

#####################################
        monDocument = App.newDocument(self.s1.text()) # utiliser une variable et utilisez la dans votre code
#####################################

#       App.setActiveDocument("Sans_nom")
#       App.ActiveDocument=App.getDocument("Sans_nom")
#       Gui.ActiveDocument=Gui.getDocument("Sans_nom")
#       App.activeDocument().Tip = App.activeDocument().addObject('App::Part','Part')

#####################################
        monDocument.Tip = App.activeDocument().addObject('App::Part','Part') # exemple d'utilisation de la variable "monDocument"
        monDocument.Part.Label = 'Part'
#####################################

#       App.activeDocument().Part.Label = 'Part'

        Gui.activeView().setActiveObject('part', App.activeDocument().Part)
        App.ActiveDocument.recompute()
        App.activeDocument().addObject('PartDesign::Body','Body')
        Gui.activeView().setActiveObject('pdbody', App.activeDocument().Body)
        Gui.Selection.clearSelection()
        Gui.Selection.addSelection(App.ActiveDocument.Body)
        App.activeDocument().Part.addObject(App.ActiveDocument.Body)
        App.ActiveDocument.recompute()
        importAirfoilDAT.insert(filename,monDocument.Name)
        Gui.SendMsgToActiveView("ViewFit")

        if self.radio1.isChecked():
            #if True:
            try:
 
                # This produces a scaled Airfoil with a DWire
 
                scalefactor=float(self.s2.text())
                Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
 
            except Exception, e:
                FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
 
            self.close()
 
        if self.radio2.isChecked():

####
# desactive le tray pour voir ou se situe l'erreur
#            try:
####
 
                # This produces a scaled Airfoil with a BSpline

                scalefactor=float(self.s2.text())
                print scalefactor
                points = FreeCAD.ActiveDocument.ActiveObject.Points

                Draft.makeBSpline(points, closed=False)
#                Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)

#################### utilisation d'une variable pour l'utiliser plus bas dans "Upgrade"
                maSpline = Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
####################

                App.getDocument(monDocument.Name).removeObject("DWire")

#  le document n'est plus "Sans_nom#              FreeCAD.getDocument("Sans_nom").getObject("BSpline").MakeFace = False
#################### le document avec son nom
                FreeCAD.getDocument(monDocument.Name).getObject("BSpline").MakeFace = False
# ou avec la variable               FreeCAD.getDocument(self.s1.text()).getObject("BSpline").MakeFace = False
####################
        
# ici monDocument est un objet               App.getDocument(monDocument).recompute()
#################### le document avec son nom
                App.getDocument(monDocument.Name).recompute()
####################

                points=[FreeCAD.Vector(points[-1]*scalefactor),FreeCAD.Vector(points[0]*scalefactor)]
                line = Draft.makeWire(points,closed=False,face=True,support=None)
                Draft.autogroup(line)
#               Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True)

#################### utilisation de upgade donnee dans le wiki et mycircle se trouve dans un tableau
                #https://www.freecadweb.org/wiki/Draft_Upgrade/fr
                #import Draft
                #mycircle = Draft.makeCircle(2)
                #face1 = Draft.upgrade([mycircle],True) 
                Draft.upgrade([maSpline, line],delete=True) # donc ici un tableau avec nos deux variables ... ou plus
####################
                Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True)
                FreeCAD.ActiveDocument.recompute()
        
#               FreeCAD.Console.PrintMessage(str(points[-1])+"\r\n")

#### desactive le except pour voir ou se situe l'erreur
#            except:
#                FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
# 
#            self.close()
####

                self.close() # ligne a effacer apres restutution dee tray ... except
 
    def close(self):
        self.dialog.hide()
 
 
    def __init__(self):
        self.dialog = None
        self.s1 = None
 
 
        # Make dialog box and get the scale size
 
        self.dialog = QtGui.QDialog()
        self.dialog.resize(350,100)
        self.dialog.setWindowTitle("Airfoil Import & Scale")
        la = QtGui.QVBoxLayout(self.dialog)

        t1 = QtGui.QLabel(u"Nom du tronçon") # ici nom du document !!
        la.addWidget(t1)
        self.s1 = QtGui.QLineEdit()
        la.addWidget(self.s1)

        t2 = QtGui.QLabel("Corde Emplanture")
        la.addWidget(t2)
        self.s2 = QtGui.QLineEdit()
        la.addWidget(self.s2)

        t3 = QtGui.QLabel("Corde Saumon")
        la.addWidget(t3)
        self.s3 = QtGui.QLineEdit()
        la.addWidget(self.s3)

        t4 = QtGui.QLabel("Envergure")
        la.addWidget(t4)
        self.s4 = QtGui.QLineEdit()
        la.addWidget(self.s4)
 
        # Add radio buttons to select between DWire and BSpline
 
        self.radio1 = QRadioButton("Make DWire")
        self.radio2 = QRadioButton("Make BSpline")
 
            # set default to DWire & make radio buttons - Change self.radio1.setChecked(True) to
            # self.radio2.setChecked(True) to set BSpline as default
 
        self.radio1.setChecked(True)
        la.addWidget(self.radio1)
        la.addWidget(self.radio2)
 
        # Add OK / Cancel buttons
 
        okbox = QtGui.QDialogButtonBox(self.dialog)
        okbox.setOrientation(QtCore.Qt.Horizontal)
        okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        la.addWidget(okbox)
        QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.proceed)
        QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), self.close)
        QtCore.QMetaObject.connectSlotsByName(self.dialog)
        self.dialog.show()
        self.dialog.exec_()
 
p()


mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by blonblon »

merci mario52

Le code fonctionne.

Le programme étant fait pour la Version 0.17 j'ai quand meme fait l'essai sur une version 0.16 le code plante, j'ai donc regardé s'il était possible de récupérer la version que l'on utilise, j'ai juste écrit quelques lignes pour tester, je récupére bien la version, mais je n'est rien trouvé pour tester si l'on utilise pas une version inférieure.

Le code qui récupére la version
TestVersion.txt
(641 Bytes) Downloaded 39 times
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by blonblon »

J'ai trouvé comment tester la version FreeCad, il me reste à regarder ou placer le code et comment fermer le programme et éventuellement afficher un message.

le code teste version
TestVersion.txt
(723 Bytes) Downloaded 38 times
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by blonblon »

J'ai intégré le teste de version dans le code le teste est bon mais je n'ai pas trouvé comment sortir de la macro.

Le code
Airfoil_V4.txt
(7.78 KiB) Downloaded 40 times
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by mario52 »

Bonjour

j'ai un peux modifié et déplacé le test au bas de la page , avant d'exécuter le p()

Code: Select all

### -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# # # #
#
# AIRFOIL IMPORT & SCALE v2.1
# 
# Imports and scales an Airfoil in the form of a Draft Wire (DWire) or Basic Spline (BSpline)
#
# For FreeCAD Versions = 0.17
#
# Works best with OCC/OCE = or > 6.7
#
#source WEB --- https://aero-modelisme.com/conception-avion-dessiner-profil-d-aile-logiciel-de-dessin-gratuit/
#
# # # #
 
 
from PySide import QtCore, QtGui
from PySide.QtGui import QLineEdit, QRadioButton
import FreeCAD, FreeCADGui, Draft
import importAirfoilDAT
import PartDesignGui
 
# Select .dat airfoil data file to be imported
 
# PySide returns a tuple (filename, filter) instead of just a string like in PyQt

##################################################################################
# mis en bas de la page et cree le test avant d'aller a la procedure principale
#version=FreeCAD.Version()[:2]
#
#if version <> ['0', '17']:
#    FreeCAD.Console.PrintMessage(str("erreur")) # ici on va fermer le programme
#    reply = QtGui.QMessageBox.information(None,"",u"La macro nécessite FreeCAD 0.17") 
##    close() #ici il y a une erreur
#print(version)
##################################################################################

# change de place et mis a la ligne 47 a l'interieur de la procedure
#filename, filefilter = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'Open An Airfoil File',u'C:/Users/Acer/Documents/PreDim/PredimRC_V2.58f/dat/','*.dat')

class p():
 
    def proceed(self):
        global filename

        filename, filefilter = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'Open An Airfoil File',u'C:/Users/Acer/Documents/PreDim/PredimRC_V2.58f/dat/','*.dat')

        Gui.activateWorkbench("PartDesignWorkbench")
#       App.newDocument("Sans_nom")

#####################################
        monDocument = App.newDocument(self.s1.text()) # utiliser une variable et utilisez la dans votre code
#####################################

#       App.setActiveDocument("Sans_nom")
#       App.ActiveDocument=App.getDocument("Sans_nom")
#       Gui.ActiveDocument=Gui.getDocument("Sans_nom")
#       App.activeDocument().Tip = App.activeDocument().addObject('App::Part','Part')

#####################################
        monDocument.Tip = App.activeDocument().addObject('App::Part','Part') # exemple d'utilisation de la variable "monDocument"
        monDocument.Part.Label = 'Part'
#####################################

#       App.activeDocument().Part.Label = 'Part'

        Gui.activeView().setActiveObject('part', App.activeDocument().Part)
        App.ActiveDocument.recompute()
        App.activeDocument().addObject('PartDesign::Body','Body')
        Gui.activeView().setActiveObject('pdbody', App.activeDocument().Body)
        Gui.Selection.clearSelection()
        Gui.Selection.addSelection(App.ActiveDocument.Body)
        App.activeDocument().Part.addObject(App.ActiveDocument.Body)
        App.ActiveDocument.recompute()
        importAirfoilDAT.insert(filename,monDocument.Name)
        Gui.SendMsgToActiveView("ViewFit")

        if self.radio1.isChecked():
            #if True:
            try:
 
                # This produces a scaled Airfoil with a DWire
 
                scalefactor=float(self.s2.text())
                Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
 
            except Exception, e:
                FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
 
            self.close()
 
        if self.radio2.isChecked():

####
# desactive le tray pour voir ou se situe l'erreur
#            try:
####
 
                # This produces a scaled Airfoil with a BSpline

                scalefactor=float(self.s2.text())
                print scalefactor
                points = FreeCAD.ActiveDocument.ActiveObject.Points

                Draft.makeBSpline(points, closed=False)
#                Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)

#################### utilisation d'une variable pour l'utiliser plus bas dans "Upgrade"
                maSpline = Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
####################

                App.getDocument(monDocument.Name).removeObject("DWire")

#  le document n'est plus "Sans_nom#              FreeCAD.getDocument("Sans_nom").getObject("BSpline").MakeFace = False
#################### le document avec son nom
                FreeCAD.getDocument(monDocument.Name).getObject("BSpline").MakeFace = False
# ou avec la variable               FreeCAD.getDocument(self.s1.text()).getObject("BSpline").MakeFace = False
####################
        
# ici monDocument est un objet               App.getDocument(monDocument).recompute()
#################### le document avec son nom
                App.getDocument(monDocument.Name).recompute()
####################

                points=[FreeCAD.Vector(points[-1]*scalefactor),FreeCAD.Vector(points[0]*scalefactor)]
                line = Draft.makeWire(points,closed=False,face=True,support=None)
                Draft.autogroup(line)
#               Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True)

#################### utilisation de upgade donnee dans le wiki et mycircle se trouve dans un tableau
                #https://www.freecadweb.org/wiki/Draft_Upgrade/fr
                #import Draft
                #mycircle = Draft.makeCircle(2)
                #face1 = Draft.upgrade([mycircle],True) 
                Draft.upgrade([maSpline, line],delete=True) # donc ici un tableau avec nos deux variables ... ou plus
####################
                Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True)
                FreeCAD.ActiveDocument.recompute()
        
#               FreeCAD.Console.PrintMessage(str(points[-1])+"\r\n")

#### desactive le except pour voir ou se situe l'erreur
#            except:
#                FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
# 
#            self.close()
####
#		FreeCAD.Console.PrintMessage(str(version)+"\r\n")
                self.close() # ligne a effacer apres restitution des tray ... except
 
    def close(self):
        self.dialog.hide()
 
 
    def __init__(self):
        self.dialog = None
        self.s1 = None
 
        # Make dialog box and get the scale size
 
        self.dialog = QtGui.QDialog()
        self.dialog.resize(350,100)
        self.dialog.setWindowTitle("Airfoil Import & Scale")
        la = QtGui.QVBoxLayout(self.dialog)

        t1 = QtGui.QLabel(u"Nom du tronçon") # ici nom du document !!
        la.addWidget(t1)
        self.s1 = QtGui.QLineEdit()
        la.addWidget(self.s1)

        t2 = QtGui.QLabel("Corde Emplanture")
        la.addWidget(t2)
        self.s2 = QtGui.QLineEdit()
        la.addWidget(self.s2)

        t3 = QtGui.QLabel("Corde Saumon")
        la.addWidget(t3)
        self.s3 = QtGui.QLineEdit()
        la.addWidget(self.s3)

        t4 = QtGui.QLabel("Envergure")
        la.addWidget(t4)
        self.s4 = QtGui.QLineEdit()
        la.addWidget(self.s4)
 
        # Add radio buttons to select between DWire and BSpline
 
        self.radio1 = QRadioButton("Make DWire")
        self.radio2 = QRadioButton("Make BSpline")
 
            # set default to DWire & make radio buttons - Change self.radio1.setChecked(True) to
            # self.radio2.setChecked(True) to set BSpline as default
 
        self.radio1.setChecked(True)
        la.addWidget(self.radio1)
        la.addWidget(self.radio2)
 
        # Add OK / Cancel buttons
 
        okbox = QtGui.QDialogButtonBox(self.dialog)
        okbox.setOrientation(QtCore.Qt.Horizontal)
        okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        la.addWidget(okbox)
        QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.proceed)
        QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), self.close)
        QtCore.QMetaObject.connectSlotsByName(self.dialog)
        self.dialog.show()
        self.dialog.exec_()
 

#p()


version=FreeCAD.Version()[:2]

if version <> ['0', '17']:
#    FreeCAD.Console.PrintMessage(str("erreur" + "\n")) # ici on va fermer le programme
    FreeCAD.Console.PrintError(str("erreur" + "\n")) # ici on va fermer le programme affiche en rouge "PrintError" il y a aussi "PrintWarning"... Critical, NoIcon, Question, Information
    #https://www.freecadweb.org/wiki/Macro_MessageBox/fr
    reply = QtGui.QMessageBox.information(None,"",u"La macro nécessite FreeCAD 0.17") 
#    self.close() #ici il y a une erreur PS:l'erreur etait due au self qui doit etre defini dans la "def xxx(self)", init....self.maVariable
else:
    p()
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by blonblon »

Alors j'ai le meme comportement avec la version modifiée que la précédente

Je sort de la macro avec ce message dans vue Rapport

Code: Select all

Traceback (most recent call last):
  File "C:/Users/Default/AppData/Roaming/FreeCAD/airfoil.FCMacro", line 223, in <module>
    App.closeDocument(App.ActiveDocument(None))
<type 'exceptions.TypeError'>: 'App.Document' object is not callable
erreur
Est ce génant
Post Reply