用脚本在ABAQUS中快速分割草图的方法

2024-09-30 20:38:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是在一个长矩形区域上得到一个过渡映射的四边形网格,这是一个参数化模型。最终网格如下所示:

Transition Mapped Quad Meshing

我实现最终输出网格的唯一方法是用草图分割面,然后使用适当的网格控制并在相应的边上播种。为此,我开始在几何体的左侧生成一个块,如下所示:

Single block created by partioning the face with sketch

此后,在Python脚本中使用了一个“for”循环,该脚本从矩形面的左侧运行到最右端,最终的分区面如下所示:

Final geometry ready to be meshed

所以,我试着用三种方法来做这个。在

选项1:在左侧使用findAt放置草图绘制器窗口,然后生成块,并使用“for”循环将草图绘制器窗口坐标系的原点逐渐向右推到最右侧。换句话说,块相对于原点的位置始终保持不变,因此,当原点从左向右移动时,块也随之移动。所以我不得不打开并关闭“用草图划分面”的次数,就像需要的块数一样多。在

选项2:Sketcher窗口的原点保持在同一位置(即0.0、0.0、0.0),块逐渐向右推。与选项1相比,这里块相对于原点的相对位置在每个增量上都发生了变化。在这里,“带草图的分区面”的打开和关闭次数与所需的块数相同。在

选项3:我只打开了一次“带草图的分区面”,原点保持在原来的位置。然后我画了所有这些水平线和垂直线,还有一个“for”循环,最终得到了分割的面。在

所有这些方法都能完美地工作,但非常耗时。这些方法中的每一种都需要8-12分钟来完成所有块的生成,因此不适合进行收敛性研究。在

有谁能提出一个更好的解决方案来加快整个过程,比如3-4分钟左右?非常感谢。提前谢谢。在

编辑:代码员们:

# The arguments of the function "block" are the x and y coordinates of the  
# 4 corners of the rectangle where the blocks have to be generated in.
def block(x_left, x_right, y_top, y_bottom):

    # Opens the sketcher window
    p = mdb.models['TDCB'].parts['Part_TDCB']
    f, e, d = p.faces, p.edges, p.datums
    t = p.MakeSketchTransform(sketchPlane=f.findAt(coordinates=(x_left + ((x_right - x_left) / 3), y_bottom + ((y_top - y_bottom) / 3), 0.0), 
    normal=(0.0, 0.0, 1.0)), sketchPlaneSide=SIDE1, origin=(x_left, y_bottom, 0.0))             
    s = mdb.models['TDCB'].ConstrainedSketch(name='__profile__', sheetSize=500.00, 
    gridSpacing=12.00, transform=t)
    g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraints
    s.setPrimaryObject(option=SUPERIMPOSE)
    p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)


    # The following block generates the first couple of horizontal lines 
    s.Line(point1=(block_width, 0.0), point2=(block_width, y_top))  # Line No.1

    s.Line(point1=(0.0, y_coord[-2]), point2=(block_width, y_coord[-2]))  # Line No.2

    s.Line(point1=(0.0, y_coord[-3]), point2=(block_width, y_coord[-3]))  # Line No.3

    s.Line(point1=(0.0, y_coord[-4]), point2=(block_width, y_coord[-4]))  # Line No.4

    s.Line(point1=(0.0, y_coord[-5]), point2=(block_width, y_coord[-5]))  # Line No.5

    s.Line(point1=(0.0, y_coord[-6]), point2=(block_width, y_coord[-6]))  # Line No.6

    # Closes the sketcher window
    p = mdb.models['TDCB'].parts['Part_TDCB']
    f = p.faces
    pickedFaces = f.findAt((x_left + ((x_right - x_left) / 3), y_bottom + ((y_top - y_bottom) / 3), 0.0))                     
    e1, d2 = p.edges, p.datums
    p.PartitionFaceBySketch(faces=pickedFaces, sketch=s)
    s.unsetPrimaryObject()
    del mdb.models['TDCB'].sketches['__profile__']    

    return

# Finally the blocks are generated using a "for" loop
for i in range(total_blocks):
    block(x_left, x_right, y_top, y_bottom)

Tags: the网格fortoplinewidthblockleft
1条回答
网友
1楼 · 发布于 2024-09-30 20:38:05

看起来你不必像在ABAQUS草图那样迭代绘制草图的过程,你可以使用线性模式复制/复制初始草图(左侧的第一个块)。这可能会使整个过程更容易。谢谢。在

谨致问候, 龙杰

相关问题 更多 >