Comprendre les "attachment"

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: Comprendre les "attachment"

Post by mario52 »

Bonjour

@2cv001 essayez pour le centre de la face :

Code: Select all

selection = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0] # select one element
selection.CenterOfMass
openBrain wrote: Mon May 11, 2020 10:03 am C'est normal Mario. Quand tu utilises une Rotation en format Euler, les valeurs sont dans l'ordre traditionel des angles d'Euler Yaw,Pitch,Roll, qui correspondent respectivement aux rotations autour de Z,Y,X. ;)
oui c'est pour ça que je l'avais noté dans ma macro et placé le Z au dessus mais je n'arrive pas à l'assimiler pour moi Z = Z et pas Z travaille sur X

de plus il ne fallait pas le supprimer du texte dans la partie Placement ce serait bien s'il était renseigné comme dans ma macro:

Axe et angle, Z (Yaw) ...

Image

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.
openBrain
Veteran
Posts: 9041
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Comprendre les "attachment"

Post by openBrain »

mario52 wrote: Mon May 11, 2020 11:36 am oui c'est pour ça que je l'avais noté dans ma macro et placé le Z au dessus mais je n'arrive pas à l'assimiler pour moi Z = Z et pas Z travaille sur X
Pas compris pourquoi tu dis que Z travaille sur X... :oops:
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: Comprendre les "attachment"

Post by mario52 »

Bonjour

c'est justement ça qui ne me va pas voir mon précédent post https://forum.freecadweb.org/viewtopic. ... 10#p397442

sur la barre déroulante il est renseigné "Angle d'Euler (XY'Z")"

j'ai modifié la valeur Z et dans le code c'est l'emplacement Rotation X qui est modifié

Code: Select all

>>> App.getDocument("Test_Cercles").Box.Placement=App.Placement(App.Vector(0,0,0), App.Rotation(5,0,0), App.Vector(0,0,0))
ou alors dans le code c'est App.Rotation(Z,Y,X) ??

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.
openBrain
Veteran
Posts: 9041
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Comprendre les "attachment"

Post by openBrain »

mario52 wrote: Mon May 11, 2020 12:59 pm ou alors dans le code c'est App.Rotation(Z,Y,X) ??
Oui c'est ça que je disais : c'est App.Rotation(Yaw, Pitch, Roll) ;)
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: Comprendre les "attachment"

Post by mario52 »

Bonjour

ok ce serait bien de le renseigner comme j'ai fait dans ma macro pour les petits bricoleurs comme moi (uwestoehr n’aurait pas dû le supprimer)

merci pour l'éclairage

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.
openBrain
Veteran
Posts: 9041
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Comprendre les "attachment"

Post by openBrain »

C'est plutôt bien documenté => https://wiki.freecadweb.org/Placement/f ... ch_et_Roll

Cela dit pour moi, il manque une info importante, c'est que FC utilise le système XY'Z''. C'est-à-dire que le Yaw n'est pas réellement la rotation autour de Z, mais la rotation autour de Z'' (ce dernier étant l'axe Z ayant subit les rotations préalable du Pitch et du Roll).
Pareil pour Y', qui n'est pas le Y réel mais le Y ayant préalablement subit le Roll. ;)
User avatar
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: Comprendre les "attachment"

Post by 2cv001 »

Donc le même source mais en utilisant "CenterOfMass"

Code: Select all

import FreeCAD, FreeCADGui, Draft#, Part
import Part
import PartDesign
from FreeCAD import Base
import statistics
from statistics import mean

### Valeurs à adapter à vos besoins
FichierPoliceDeCaracteres="C:/Windows/Fonts/ARIAL.TTF" # pb si on est en linux... A traiter.
TailleCaracteres=4 
TextParDefaut="Text"

