示例#1
0
 def clear_faces(self, keys=None):
     if not keys:
         keys = list(self.datastructure.faces())
     objects = []
     for key in keys:
         name = self.datastructure.face_name(key)
         object = get_objects(name=name)
         if object:
             objects.append(object)
         name = 'F{0}'.format(key)
         object = get_objects(name=name)
         if object:
             objects.append(object)
     delete_objects(objects=objects)
示例#2
0
 def clear_edges(self, keys=None):
     if not keys:
         keys = list(self.datastructure.edges())
     objects = []
     for u, v in keys:
         name = self.datastructure.edge_name(u, v)
         object = get_objects(name=name)
         if object:
             objects.append(object)
         name = 'E{0}-{1}'.format(u, v)
         object = get_objects(name=name)
         if object:
             objects.append(object)
     delete_objects(objects=objects)
示例#3
0
def ordered_network(structure, network, layer):
    """ Extract node and element orders from a Network for a given start-point.

    Parameters
    ----------
    structure : obj
        Structure object.
    network : obj
        Network object.
    layer : int
        Layer to extract start-point (Blender object).

    Returns
    -------
    list
        Ordered nodes.
    list
        Ordered elements.
    list
        Cumulative lengths at element mid-points.
    float
        Total length.

    Notes
    -----
    - Function is for a Network representing a single structural element.

    """

    start = get_object_location(object=get_objects(layer=layer)[0])
    return network_order(start=start, structure=structure, network=network)
示例#4
0
def add_nset_from_objects(structure, name, objects=None, layer=None):
    """ Adds the objects' locations as a node set.

    Parameters
    ----------
    structure : obj
        Structure object to update.
    name : str
        Name of the new node set.
    objects : list
        Objects to use location values.
    layer : int
        Layer to get objects from if objects are not given.

    Returns
    -------
    None

    Notes
    -----
    - Either objects or layer should be given, not both.

    """

    if layer is not None:
        objects = get_objects(layer=layer)
    nodes = [
        structure.check_node_exists(object.location) for object in objects
    ]
    structure.add_set(name=name, type='node', selection=nodes)
示例#5
0
 def clear_vertexlabels(self, keys=None):
     if not keys:
         keys = list(self.datastructure.vertices())
     objects = []
     for key in keys:
         name = 'V{0}'.format(key)
         object = get_objects(name=name)
         if object:
             objects.append(object)
     delete_objects(objects=objects)
示例#6
0
def clear_layer(layer):
    """ Deletes objects in given layer.

    Parameters:
        layer (int): Layer number.

    Returns:
        None
    """
    delete_objects(get_objects(layer=layer))
示例#7
0
def add_elset_from_bmeshes(structure, name, bmeshes=None, layer=None):
    """ Adds the Blender meshes' edges and faces as an element set.

    Parameters
    ----------
    structure : obj
        Structure object to update.
    name : str
        Name of the new element set.
    bmeshes : list
        Blender mesh objects to extract edges and faces.
    layer : int
        Layer to get bmeshes from if bmeshes are not given.

    Returns
    -------
    None

    Notes
    -----
    - Either bmeshes or layer should be given, not both.

    """

    if layer is not None:
        bmeshes = [
            object for object in get_objects(layer=layer)
            if object.type == 'MESH'
        ]

    elements = []

    for bmesh in bmeshes:

        blendermesh = BlenderMesh(bmesh)
        vertices = blendermesh.get_vertex_coordinates()
        edges = blendermesh.get_edge_vertex_indices()
        faces = blendermesh.get_face_vertex_indices()

        for u, v in edges:
            sp = structure.check_node_exists(vertices[u])
            ep = structure.check_node_exists(vertices[v])
            element = structure.check_element_exists([sp, ep])
            if element is not None:
                elements.append(element)

        for face in faces:
            nodes = [structure.check_node_exists(vertices[i]) for i in face]
            element = structure.check_element_exists(nodes)
            if element is not None:
                elements.append(element)

    structure.add_set(name=name, type='element', selection=elements)
示例#8
0
def add_nodes_elements_from_layers(structure, layers, line_type=None, mesh_type=None, thermal=False, pA=None, pL=None):
    """
    Adds node and element data from Blender layers to Structure object.

    Parameters
    ----------
    structure : obj
        Structure object to update.
    layers : list
        Layer string names to extract nodes and elements.
    line_type : str
        Element type for lines (bmesh edges).
    mesh_type : str
        Element type for meshes.
    thermal : bool
        Thermal properties on or off.
    pA : float
        Mass area density [kg/m2].
    pL : float
        Mass length density [kg/m].

    Returns
    -------
    list
        Node keys that were added to the Structure.
    list
        Element keys that were added to the Structure.

    """

    if isinstance(layers, str):
        layers = [layers]

    added_nodes    = set()
    added_elements = set()

    for layer in layers:

        elset = set()

        for bmesh in get_objects(layer=layer):

            # pA and pL

            nodes, elements = add_nodes_elements_from_bmesh(structure=structure, bmesh=bmesh, line_type=line_type,
                                                            mesh_type=mesh_type, thermal=thermal)
            added_nodes.update(nodes)
            added_elements.update(elements)
            elset.update(elements)

        structure.add_set(name=layer, type='element', selection=list(elset))

    return list(added_nodes), list(added_elements)
