Axes XYZ... comprends pas...

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
IAD
Posts: 6
Joined: Wed Oct 08, 2014 1:00 pm

Axes XYZ... comprends pas...

Post by IAD »

Bonjour,
quelqu'un pourrait m'expliquer le système de coordonnées ? Je ne le comprends pas. Je m'explique. J'ai fait un petit script python, qui me crée un certain nombre de tubes sur les 3 axes (enfin... c'est ce que je croyais). Or, lorsque je visionne mon dessin, il me manque l'axe Z ; ou plutôt, je m'attendais à voir quelque chose comme (si je prends l'image d'un gateau) un gâteau coupé en 4 (vue du dessus) pour les axes X et Y, puis au milieu (horizontal, vue de côté) pour l'axe Z et le résultat n'est pas ça. De plus, lorsque je séléctionne mes tubes tubeX0, tubeY0 et tubeZ0 (dans la fenêtre "Vue Combinée"), ils sont tous les trois au même endroit, alors que je m'attendais à avoir le tubeX0 sur l'axe X, tubeY0 sur l'axe Y et tubeZ0 sur l'axe Z.

Merci d'avance pour vos précieuses remarques... et désolé si la réponse a déjà été donnée, je vous promets que j'ai cherché...

IAD.

P.S.: je copie le code python ci-dessous puisque les extensions .py, .txt et .t ne sont pas authorisées et je n'ai pas pu attacher mon fichier freecad_test2.py

Code: Select all

# -*- coding: utf8 -*-

# --- Modules nécessaires --- #
import FreeCAD                      # Module FreeCAD
import Part                         # conteneur d'objects (sphère, cylindre, ...)


# --- Mes fonctions --- #

def createTube (tubeDoc, tubeLen=10, tubeDiam=4, tubeEpais=0.5, tubeName="Tube") :
        """
        Fonction qui permets de créer un tube
        d'une longueur et épaisseur donnée
        """
        tubeExtObj = tubeDoc.addObject("Part::Feature","TubeExt")
        tubeExtObj.Shape = Part.makeCylinder(tubeDiam, tubeLen)             # 

        tubeIntObj = tubeDoc.addObject("Part::Feature","TubeInt")
        tubeIntObj.Shape = Part.makeCylinder(tubeDiam-tubeEpais, tubeLen)                 
        
        tubeObj = tubeDoc.addObject("Part::Cut",tubeName)
        tubeObj.Base = tubeExtObj                                           # Object de base
        tubeObj.Tool = tubeIntObj                                           # Object à soustraire
        return tubeObj


# --- Paramètres de l'objet --- #

cylTaille = 12                      # Cylindre - taille(en cm)
cylDiam = 2                         # Cylindre - diamètre externe(en cm)
cylEpais = 0.25                     # Cylindre - épaisseur (en cm)
cylTrans = 10                       # Cylindre - transparence


# Création du nouveau document FreeCAD
doc=FreeCAD.newDocument ("FreeCAD_Test2")

# Création des tubes à 30° sur les axe X, Y et Z
tubeNr=0
angle=30

while tubeNr < (360/angle) :
    # Création du tube en X
    cylObjX = createTube(doc, cylTaille, cylDiam, cylEpais, "tubeX"+str(tubeNr))                                        # Tube X - Création
    cylObjX.ViewObject.Transparency = cylTrans                                                                          # Tube X - Transparence
    cylObjX.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(1,0,0),tubeNr*angle))   # Tube X - Alignement

    # Création du tube en Y
    cylObjY = createTube(doc, cylTaille, cylDiam, cylEpais, "tubeY"+str(tubeNr))                                        # Tube Y - Création
    cylObjY.ViewObject.Transparency = cylTrans                                                                          # Tube Y - Transparence
    cylObjY.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,1,0),tubeNr*angle))   # Tube Y - Alignement

    # Création du tube en Z
    cylObjZ = createTube(doc, cylTaille, cylDiam, cylEpais, "tubeZ"+str(tubeNr))                                        # Tube Z - Création
    cylObjZ.ViewObject.Transparency = cylTrans                                                                          # Tube Z - Transparence
    cylObjZ.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),tubeNr*angle))   # Tube Z - Alignement
    
    tubeNr += 1                                                                                                         # incrémentation du numéro du tube

doc.recompute()
Last edited by NormandC on Fri Oct 10, 2014 3:27 am, edited 1 time in total.
Reason: Ajout de balises [code][/code] au script pour améliorer la lecture.
OS: Windows 7 64-bit Version: 0.14.3700 (Git)
Python version: 2.7.6 Qt : 4.8.5 Coin : 4.0.0a SoQt : 1.6.0a OCC : 6.6.0
User avatar
NormandC
Veteran
Posts: 18589
Joined: Sat Feb 06, 2010 9:52 pm
Location: Québec, Canada

Re: Axes XYZ... comprends pas...

Post by NormandC »

Salut,

Je me suis permis de formater ton script avec des balises code. Je ne peux te répondre, je suis une quiche en programmation. :oops:

Pour quiconque voudrait copier le script, n'utilisez pas le lien "SELECT ALL" pour la sélection, car il ajoute des indentations qui brisent l'exécution du script.
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: Axes XYZ... comprends pas...

Post by mario52 »

bonjour IAD
j'ai fais tourner votre macro et c'est normal que que vous ne voyez pas les tubes dans l'axe Z votre tube est à plat dans l'axe Z donc il tourne sur lui même et vous ne voyez qu'un tube vous voyez les rotations X Y et pas la Z.
Pour bien voir et distinguer, colorez vos tubes XYZ avec les couleurs correspondantes XYZ
ou faites tourne un axe à la fois en commentant les deux autres.
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.
IAD
Posts: 6
Joined: Wed Oct 08, 2014 1:00 pm

