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: 146
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 10, 2018 11:25 am

ce que je veux dire c'est juste tout mettre dans un conteneur unique

mario
Là je sais pas faire, a tu un exemple.
User avatar
blonblon
Posts: 146
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 » Tue Mar 13, 2018 8:18 pm

Bonsoir

J'ai intégré deux DatumPlane pour y accrocher les Sketchs pour le passages des longerons et clefs d'aile.
ce que je veux dire c'est juste tout mettre dans un conteneur unique

mario
Là je sais pas faire, a tu un exemple.

La macro
Airfoil_V12.txt
(12.93 KiB) Downloaded 11 times
SchmilBlick
Posts: 26
Joined: Fri Jan 09, 2015 8:31 pm
Location: France

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

Postby SchmilBlick » Tue Mar 13, 2018 10:27 pm

Bonsoir,

J'ai une erreur en mode BSpline, en prenant le même fichier .dat pour emplanture et saumon:

Code: Select all

Draft.makeBSpline: Equal endpoints forced Closed
Found several edges: wiring them
Found 1 open wire: closing it
Draft.makeBSpline: Equal endpoints forced Closed
Found several edges: wiring them
Found 1 open wire: closing it
Error, not a valid .dat file
Et en mode DWire le DatumPlane renvoie également l'erreur suivante:

Code: Select all

PositionBySupport: TopoDS::Face
PartDesign::Plane: Links go out of the allowed scope
Exception (Tue Mar 13 22:25:39 2018): TopoDS::Face  
PositionBySupport: TopoDS::Face
PositionBySupport: TopoDS::Face
PositionBySupport: TopoDS::Face
PartDesign::Plane: Links go out of the allowed scope
Exception (Tue Mar 13 22:25:39 2018): TopoDS::Face
Je n'ai pas plus cherché que ça à déboguer.

Avec le même objectif que le site que je vois en référence dans la macro https://aero-modelisme.com/conception-a ... n-gratuit/, c'est à dire produire un plan des sections pour en faire la découpe laser, j'avais commencé il y a quelque temps un module pour la création d'une aile. L'objectif était d'automatiser, comme les macros proposées, et de faciliter la modification en créant un objet aile. Je repris du code de la macro airfoil import et d'autres macros pour aller chercher le fichier de profil.
Module Aile "Aile_module2.py"
Aile_module2.py
(5.28 KiB) Downloaded 9 times

Code: Select all

import os, re
from PySide import QtCore, QtGui
import FreeCAD, FreeCADGui, Part, Draft
from pivy import coin

ModeVerbose = True

if open.__module__ == '__builtin__':
	pythonopen = open

def msgCsl(message):
	if ModeVerbose:
		FreeCAD.Console.PrintMessage(message) # +"\n")

def FileProfil():
	# PySide returns a tuple (filename, filter) instead of just a string like in PyQt
	FileProfil, filefilter = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'Open An Airfoil File',FreeCAD.ConfigGet("UserHomePath"),'*.*')
#	if ModeVerbose:
	msgCsl(FileProfil)
	return  FileProfil

def NomFichier(filename):
	NomFichier = os.path.basename(filename)
#	_,NomFichier = os.path.split(filename)
	msgCsl(NomFichier)
	return NomFichier

def CheminFichier(filename):
	CheminFichier = os.path.dirname(filename)
	msgCsl(CheminFichier)
	return CheminFichier

def getPoints(filename):
	# Regex to identify data rows and throw away unused metadata
	regex = re.compile(r'^\s*(?P<xval>(\-|\d*)\.\d+(E\-?\d+)?)\,?\s*(?P<yval>\-?\s*\d*\.\d+(E\-?\d+)?)\s*$')
	afile = pythonopen(filename,'r')
	# read the airfoil name which is always at the first line
	airfoilname = afile.readline().strip()
	coords=[]
#	upside=True
#	last_x=None
	# Collect the data for the upper and the lower side seperately if possible
	for lin in afile:
		curdat = regex.match(lin)
		if curdat != None:
			x = float(curdat.group("xval"))
			y = float(curdat.group("yval"))
			# the normal processing
			coords.append(FreeCAD.Vector(x,y,0))
		# End of if curdat != None
	# End of for lin in file
	afile.close()
	return coords


class Aile:
	def __init__(self, obj):