示例#9
0
def add_nodes_elements_from_layers(structure,
                                   layers,
                                   line_type=None,
                                   mesh_type=None,
                                   acoustic=False,
                                   thermal=False):
    """ Adds node and element data from Blender layers to Structure object.

    Parameters
    ----------
    structure : obj
        Structure object to update.
    layers : list
        Layers to extract nodes and elements.
    line_type : str
        Element type for lines (bmesh edges).
    mesh_type : str
        Element type for meshes.
    acoustic : bool
        Acoustic properties on or off.
    thermal : bool
        Thermal properties on or off.

    Returns
    -------
    list
        Node keys that were added to the Structure.
    list
        Element keys that were added to the Structure.

    """

    if isinstance(layers, int):
        layers = [layers]

    created_nodes = set()
    created_elements = set()

    for layer in layers:
        for bmesh in get_objects(layer=layer):
            nodes, elements = add_nodes_elements_from_bmesh(
                structure=structure,
                bmesh=bmesh,
                line_type=line_type,
                mesh_type=mesh_type,
                acoustic=acoustic,
                thermal=thermal)
            created_nodes.update(nodes)
            created_elements.update(elements)

    return list(created_nodes), list(created_elements)
示例#10
0
def clear_layers(layers):
    """ Deletes objects in given layers.

    Parameters:
        layers (list, str): Layers or 'all'.

    Returns:
        None
    """
    if layers == 'all':
        delete_all_objects()
    elif isinstance(layers, list):
        for layer in layers:
            delete_objects(get_objects(layer=layer))
示例#11
0
def add_nset_from_bmeshes(structure, name, bmeshes=None, layer=None):
    """ Adds the Blender meshes' vertices as a node set.

    Parameters
    ----------
    structure : obj
        Structure object to update.
    name : str
        Name of the new node set.
    bmeshes : list
        Blender mesh objects to extract vertices.
    layer : int
        Layer to get bmeshes from if bmeshes are not given.

    Returns
    -------
    None

    Notes
    -----
    - Either bmeshes or layer should be given, not both.

    """

    if layer is not None:
        bmeshes = [
            object for object in get_objects(layer=layer)
            if object.type == 'MESH'
        ]

    nodes = []
    for bmesh in bmeshes:
        for vertex in BlenderMesh(bmesh).get_vertex_coordinates():
            node = structure.check_node_exists(vertex)
            if node is not None:
                nodes.append(node)
    structure.add_set(name=name, type='node', selection=nodes)
示例#12
0
文件: mesh.py 项目: sehlstrom/compas
    def closest_point(self, point, maxdist=None):
        raise NotImplementedError

    def closest_points(self, points, maxdist=None):
        raise NotImplementedError


# ==============================================================================
# Main
# ==============================================================================

if __name__ == '__main__':

    from compas_blender.utilities import get_objects

    mesh = BlenderMesh(get_objects(layer=0)[0])

    print(mesh.guid)
    print(mesh.mesh)
    print(mesh.geometry)
    print(mesh.attributes)
    print(mesh.type)

    mesh.hide()
    mesh.show()
    mesh.unselect()
    mesh.select()

    print(mesh.get_vertex_coordinates())
    print(mesh.get_edge_vertex_indices())
    print(mesh.get_face_vertex_indices())
示例#13
0
from compas_blender.utilities import get_objects

__author__ = ['Andrew Liew <*****@*****.**>']
__copyright__ = 'Copyright 2018, BLOCK Research Group - ETH Zurich'
__license__ = 'MIT License'
__email__ = '*****@*****.**'

# Structure

mdl = Structure(name='block_tets', path='/home/al/temp/')

# Tetrahedrons

blender.add_tets_from_bmesh(mdl,
                            name='elset_tets',
                            bmesh=get_objects(layer=0)[0])

# Sets

blender.add_nset_from_bmeshes(mdl, layer=1, name='base')
blender.add_nset_from_bmeshes(mdl, layer=2, name='top')

# Materials

mdl.add_material(
    ElasticIsotropic(name='mat_elastic', E=100 * 10**9, v=0.3, p=1))

# Sections

mdl.add_section(SolidSection(name='sec_solid'))
示例#14
0
               material='mat_steel',
               section='sec_ties',
               elsets='elset_ties')
])

# Displacements

mdl.add_displacements([
    RollerDisplacementXY(name='disp_roller', nodes='nset_corners'),
    PinnedDisplacement(name='disp_pinned', nodes='nset_corner1'),
    GeneralDisplacement(name='disp_xdof', nodes='nset_corner2', x=0)
])

# Loads

mesh = mesh_from_bmesh(get_objects(layer=2)[0])
mdl.add_loads([
    GravityLoad(name='load_gravity', elements='elset_concrete'),
    PrestressLoad(name='load_prestress', elements='elset_ties',
                  sxx=50 * 10**6),
    TributaryLoad(mdl, name='load_tributary', mesh=mesh, z=-5000)
])

