Objets créés par script avec ancrage

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 • ‎polski • ‎русский

Introduction

Le but de cette page est de montrer un exemple minimal de fonctionnalité de Part Ancrage 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é.

 1class 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.

1class 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

 1import FreeCAD as App
 2import Part
 3
 4
 5class 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
46def 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
56document = App.ActiveDocument
57if document is None:
58    document = App.newDocument('Part Attachment Example')
59
60box = create_box('CustomBox', document)
61document.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)

Remarque : pour FreeCAD 0.19, ce tutoriel nécessite une mise à jour mineure :