Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def draw_lines(lines, layer=None, centroid=True):
objects = [0] * len(lines)
for index, data in enumerate(lines):
sp = data['start']
ep = data['end']
mp = centroid_points([sp, ep]) if centroid else [0, 0, 0]
name = data.get('name', 'line')
curve = bpy.data.curves.new(name, type='CURVE')
curve.dimensions = '3D'
spline = curve.splines.new('NURBS')
spline.points.add(2)
spline.points[0].co = list(subtract_vectors(sp, mp)) + [1]
spline.points[1].co = list(subtract_vectors(ep, mp)) + [1]
spline.order_u = 1
obj = bpy.data.objects.new(name, curve)
obj.location = mp
obj.data.fill_mode = 'FULL'
obj.data.bevel_depth = data.get('width', 0.05)
obj.data.bevel_resolution = 0
obj.data.resolution_u = 20
rgb = data.get('color') or [1.0, 1.0, 1.0]
set_object_color(obj, rgb)
objects[index] = obj
link_objects(objects, layer=layer)
return objects
def cross(o, a, b):
u = subtract_vectors(a, o)
v = subtract_vectors(b, o)
return cross_vectors_xy(u, v)[2]
.. code-block:: python
line = [(0.0, 0.0, 0.0), (3.0, 3.0, 0.0)]
distance = 0.2 # constant offset
line_offset = offset_line(line, distance)
print(line_offset)
distance = [0.2, 0.1] # variable offset
line_offset = offset_line(line, distance)
print(line_offset)
"""
a, b = line
ab = subtract_vectors(b, a)
direction = normalize_vector(cross_vectors(normal, ab))
if not is_item_iterable(distance):
distance = [distance]
distances = list(iterable_like(line, distance, distance[-1]))
u = scale_vector(direction, distances[0])
v = scale_vector(direction, distances[1])
c = add_vectors(a, u)
d = add_vectors(b, v)
return c, d
def from_bounding_box(cls, bbox):
# this should put the frame at the centroid of the box
# not at the bottom left corner
a = bbox[0]
b = bbox[1]
d = bbox[3]
e = bbox[4]
xaxis = Vector(*subtract_vectors(d, a))
yaxis = Vector(*subtract_vectors(b, a))
zaxis = Vector(*subtract_vectors(e, a))
xsize = xaxis.length
ysize = yaxis.length
zsize = zaxis.length
frame = Frame(a, xaxis, yaxis)
frame.point += frame.xaxis * 0.5 * xsize + frame.yaxis * 0.5 * ysize + frame.zaxis * 0.5 * zsize
return cls(frame, xsize, ysize, zsize)
def _normal_face(face):
u = subtract_vectors(points[face[1]], points[face[0]])
v = subtract_vectors(points[face[-1]], points[face[0]])
return cross_vectors(u, v)
def DrawForeground(self, e):
p1 = self.mouse.p1
p2 = self.mouse.p2
v12 = subtract_vectors(p2, p1)
l12 = length_vector(v12)
for index, (key, attr) in enumerate(self.mesh.vertices(True)):
p0 = attr['x'], attr['y'], attr['z']
text = str(index)
v01 = subtract_vectors(p1, p0)
v02 = subtract_vectors(p2, p0)
l = length_vector(cross_vectors(v01, v02))
if l12 == 0.0 or (l / l12) < self.tol:
point = Point3d(*p0)
e.Display.DrawDot(point, text, self.dotcolour, self.textcolour)
break
mesh = Mesh.from_obj(compas.get('faces.obj'))
vertices = set(mesh.vertices())
fkey = 12
where = mesh.face_vertices(fkey)[0:2]
centroid = mesh.face_centroid(fkey)
face = mesh.unweld_vertices(fkey, where)
for key in face:
if key in vertices:
continue
xyz = mesh.vertex_coordinates(key)
v = subtract_vectors(centroid, xyz)
mesh.vertex[key]['x'] += 0.3 * v[0]
mesh.vertex[key]['y'] += 0.3 * v[1]
mesh.vertex[key]['z'] += 0.3 * v[2]
plotter = MeshPlotter(mesh, figsize=(10, 7))
plotter.draw_vertices()
plotter.draw_faces(text={fkey: fkey for fkey in mesh.faces()})
plotter.show()
def draw_mesh(vertices, edges=None, faces=None, name='mesh', color=[1, 1, 1],
centroid=True, layer=None, **kwargs):
edges = [] if not edges else edges
faces = [] if not faces else faces
mp = centroid_points(vertices) if centroid else [0, 0, 0]
vertices = [subtract_vectors(vertex, mp) for vertex in vertices]
mesh = bpy.data.meshes.new(name)
mesh.from_pydata(vertices, edges, faces)
mesh.update(calc_edges=True)
obj = bpy.data.objects.new(name, mesh)
obj.show_wire = True
obj.location = mp
set_object_color(obj, color)
link_objects([obj], layer=layer)
return obj
def vertex_area(self, key):
"""Return the tributary area of a vertex."""
area = 0
p0 = self.vertex_coordinates(key)
for nbr in self.halfedge[key]:
p1 = self.vertex_coordinates(nbr)
v1 = subtract_vectors(p1, p0)
fkey = self.halfedge[key][nbr]
if fkey is not None:
p2 = self.face_centroid(fkey)
v2 = subtract_vectors(p2, p0)
area += length_vector(cross_vectors(v1, v2))
fkey = self.halfedge[nbr][key]
if fkey is not None:
p3 = self.face_centroid(fkey)
v3 = subtract_vectors(p3, p0)
area += length_vector(cross_vectors(v1, v3))
return 0.25 * area