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)
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)
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)
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)
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)
def clear_layer(layer): """ Deletes objects in given layer. Parameters: layer (int): Layer number. Returns: None """ delete_objects(get_objects(layer=layer))
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)
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)
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)
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))
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)
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())
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'))
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'],
def clear_layer(layer): objects = get_objects(layer=layer) if objects: delete_objects(objects=objects)
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']
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))}}
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
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)])