美文网首页狮猿社CATIA
CATIA Python接口:CATIA.SystemServi

CATIA Python接口:CATIA.SystemServi

作者: 锦囊喵 | 来源:发表于2020-02-20 11:32 被阅读0次

    问题:
    CATIA automation接口,当函数引用传参,Python不能得到正确结果,怎么破?

    比如,在automation接口使用VBA,有以下getpoint:

      Sub GetPoint( CATSafeArrayVariant  oCoordinates)
      | Retrieves the position of the point.
      | Parameters:
      | oCoordinates
      | The coordinate of the point with respect to the product coordinate system:
      | oCoordinates(0) is the X coordinate
      | oCoordinates(1) is the Y coordinate
      | oCoordinates(2) is the Z coordinate
      | Example:
      | This example retrieves the coordinate of the point of NewMeasurable measure.
      |    Dim Coordinates (2)
      |    NewMeasurable.GetPoint Coordinates
    

    用类似.Net的各种处理方法,想迁移到Python,但oCoordinates始终是铁板一块,不能正确输出结果;
    后来参考pyCatia ;代码如下:

        def get_point(self, catia):
            """
            :param catia: CATIAApplication()
            :return: tuple(float, float, float)
            """
    
            vba_function_name = 'get_point'
            vba_function = 'GetPoint'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable)
                Dim Coordinates (2)
                measurable.{vba_function} Coordinates
                {vba_function_name} = Coordinates
            End Function
            '''
    
            return catia.evaluate(vba_code, vba_function_name, [self.measurable])
    

    注意,上面实际上把VBA代码直接赋值给vba_code,借助catia.evaluate,得到相应的结果。


    https://stackoverflow.com/questions/31998761/create-new-product-in-catia-with-python

    import random
    import win32com.client
    
    CATIA = win32com.client.GetActiveObject('CATIA.Application')
    CATVBALanguage = 1
    
    # This should work, but CATIA leaves up the dialog window and it can affect
    # the rest of the code execution
    # NewProductDocument = CATIA.Documents.Add('Product')
    
    # Instead, write the code in VBA and then have CATIA execute it.  You can
    # pass in arguments and capture the results as demonstrated below.
    CREATE_PRODUCT_VBA_CODE = '''
        Public Function create_product(part_number as  CATBSTR) as Document
            Set create_product = CATIA.Documents.Add("Product")
            create_product.Product.PartNumber = part_number
        End Function
    '''
    PART_NUMBER = 'test_product_{}'.format(random.randint(1, 100))
    NewProductDocument = CATIA.SystemService.Evaluate(
        CREATE_PRODUCT_VBA_CODE,   # String with the VBA code to execute
        CATVBALanguage,            # 1 to indicate this string is VBA code
        'create_product',          # VBA function to call and return result from
        [PART_NUMBER]              # Array of arguments, in order for VBA function
    )
    
    # Can still interact with this returned object as if we had created it
    print(NewProductDocument.Product.PartNumber)
    

    以下为pyCatia中measurable.py完整代码:

    #! /usr/bin/python3.6
    
    
    class CATIAMeasurable:
        """
        The interface to access a CATIAMeasurable Get measurements on the object.
    
        .. note::
            CAA V5 Visual Basic help
    
            Two types of measurement can be done:
    
            | itself : gives dimensions related to the object itself (ex the radius of a circle).
            | between : gives dimensions related to another object (ex the distance between two products).
            | A restriction occurs for distance between: bodies (CATBody) cannot be measured.
    
            | Methods on VOLUME : GetVolume GetArea GetCOG
            | Methods on SURFACE : GetArea GetCOG GetPerimeter
            | Methods on PLANE : GetArea GetCOG GetPlane
            | Methods on CYLINDER : GetArea GetCOG GetAxis GetPointsOnAxis GetRadius
            | Methods on CONE : GetArea GetCOG GetAxis GetPointsOnAxis GetAngle
            | Methods on SPHERE : GetArea GetCOG GetRadius GetCenter
            | Methods on CURVE : GetLength GetCOG GetPointsOnCurve
            | Methods on LINE : GetLength GetCOG GetPointsOnCurve GetDirection
            | Methods on CIRCLE : GetLength GetCOG GetPointsOnCurve GetRadius GetCenter GetAngle GetAxis
            | Methods on POINT : GetPoint
            | Methods on AXIS SYST : GetAxisSystem
    
        """
    
        def __init__(self, measurable):
            """
            :param measurable:
            """
            self.measurable = measurable
    
        @property
        def angle(self):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Property Angle( ) As double (Read Only)
    
                | Returns the Angle of a circle or cone.
                | Example:
                | This example retrieves the Angle of NewMeasurable measure.
                |
                | Dim AAngle As double
                | AAngle = NewMeasurable.Angle
    
    
            :return: angle
            """
            return self.measurable.Angle
    
        @property
        def area(self):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Property Area( ) As double (Read Only)
    
                | Returns the area of the surface or wet area from volume.
                | Example:
                | This example retrieves the area of NewMeasurable measure. The area unit given by oArea is m²
                |   Dim AArea As double
                |   AArea = NewMeasurable.Area
    
    
            :return: float
            """
            return self.measurable.Area
    
        @property
        def geometry_name(self):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Property GeometryName( ) As CatMeasurableName (Read Only)
    
                | Returns the name of the geometry of the measured object.
                | Example:
                | This example retrieves the name of the geometry of the NewMeasurable measure.
                |   Dim AGeometryName As CatMeasurableName
                |   AGeometryName = NewMeasurable.GeometryName
    
    
            :return: str
            """
    
            catia_measurable_name_list = ['CatMeasurableUnknown',
                                          'CatMeasurable',
                                          'CatMeasurableVolume',
                                          'CatMeasurableSurface',
                                          'CatMeasurableCylinder',
                                          'CatMeasurableSphere',
                                          'CatMeasurableCone',
                                          'CatMeasurablePlane',
                                          'CatMeasurableCurve',
                                          'CatMeasurableCircle',
                                          'CatMeasurableLine',
                                          'CatMeasurablePoint',
                                          'CatMeasurableAxisSystem', ]
    
            return catia_measurable_name_list[self.measurable.GeometryName]
    
        @property
        def length(self):
            """
            ..note::
                CAA V5 Visual Basic help
    
                Property Length( ) As double (Read Only)
    
                | Returns the Length of a curve.
                | Example:
                | This example retrieves the Length of NewMeasurable measure.
                |   Dim ALength As double
                |   ALength = NewMeasurable.Length
    
    
            :return: float
            """
    
            return self.measurable.Length
    
        @property
        def perimeter(self):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Property Perimeter( ) As double (Read Only)
    
                | Returns the perimeter of a surface.
                | Example:
                | This example retrieves the perimeter of NewMeasurable measure.
                |    Dim APerimeter As double
                |    APerimeter = NewMeasurable.Perimeter
    
    
            :return: float
            """
    
            return self.measurable.Perimeter
    
        @property
        def radius(self):
            """
            ..note ::
                CAA V5 Visual Basic help
    
                Property Radius( ) As double (Read Only)
    
                | Returns the radius of an arc, cylinder or sphere.
                | Example:
                | This example retrieves the Radius of NewMeasurable measure.
                |   Dim ARadius As double
                |   ARadius = NewMeasurable.Radius
    
    
            :return: float
            """
    
            return self.measurable.Radius
    
        @property
        def volume(self):
            """
            ..note::
                CAA V5 Visual Basic help
                Property Volume( ) As double (Read Only)
    
                | Returns the volume.
                | Example:
                | This example retrieves the volume of NewMeasurable measure. The volume unit given by oVolume is m^3
                |   Dim AVolume As double
                |   AVolume = NewMeasurable.Volume
    
    
            :return: float
            """
            return self.measurable.Volume
    
        def get_angle_between(self, reference_measurable):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Func GetAngleBetween( Reference  iMeasuredItem) As double
    
                | Compute the angle between the CATIAMeasurable and another.
                | Example:
                | This example retrieves the angle between the reference1 and reference2.
    
                | Dim reference1 As Reference
                | Set reference1 = part1.CreateReferenceFromObject(object1)
    
                | Dim reference2 As Reference
                | Set reference2 = part1.CreateReferenceFromObject(object1)
    
                | Dim TheSPAWorkbench As Workbench
                | Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench ( "SPAWorkbench" )
    
                | Dim TheMeasurable As Measurable
                | Set TheMeasurable = TheSPAWorkbench.GetMeasurable(reference1)
    
                | Dim MinimumDistance As double
                | MinimumDistance = TheMeasurable.GetAngleBetween(reference2)
    
    
            :return: float
            """
    
            return self.measurable.GetAngleBetween(reference_measurable)
    
        def get_axis(self, catia):
            """
            ..note::
                CAA V5 Visual Basic help
    
                Sub GetAxis( CATSafeArrayVariant  oAxisVector)
    
                | Retrieves the axis vector of the cylinder or a cone.
                | Parameters:
                | oVector
                | The axis vector of the cylinder or a cone with respect to the product coordinate system:
                | oAxisVector(0) is the X direction
                | oAxisVector(1) is the Y direction
                | oAxisVector(2) is the Z direction
                | Example:
                | This example retrieves the axis vector of the cylinder or a cone of NewMeasurable measure.
                |    Dim AxisVector (2)
                |    NewMeasurable.GetAxis AxisVector
    
    
            :param catia:
            :return: tuple(float, float, float)
            """
            vba_function_name = 'get_axis'
            vba_function = 'GetAxis'
            vba_code = f'''   
            Public Function {vba_function_name}(measurable)
                Dim AxisVector (2)
                measurable.{vba_function} AxisVector
                {vba_function_name} = AxisVector
            End Function
            '''
            result = catia.evaluate(vba_code, vba_function_name, [self.measurable])
    
            return result
    
        def get_axis_system(self, catia):
            """
            ..note ::
                CAA V5 Visual Basic help
    
                Sub GetAxisSystem( CATSafeArrayVariant  oComponents)
    
                | Retrieves the information of the axis system.
                | Parameters:
                | oCoordinates
                | The information of the axis system with respect to the product coordinate system:
                | oComponents(0) is the X coordinate of the origin of the axis system
                | oComponents(1) is the Y coordinate of the origin of the axis system
                | oComponents(2) is the Z coordinate of the origin of the axis system
                | oComponents(3) is the X coordinate of the first direction of the axis system
                | oComponents(4) is the Y coordinate of the first direction of the axis system
                | oComponents(5) is the Z coordinate of the first direction of the axis system
                | oComponents(6) is the X coordinate of the second direction of the axis system
                | oComponents(7) is the Y coordinate of the second direction of the axis system
                | oComponents(8) is the Z coordinate of the second direction of the axis system
                | oComponents(9) is the X coordinate of the third direction of the axis system
                | oComponents(10) is the Y coordinate of the third direction of the axis system
                | oComponents(11) is the Z coordinate of the third direction of the axis system
                | Example:
                | This example retrieves information of the axis system of NewMeasurable measure.
                |    Dim Components (11)
                |    NewMeasurable.GetAxisSystem Components
    
    
            :param catia: CATIAApplication()
            :return: tuple(float, float, float, float, float, float, float, float, float, float, float, float)
            """
    
            vba_function_name = 'get_axis_system'
            vba_function = 'GetAxisSystem'
            vba_code = f'''        
                Public Function {vba_function_name}(measurable)
                    Dim Components (11)
                    measurable.{vba_function} Components
                    {vba_function_name} = Components
                End Function
                '''
    
            result = catia.evaluate(vba_code, vba_function_name, [self.measurable])
    
            return result
    
        def get_cog(self, catia):
            """
            .. note::
                FROM CAA V5 Visual Basic help
    
                Sub GetCOG( CATSafeArrayVariant  oCoordinates)
    
                | Retrieves the position of the center of gravity of a surface and volume .
                | Parameters:
                | oCoordinates
                | The position of the center of gravity with respect to the product coordinate system:
                | oCoordinates(0) is the X coordinate
                | oCoordinates(1) is the Y coordinate
                | oCoordinates(2) is the Z coordinate
                | Example:
                | This example retrieves the position of the center of gravity of NewMeasurable measure.
                |    Dim Coordinates (2)
                |    NewMeasurable.GetCOG Coordinates
    
    
            :param catia: CATIAApplication()
            :return: tuple(float, float, float)
            """
    
            vba_function_name = 'create_cog'
            vba_function = 'GetCOG'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable)
                Dim coord(2)
                measurable.{vba_function} coord
                {vba_function_name} = coord
            End Function
            '''
            result = catia.evaluate(vba_code, vba_function_name, [self.measurable])
    
            return result
    
        def get_center(self, catia):
            """
            ..note::
                CAA V5 Visual Basic help
                Sub GetCenter( CATSafeArrayVariant  oCoordinates)
    
                | Retrieves the position of the center of a circle or sphere.
                | Parameters:
                | oCoordinates
                | The position of the center with respect to the product coordinate system:
                | oCoordinates(0) is the X coordinate
                | oCoordinates(1) is the Y coordinate
                | oCoordinates(2) is the Z coordinate
                | Example:
                | This example retrieves the position of the center of NewMeasurable measure.
                |    Dim Coordinates (2)
                |    NewMeasurable.GetCenter Coordinates << fixed typo in help
    
    
            :param catia: CATIAApplication()
            :return: tuple(float, float, float)
            """
    
            vba_function_name = 'get_center'
            vba_function = 'GetCenter'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable)
                Dim Coordinates (2)
                measurable.{vba_function} Coordinates
                {vba_function_name} = Coordinates
            End Function
            '''
    
            result = catia.evaluate(vba_code, vba_function_name, [self.measurable])
    
            return result
    
        def get_direction(self, catia):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Sub GetDirection( CATSafeArrayVariant  oDirection)
    
                | Retrieves the direction of the line.
                | Parameters:
                | oDirection
                | The direction of the line with respect to the product coordinate system:
                | oDirection(0) is the X direction
                | oDirection(1) is the Y direction
                | oDirection(2) is the Z direction
                | Example:
                | This example retrieves the direction of the line of NewMeasurable measure.
                |    Dim Direction (2)
                |    NewMeasurable.GetDirection Direction
    
    
            :param catia:
            :return: tuple(float, float, float)
            """
    
            vba_function_name = 'get_direction'
            vba_function = 'GetDirection'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable)
                Dim direction (2) 
                measurable.{vba_function} direction
                {vba_function_name} = direction
            End Function
            '''
    
            result = catia.evaluate(vba_code, vba_function_name, [self.measurable])
    
            return result
    
        def get_minimum_distance(self, reference):
            # noinspection SpellCheckingInspection
            """
            .. note::
                CAA V5 Visual Basic help
    
                Func GetMinimumDistance( Reference  iMeasuredItem) As double
    
                | Compute the minimum distance between the CATIAMeasurable and another.
                | Bodies (openbody, hybridbody..) cannot be measured between.
                | Parameters:
                | oCoordinates
                | The information of the axis system with respect to the product coordinate system:
                | oComponents(0) is the X coordinate of the origin of the axis system
                | oComponents(1) is the Y coordinate of the origin of the axis system
                | oComponents(2) is the Z coordinate of the origin of the axis system
                | oComponents(3) is the X coordinate of the first direction of the axis system
                | oComponents(4) is the Y coordinate of the first direction of the axis system
                | oComponents(5) is the Z coordinate of the first direction of the axis system
                | Example:
                |   This example retrieves the distance between the reference1 and reference2.
                |   Dim reference1 As Reference
                |   Set reference1 = part1.CreateReferenceFromObject(object1)
                |   Dim reference2 As Reference
                |   Set reference2 = part1.CreateReferenceFromObject(object1)
                |   Dim TheSPAWorkbench As Workbench
                |   Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench ( "SPAWorkbench" )
                |   Dim TheMeasurable As Measurable
                |   Set TheMeasurable = TheSPAWorkbench.GetMeasurable(reference1)
                |   Dim MinimumDistance As double
                |   MinimumDistance = TheMeasurable.GetMinimumDistance(reference2)
    
    
            :return: float
            """
    
            return self.measurable.GetMinimumDistance(reference)
    
        def get_minimum_distance_points(self, catia, point_reference):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Sub GetMinimumDistancePoints( Reference  iMeasuredItem, CATSafeArrayVariant  oCoordinates)
    
                | Compute the points corresponding to the minimum distance between the two references.
                | Example:
                | This example retrieves the points corresponding to the distance between the reference1 and reference2.
                |   Dim reference1 As Reference
                |   Set reference1 = part1.CreateReferenceFromObject(object1)
                |   Dim reference2 As Reference
                |   Set reference2 = part1.CreateReferenceFromObject(object1)
                |   Dim TheSPAWorkbench As Workbench
                |   Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench ( "SPAWorkbench" )
                |   Dim TheMeasurable As Measurable
                |   Set TheMeasurable = TheSPAWorkbench.GetMeasurable(reference1)
                |   Dim Coordinates (8)
                |   TheMeasurable.GetMinimumDistancePoints reference2, Coordinates
    
    
            :param catia: CATIAApplication()
            :param point_reference:
            :return: tuple(float, float, float, float, float, float, float, float)
            """
    
            vba_function_name = 'get_minimum_distance_points'
            vba_function = 'GetMinimumDistancePoints'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable, point_reference)
                Dim Coordinates (8) 
                measurable.{vba_function} point_reference, Coordinates
                {vba_function_name} = Coordinates
            End Function
            '''
    
            return catia.evaluate(vba_code, vba_function_name, [self.measurable, point_reference])
    
        def get_plane(self, catia):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Sub GetPlane( CATSafeArrayVariant  oComponents)
    
                | Retrieves informations of the plane.
                | Parameters:
                | oComponents
                | The informations of the plane with respect to the product coordinate system:
                | oComponents(0) is the X coordinate of the origin
                | oComponents(1) is the Y coordinate of the origin
                | oComponents(2) is the Z coordinate of the origin
                | oComponents(3) is the X coordinate of the first direction of the plane
                | oComponents(4) is the Y coordinate of the first direction of the plane
                | oComponents(5) is the Z coordinate of the first direction of the plane
                | oComponents(6) is the X coordinate of the second direction of the plane
                | oComponents(7) is the Y coordinate of the second direction of the plane
                | oComponents(8) is the Z coordinate of the second direction of the plane
                | Example:
                | This example retrieves informations of the plane of NewMeasurable measure.
                |    Dim Components (8)
                |    NewMeasurable.GetPlane Components
    
    
            :param catia:
            :return: tuple(float, float, float, float, float, float, float, float)
            """
    
            vba_function_name = 'get_plane'
            vba_function = 'GetPlane'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable)
                Dim Components (8)
                measurable.{vba_function} Components
                {vba_function_name} = Components
            End Function
            '''
    
            return catia.evaluate(vba_code, vba_function_name, [self.measurable])
    
        def get_point(self, catia):
            """
            .. note::
                CAA V5 Visual Basic help
                Sub GetPoint( CATSafeArrayVariant  oCoordinates)
    
                | Retrieves the position of the point.
                | Parameters:
                | oCoordinates
                | The coordinate of the point with respect to the product coordinate system:
                | oCoordinates(0) is the X coordinate
                | oCoordinates(1) is the Y coordinate
                | oCoordinates(2) is the Z coordinate
                | Example:
                | This example retrieves the coordinate of the point of NewMeasurable measure.
                |    Dim Coordinates (2)
                |    NewMeasurable.GetPoint Coordinates
    
    
            :param catia: CATIAApplication()
            :return: tuple(float, float, float)
            """
    
            vba_function_name = 'get_point'
            vba_function = 'GetPoint'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable)
                Dim Coordinates (2)
                measurable.{vba_function} Coordinates
                {vba_function_name} = Coordinates
            End Function
            '''
    
            return catia.evaluate(vba_code, vba_function_name, [self.measurable])
    
        def get_points_on_axis(self, catia):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Sub GetPointsOnAxis( CATSafeArrayVariant  oCoordinates)
    
                | Retrieves the the characteristic points of the axis with respect of the size of the revolution object.
                | Parameters:
                | oCoordinates
                | The information of the characteristic points with respect to the product coordinate system:
                | oCoordinates(0) is the X coordinate of the centerpoint of the axis
                | oCoordinates(1) is the Y coordinate of the centerpoint of the axis
                | oCoordinates(2) is the Z coordinate of the centerpoint of the axis
                | oCoordinates(3) is the X coordinate of the startpoint of the axis
                | oCoordinates(4) is the Y coordinate of the startpoint of the axis
                | oCoordinates(5) is the Z coordinate of the startpoint of the axis
                | oCoordinates(6) is the X coordinate of the endpoint of the axis
                | oCoordinates(7) is the Y coordinate of the endpoint of the axis
                | oCoordinates(8) is the Z coordinate of the endpoint of the axis
                | Example:
                | This example retrieves the characteristic points of the axis of NewMeasurable measure.
                |    Dim Coordinates (8)
                |    NewMeasurable.GetPointsOnAxis Coordinates
    
    
            :return: tuple(float, float, float, float, float, float, float, float)
            """
    
            vba_function_name = 'get_points_on_axis'
            vba_function = 'GetPointsOnAxis'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable)
                Dim Coordinates (8)
                measurable.{vba_function} Coordinates
                {vba_function_name} = Coordinates
            End Function
            '''
    
            return catia.evaluate(vba_code, vba_function_name, [self.measurable])
    
        def get_points_on_curve(self, catia):
            """
            .. note::
                CAA V5 Visual Basic help
    
                Sub GetPointsOnCurve( CATSafeArrayVariant  oCoordinates)
    
                | Retrieves the characteristic points of the curve : the start point, the middle point and the end point.
                | Parameters:
                | oCoordinates
                | The information of the characteristic points of the curve with respect to the product coordinate system:
                | oCoordinates(0) is the X coordinate of the startpoint of the curve
                | oCoordinates(1) is the Y coordinate of the startpoint of the curve
                | oCoordinates(2) is the Z coordinate of the startpoint of the curve
                | oCoordinates(3) is the X coordinate of the midpoint of the curve
                | oCoordinates(4) is the Y coordinate of the midpoint of the curve
                | oCoordinates(5) is the Z coordinate of the midpoint of the curve
                | oCoordinates(6) is the X coordinate of the endpoint of the curve
                | oCoordinates(7) is the Y coordinate of the endpoint of the curve
                | oCoordinates(8) is the Z coordinate of the endpoint of the curve
                | Example:
                | This example retrieves the characteristic points of the curve of NewMeasurable measure.
                |    Dim Coordinates (8)
                |    NewMeasurable.GetPointsOnCurve Coordinates
    
    
            :param catia: CATIAApplication()
            :return: tuple(float, float, float, float, float, float, float, float)
            """
    
            vba_function_name = 'get_points_on_curve'
            vba_function = 'GetPointsOnCurve'
            vba_code = f'''        
            Public Function {vba_function_name}(measurable)
                Dim Coordinates (8)
                measurable.{vba_function} Coordinates
                {vba_function_name} = Coordinates
            End Function
            '''
    
            return catia.evaluate(vba_code, vba_function_name, [self.measurable])
    

    点我跳转到pyCatia

    相关文章

      网友评论

        本文标题:CATIA Python接口:CATIA.SystemServi

        本文链接:https://www.haomeiwen.com/subject/sjntqhtx.html