Objets créés par script avec ancrage

From FreeCAD Documentation
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This page is a translated version of the page Scripted objects with attachment and the translation is 100% complete.
Other languages:

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.


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é.

class Box():
    """Custom Scripted Box Object"""

    def __init__(self, obj):
        self.Type = 'Box'

        obj.Proxy = self
        
        ... custom properties

        # Needed to make this object "attachable"
        obj.addExtension('Part::AttachExtensionPython')

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.

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.

class Box:
    
    ...

    def execute(self, obj):
        obj.positionBySupport()
        
        # Assign a Shape to obj
        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

import FreeCAD as App
import Part


class Box():
    """
    Simple Custom Box Object
    See Also:
        https://wiki.freecadweb.org/FeaturePython_Objects
    """

    def __init__(self, obj):
        """
        Constructor
        Arguments
        ---------
        - obj: an existing document object or an object created with FreeCAD.Document.addObject('Part::FeaturePython', '{name}').
        """

        self.Type = 'Box'

        obj.Proxy = self
        obj.addProperty('App::PropertyLength', 'Length',
                        'Dimensions', 'Box length').Length = 10.0
        obj.addProperty('App::PropertyLength', 'Width',
                        'Dimensions', 'Box width').Width = 10.0
        obj.addProperty('App::PropertyLength', 'Height',
                        'Dimensions', 'Box height').Height = 10.0

        # Needed to make this object "attachable",
        # or able to attach parameterically to other objects
        obj.addExtension('Part::AttachExtensionPython')

    def execute(self, obj):
        """
        Called on document recompute
        """
        # Needed to update position when attached-to object changes position.
        # Reposition object based on Support, MapMode and MapPathParameter properties.
        # Returns True if attachment calculation was successful, False if object is not attached and Placement wasn't updated,
        obj.positionBySupport()

        obj.Shape = Part.makeBox(obj.Length, obj.Width, obj.Height)


def create_box(obj_name, document):
    """
    Create a Box.
    """
    obj = document.addObject('Part::FeaturePython', obj_name)
    Box(obj)
    obj.ViewObject.Proxy = 0  # Mandatory unless ViewProvider is coded
    return obj


document = App.ActiveDocument
if document is None:
    document = App.newDocument('Part Attachment Example')

box = create_box('CustomBox', document)
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)

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