Difficultes pour modifier la macro airfoil import vers freecad 0.17

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
mario52
Posts: 2249
Joined: Wed May 16, 2012 2:13 pm

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

Postby mario52 » Sat Mar 03, 2018 11:53 am

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. My macros on Gist.github
User avatar
blonblon
Posts: 129
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

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

Postby blonblon » Sat Mar 03, 2018 1:59 pm

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
Posts: 2249
Joined: Wed May 16, 2012 2:13 pm

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

Postby mario52 » Sat Mar 03, 2018 2:20 pm

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. My macros on Gist.github
User avatar
blonblon
Posts: 129
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

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

Postby blonblon » Sat Mar 03, 2018 2:28 pm

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

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

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

Postby mario52 » Sat Mar 03, 2018 6:59 pm

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. My macros on Gist.github
User avatar
blonblon
Posts: 129
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

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

Postby blonblon » Sat Mar 03, 2018 8:32 pm

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 2 times
User avatar
blonblon
Posts: 129
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

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

Postby blonblon » Sat Mar 03, 2018 9:42 pm

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 4 times
User avatar
blonblon
Posts: 129
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

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

Postby blonblon » Sat Mar 03, 2018 10:53 pm

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 5 times
mario52
Posts: 2249
Joined: Wed May 16, 2012 2:13 pm

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

Postby mario52 » Sun Mar 04, 2018 12:45 pm

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. My macros on Gist.github
User avatar
blonblon
Posts: 129
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

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

Postby blonblon » Sun Mar 04, 2018 12:55 pm

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