#		fichier, filefilter = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'Open An Airfoil File',FreeCAD.ConfigGet("UserHomePath"),'*.*')
#		chemin, fichier = os.path.split(fichier)
#		msgCsl("Repertoire: " + chemin + "\nFichier: " + fichier)
#		obj.addProperty("App::PropertyPath","Chemin","Aile","Profil de l'aile").Chemin=chemin
		obj.addProperty("App::PropertyFile","Fichier","Aile","Profil de l'aile").Fichier = FileProfil()
		obj.addProperty("App::PropertyLength","EchelleSaumon", "Aile","Echelle saumon, soit la longueur du saumon").EchelleSaumon = 1.0
		obj.addProperty("App::PropertyLength","EchelleEmplanture", "Aile","Echelle emplanture, soit la longueur de l'emplanture").EchelleEmplanture = 1.0
		obj.addProperty("App::PropertyLength","Longueur", "Aile","Longueur de l'aile").Longueur = 10.0
#		obj.addProperty("Part::PropertyPartShape","Aile","Aile","Aile")
		obj.addProperty("App::PropertyVectorList","points_saumon","Aile","Points du saumon")
		obj.addProperty("App::PropertyVectorList","points_emplanture","Aile","Points de l'emplanture")
		obj.Proxy = self
		points=[]
		points = getPoints(obj.Fichier)
		e = obj.getPropertyByName("EchelleSaumon")
		for p in points:
			p.x = p.x * e
			p.y = p.y * e
			p.z = obj.Longueur
		obj.points_saumon = points
		saumonP = Part.makePolygon(obj.points_saumon, True)
		saumon = Draft.makeWire(saumonP,True,False)
		saumon.Label = "Saumon"
		points=[]
		points = getPoints(obj.Fichier)
		e = obj.getPropertyByName("EchelleEmplanture")
		for p in points:
			p.x = p.x * e
			p.y = p.y * e
		obj.points_emplanture = points
		emplantureP = Part.makePolygon(obj.points_emplanture, True)
		emplanture = Draft.makeWire(emplantureP,True,False)
		emplanture.Label = "Emplanture"
		obj.addProperty("App::PropertyString","WireSaumon","Aile","Saumon de l'aile").WireSaumon = saumon.Name
		obj.addProperty("App::PropertyString","WireEmplanture","Aile","Emplanture de l'aile").WireEmplanture = emplanture.Name
		AileBis = FreeCAD.ActiveDocument.addObject('Part::Loft','Loft')
		AileBis.Label = "Loft_Aile"
		obj.addProperty("App::PropertyString","NomLoft","Aile","Nom du lissage lie a l'aile").NomLoft = AileBis.Name
		AileBis.Sections = [FreeCAD.ActiveDocument.getObject(emplanture.Name),FreeCAD.ActiveDocument.getObject(saumon.Name)]
		AileBis.Solid = True
		AileBis.Ruled = False		
				
	def onChanged(self, fp, prop):
        # Do something when a property has changed
        	msgCsl("Change property: " + str(prop) + "\n")
		if prop == "Fichier":
			fp.points_emplanture = getPoints(fp.Fichier)
			self.updateWire(fp,fp.WireEmplanture,"points_emplanture","EchelleEmplanture")
			fp.points_saumon=getPoints(fp.getPropertyByName("Fichier"))
			self.updateWire(fp,fp.WireSaumon,"points_saumon","EchelleSaumon")
		if prop == "EchelleEmplanture":
			self.updateWire(fp,fp.WireEmplanture,"points_emplanture","EchelleEmplanture")
		if prop == "EchelleSaumon":
			self.updateWire(fp,fp.WireSaumon,"points_saumon","EchelleSaumon")
		if prop == "Longueur":
			self.updateWire(fp,fp.WireSaumon,"points_saumon","EchelleSaumon")			
				
	def execute(self, fp):
		msgCsl("class Aile, execute")
		
	def updateWire(self, fp, oWire, fWire, Echelle):
		oW = FreeCAD.ActiveDocument.getObject(oWire)
		eW = FreeCAD.ActiveDocument.getObject(fp.WireEmplanture)
		fW = fp.getPropertyByName(fWire)
		e = fp.getPropertyByName(Echelle)
		z = 0.0
		if fWire == "points_saumon" : z = fp.Longueur
		mPosition = FreeCAD.Vector(0,0,z)
		mRotation = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),0)
		mCenter = FreeCAD.Vector(0,0,1)
		mPlacement = FreeCAD.Placement(mPosition,mRotation,mCenter)
		mPlacement = eW.Placement.multiply(mPlacement)
		oW.Placement = mPlacement
		pts = []
		for p in fW:
			pts.append(FreeCAD.Vector(p.x * e,p.y * e, 0))
		oW.Points = pts
