#! /user/bin/python
#coding:utf-8
####################################################
#####本脚本用于在abaqus快速建立空间k6型单层网架#####
####################################################
###考虑到网壳需要施加节点自重或者外荷载,或不同形的截面尺寸,建立节点set请用户自己访问数组B
from abaqus import *
from abaqusConstants import *
import part
import assembly
import sketch
#输入一些参数,我假设每层网架的圆都在一个半径为R的球面上,所以是一个球面网壳,用户可以随便设r和z
R=6
pi=3.1415926535898
ax=-90#这个数是起始坐标轴的位置
#这一步建立参考点,作为part,如果想在abaqus里建空间网架必须新建一个part再建空间线,abaqus只支持绘制平面草图
p = mdb.models['Model-1'].Part(name='Part-1', dimensionality=THREE_D, type=DEFORMABLE_BODY)
p.ReferencePoint(point=(0.0, 0.0, R))
p = mdb.models['Model-1'].parts['Part-1']
import math
import numpy as np
#输入一个层数,就是你想要几个同心圆
c=5
#输入每层的半径,取递增比如1,2,3,4这样的间隔整数,当然也可以根据需要写公式或者直接输入r
#比如r=[1,2,3,4,5]
r=range(1,c+1)
i=0
ir=[]
det=[]
while i<c:
ir.append(i)
i=i+1
print[ir]
session.viewports['Viewport: 1'].view.setValues(session.views['Bottom'])
#如果是球面网壳,自动计算各层在z方向上的高度
#如果非球面网壳,请手动输入各层z
z=[]
for i in ir:
z.append(math.sqrt(R**2-r[i]**2))
det.append(float(60.0000000/(i+1)))
print("z=%r")%z
print det
#绘制节点
n=0
B=[0]*20000
ii=1
for i in ir:
theta1=0
theta2=0
num=0
while theta2<359:
theta1=(theta2+ax)*pi/180
xx=r[i]*np.cos(theta1)
yy=r[i]*np.sin(theta1)
B[ii]=p.DatumPointByCoordinate(coords=(xx, yy, z[i]))
p = mdb.models['Model-1'].parts['Part-1']
theta2=theta2+det[i]
num=num+1
ii=ii+1
n=n+num
#连接圆周线上的节点
p = mdb.models['Model-1'].parts['Part-1']
d = p.datums
n=int(n)
i=int(1)
for j in range(1,c+1):
for i in range(3*(j-1)**2+3*(j-1)+1,3*j**2+3*j+1):
p1=d[int(B[i].id)]
if i==3*j**2+3*j:
p2=d[int(B[3*(j-1)**2+3*(j-1)+1].id)]
else:
p2=d[int(B[i+1].id)]
p.WirePolyLine(points=((p1, p2)), mergeWire=OFF, meshable=ON)
i=i+1
#绘制其他线
A=0
iir=ir
iir.remove(0)
for i in iir:
A1=[]
A=int(2*i+2)
for j in range(1,6):
A1.append(A*j+1)
nl=6*A
nk=[]
for kk in range(0,nl):
nk.append(0)
nk[0]=3*i**2+3*i+1
nk[1]=3*(i-1)**2+3*(i-1)+1
k=0
while k<nl-2:
if k+2 in A1:
nk[k+2]=nk[k]
else:
nk[k+2]=nk[k]+1
k=k+1
nk[-1]=nk[-1]-6*i
A2=[]
for j in range(1,7):
A2=[]
for jj in range(1,A+1):
A2.append(nk[jj+(j-1)*A-1])
for jj in range(1,A+1):
if jj <A:
p1=d[int(B[A2[jj-1]].id)]
p2=d[int(B[A2[jj]].id)]
p.WirePolyLine(points=((p1, p2)), mergeWire=OFF, meshable=ON)
#建立视图
session.viewports['Viewport: 1'].setValues(displayedObject=p)
评论4