Пример #1
0
    def system(self):
        r"""Initialise the GProp_GProps depending on the topological type

        Notes
        -----
        geom_type could be abstracted with TopoDS... instead of using _topo_type

        Returns
        -------
        OCC.GProp.GProp_GProps

        """
        self._system = GProp_GProps()

        if self._topo_type in GlobalProperties.surfacic_types:
            brepgprop_SurfaceProperties(self.shape, self._system)
        elif self._topo_type in GlobalProperties.linear_types:
            brepgprop_LinearProperties(self.shape, self._system)
        elif self._topo_type in GlobalProperties.volumic_types:
            brepgprop_VolumeProperties(self.shape, self._system)
        else:
            msg = "ShapeType is not linear, surfacic or volumic"
            logger.error(msg)
            raise WrongTopologicalType(msg)
        return self._system
Пример #2
0
 def system(self):
     self._system = GProp_GProps()
     # todo, type should be abstracted with TopoDS...
     _topo_type = self.instance.topo_type
     if _topo_type == 'face' or _topo_type == 'shell':
         brepgprop_SurfaceProperties(self.instance, self._system)
     elif _topo_type == 'edge':
         brepgprop_LinearProperties(self.instance, self._system)
     elif _topo_type == 'solid':
         brepgprop_VolumeProperties(self.instance, self._system)
     return self._system
Пример #3
0
 def system(self):
     self._system = GProp_GProps()
     # todo, type should be abstracted with TopoDS...
     _topo_type = self.instance.topo_type
     if _topo_type == 'face' or _topo_type == 'shell':
         brepgprop_SurfaceProperties(self.instance, self._system)
     elif _topo_type == 'edge':
         brepgprop_LinearProperties(self.instance, self._system)
     elif _topo_type == 'solid':
         brepgprop_VolumeProperties(self.instance, self._system)
     return self._system
def cube_inertia_properties():
    """ Compute the inertia properties of a shape
    """
    # Create and display cube
    print("Creating a cubic box shape (50*50*50)")
    cube_shape = BRepPrimAPI_MakeBox(50., 50., 50.).Shape()
    # Compute inertia properties
    props = GProp_GProps()
    brepgprop_VolumeProperties(cube_shape, props)
    # Get inertia properties
    mass = props.Mass()
    cog = props.CentreOfMass()
    matrix_of_inertia = props.MatrixOfInertia()
    # Display inertia properties
    print("Cube mass = %s" % mass)
    cog_x, cog_y, cog_z = cog.Coord()
    print("Center of mass: x = %f;y = %f;z = %f;" % (cog_x, cog_y, cog_z))
def cube_inertia_properties():
    """ Compute the inertia properties of a shape
    """
    # Create and display cube
    print("Creating a cubic box shape (50*50*50)")
    cube_shape = BRepPrimAPI_MakeBox(50., 50., 50.).Shape()
    # Compute inertia properties
    props = GProp_GProps()
    brepgprop_VolumeProperties(cube_shape, props)
    # Get inertia properties
    mass = props.Mass()
    cog = props.CentreOfMass()
    matrix_of_inertia = props.MatrixOfInertia()
    # Display inertia properties
    print("Cube mass = %s" % mass)
    cog_x, cog_y, cog_z = cog.Coord()
    print("Center of mass: x = %f;y = %f;z = %f;" % (cog_x, cog_y, cog_z))
Пример #6
0
def solid_volume(occsolid):
    """
    This function calculates the volume of the OCCsolid.
 
    Parameters
    ----------
    occsolid : OCCsolid
        The OCCsolid to be analysed.
        
    Returns
    -------
    volume : float
        The volume of the solid.
    """
    props = GProp_GProps()
    brepgprop_VolumeProperties(occsolid, props)
    volume = props.Mass()
    return volume
Пример #7
0
def solid_volume(occsolid):
    """
    This function calculates the volume of the OCCsolid.
 
    Parameters
    ----------
    occsolid : OCCsolid
        The OCCsolid to be analysed.
        
    Returns
    -------
    volume : float
        The volume of the solid.
    """
    props = GProp_GProps()
    brepgprop_VolumeProperties(occsolid, props)
    volume = props.Mass()
    return volume