def milieu(face): # finalement fonction non utilisée, je la garde pour mémoire de comment atteindre les sommets
	listeSommetsX=[]
	listeSommetsY=[]
	listeSommetsZ=[]
	Milieu=[0,0,0]
	for sommet in face.Vertexes:
		listeSommetsX.append(sommet.Point.x)	
		print(sommet.Point)
		listeSommetsY.append(sommet.Point.y)
		listeSommetsZ.append(sommet.Point.z)					
		#print(milieuX, ' ',milieuY,' ',milieuZ)
	Milieu[0]=mean([min(listeSommetsX),max(listeSommetsX)])
	Milieu[1]=mean([min(listeSommetsY),max(listeSommetsY)])
	Milieu[2]=mean([min(listeSommetsZ),max(listeSommetsZ)])
	return(Milieu)



try:
	sel = FreeCADGui.Selection.getSelection()       # get the selection
	SubElement = FreeCADGui.Selection.getSelectionEx()# "getSelectionEx" Used for selecting subobjects
	element_ = SubElement[0].SubElementNames[0]       # selection of the first element
except:
    App.Console.PrintError( "Sélectionnez la face sur laquelle vous voulez écrire avant de lancer la macro"+"\n")
else:

 	#Récupération de la face sélectionnée
	nomObjetSelect= str(sel[0].Name) # par exemple Pad001
	App.Console.PrintMessage("Objet sélectionnée  : "+nomObjetSelect) 
	faceObjetSelect= str(element_) # par exemple Face 5
	App.Console.PrintMessage("\nFace sélectionnée  : "+faceObjetSelect+"\n") 
	###Création du ShapeString sur la face sélectionnée
	
	nouvelleShapeString=Draft.makeShapeString(String=TextParDefaut,FontFile=FichierPoliceDeCaracteres,Size=TailleCaracteres,Tracking=0.0)

	nouvelleShapeString.Support = [(App.getDocument(App.ActiveDocument.Name).getObject(nomObjetSelect),faceObjetSelect)]
	nouvelleShapeString.MapMode = 'FlatFace'
	nouvelleShapeString.MapPathParameter = 0.000000
	nouvelleShapeString.MapReversed = False
	nouvelleShapeString.AttachmentOffset = App.Placement(App.Vector(0.0000000000, 0.0000000000, 0.0000000000),  App.Rotation(0.0000000000, 0.0000000000, 0.0000000000))
	nouvelleShapeString.recompute() # pas sûr que ce recompute soit nécessaire à priori non
	
	### Déplacement du ShapeString pour le placer dans le body actif
	bodySelect = Gui.ActiveDocument.ActiveView.getActiveObject('pdbody') # il vaudrait mieux récupérer le body de la face sélectionnée
	bodySelect.addObjects([nouvelleShapeString])

	nouvelleShapeString.MapMode = 'Deactivated'
	
	#for o in SubElement:
	if SubElement[0].HasSubObjects:# on est au niveau par exemple d'un Pad

		CentreDesMasses=SubElement[0].SubObjects[0].CenterOfMass
	nouvelleShapeString.Placement.Base.x=CentreDesMasses[0]
	nouvelleShapeString.Placement.Base.y=CentreDesMasses[1]
	nouvelleShapeString.Placement.Base.z=CentreDesMasses[2]
	#tSize=nouvelleShapeString.Size.Value
	App.ActiveDocument.recompute()
	

	
	
	
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: Comprendre les "attachment"

Post by mario52 »

Bonjour

@2cv001
ici pour centrer le texte sur le point (déduire la demi longueur et hauteur)

Code: Select all

	nouvelleShapeString.Shape.BoundBox.XLength
	nouvelleShapeString.Shape.BoundBox.YLength
	nouvelleShapeString.Shape.BoundBox.ZLength
@ openBrain
quelle ironie et c'est moi qui ai fait les avions animés et les texte à côté à ce moment là j'ai pas arrêté d'aller voir sur la page Wikipédia pour être sûr de ne pas me tromper j'avais même ajouté les angles en grec je n'arrivais pas a admettre que App.Rotation(10,20,30) = (Z,Y,X) (et encore aujourd'hui)

Code: Select all

App.Rotation(10,20,30) = Euler Angle

