Merci pour le lien. C'est vrai qu'il y a pas mal de choses intéressantes dans cette version, mais le fait qu'elle n'est pas 'officielle' est un peu gênant.
J'espère qu'elle sert de fer de lance pour des évolutions (à priori oui, c'est ce qui avait été dit dans un autre message).
Pour en revenir au problème initial, à priori, c'est une régression qui devrait être corrigé.
En fait, je cherchait à contourner le problème de dénomination topologique. La version LinkDaily était une réponse, mais un peu non satisfaisante car moins courante et potentiellement, il peut y avoir des incompatibilités.
Bref, pour contourner ce problème, dans le cas très simple par exemple d'un skectch qui se place sur la face supérieur d'un pad (pad fait par exemple sur un sketch dans le plan xy), je teste le fait de modifier la propriété attachement / position /z en lui mettant par exemple
- Capture.PNG (17.23 KiB) Viewed 644 times
Dans la version LinkDaily, ça fonctionne mais pas dans la 0.21. Ca me fait une belle jambe puisque justement je cherche à me passer de la LinkDaily.
J'en ai même fait une macro (sélectionner à la fois le pad et le sketch que l'on veut accrocher au pad, puis la lancer. Il doit y avoir plein de cas où ça ne marche pas, mais bon, c'est un début.
Code: Select all
import FreeCAD, FreeCADGui
##########################################
# Main proceddure
##########################################
def main():
# get selected pad
sel = FreeCADGui.Selection.getSelection()[0]
if sel.TypeId == 'Sketcher::SketchObject' :
selSketch = sel
elif sel.TypeId == 'PartDesign::Pad' :
selPad = sel
sel = FreeCADGui.Selection.getSelection()[1]
if sel.TypeId == 'Sketcher::SketchObject' :
selSketch = sel
elif sel.TypeId == 'PartDesign::Pad' :
selPad = sel
# get pad properties
selectedPadName = selPad.Name
selectedPadLength = selPad.Length
selectedPadSketch = selPad.Profile[0]
selectedPadSketchName = selectedPadSketch.Name
#selSketch.setExpression('.AttachmentOffset.Base.z', selectedPadName + '.Reversed == False ? ' + selectedPadSketchName
#+ '.Placement.Base.z + ' + selectedPadName + '.Length : ' + selectedPadSketchName + '.Placement.Base.z' )
if selSketch.Support[0][0].Name == 'XY_Plane' and selSketch.MapMode == 'FlatFace' :
expression = selectedPadName + '.Shape.BoundBox.ZMax'
selSketch.setExpression('.AttachmentOffset.Base.z', expression )
#expression = selectedPadName + '.Reversed == False ? ' + selectedPadSketchName
#+ '.Placement.Base.z + ' + selectedPadName + '.Length : ' + selectedPadSketchName + '.Placement.Base.z'
elif selSketch.Support[0][0].Name == 'XZ_Plane' and selSketch.MapMode == 'FlatFace' :
expression = '-' + selectedPadName + '.Shape.BoundBox.Ymin'
selSketch.setExpression('.AttachmentOffset.Base.z', expression )
elif selSketch.Support[0][0].Name == 'YZ_Plane' and selSketch.MapMode == 'FlatFace' :
expression = selectedPadName + '.Shape.BoundBox.XMax'
selSketch.setExpression('.AttachmentOffset.Base.z', expression )
else :
print(selSketch.Name + 'Attachement support or MapMode not compatible. Must be XY_Plane and FlatFace')
if __name__ == '__main__':
main()
Du coup, je change un peu mon fusil d'épaule et je remplace la formule
par
Code: Select all
Pad.Reversed == False ? Sketch.Placement.Base.z + Pad.Length : Sketch.Placement.Base.z
D'où la nouvelle macro, compatible elle avec la version 'officielle' et qui pour l'instant ne marche que pour les plans xy :
Code: Select all
import FreeCAD, FreeCADGui
##########################################
# Main proceddure
##########################################
def main():
# get selected pad
sel = FreeCADGui.Selection.getSelection()[0]
if sel.TypeId == 'Sketcher::SketchObject' :
selSketch = sel
elif sel.TypeId == 'PartDesign::Pad' :
selPad = sel
sel = FreeCADGui.Selection.getSelection()[1]
if sel.TypeId == 'Sketcher::SketchObject' :
selSketch = sel
elif sel.TypeId == 'PartDesign::Pad' :
selPad = sel
# get pad properties
selectedPadName = selPad.Name
selectedPadLength = selPad.Length
selectedPadSketch = selPad.Profile[0]
selectedPadSketchName = selectedPadSketch.Name
selSketch.setExpression('.AttachmentOffset.Base.z', selectedPadName + '.Reversed == False ? ' + selectedPadSketchName
+ '.Placement.Base.z + ' + selectedPadName + '.Length : ' + selectedPadSketchName + '.Placement.Base.z' )
if __name__ == '__main__':
main()