Пример #8
0
def compute_inertia_and_center_of_mass(shapes, io=None):
    """
    Compute inertia from a list of Shapes.

    Returns
    -------
    mass
    center_of_mass
    inertia
    inertia_matrix
    """
    from OCC.GProp import GProp_GProps
    from OCC.BRepGProp import brepgprop_VolumeProperties
    from OCC.gp import gp_Ax1, gp_Dir
    from siconos.mechanics import occ

    system = GProp_GProps()

    for shape in shapes:

        iprops = GProp_GProps()

        if shape.data is None:
            if io is not None:
                shape.data = io._shape.get(shape.shape_name, new_instance=True)
            else:
                warn('cannot get shape {0}'.format(shape.shape_name))
                return None

        iishape = shape.data

        ishape = occ.OccContactShape(iishape).data()
        # the shape relative displacement
        occ.occ_move(ishape, list(shape.translation) + list(shape.orientation))

        brepgprop_VolumeProperties(iishape, iprops)

        density = None

        if hasattr(shape, 'mass') and shape.mass is not None:
            density = shape.mass / iprops.Mass()

        elif shape.parameters is not None and hasattr(shape.parameters,
                                                      'density'):
            density = shape.parameters.density
            #print('shape.parameters.density:', shape.parameters.density)
        else:
            density = 1.

        assert density is not None
        # print("shape", shape.shape_name)
        # print('density:', density)
        # print('iprops.Mass():', iprops.Mass())

        system.Add(iprops, density)

    mass = system.Mass()
    assert (system.Mass() > 0.)

    computed_com = system.CentreOfMass()

    gp_mat = system.MatrixOfInertia()
    inertia_matrix = np.zeros((3, 3))
    for i in range(0, 3):
        for j in range(0, 3):
            inertia_matrix[i, j] = gp_mat.Value(i + 1, j + 1)

    I1 = system.MomentOfInertia(gp_Ax1(computed_com, gp_Dir(1, 0, 0)))
    I2 = system.MomentOfInertia(gp_Ax1(computed_com, gp_Dir(0, 1, 0)))
    I3 = system.MomentOfInertia(gp_Ax1(computed_com, gp_Dir(0, 0, 1)))

    inertia = [I1, I2, I3]
    center_of_mass = np.array(
        [computed_com.Coord(1),
         computed_com.Coord(2),
         computed_com.Coord(3)])

    return mass, center_of_mass, inertia, inertia_matrix
Пример #9
0
 def volume(self):
     '''returns the volume of a solid
     '''
     prop = GProp_GProps()
     brepgprop_VolumeProperties(self.shape, prop, self.tolerance)
     return prop
Пример #10
0
def calculate_volume(shape):
    props = GProp_GProps()
    brepgprop_VolumeProperties(shape, props)
    return props.Mass()
Пример #11
0
 def volume(self):
     '''returns the volume of a solid
     '''
     prop = GProp_GProps()
     brepgprop_VolumeProperties(self.shape, prop, self.tolerance)
     return prop
Пример #12
0
def centerOfMass(solid):
    prop = GProp_GProps()
    brepgprop_VolumeProperties(solid, prop)
    return prop.CentreOfMass()
Пример #13
0
    def _center_of_mass(shape):

        Properties = GProp_GProps()
        brepgprop_VolumeProperties(shape, Properties)

        return Vector(Properties.CentreOfMass())
Пример #14
0
def calculate_volume(shape):
  props = GProp_GProps()
  brepgprop_VolumeProperties(shape, props)
  return props.Mass()
Пример #15
0
def compute_inertia_and_center_of_mass(shapes, io=None):
    """
    Compute inertia from a list of Shapes.
    """
    from OCC.GProp import GProp_GProps
    from OCC.BRepGProp import brepgprop_VolumeProperties
    from OCC.gp import gp_Ax1, gp_Dir
    from siconos.mechanics import occ

    system = GProp_GProps()

    for shape in shapes:

        iprops = GProp_GProps()

        if shape.data is None:
            if io is not None:
                shape.data = io._shape.get(shape.shape_name, new_instance=True)
            else:
                warn('cannot get shape {0}'.format(shape.shape_name))
                return None

        iishape = shape.data

        ishape = occ.OccContactShape(iishape).data()
        # the shape relative displacement
        occ.occ_move(ishape, list(shape.translation) +
                     list(shape.orientation))

        brepgprop_VolumeProperties(iishape, iprops)

        density = None

        if hasattr(shape, 'mass') and shape.mass is not None:
            density = shape.mass / iprops.Mass()

        elif shape.parameters is not None and \
             hasattr(shape.parameters, 'density'):
            density = shape.parameters.density
            #print('shape.parameters.density:', shape.parameters.density)
        else:
            density = 1.

        assert density is not None
        # print("shape", shape.shape_name)
        # print('density:', density)
        # print('iprops.Mass():', iprops.Mass())

        system.Add(iprops, density)


    mass=  system.Mass()
    assert (system.Mass() > 0.)

    computed_com = system.CentreOfMass()

    gp_mat= system.MatrixOfInertia()
    inertia_matrix = np.zeros((3,3))
    for i in range(0,3):
        for j in range(0,3):
            inertia_matrix[i,j]=  gp_mat.Value(i+1,j+1)

    I1 =  system.MomentOfInertia(
        gp_Ax1(computed_com, gp_Dir(1, 0, 0)))
    I2 =  system.MomentOfInertia(
        gp_Ax1(computed_com, gp_Dir(0, 1, 0)))
    I3 = system.MomentOfInertia(
        gp_Ax1(computed_com, gp_Dir(0, 0, 1)))

    inertia = [I1, I2, I3]
    center_of_mass = np.array([computed_com.Coord(1),
                               computed_com.Coord(2),
                               computed_com.Coord(3)])

    return mass, center_of_mass, inertia, inertia_matrix
