Objets créés par script avec pièce jointe

From FreeCAD Documentation
Jump to navigation Jump to search
This page is a translated version of the page Scripted objects with attachment and the translation is 100% complete.
Other languages:
Deutsch • ‎English • ‎français • ‎italiano • ‎русский

Introduction

Le but de cette page est de montrer un exemple minimal de fonctionnalité de Part Attachement utilisant des Objets créés par script en Python.

Voir l'Exemple minimal complet ci-dessous.

Le GIF suivant montre comment attacher notre boîte personnalisée à un cylindre et mettre à jour automatiquement sa position lorsque la position du cylindre change.

Box-attached-to-cylinder-demo.gif


REMARQUE: La boîte est notre objet personnalisé crée par script et le cylindre est un objet FreeCAD standard généré à partir de l'atelier Part.

Rendre les objets créés par script attachables

Ajouter une extension attachée

Tout d'abord, nous devons ajouter l'extension Part::AttachExtensionPython à notre objet Part::FeaturePython dans le constructeur, ou la méthode __init__ de notre objet créé par script personnalisé.

 1 class Box():
 2     """Custom Scripted Box Object"""
 3 
 4     def __init__(self, obj):
 5         self.Type = 'Box'
 6 
 7         obj.Proxy = self
 8         
 9         ... custom properties
10 
11         # Needed to make this object "attachable"
12         obj.addExtension('Part::AttachExtensionPython', obj)

Sans ce code, nous verrions la boîte de dialogue d'avertissement suivante lors de la connexion de notre objet personnalisé créé par script à un autre objet.

Part-attachment-warning-dialog.png

Mis à jour de la position en fonction de l'objet attaché

Ensuite, dans la méthode execute de notre script personnalisé, nous devons appeler le positionBySupport sur notre objet Part::FeaturePython.

1 class Box:
2     
3     ...
4 
5     def execute(self, obj):
6         obj.positionBySupport()
7         
8         # Assign a Shape to obj
9         obj.Shape = Part.makeBox(...)

Si positionBySupport n'est pas appelé, notre objet personnalisé crée par script ne mettra pas à jour sa position lorsque la position de l'objet attaché change.

Exemple minimal complet

 1 import FreeCAD as App
 2 import Part
 3 
 4 
 5 class Box():
 6     """
 7     Simple Custom Box Object
 8     See Also:
 9         https://wiki.freecadweb.org/FeaturePython_Objects
10     """
11 
12     def __init__(self, obj):
13         """
14         Constructor
15         Arguments
16         ---------
17         - obj: an existing document object or an object created with FreeCAD.Document.addObject('Part::FeaturePython', '{name}').
18         """
19 
20         self.Type = 'Box'
21 
22         obj.Proxy = self
23         obj.addProperty('App::PropertyLength', 'Length',
24                         'Dimensions', 'Box length').Length = 10.0
25         obj.addProperty('App::PropertyLength', 'Width',
26                         'Dimensions', 'Box width').Width = 10.0
27         obj.addProperty('App::PropertyLength', 'Height',
28                         'Dimensions', 'Box height').Height = 10.0
29 
30         # Needed to make this object "attachable",
31         # or able to attach parameterically to other objects
32         obj.addExtension('Part::AttachExtensionPython', obj)
33 
34     def execute(self, obj):
35         """
36         Called on document recompute
37         """
38         # Needed to update position when attached-to object changes position.
39         # Reposition object based on Support, MapMode and MapPathParameter properties.
40         # Returns True if attachment calculation was successful, False if object is not attached and Placement wasn't updated,
41         obj.positionBySupport()
42 
43         obj.Shape = Part.makeBox(obj.Length, obj.Width, obj.Height)
44 
45 
46 def create_box(obj_name, document):
47     """
48     Create a Box.
49     """
50     obj = document.addObject('Part::FeaturePython', obj_name)
51     Box(obj)
52     obj.ViewObject.Proxy = 0  # Mandatory unless ViewProvider is coded
53     return obj
54 
55 
56 document = App.ActiveDocument
57 if document is None:
58     document = App.newDocument('Part Attachment Example')
59 
60 box = create_box('CustomBox', document)
61 document.recompute()

Références

Testé avec la version FreeCAD

Testé avec la version suivante de FreeCAD:

OS: Ubuntu 18.04.3 LTS
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.18.16146 (Git) AppImage
Build type: Release
Branch: (HEAD detached at 0.18.4)
Hash: 980bf9060e28555fecd9e3462f68ca74007b70f8
Python version: 3.6.7
Qt version: 5.6.2
Coin version: 4.0.0a
OCC version: 7.3.0
Locale: English/UnitedStates (en_US)