# Steps

mdl.add_steps([
    GeneralStep(name='step_bc',
                displacements=['disp_roller', 'disp_pinned', 'disp_xdof']),
    GeneralStep(name='step_prestress', loads=['load_prestress']),
    GeneralStep(name='step_loads',
                loads=['load_gravity', 'load_tributary'],
示例#15
0
def clear_layer(layer):
    objects = get_objects(layer=layer)
    if objects:
        delete_objects(objects=objects)
示例#16
0
               material='mat_concrete',
               section='sec_wall',
               elsets='elset_wall',
               reinforcement=reb_wall)
])

# Displacements

mdl.add_displacement(FixedDisplacement(name='disp_fixed', nodes='nset_fixed'))

# Loads

mdl.add_load(
    GravityLoad(name='load_gravity', elements=['elset_wall', 'elset_plinth']))
components = {}
for object in get_objects(layer=2):
    px, py, pz, _ = object.name.split(' ')
    components[mdl.check_node_exists(list(object.location))] = {
        'z': float(pz) * 100
    }
mdl.add_load(PointLoads(name='load_points', components=components))
loads = ['load_gravity', 'load_points']

# Steps

mdl.add_steps([
    GeneralStep(name='step_bc', nlgeom=False, displacements=['disp_fixed']),
    GeneralStep(name='step_loads', nlgeom=False, loads=loads)
])
mdl.steps_order = ['step_bc', 'step_loads']
示例#17
0
    def clear(self):
        self.clear_vertices()
        self.clear_edges()


# ==============================================================================
# Main
# ==============================================================================

if __name__ == "__main__":

    from compas_blender.utilities import get_objects

    from compas_blender.helpers import network_from_bmesh

    network = network_from_bmesh(bmesh=get_objects(layer=0)[0])

    networkartist = NetworkArtist(network=network, layer=1)

    networkartist.clear_layer()

    networkartist.draw_vertices()
    networkartist.draw_vertexlabels()
    networkartist.clear_vertices(keys=[4])
    networkartist.clear_vertexlabels(keys=[6])

    networkartist.draw_edges()
    networkartist.draw_edgelabels()
    networkartist.clear_edges(keys=[(0, 4)])
    networkartist.clear_edgelabels(keys=[(5, 4)])
m = 20
n = m + 1
E = 5 * 10**9
I = 2 * 10**(-11)
A = 0.005**2

# Solver input

div = 10
factor = 1.0
tol = 0.01
steps = 10000
deg = pi / 180
du = 0.02
dr = 15 * deg
target = get_objects(0)[0]
Xt = array(bezier_curve_interpolate(target, div * n))

# Network

ds = L / m
xyz = [[i * ds, 0, 0] for i in range(n)]
uv = [[i, i + 1] for i in range(m)]
network = Network.from_vertices_and_edges(xyz, uv)
vertices = network.vertices()
edges = network.edges()
network.set_vertices_attributes(vertices, {'EIx': E * I, 'EIy': E * I})
network.set_edges_attributes(edges, {'E': E, 'A': A, 'l0': ds})
network.set_vertices_attributes([0, 1, m - 1, m], {'B': [0, 0, 0]})
network.beams = {'beam': {'nodes': list(range(n))}}
示例#19
0
div = 10
E = 5 * 10**9
I = 2 * 10**(-11)
A = 0.005**2

# Solver input

mi = div * m
tol = 0.01
du = 0.02
deg = pi / 180
dr = 15 * deg

# Target

curve = get_objects(layer=1)[0]
blendercurve = BlenderCurve(object=curve)
Xt = array(blendercurve.divide(number_of_segments=mi))

# Network

vertices = [list(Xi) for Xi in list(Xt[:mi:div, :])]
edges = [[i, i + 1] for i in range(m)]
network = Network.from_vertices_and_edges(vertices=vertices, edges=edges)
network.update_default_vertex_attributes({'EIx': E*I, 'EIy': E*I})
network.update_default_edge_attributes({'E': E, 'A': A, 'l0': ds})
network.set_vertices_attributes([0, 1, m - 1, m], {'B': [0, 0, 0]})
network.beams = {'beam': {'nodes': list(range(network.number_of_vertices()))}}

# Manual
示例#20
0
        self.clear_vertices()
        self.clear_faces()
        self.clear_edges()


# ==============================================================================
# Main
# ==============================================================================

if __name__ == "__main__":

    from compas_blender.utilities import get_objects

    from compas_blender.helpers import mesh_from_bmesh

    mesh = mesh_from_bmesh(bmesh=get_objects(layer=0)[0])

    meshartist = MeshArtist(mesh=mesh, layer=1)

    meshartist.clear_layer()

    meshartist.draw_vertices()
    meshartist.draw_vertexlabels()
    meshartist.clear_vertices(keys=[4])
    meshartist.clear_vertexlabels(keys=[6])

    meshartist.draw_edges()
    meshartist.draw_edgelabels()
    meshartist.clear_edges(keys=[(0, 4)])
    meshartist.clear_edgelabels(keys=[(5, 4)])