Пример #16
0
def solid_volume(occ_solid):
    props = GProp_GProps()
    brepgprop_VolumeProperties(occ_solid, props)
    volume = props.Mass()
    return volume
Пример #17
0
def compute_inertia_and_center_of_mass(shapes, mass, io=None):
    """
    Compute inertia from a list of Shapes.
    """
    from OCC.GProp import GProp_GProps
    from OCC.BRepGProp import brepgprop_VolumeProperties
    from OCC.gp import gp_Ax1, gp_Dir
    from siconos.mechanics import occ

    props = GProp_GProps()

    for shape in shapes:

        iprops = GProp_GProps()

        if shape.data is None:
            if io is not None:
                shape.data = io._shape.get(shape.shape_name, new_instance=True)
            else:
                warn('cannot get shape {0}'.format(shape.shape_name))
                return None

        iishape = shape.data

        ishape = occ.OccContactShape(iishape).data()
        # the shape relative displacement
        occ.occ_move(ishape, list(shape.translation) + list(shape.orientation))

        brepgprop_VolumeProperties(iishape, iprops)

        density = None

        if hasattr(shape, 'mass') and shape.mass is not None:
            density = shape.mass / iprops.Mass()

        elif shape.parameters is not None and \
             hasattr(shape.parameters, 'density'):
            density = shape.parameters.density
        else:
            density = 1.

        assert density is not None
        props.Add(iprops, density)

    assert (props.Mass() > 0.)

    global_density = mass / props.Mass()
    computed_com = props.CentreOfMass()
    I1 = global_density * props.MomentOfInertia(
        gp_Ax1(computed_com, gp_Dir(1, 0, 0)))
    I2 = global_density * props.MomentOfInertia(
        gp_Ax1(computed_com, gp_Dir(0, 1, 0)))
    I3 = global_density * props.MomentOfInertia(
        gp_Ax1(computed_com, gp_Dir(0, 0, 1)))

    inertia = [I1, I2, I3]
    center_of_mass = np.array(
        [computed_com.Coord(1),
         computed_com.Coord(2),
         computed_com.Coord(3)])

    return inertia, center_of_mass
from OCC.GProp import GProp_GProps
from OCC.BRepGProp import brepgprop_VolumeProperties

from math import pi

# original implementation with occ backend
import siconos.io.mechanics_io
siconos.io.mechanics_io.set_implementation('original')
siconos.io.mechanics_io.set_backend('occ')

# ball shape
ball = BRepPrimAPI_MakeSphere(.15).Shape()

ball_props = GProp_GProps()
brepgprop_VolumeProperties(ball, ball_props)

ball_mass = ball_props.Mass()
ball_com = ball_props.CentreOfMass()
ball_inertia = ball_props.MatrixOfInertia()

ball_I1 = ball_props.MomentOfInertia(gp_Ax1(ball_com, gp_Dir(1, 0, 0)))
ball_I2 = ball_props.MomentOfInertia(gp_Ax1(ball_com, gp_Dir(0, 1, 0)))
ball_I3 = ball_props.MomentOfInertia(gp_Ax1(ball_com, gp_Dir(0, 0, 1)))

print 'ball mass:', ball_mass
print 'ball center of mass:', (ball_com.Coord(1), ball_com.Coord(2),
                               ball_com.Coord(3))
print 'ball moment of inertia:', (ball_I1, ball_I2, ball_I3)

# the ground
Пример #19
0
    PFloop = Construct.translate_topods_from_vector(PFloop.Wire(),
                                                    Construct.gp_Vec(r, 0, z))
    PFface = Construct.make_face(PFloop)
    ax = gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1))
    PFcoil.append(BRepPrimAPI_MakeRevol(PFface, ax).Shape())
PFcage = Construct.compound(PFcoil)

x3d = Construct.compound([TFcage['wp'], TFcage['case'], PFcage, GScage])
my_renderer = x3dom_renderer.X3DomRenderer()
my_renderer.DisplayShape(x3d)

prop = GpropsFromShape(TF['case'])
print('gprop', prop.volume().Mass())

prop = GProp_GProps()
brepgprop_VolumeProperties(TF['case'], prop, 1e-6)
print('case volume', prop.Mass())

prop = GProp_GProps()
brepgprop_VolumeProperties(TF['wp'], prop, 1e-6)
print('wp volume', prop.Mass())

prop = GProp_GProps()
brepgprop_VolumeProperties(TFcage['wp'], prop, 1e-6)
print('cold mass volume', prop.Mass())

display, start_display = init_display()[:2]
display.DisplayColoredShape(TFcage['case'], QC[0])
display.DisplayColoredShape(GScage, QC[1])
display.DisplayColoredShape(PFcage, QC[5])
display.FitAll()