La macro pour lancer la création d'une aile:

Code: Select all

import Aile_module2
reload(Aile_module2)

a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Aile")
Aile_module2.Aile(a)
a.ViewObject.Proxy=0 # just set it to something different from None (this assignment is needed to run an internal notification)
FreeCAD.ActiveDocument.recompute()
Ensuite pour créer les nervures, le module "Nervures.py":
Nervures.py
(1.91 KiB) Downloaded 8 times

Code: Select all

import FreeCAD, FreeCADGui
import Part
import math
from FreeCAD import Base

ModeVerbose = True

def msgCsl(message):
	if ModeVerbose:
		FreeCAD.Console.PrintMessage(message  +"\n")
		
#DOC = "Test_Macro_sections"
#NB_NERVURES = 3
#OBJ = "Cut"
#NOM_SECTION = "Section_"
#ANGLE = 20.00  # en degres
#Normale = FreeCAD.Base.Vector(0,math.sin(ANGLE/180.00*math.pi),math.cos(ANGLE/180.00*math.pi))

def Extruder(DOC,OBJ,NB_NERVURES,NOM_SECTION,Normale,Longueur):

	for cnt in range(1 , NB_NERVURES+1):
	#	msgCsl("Section %d, sinus   %f, cosinus   %f" %  (cnt,ANGLE/180.00,ANGLE/180.00*math.pi))
		msgCsl("Section %d, %s" %  (cnt,Normale))
		nomExtrusion = NOM_SECTION + "Extrude_%d" % (cnt)
		msgCsl(nomExtrusion)
		FreeCAD.getDocument(DOC).addObject("Part::Extrusion",nomExtrusion)
		FreeCAD.getDocument(DOC).getObject(nomExtrusion).Base = FreeCAD.getDocument(DOC).getObject(NOM_SECTION + "%d" % cnt)
		FreeCAD.getDocument(DOC).getObject(nomExtrusion).Dir = (Longueur*Normale.x,Longueur*Normale.y,Longueur*Normale.z)
		FreeCAD.getDocument(DOC).getObject(nomExtrusion).Solid = (True)
		FreeCAD.getDocument(DOC).getObject(nomExtrusion).TaperAngle = (0)
		FreeCADGui.getDocument(DOC).getObject(NOM_SECTION + "%d" % cnt).Visibility = False
		FreeCAD.getDocument(DOC).getObject(nomExtrusion).Label = nomExtrusion
		FreeCAD.getDocument(DOC).recompute()
		
#ECARTEMENT_NERVURE = 50

def Sections(DOC,OBJ,NB_NERVURES,ECARTEMENT_NERVURE,NOM_SECTION,Normale):
	shape=FreeCAD.getDocument(DOC).getObject(OBJ).Shape

	for cnt in range(1 , NB_NERVURES+1):
		wires=list()
	#	msgCsl("Section %d, sinus   %f, cosinus   %f" %  (cnt,ANGLE/180.00,ANGLE/180.00*math.pi))
		msgCsl("Section %d, %s" %  (cnt,Normale))
		for i in shape.slice(Normale,ECARTEMENT_NERVURE*cnt):
			wires.append(i)
		comp=Part.Compound(wires)
		slice=FreeCAD.getDocument(DOC).addObject("Part::Feature",NOM_SECTION + "%d" % (cnt) )
		slice.Shape=comp
		slice.purgeTouched()
		del slice,comp,wires
	del shape
Et la macro pour créer les nervures, ça mouline un peu chez moi:

Code: Select all

import Nervures, math
reload(Nervures)

DOC = FreeCAD.ActiveDocument.Name
NB_NERVURES = 10
ECARTEMENT_NERVURE = 50
OBJ = "Loft"
NOM_SECTION = "Nervure_"
Longueur = 2.00
ANGLE = 1.14  # en degres
Normale = FreeCAD.Base.Vector(0,math.sin(ANGLE/180.00*math.pi),math.cos(ANGLE/180.00*math.pi))