Yaw = 10 degrés (Z)

Pitch = 20 degrés (Y)

Roll = 30 degrés (X) 
pour moi le premier paramètre est X

est ce qu'il est possible de mettre le Z au-dessus comme dans ma macro pour "correspondre" au code

(montage Gimp)
EulerAngleVueCommeMario.png
EulerAngleVueCommeMario.png (8.28 KiB) Viewed 811 times
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
2cv001
Posts: 484
Joined: Wed Jan 01, 2020 9:30 am

Re: Comprendre les "attachment"

Post by 2cv001 »

@Mario52
Merci pour l'info de
nouvelleShapeString.Shape.BoundBox.XLength
nouvelleShapeString.Shape.BoundBox.YLength
nouvelleShapeString.Shape.BoundBox.ZLength
Ca ouvre des perspectives !

Mais bizarrement, en remplaçant à la fin

Code: Select all

	nouvelleShapeString.Placement.Base.x=CentreDesMasses[0]
	nouvelleShapeString.Placement.Base.y=CentreDesMasses[1]
	nouvelleShapeString.Placement.Base.z=CentreDesMasses[2]	
par

Code: Select all

	nouvelleShapeString.Placement.Base.x=CentreDesMasses[0]-nouvelleShapeString.Shape.BoundBox.XLength/2
	nouvelleShapeString.Placement.Base.y=CentreDesMasses[1]-nouvelleShapeString.Shape.BoundBox.YLength/2
	nouvelleShapeString.Placement.Base.z=CentreDesMasses[2]-nouvelleShapeString.Shape.BoundBox.ZLength/2
Ca marche très bien pour les cubes mais pas pour les faces en biais des polygones extrudés. Je mets le fichier FreeCad en pièce jointe. Il s'agit des ShapeString008 et 009
Attachments
Capture.JPG
Capture.JPG (30.15 KiB) Viewed 793 times
test.FCStd
(64.48 KiB) Downloaded 19 times
Macro Sketch Constraint From Spreadsheet :
https://wiki.freecad.org/Macro_Sketch_C ... adsheet/fr
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: Comprendre les "attachment"

Post by mario52 »

Bonjour

oui c'est pas évident

ici une autre approche qui fonctionne bien mais sans attachement et sans incliner le Body (ne tient pas compte du body)

(extrait de ma nouvelle version de FCCircularText toujours pas terminé)

Code: Select all

selectedEdge = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0] # select one element
sel = FreeCADGui.Selection.getSelection()

diagonalObject = int(sel[0].Shape.BoundBox.DiagonalLength)
yL = selectedEdge.CenterOfMass                                        # create axis Center Of face
uv = selectedEdge.Surface.parameter(yL)
nv = selectedEdge.normalAt(uv[0], uv[1]).normalize().multiply(diagonalObject)  #int(diagonalObject)
pointsTrajet = [yL, (nv + yL)]
direction = pointsTrajet[1].sub(pointsTrajet[0])
r = App.Rotation(App.Vector(0,0,1),direction)
plDirection    = App.Placement(App.Vector(0.0,0.0,0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0))
plDirection.Rotation.Q = r.Q
plDirection.Base = pointsTrajet[0]                                    # base lineselected

TailleCaracteres=4 
TextParDefaut="Text"
FichierPoliceDeCaracteres="C:/Windows/Fonts/ARIAL.TTF" # pb si on est en linux... A traiter.
nouvelleShapeString=Draft.makeShapeString(String=TextParDefaut,FontFile=FichierPoliceDeCaracteres,Size=TailleCaracteres,Tracking=0.0)

boundBox_   = nouvelleShapeString.Shape.BoundBox
boundBoxLX  = boundBox_.XLength
boundBoxLY  = boundBox_.YLength

plX = App.Placement(App.Vector((-(boundBoxLX/2.0)),-(boundBoxLY/2.0),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0))
nouvelleShapeString.Placement = plDirection.multiply(plX)
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.
Post Reply