【ABAQUS二次开发手册】【案例3.2】【用matplotlib画示意图】

【ABAQUS二次开发手册】【案例3.2】【用matplotlib画示意图】

1. 效果图

效果图

2. Python源代码

# coding=gbk
from matplotlib import pyplot as plt
from matplotlib.path import Path
from matplotlib import patches
import numpy as np
## 基本函数
def PT(*args):  return np.array(args,'d')  #创建点
def norm(vec):  return np.linalg.norm(vec) #模
def angle(vec): #向量的角度 [0~360)
    an = np.rad2deg(np.arctan2(vec[1],vec[0]))
    return an if an>=0 else an+360.
## 路径函数
def line(*PTs):
    '''各个点,连成线路径,LINETO=2'''
    v = np.array(PTs)
    c = np.ones(len(PTs))*2
    return v,c
def arc(O,P1,P2,reverse=False):
    '''逆时针方向的圆弧的路径  P1 P2逆时针给出'''
    an1 = angle(P1-O) #起始角度
    an2 = angle(P2-O) #终止角度
    R   = norm (P1-O) #半径
    if   an1 == an2: #共线
        v = np.array([P1,P2])
        c = np.array([2 ,2 ])
    elif an1>an2: #跨0线
        p1 = Path.arc(an1,360)
        p2 = Path.arc(0,an2)
        c1 = np.array(p1.codes)
        c1[0] = 2
        c2 = np.array(p2.codes)
        c2[0] = 2
        v = np.concatenate([p1.vertices*R + O, p2.vertices*R + O])
        c = np.concatenate([c1, c2])
    else:
        p = Path.arc(an1,an2)
        c = np.array(p.codes)
        c[0] = 2
        v = p.vertices*R + O
    if reverse:
        v = v[slice(-1,None,-1)]
    return v,c
def join_path(vs,cs,color='gray',lw=1): 
    '''逆时针连接各路径,有顺序;起始点要与终点重合;终点要保证留个位置'''
    cs[0][0] = 1 #MOVETO
    cs[-1][-1] = 79 #CLOSEPOLY
    v = np.concatenate(vs)
    c = np.concatenate(cs)
    p = Path(v,c)
    patch = patches.PathPatch(p, facecolor=color, lw=lw)
    return patch
def demo(R=10,color='#FFFFFF',lw=2):
    kp = [
        PT( 0    , 0    ), PT( 2*R  , 2*R  ), PT(-2*R  , 2*R  ),
        PT(-2*R  ,-2*R  ), PT( 2*R  ,-2*R  ), PT( 2*R  ,   R  ),
        PT(   R  , 2*R  ), PT(  -R  , 2*R  ), PT(-2*R  ,   R  ),
        PT(-2*R  ,  -R  ), PT(  -R  ,-2*R  ), PT(   R  ,-2*R  ),
        PT( 2*R  ,  -R  ),]
    v1,c1 = arc(kp[1],kp[5],kp[6])
    v2,c2 = arc(kp[2],kp[7],kp[8])
    v3,c3 = arc(kp[3],kp[10],kp[9],True)
    v4,c4 = arc(kp[4],kp[12],kp[11],True)
    v5,c5 = line(kp[12],kp[5])
    pat = join_path([v1,v2,v3,v4,v5],[c1,c2,c3,c4,c5],color,lw)
    ap1 = patches.FancyArrowPatch(kp[12]-PT(0.1*R,0),kp[5]-PT(0.1*R,0), 
        arrowstyle='<->'  ,linewidth=2,facecolor='k',edgecolor='k',
        mutation_scale=20)
    ap2 = patches.FancyArrowPatch([-R,2.1*R],[R,2.1*R], 
        arrowstyle='<|-|>',linewidth=2,facecolor='k',edgecolor='k',
        mutation_scale=20)
    ap3 = patches.FancyArrowPatch([2*R,2*R],[3*R,2*R], arrowstyle='-|>',
        linewidth=2,facecolor='k',edgecolor='k',mutation_scale=20)
    fig,ax = plt.subplots(figsize=(6,6))
    ax.add_patch(pat)
    ax.add_patch(ap1)
    ax.add_patch(ap2)
    ax.add_patch(ap3)
    
    pR = patches.Rectangle
    pE = patches.Ellipse
    ax.add_patch(pR([-R-0.6*R,R-0.4*R],1.2*R,0.8*R,color='red',lw=2,ec='k'))
    ax.add_patch(pR([R-0.6*R,R-0.4*R],1.2*R,0.8*R,color='red',lw=2,ec='k'))
    ax.add_patch(pR([-0.6*R,-R],1.2*R,0.8*R,color='w',lw=2,ec='k'))
    ax.add_patch(pE([-R,R],0.6*R,0.4*R,color='black',lw=2,ec='k'))
    ax.add_patch(pE([ R,R],0.6*R,0.4*R,color='black',lw=2,ec='k'))
    
    ax.text(2.5*R,2.1*R,'R',fontsize=12,rotation=0,
        ha='center',va='center',color='b')
    ax.text(1.8*R,0,'2R',fontsize=12,rotation=90,
        ha='center',va='center',color='b')
    ax.text(0,2.2*R,'2R',fontsize=12,rotation=0,
        ha='center',va='center',color='b')
    fig.subplots_adjust(top=1,bottom=0,left=0,right=1)
    ax.axis('equal')
    ax.axis('off')
    plt.savefig('demo.png')
    plt.show()
if __name__ == '__main__':
    demo(R=10,color='orange',lw=2)

3. 原理

  • 用matplotlib.path.Path分段绘制线段、圆弧路径Path,路径连接在一起形成轮廓
  • 用 patches.FancyArrowPatch 绘制箭头
  • 用坐标轴的text绘制文本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值