I have to make very large number of cylinder. So I need some fast way to make the object. I found one solution to sphere and modify for cylinder but unable to set the depth of the cylinder.
import bpy
import numpy as np
import math
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete()
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.mesh.primitive_cylinder_add(radius = 0.02)
cylinder =bpy.context.object
def cylinder_user(x1, y1, z1, x2, y2, z2):
dx = x2 - x1
dy = y2 - y1
dz = z2 - z1
dist = math.sqrt(dx**2 + dy**2 + dz**2)
phi = math.atan2(dy, dx)
theta = math.acos(dz/dist)
return [dx,dy,dz,dist,phi,theta]
f=open('input.data')
xyz=np.zeros((11,3),dtype=np.float)
for line in f:
l=line.split()
xyz[int(l[0]),:]=[float(l[3]),float(l[4]),float(l[5])]
a=[10]
size=a+a
csize=np.cumsum(size)
start=0
for i in range(1):
for j in range(start+1,csize[i]+1):
if j>(start+1):
ob1=cylinder.copy()
value=cylinder_user(xyz[j-1][0], xyz[j-1][1], xyz[j-1][2], xyz[j][0], xyz[j][1], xyz[j][2]) # [dx,dy,dz,depth,phi,theta]
ob1.location=(value[0]/2 + xyz[j-1][0], value[1]/2 + xyz[j-1][1], value[2]/2 + xyz[j-1][2])
#ob1.depth=value[3]
ob1.rotation_euler[1] = value[5]
ob1.rotation_euler[2] = value[4]
bpy.context.scene.objects.link(ob1)
bpy.context.scene.update()
start=csize[i]
I am unable to set the depth. The error is saying AttributeError: 'Object' object has no attribute 'depth'. my input.data look like this.
1 1 1 0.272431 0.881136 1.12464
2 1 1 -0.12394 -0.000412278 1.20626
3 1 1 0.0688532 -0.508813 0.402982
4 1 1 0.137647 -0.977714 -0.443362
5 1 1 0.594422 -0.229495 -0.858603
6 1 1 1.40139 0.285219 -1.016
7 1 1 1.65654 0.778843 -0.220937
8 1 1 0.906638 1.29492 -0.555914
9 1 1 0.613766 0.376717 -0.665624
10 1 1 -0.212395 0.861266 -0.512098
ob1.dimensions.z = value[3]
$\endgroup$