在PDMS中使用python直接生成管口方位图(开源分享第二集)

    上一集分享主要给大家展示了从PDMS运行宏调用Python对数据进行处理生成了一张完整的管口方位图dxf文件。

 

        上期回顾(点击以下链接):

        在PDMS中使用python直接生成管口方位图(开源分享第一集)

 

        从今天开始分步骤分享具体的实施过程。

        python运行平台的搭建我这不过多说明了,我的平台配置如下:

        1:python(3.7.6)

       2:  Anaconda3( Anaconda3可自带python编译器, 考虑到下面还要用到numpy, sympy等三方库所以干脆都下载了)

        3: Pycharm 2020.1.1(Community Edition)社区版

        4: ezdxf 0.12.5(https://pypi.org/project/ezdxf/)

        今天我们通过源码分享可以绘制出圆形设备的外圆圈和相位中心线,并标注设备的名称,在相位中心线的两端标注相位角。

        我对源码进行了大量注释,源码前部份涉及层,字体等设置,这主要是以后要用到,所以在本次源码分享中先把这部分配置详细介绍一下:

 

        先来看一下今天的目标成果(看着应该是比较简单的):

以下是源码(Mainfun.py):

__author__ = 'fenchane@wo.cn'
# date@2020-06-12
import ezdxf  # 导入ezdxf模块
import math  # 导入math模块
# ezdxf 文档网址为https://ezdxf.mozman.at/docs/
dxfile = 'd:\\nozzdraft.dxf'  # 将要生成的NOZZ方位文件
doc = ezdxf.new('R2010', setup=True)  # 2010 格式, setup值为True时会加载默认的线型等设置,建议设置为True
doc.header['$INSUNITS'] = 4  # 文件为mm为单位
msp = doc.modelspace() # modelspace 与CAD里的model模型相对应

# layer setting 下面将定义层新建一个列表
#           [层名称         线型     颜色索引   线宽(-1表示默认,30表示的的是0.3mm, 线宽依次类推]
layerset = (['level_cl', 'CENTER2', 255, -1],         # 中心线用
            ['level_nozz', 'CONTINUOUS', 3, 30],      # 管口图型用
            ['level_outline', 'CONTINUOUS', 1, 30],   # 设备外形用
            ['level_tagText', 'CONTINUOUS', 2, -1],   # 管口TAG用
            ['level_Dim', 'CONTINUOUS', 1, -1],       # 标注用
            ['level_brd', 'CONTINUOUS', 5, 30])       # 图框用
for layer in layerset: # 循环向图形中加载列表中的层设置
    #                   名称         属性          线型                 颜色                线宽
    doc.layers.new(name=layer[0], dxfattribs={'linetype': layer[1], 'color': layer[2], 'lineweight': layer[3]})

# fonts setting 字体设置/新建一个列表
#        【字体名称         西文字体      中文字体    字体大小 宽度因子】
fonts = (['nozz_Style', 'Tssdeng.shx', 'TSSDCHN.shx', 50, 0.75],
         ['table_Style', 'romand.shx', 'TSSDCHN.shx', 50, 0.75],)

for font in fonts:  # 循环向图形中加载字体设置
    doc.styles.new(font[0], dxfattribs={'font': font[1], 'bigfont': font[2], 'height': font[3], 'width': font[4]})
    styles = doc.styles
# /TK-2020,CYLI,13000mm,E 0mm N 0mm U 7250mm WRT /*,13500mm
# 以上为设备信息通过PML语言可以从PDMS提取,并以“,”为分隔依次表示设备位号,
# /TK-2020
# 直径13000mm
# CYLI表示PDMS中的元件类型圆柱,
# 坐标E 0mm N 0mm U 7250mm WRT /*
# 13500mm高
# 为简化处理过程这次我们直接改写成最终我们需要的列表型式,我们只需要设备位号,坐标X/Y对应该E/N, 圆柱直径
#eqpinfo = ['TK-2020', (0, 0), 13000]
eqpinfo = ['TK-2020', (0, 0), 13000]
eqpname = eqpinfo[0]  # 设备名称
eqpori = eqpinfo[1]   # 设备原点X/Y对应该E/N坐标
eqpradius = eqpinfo[2]/2  # 设备半径

# 以下为使用add_circle()函数向dxf图形中添加设备的外圆圈
msp.add_circle(eqpori, eqpradius, dxfattribs={'layer': 'level_outline'})  # level_outline来自layerset


# 为画出过圆心的中心线先定义一个函数linecoordinate(ori, cllen, angle)可以根据圆的中心点个中心线长及角度算出线起点和终点的坐标
def linecoordinate(ori, cllen, angle): #ori:线要过的中心点坐示, clen:中心线长,angle在笛卡尔坐标系中的角度,今后会提到极坐标
    clenhalf = 0.5*cllen
    angle = math.radians(angle)
    pointsv = (ori[0]-clenhalf*math.cos(angle), ori[1]-clenhalf*math.sin(angle))
    pointev = (ori[0]+clenhalf*math.cos(angle), ori[1]+clenhalf*math.sin(angle))
    return pointsv, pointev


# 以下将为使用add_line()函数为设备的外圆圈添加中心线
pointendarr = [] #pointendarr用来接收中心线起始点的坐标。
for deg in [0, 90]: #中心线就是0和90度
#clhorpoint[0], clhorpoint[1], dxfattribs={'layer': layercl, 'ltscale': ltscale}
    cllen = 1.2*eqpradius*2  #中心线按圆形的直径1.2倍
    cllinepoint = linecoordinate(eqpori, cllen, deg)
    msp.add_line(cllinepoint[0], cllinepoint[1], dxfattribs={'layer': 'layer_cl', 'linetype': 'CENTER2',  'ltscale': 1000})
    pointendarr.append(cllinepoint)  # 把0°/90°起始点收到pointendarr列表中,下面为中心线端部添加0°,90°,180°, 270°文字要用到
               # cllinepoint[0]表示起点, cllinepoint[1]表示终点
                # 'layer_cl'来自layerset
                # ltscale 表示线形比例为让点画线型比较合适表示建议设置为中心线长/10
#以下将为中心线的两头添加0°,90°,180°, 270°文字, 定义了phase相位角的字典数据库
phasedeg = {90: (pointendarr[0][1], 'MIDDLE_LEFT'),
            0: (pointendarr[1][1], 'BOTTOM_CENTER'),
            270: (pointendarr[0][0], 'MIDDLE_RIGHT'),
            180: (pointendarr[1][0], 'TOP_CENTER')}
for deg in [0, 90, 180, 270]:
    msp.add_text(str(deg) + '%%d', dxfattribs={'style': 'nozz_Style', 'height': 500, 'color': 6, 'width': 0.75}).\
        set_pos(phasedeg[deg][0], align=phasedeg[deg][1])
msp.add_text(eqpname, dxfattribs={'style': 'nozz_Style', 'height': 1000, 'color': 4, 'width': 0.75}). \
        set_pos(eqpori, align='MIDDLE_CENTER')
doc.saveas(dxfile)  # 保存以上所有操作进dxf文件中,下面可以去查看'd:\\nozzdraft.dxf'下生成的文件了

 

源码下载地址:

https://share.babel.cc/share.do?s=MzU0NzUzNzYyNjM5NzkzNTtGcmkgSnVuIDEyIDIwMjAgMjM6Mzc6NTQgR01UKzA4MDAgKEdNVCswODowMCk%3D

 

 

往期回顾(点击以下链接):

在PDMS中使用python直接生成管口方位图(开源分享第一集)

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值