Re: Axes XYZ... comprends pas...

Post by IAD »

Merci Normand pour le formatage du script, c'est beaucoup plus clair. :D

Merci Mario pour la réponse. Effectivement, j'avais pu vérifié que mon axe Z tournait sur lui-même, mais je ne comprends pas pourquoi.

Ceci-dit, c'était une très bonne idée pour les couleurs merci beaucoup ! ;) je peux mieux expliquer mon incompréhension.

Dans l'image ci-après, la première ligne contient le résultat de mon script et la deuxième est le résultat de ce que je m'attendais à avoir (ça m'a pris des plombes, pour essayer de trouver à peu près les bonnes distances et de mettre les bonnes couleurs sur le bon axe !).
Axes XYZ.png
Axes XYZ.png (423.8 KiB) Viewed 2486 times
Or, ce que je ne comprends pas c'est pourquoi lorsque je crée un seul tube

Code: Select all

while tubeNr < 1 :
je n'ai pas un tube sur chaque axe, mais j'ai 3 tubes sur le même axe ; ainsi que, lorsque j'ai deux tubes

Code: Select all

while tubeNr < 2 :
je n'ai pas deux tubes par axe, mais 4 tubes sur le même axe et deux autres effectivement décalés.
Bon... en rédigeant ce texte je viens de comprendre un truc... les tubes tournent autour de leur axe (tubeYxx autour de l'axe Y, tubeXxx autour de l'axe X) - Mario, c'est pour cela que tu disais que mon tube est à plat ?
Je reformule ma question : comment faire pour que mes tubes tubesZxx tournent autour de mon axe Z (dans l'image ci-dessus, j'ai bricolé, avec des valeurs approximatives) ?
Merci d'avance pour votre aide. :D
OS: Windows 7 64-bit Version: 0.14.3700 (Git)
Python version: 2.7.6 Qt : 4.8.5 Coin : 4.0.0a SoQt : 1.6.0a OCC : 6.6.0
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: Axes XYZ... comprends pas...

Post by mario52 »

bonjour
ici c'est la position de votre tube dans FreeCAD donc dans l'axe Z
les cercles RVB représentent la rotation, comme le tube est dans l'axe ils se copient dans l'axe Z avec une rotation (angle=30)
XYZ_01.png
XYZ_01.png (20.47 KiB) Viewed 2478 times
donc pour faire pivoter votre tube dans l'axe Z vous devez l'incliner de 90 degrés dans l'axe X ou Y puis opérer votre rotation dans l'axe Z (cercle bleu).
XYZ_02.png
XYZ_02.png (19.3 KiB) Viewed 2478 times
IAD wrote:je n'ai pas un tube sur chaque axe, mais j'ai 3 tubes sur le même axe ; ainsi que, lorsque j'ai deux tubes
n'oubliez pas que vous avez un tube extérieur (TubeExt), un tube intérieur (TubeInt) et un tube opération booléenne (tubeX0) = 3
vous pouvez effacer TubeExt et TubeInt mais vous perdrez l'historique de la création de tubeX0
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.
IAD
Posts: 6
Joined: Wed Oct 08, 2014 1:00 pm

Re: Axes XYZ... comprends pas...

Post by IAD »

Superbe explication !!! :)

Merci beaucoup Mario !

Pour ceux qui s'intéressent, il suffit de rajouter deux petites lignes dans la boucle lors de la création du tube Z (commentées Tube Z - Alignement sur l'axe X (pour tourner autour de l'axe Z)):

Code: Select all

while tubeNr < (360/angle) :
    # Création du tube en X
    cylObjX = createTube(doc, cylTaille, cylDiam, cylEpais, "tubeX"+str(tubeNr))                                        # Tube X - Création
    cylObjX.ViewObject.ShapeColor = (1.0,0.0,0.0)                                                                       # Tube X - Couleur (rouge)
    cylObjX.ViewObject.Transparency = cylTrans                                                                          # Tube X - Transparence
    cylObjX.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(1,0,0),tubeNr*angle))   # Tube X - Alignement

    # Création du tube en Y
    cylObjY = createTube(doc, cylTaille, cylDiam, cylEpais, "tubeY"+str(tubeNr))                                        # Tube Y - Création
    cylObjY.ViewObject.ShapeColor = (0.0,1.0,0.0)                                                                       # Tube Y - Couleur (vert)
    cylObjY.ViewObject.Transparency = cylTrans                                                                          # Tube Y - Transparence
    cylObjY.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,1,0),tubeNr*angle))   # Tube Y - Alignement
    
    # Création du tube en Z
    cylObjZ = createTube(doc, cylTaille, cylDiam, cylEpais, "tubeZ"+str(tubeNr))                                        # Tube Z - Création
    cylObjZ.ViewObject.ShapeColor = (0.0,0.0,1.0)                                                                       # Tube Z - Couleur (bleu)
    cylObjZ.ViewObject.Transparency = cylTrans                                                                          # Tube Z - Transparence
    cylObjZ.Base.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(1,0,0),90))        # Tube Z - Alignement sur l'axe X (pour tourner autour de l'axe Z)
    cylObjZ.Tool.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(1,0,0),90))        # Tube Z - Alignement sur l'axe X (pour tourner autour de l'axe Z)
    cylObjZ.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),tubeNr*angle))   # Tube Z - Alignement
    
    tubeNr += 1                                                                                                         # incrémentation du numéro du tube
OS: Windows 7 64-bit Version: 0.14.3700 (Git)
Python version: 2.7.6 Qt : 4.8.5 Coin : 4.0.0a SoQt : 1.6.0a OCC : 6.6.0
Post Reply