Nervures.Sections(DOC,OBJ,NB_NERVURES,ECARTEMENT_NERVURE,NOM_SECTION,Normale)
Nervures.Extruder(DOC,OBJ,NB_NERVURES,NOM_SECTION,Normale,Longueur)
Pas mal de compléments et d'améliorations possibles, je m'étais arrêté là car un autre membre du club dessinait sur Solidworks le plan d'un projet de planeur. Mais là on va recevoir une découpeuse laser, faudrait que je continue ce module!
Dans le désordre:
1) rajouter le profil de saumon à l'objet aile
2) corriger un bug de la fenêtre de récupération du profil, la boite de dialogue apparait en arrière plan
3) ajouter le mode BSpline
4) ajouter un offset de la première nervure
5) calcul automatique du nombre de nervures en fonction du pas (j'ai supposé qu'on choisit plutôt le pas pour faciliter le construction)
6) créer la mise à jour de l'objet "nervures" en cas de modif
7) ajouter le pas en propriété modifiable de l'objet "nervures"
8) ajouter la vrillage dans les propriétés de l'aile
9) créer l'atelier du module aile avec le bouton de création d'aile, de création des nervures à partir de l'aile sélectionner
10) nettoyer, optimiser le code
11) gérer les erreurs utilisateur
12) mettre ça sur github
13) calcul de la normale des sections à partir du dièdre paramétré
14) améliorer la création automatique du plan avec les sections
15) la propal de mario52, intégrer les fichiers .dat au conteneur du fichier freecad .fcstd. Je n'ai aucune idée de comment faire. Mais j'irais chercher dans le code source qui intègre les planches ou spreadsheets dans le conteneur.
16) ...

Je ne suis pas du tout un pro de la programmation, et plutôt débutant en python! ;)

Ah oui, et ma raison d'écrire: partager nos idées pour améliorer nos outils respectifs de création d'aile paramétrée! :D
Je pense notamment à préciser le besoin. La création de plans pour la fabrication, et/ou la modélisation réaliste d'un aéromodèle en 3D. Je pense par exemple que les baguettes ou clés d'aile ne doivent pas être un sketch extrudé, sauf si cela correspond à une forme réelle et complexe, mais plutôt de créer des solides simples et faire la soustraction à l'aile pleine et ensuite créer les sections des nervures.
Capture du 2018-03-13 23-03-54.png
Capture du 2018-03-13 23-03-54.png (54.24 KiB) Viewed 213 times
Capture du 2018-03-13 23-12-44.png
Capture du 2018-03-13 23-12-44.png (31.82 KiB) Viewed 213 times
Ubuntu 16.04 LTS 64bits - FreeCAD daily-build - FreeCAD 0.17
User avatar
blonblon
Posts: 146
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 » Tue Mar 13, 2018 10:47 pm

Bonsoir SchmilBlick

J'ai testé sur la version.

OS: Windows 10
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.17.13387 (Git)
Build type: Release
Branch: master
Hash: c5f4079252b11e3c54cd603be7d3697fa9f9d922
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)

Je lance la macro sans avoir ouvert un nouveau dossier, et pas d'erreur
visuel.png
visuel.png (61.25 KiB) Viewed 210 times
visuel2.png
visuel2.png (25.12 KiB) Viewed 207 times
SchmilBlick
Posts: 26
Joined: Fri Jan 09, 2015 8:31 pm
Location: France

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

Postby SchmilBlick » Wed Mar 14, 2018 9:35 pm

Salut Blonblon,

OS: Ubuntu 16.04.4 LTS
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.17.13407 (Git)
Build type: None
Branch: master
Hash: 2c2d781aa686b731f2a0e754dc30ebb76f3553e0
Python version: 2.7.12
Qt version: 4.8.7
Coin version: 4.0.0a
OCC version: 7.1.0
Locale: French/France (fr_FR)

J'ai réessayé avec un profil ouvert:
- BSpline: ok, même résultat que toi. Reste donc le message orange "PartDesign::Plane: Links go out of the allowed scope"
- DWire: ko, en fait il n'y a pas de faces créées donc les datum plane en mode FlatFace ne peuvent fonctionner.

