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

Difficultes pour modifier la macro airfoil import vers freecad 0.17

Post by blonblon »

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

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

ici plein de code pour débuter Code_snippets

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

Je vais regarder et essayer de récupérer les coordonnées des points.
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 »

Je n'arrive pas à récupérer les coordonnées :evil:
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

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

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

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

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.
Post Reply