提示未能在数据库找到合适的剖面,ABAQUS版本2024,
# -*- coding: utf-8 -*-
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import *
import sketch
import numpy as np
from abaqus import *
from abaqusConstants import *
import part
import os
def read_data(filename):
with open(filename, 'r') as f:
lines = f.readlines()
points = []
for line in lines:
x, y = map(float, line.strip().split(','))
points.append((x, y))
left = points[:31] # 左侧边线上顶点
middle = points[31:62] # 中间边线上顶点
right = points[62:] # 右侧边线上顶点
return left, middle, right
def create_origami_model():
# 设置工作目录
work_dir = os.getcwd()
os.chdir(work_dir)
# 创建新模型
model_name = 'OrigamiModel'
if model_name in mdb.models.keys():
del mdb.models[model_name]
my_model = mdb.Model(name=model_name)
# 读取数据文件 (修改为您的实际文件路径)
data_file = 'D:\曲纹折纸\文献\Codes\Codes\shujuf1.txt'
left, middle, right = read_data(data_file)
# 创建折痕线(线段)
print("\n" + "="*50)
print("Creating Crease Lines (Wires)")
print("="*50)
create_crease_lines(my_model, left, middle, right)
# 创建面板(壳部件)
print("\n" + "="*50)
print("Creating Panels (Shells)")
print("="*50)
create_panels(my_model, left, middle, right)
# 创建材料属性
print("\n" + "="*50)
print("Creating Materials and Assigning Sections")
print("="*50)
create_materials_and_sections(my_model)
# 在视口中显示第一个折痕线
if len(middle) > 1:
first_part_name = "Middle_Segment_1"
session.viewports['Viewport: 1'].setValues(displayedObject=my_model.parts[first_part_name])
print("\n" + "="*50)
print(f"Successfully created origami model '{model_name}'")
print(f"Total parts: {len(my_model.parts)}")
print(f" - Crease lines: 88")
print(f" - Panels: 60")
print("="*50)
def create_crease_lines(model, left_points, middle_points, right_points):
"""创建所有折痕线(线段部件)"""
# 创建中间边线的线段 (30条)
create_middle_wires(model, middle_points)
# 创建左侧到中间的连线 (29条)
create_left_to_middle_wires(model, left_points, middle_points)
# 创建中间到右侧的连线 (29条)
create_middle_to_right_wires(model, middle_points, right_points)
def create_middle_wires(model, middle_points):
"""创建中间边线的线段 (30条)"""
print("\nCreating middle wire segments...")
for i in range(len(middle_points) - 1):
p1 = middle_points[i]
p2 = middle_points[i+1]
sketch_name = f"Sketch_Middle_{i+1}"
part_name = f"Middle_Segment_{i+1}"
create_single_wire(model, sketch_name, part_name, p1, p2)
print(f" Created middle segment {i+1}")
def create_left_to_middle_wires(model, left_points, middle_points):
"""创建左侧到中间的连线 (29条,排除首尾)"""
print("\nCreating left-to-middle wires (excluding first and last)...")
# 排除首尾点 (索引1到29)
for i in range(1, len(middle_points)-1):
p1 = left_points[i]
p2 = middle_points[i]
sketch_name = f"Sketch_L2M_{i}"
part_name = f"Left_to_Middle_{i}"
create_single_wire(model, sketch_name, part_name, p1, p2)
print(f" Created left-to-middle wire {i} (point {i})")
def create_middle_to_right_wires(model, middle_points, right_points):
"""创建中间到右侧的连线 (29条,排除首尾)"""
print("\nCreating middle-to-right wires (excluding first and last)...")
# 排除首尾点 (索引1到29)
for i in range(1, len(middle_points)-1):
p1 = middle_points[i]
p2 = right_points[i]
sketch_name = f"Sketch_M2R_{i}"
part_name = f"Middle_to_Right_{i}"
create_single_wire(model, sketch_name, part_name, p1, p2)
print(f" Created middle-to-right wire {i} (point {i})")
def create_single_wire(model, sketch_name, part_name, point1, point2):
"""创建单个线段的三维线部件"""
# 创建草图
sketch = model.ConstrainedSketch(name=sketch_name, sheetSize=200.0)
# 在草图中绘制线段
sketch.Line(point1=(point1[0], point1[1]), point2=(point2[0], point2[1]))
# 创建三维可变形部件
wire_part = model.Part(
name=part_name,
dimensionality=THREE_D,
type=DEFORMABLE_BODY
)
# 使用草图创建基础线
wire_part.BaseWire(sketch=sketch)
# 清理草图对象
del model.sketches[sketch_name]
def create_panels(model, left_points, middle_points, right_points):
"""创建所有面板(壳部件)"""
# 创建左侧面板 (30个)
create_left_panels(model, left_points, middle_points)
# 创建右侧面板 (30个)
create_right_panels(model, middle_points, right_points)
def create_left_panels(model, left_points, middle_points):
"""创建左侧面板 (左边界和中间边界之间)"""
print("\nCreating left panels...")
for i in range(len(left_points) - 1):
# 获取四个顶点 (按顺序连接形成四边形)
p1 = left_points[i] # 左侧边线起点
p2 = left_points[i+1] # 左侧边线终点
p3 = middle_points[i+1] # 中间边线终点
p4 = middle_points[i] # 中间边线起点
panel_name = f"Left_Panel_{i+1}"
# 创建壳单元部件
create_single_shell(model, panel_name, [p1, p2, p3, p4])
print(f" Created left panel {i+1}")
def create_right_panels(model, middle_points, right_points):
"""创建右侧面板 (中间边界和右边界之间)"""
print("\nCreating right panels...")
for i in range(len(middle_points) - 1):
# 获取四个顶点 (按顺序连接形成四边形)
p1 = middle_points[i] # 中间边线起点
p2 = middle_points[i+1] # 中间边线终点
p3 = right_points[i+1] # 右侧边线终点
p4 = right_points[i] # 右侧边线起点
panel_name = f"Right_Panel_{i+1}"
# 创建壳单元部件
create_single_shell(model, panel_name, [p1, p2, p3, p4])
print(f" Created right panel {i+1}")
def create_single_shell(model, part_name, points):
"""创建单个四边形面板的壳单元部件"""
# 创建草图
sketch_name = f"Sketch_{part_name}"
sketch = model.ConstrainedSketch(name=sketch_name, sheetSize=200.0)
# 绘制四边形 (四条线段)
# 点顺序: p1 -> p2 -> p3 -> p4 -> p1
sketch.Line(point1=(points[0][0], points[0][1]),
point2=(points[1][0], points[1][1]))
sketch.Line(point1=(points[1][0], points[1][1]),
point2=(points[2][0], points[2][1]))
sketch.Line(point1=(points[2][0], points[2][1]),
point2=(points[3][0], points[3][1]))
sketch.Line(point1=(points[3][0], points[3][1]),
point2=(points[0][0], points[0][1]))
# 创建三维壳部件
shell_part = model.Part(
name=part_name,
dimensionality=THREE_D,
type=DEFORMABLE_BODY
)
# 使用草图创建基础壳
shell_part.BaseShell(sketch=sketch)
# 清理草图对象
del model.sketches[sketch_name]
def create_materials_and_sections(model):
"""创建材料属性并分配给部件"""
# 创建面板材料
panel_material = model.Material(name='panel')
panel_material.Density(table=((7850.0, ), )) # 密度 kg/m³
panel_material.Elastic(table=((21000.0, 0.3), )) # 弹性模量 MPa, 泊松比
# 创建梁材料
beam_material = model.Material(name='beam')
beam_material.Density(table=((7850.0, ), ))
beam_material.Elastic(table=((210000.0, 0.3), ))
# 创建壳截面属性
shell_section = model.HomogeneousShellSection(
name='PanelSection',
material='panel',
thicknessType=UNIFORM,
thickness=1.0, # 面板厚度 mm
thicknessField='',
idealization=NO_IDEALIZATION,
poissonDefinition=DEFAULT,
thicknessModulus=None,
temperature=GRADIENT,
useDensity=OFF,
integrationRule=SIMPSON,
numIntPts=5
)
# 创建梁截面属性
beam_section = model.BeamSection(
name='BeamSection',
integration=DURING_ANALYSIS,
profile='Rectangular',
material='beam'
)
model.RectangularProfile(
name='Rectangular',
a=1.0, # 梁宽度 mm
b=1.0 # 梁高度 mm
)
# 为所有面板部件分配壳截面
assign_shell_sections(model, 'PanelSection')
# 为所有线部件分配梁截面
assign_beam_sections(model, 'BeamSection')
print(" Created materials and assigned sections to all parts")
def assign_shell_sections(model, section_name):
"""为所有面板部件分配壳截面"""
print("\nAssigning shell sections to panels...")
for part_name in model.parts.keys():
if "Panel" in part_name: # 所有面板部件名称包含"Panel"
part_obj = model.parts[part_name]
# 获取整个部件作为区域
region = part_obj.Set(name=f"Set_{part_name}", cells=part_obj.cells)
# 分配截面属性
part_obj.SectionAssignment(
region=region,
sectionName=section_name,
offset=0.0,
offsetType=MIDDLE_SURFACE,
offsetField='',
thicknessAssignment=FROM_SECTION
)
print(f" Assigned shell section to {part_name}")
def assign_beam_sections(model, section_name):
"""为所有线部件分配梁截面"""
print("\nAssigning beam sections to wires...")
beam_prefixes = ["Middle_Segment", "Left_to_Middle", "Middle_to_Right"]
for part_name in model.parts.keys():
# 检查是否为线部件
if any(prefix in part_name for prefix in beam_prefixes):
part_obj = model.parts[part_name]
# 获取整个部件作为区域
region = part_obj.Set(name=f"Set_{part_name}", edges=part_obj.edges)
# 分配截面属性
part_obj.SectionAssignment(
region=region,
sectionName=section_name
)
# 设置梁方向(垂直于XY平面)
part_obj.assignBeamSectionOrientation(
region=region,
method=N1_COSINES,
n1=(0.0, 0.0, -1.0)
)
print(f" Assigned beam section to {part_name}")
# 执行创建函数
if __name__ == '__main__':
create_origami_model()