Pour dessiner les baguettes à partir de sketch sur les datum plane, il faudrait que ces derniers soient perpendiculaires à la baguette, sinon le sketch sera incliné par rapport à la section et les cotes du sketch ne correspondront pas aux dimensions de la baguette. Il faudrait créer la baguette à partir du sketch emplanture, puis positionner correctement le résultat tangent aux profiles des emplanture et saumon. Là ça se corse. L'idéal serait d'avoir une fonction f(x) qui se déplace sur le long du profile, x étant la distance au bord de fuite.

SchmilBlick
Ubuntu 16.04 LTS 64bits - FreeCAD daily-build - FreeCAD 0.17
User avatar
blonblon
Posts: 146
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 » Wed Mar 14, 2018 10:09 pm

Bonsoir

Chez moi cela fonctionne jusqu'à l'affichage des Datumplane, à partir de là il faut faire manuellement leur positionnement éventuel ainsi que les Sketchs.

Est ce que tu a l'affichage du tronçon d'aile.

Dans vue rapport il y a des messages qui s'affichent mais qui ne gênent pas le fonctionnement.

Pour la découpe des nervures la Macro n'est pas encore faite, mais on l'appellera une fois les passages des clefs et des longerons modélisés.

Tu n'a pas modifié la Macro que j'ai posté.
SchmilBlick
Posts: 26
Joined: Fri Jan 09, 2015 8:31 pm
Location: France

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

Postby SchmilBlick » Wed Mar 14, 2018 11:35 pm

oui, oui, le loft est bien créé, à partir du moment où j'ai supprimé le dernier point dans mon fichier .dat

En DWire, pour que le datumplane soit correctement créé, je pense qu'il faut faire un upgrade pour obtenir les faces à partir des wire, comme dans le cas des splines, ensuite le code fonctionnera je pense.

A part pour corriger ce passage pour les datumplane, je n'ai pas vu le besoin de modifier ta macro. Je pense pouvoir si tu le souhaites. Sinon de mon côté je me remets à créer un workbench à partir du module que j'ai joint dans mon premier post.

Pour la création des nervures, j'ai proposé du code qu'il faudrait adapter pour l'utiliser à partir de ta macro et du fait d''utiliser la structure body/part. Je n'ai pas encore regardé dans le détail le blog pour y piocher une éventuelle méthode plus efficace.

Je suivrai la suite de tes macros avec intérêt :D
Ubuntu 16.04 LTS 64bits - FreeCAD daily-build - FreeCAD 0.17
User avatar
blonblon
Posts: 146
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 15, 2018 8:45 am

Bonjour SchmilBlick

Peut tu poster ta modif sur le fichier.

Tu peu poster tes fichiers et tes idées, le Forum est fait pour cela.

Quand j'ai modifié Airfoil c'était pour qu'il ne fonctionne que sur FreeCAD 0.17, comme je l'ai lancé par erreur sur la version 0.16 j'ai regardé pour y intégrer un teste de version, j'ai modifié le panneau dialogue, j'ai automatisé la modélisation au maximum, pour les clefs d'aile et le longerons je pense qu'il est préférable de le faire manuellement, il suffit d'attacher le(s) Sketch(s) sur le(s) Datumplane il(s) qui se réajustent automatiquement.

Pour dessiner les nervures je pense a une macro indépendante.
SchmilBlick
Posts: 26
Joined: Fri Jan 09, 2015 8:31 pm
Location: France

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

Postby SchmilBlick » Thu Mar 15, 2018 10:14 pm

Peut tu poster ta modif sur le fichier.
Tu parles du fichier .dat ? Car je n'ai rien modifié d'autre. C'est juste le fichier avec les points du profil.

Effectivement une macro séparée pour les nervures me semble mieux vu que cela peut s'appliquer à n'importe quel solide.
Ubuntu 16.04 LTS 64bits - FreeCAD daily-build - FreeCAD 0.17
User avatar
blonblon
Posts: 146
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 15, 2018 10:23 pm

Je pensais à une modif sur mon fichier macro, donc on a la certitude que cela fonctionne.

Si les fichiers import dat profil emplenture saumon doivent je pense avoir le meme nombre de points pour le Loft.

J'ai commencé la macro nervures ça ne marche que pour la première nervure.