New Cubit user here. I am trying to sweep a rectangle along a helix curve. When I use the native helix from Cubit, it works as expected. However, when I define my own custom helix I am seeing a twisting effect and it does not mesh well. I read the “Twisting During Sweep Along Closed Curve” thread but the discussion was a little above my head at this point, so I cannot be sure if it applies or not.
import numpy as np
import scipy.constants as sc
cubit.cmd(‘reset’)
pie = np.pi/180
Input parameters
sense = ‘r’ # r or l right or left handed helix
f = 1.8e9 # Frequency Hz
N = 3 # Number of turns
w = 0.1 # Wire diameter, inches
R_gp = 3 # Ground plane radius, inches
alpha_i = 4pie # Starting pitch angle, degrees
alpha_f = 15pie # Ending pitch angle, degrees
Compute helix x,y,z points
c = sc.speed_of_light
lamda = c / f * 39.37
C = lamda # Helix circumference
R = C / (2np.pi) # Helix radius
th_max = 2Nnp.pi
theta = np.linspace(0, th_max, 36N) # 36 points per turn
x = Rnp.sin(theta)
if sense == ‘r’:
y = -Rnp.cos(theta)
else:
y = Rnp.cos(theta)
alpha_m = (alpha_f - alpha_i) / (2np.piN)
z = Rtheta*np.tan(alpha_i + alpha_m * theta)
Create helix curve
vertexIDs =
for ii in range(0, len(z)):
cubit.cmd(‘create vertex {0} {1} {2}’.format(x[ii], y[ii], z[ii]))
vertexIDs.append(cubit.get_last_id(‘vertex’))
cubit.cmd(‘create curve spline vertex {0} delete’.format(’ '.join(str(vid) for vid in vertexIDs)))
curve_ID = cubit.get_last_id(‘curve’)
Sweep surface along helix curve
cubit.cmd(‘create surface rectangle width {} xplane’.format(w))
wire_surf_ID = cubit.get_last_id(‘surface’)
cubit.cmd(‘move surface {} x 0 y {} z 0 include_merged’.format(wire_surf_ID, -R))
cubit.cmd(‘sweep surface {} along curve {} to {} keep individual’.format(wire_surf_ID, 1, curve_ID))
hi,
i made use of your created vertices and copied the surface along your spline for each vertex. Before moving them to the location on the spline i have rotated them only in the zplane, so they don’t get twisted along the spline anymore. After the creation of the surfaces you can loft a volume.
import numpy as np
import scipy.constants as sc
cubit.cmd('reset')
pie = np.pi/180
# Input parameters
sense = 'r' # r or l right or left handed helix
f = 1.8e9 # Frequency Hz
N = 3 # Number of turns
w = 0.1 # Wire diameter, inches
R_gp = 3 # Ground plane radius, inches
alpha_i = 4*pie # Starting pitch angle, degrees
alpha_f = 15*pie # Ending pitch angle, degrees
# Compute helix x,y,z points
c = sc.speed_of_light
lamda = c / f * 39.37
C = lamda # Helix circumference
R = C / (2*np.pi) # Helix radius
th_max = 2*N*np.pi
theta = np.linspace(0, th_max, 36*N) # 36 points per turn
x = R*np.sin(theta)
if sense == 'r':
y = -R*np.cos(theta)
else:
y = R*np.cos(theta)
alpha_m = (alpha_f - alpha_i) / (2*np.pi*N)
z = R*theta*np.tan(alpha_i + alpha_m * theta)
# Create helix curve
vertexIDs = []
for ii in range(0, len(z)):
cubit.cmd('create vertex {0} {1} {2}'.format(x[ii], y[ii], z[ii]))
vertexIDs.append(cubit.get_last_id('vertex'))
#cubit.cmd('create curve spline vertex {0} delete'.format(' '.join(str(vid) for vid in vertexIDs)))
cubit.cmd('create curve spline vertex {0} '.format(' '.join(str(vid) for vid in vertexIDs)))
curve_ID = cubit.get_last_id('curve')
# Sweep surface along helix curve
cubit.cmd('create surface rectangle width {} xplane'.format(w))
wire_surf_ID = cubit.get_last_id('surface')
#cubit.cmd('move surface {} x 0 y {} z 0 include_merged'.format(wire_surf_ID, -R))
#cubit.cmd('sweep surface {} along curve {} to {} keep individual'.format(wire_surf_ID, 1, curve_ID))
nv = len(vertexIDs)
curve = cubit.curve(1)
surfaceIDs = []
for i in range(nv):
vertex_id = vertexIDs[i]
vertex = cubit.vertex(vertex_id)
cubit.cmd(f"surface {wire_surf_ID} copy")
surfaceIDs.append(cubit.get_last_id('surface'))
surface = cubit.surface(cubit.get_last_id('surface'))
coord = vertex.coordinates()
tx, ty, tz = curve.tangent(coord)
#print(coord)
#print(tx, ty, tz)
## rotation
a = np.array(tx+0j)
a.imag = np.array([ty])
cubit.cmd(f"rotate surface {surface.id()} angle {np.angle(a, deg=True)} about Z")
cubit.cmd(f"move surface {surface.id()} location vertex {vertex.id()}")
cubit.cmd('create volume loft surface {0} '.format(' '.join(str(sid) for sid in surfaceIDs)))
cubit.cmd('delete surface all with is_free')
cubit.cmd('delete curve all with is_free')
cubit.cmd('delete vertex all with is_free')