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

Difficultes pour modifier la macro airfoil import vers freecad 0.17

Postby blonblon » Thu Mar 01, 2018 9:04 pm

OS: Windows 10
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.17.13344 (Git)
Build type: Release
Branch: master
Hash: 404452d6ee925b9c5504b58b65c7934e411bbe62
Python version: 2.7.14
Qt version: 4.8.7
Coin version: 4.0.0a
OCC version: 7.1.0
Locale: French/France (fr_FR)


Bonsoir je cherche à modifier le code de la macro airfoil import prévu pour la version 0.16, si je lance la macro sur la version 0.17 après avoir fait nouveau et part un nouveau fichier unnamed est crée, j'ai le code de airfoil et j'ai le code de la console crée en faisant un import, je ne comprend pas trop ou et quoi insérer du code a modifier.
User avatar
blonblon
Posts: 204
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 » Thu Mar 01, 2018 11:04 pm

Ce code minimal fonctionne, je ne sais pas encore comment l'integrer
Gui.activateWorkbench("PartDesignWorkbench")
App.newDocument("Sans nom")
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')
App.activeDocument().Part.Label = 'Part'
Gui.activeView().setActiveObject('part', App.activeDocument().Part)
App.ActiveDocument.recompute()
App.activeDocument().addObject('PartDesign::Body','Body')
import PartDesignGui
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()
import importAirfoilDAT
importAirfoilDAT.insert(u"C:/Users/Acer/Documents/PreDim/PredimRC_V2.58f/dat/AG03.dat","Sans_nom")
Gui.SendMsgToActiveView("ViewFit")
User avatar
blonblon
Posts: 204
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 » Fri Mar 02, 2018 10:54 am

J'ai commencé à modifier pour la version 0.17, je crée le part et le body.

avec la courbe splines si on veut que le profil soit respecté il faut modifier closed et make face, par contre la courbe n'est pas fermée il suffit pour cela de joindre deux points par un ligne mais je ne sais pas récupérer les deux points a joindre, j'ai vu que la variable points renvoyait un tableau de vertex dans ce tableau il me faudrait récupérer la premiére et la derniére coordonnées je n'y suis pas arrivé

le fichier
Airfoil.txt
(4.94 KiB) Downloaded 31 times
mario52
Posts: 2645
Joined: Wed May 16, 2012 2:13 pm

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

Postby mario52 » Fri Mar 02, 2018 12:33 pm

Bonjour

ici plein de code pour débuter Code_snippets

mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Dialog creation. My macros on Gist.github.
User avatar
blonblon
Posts: 204
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 » Fri Mar 02, 2018 12:59 pm

Merci mario52

Je vais regarder et essayer de récupérer les coordonnées des points.
User avatar
blonblon
Posts: 204
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 » Fri Mar 02, 2018 7:58 pm

Je n'arrive pas à récupérer les coordonnées :evil:
mario52
Posts: 2645
Joined: Wed May 16, 2012 2:13 pm

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

Postby mario52 » Fri Mar 02, 2018 11:15 pm

Bonjour

pour la première coordonnée du tableau faites

Code: Select all

points[0]
pour la dernière coordonnée,

Code: Select all

points[-1]
(en admettant que le tableau s'appelle points[])

mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Dialog creation. My macros on Gist.github.
User avatar
blonblon
Posts: 204
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:23 am

Merci mario52

Grace à toi j'ai réussi à tracer ma ligne et à la redimensionner, par contre je n'arrive pas à fusionner le Bspline et la Ligne par code alors que cela fonctionne manuellement.
Je poste le code, pour tester il n'est utile que de renseigner la première ligne Corde Emplanture et le bouton Make BSpline, les autres données ne sont pas utilisées dans le code pour l'instant.

Le code
Airfoil_V1.txt
(4.91 KiB) Downloaded 28 times
mario52
Posts: 2645
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:00 am

Bonjour

votre 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
#
# # # #
 
 
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("Sans_nom") # 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,"Sans_nom")
        Gui.SendMsgToActiveView("ViewFit")

        if self.radio1.isChecked():
            #if True:
            try:
 
                # This produces a scaled Airfoil with a DWire
 
                scalefactor=float(self.s1.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():
            try:
 
                # This produces a scaled Airfoil with a BSpline

                scalefactor=float(self.s1.text())
                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("Sans_nom").removeObject("DWire")
                FreeCAD.getDocument("Sans_nom").getObject("BSpline").MakeFace = False
        
                App.getDocument("Sans_nom").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
####################
                FreeCAD.ActiveDocument.recompute()
        
#               FreeCAD.Console.PrintMessage(str(points[-1])+"\r\n")

            except:
                FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
 
            self.close()
 
    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("Corde Emplanture")
        la.addWidget(t1)
        self.s1 = QtGui.QLineEdit()
        la.addWidget(self.s1)
        t2 = QtGui.QLabel("Corde Saumon")
        la.addWidget(t2)
        self.s2 = QtGui.QLineEdit()
        la.addWidget(self.s2)
        t3 = QtGui.QLabel("Envergure")
        la.addWidget(t3)
        self.s3 = QtGui.QLineEdit()
        la.addWidget(self.s3) 
        # 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()

pour upgrade il faut un tableau:

Code: Select all

Draft.upgrade([maSpline, line],delete=True)
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Dialog creation. My macros on Gist.github.
User avatar
blonblon
Posts: 204
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 11:39 am

Merci mario52

J'ai encore appris quelque chose, je ne connaissais pas le tableau d'objets.

Si je comprend bien dans la ligne

Code: Select all

monDocument = App.newDocument("Sans_nom") # utiliser une variable et utilisez la dans votre code
je peux dans la ligne

Code: Select all

importAirfoilDAT.insert(filename,"Sans_nom")
remplacer par

Code: Select all

importAirfoilDAT.insert(filename monDocument )
et cela partout dans le programme.