python导出dxf图_在PDMS中使用python直接生成管口方位图(开源分享第三集)

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

   距离上一次发推送已有5个月之久,上周立了冬,这二季我为五斗米折了腰,最近才缓过气来。

   令我没想到的是,大家竟然对这个主题这么有兴趣,有关注者几次在私信询问我什么时候更新,大家的期盼无形之中给了我继续分享的动力。

上一集给大家介绍了如何生成设备的轮廓及相位中心线。

   这一集里要完成生成3个顶部管口的平面图形及位号标注功能。

其主要步骤如下:

1:提取设备管口的基本信息(这里可以通过宏文件在PDMS提取,本集不做详细介绍),其提取的信息要包含如下内容:管口号,管口端面型式,端面坐标,管口朝向,管口法兰OD值及管口接管的OD值;

2:生成管口图形,其图形将以2个同心圆表示,这两个同心圆分别表示法兰外径及接管端的外径;

3:生成管口位号标签(管口号外面以一个圈的型式表示)。

本集主要的精华部分在将管口图形及管口位号标签以块的型式生成,特别是管口位号标签块是以属性块的型式表示(如下图所示)。

240231f0f85e56b53f9600d8131f6f7a.png

其对应视频如下:

原代码如下(本集代码与上一集代码的增加集中在第81行至116行):

1__author__ = 'fenchane@wo.cn'
2# date@2020-11-16
3import ezdxf  # 导入ezdxf模块
4import math  # 导入math模块
5# ezdxf  文档网址为https://ezdxf.mozman.at/docs/
6dxfile =  'd:\\nozzdraft.dxf'  # 将要生成的NOZZ方位文件
7doc = ezdxf.new('R2010',  setup=True)  # 2010 格式,  setup值为True时会加载默认的线型等设置,建议设置为True
8doc.header['$INSUNITS'] = 4  # 文件为mm为单位
9msp = doc.modelspace() #  modelspace 与CAD里的model模型相对应
10
11# layer setting 下面将定义层新建一个列表
12#           [层名称         线型     颜色索引    线宽(-1表示默认,30表示的的是0.3mm, 线宽依次类推]
13layerset = (['level_cl',  'CENTER2', 255, -1],         # 中心线用
14            ['level_nozz', 'CONTINUOUS', 3,  30],      # 管口图型用
15            ['level_outline', 'CONTINUOUS',  1, 30],   # 设备外形用
16            ['level_tagText', 'CONTINUOUS',  2, -1],   # 管口TAG用
17            ['level_Dim', 'CONTINUOUS', 1,  -1],       # 标注用
18            ['level_brd', 'CONTINUOUS', 5,  30])       # 图框用
19for layer in layerset: #  循环向图形中加载列表中的层设置
20    #                   名称         属性          线型                 颜色                线宽
21    doc.layers.new(name=layer[0],  dxfattribs={'linetype': layer[1], 'color': layer[2], 'lineweight': layer[3]})
22
23# fonts setting 字体设置/新建一个列表
24#        【字体名称         西文字体      中文字体     字体大小 宽度因子】
25fonts = (['nozz_Style',  'Tssdeng.shx', 'TSSDCHN.shx', 50, 0.75],
26         ['table_Style', 'romand.shx',  'TSSDCHN.shx', 50, 0.75],)
27
28for font in fonts:  # 循环向图形中加载字体设置
29    doc.styles.new(font[0],  dxfattribs={'font': font[1], 'bigfont': font[2], 'height': font[3], 'width':  font[4]})
30    styles = doc.styles
31# /TK-2020,CYLI,13000mm,E 0mm N  0mm U 7250mm WRT /*,13500mm
32#  以上为设备信息通过PML语言可以从PDMS提取,并以“,”为分隔依次表示设备位号,
33# /TK-2020
34# 直径13000mm
35# CYLI表示PDMS中的元件类型圆柱,
36# 坐标E 0mm N 0mm U 7250mm WRT /*
37# 13500mm高
38#  为简化处理过程这次我们直接改写成最终我们需要的列表型式,我们只需要设备位号,坐标X/Y对应该E/N, 圆柱直径
39#eqpinfo = ['TK-2020', (0, 0),  13000]
40eqpinfo = ['TK-2020', (0, 0),  13000]
41eqpname = eqpinfo[0]  # 设备名称
42eqpori = eqpinfo[1]   # 设备原点X/Y对应该E/N坐标
43eqpradius = eqpinfo[2]/2  # 设备半径
44###
45#  以下为使用add_circle()函数向dxf图形中添加设备的外圆圈
46msp.add_circle(eqpori,  eqpradius, dxfattribs={'layer': 'level_outline'})  # level_outline来自layerset
47
48#  为画出过圆心的中心线先定义一个函数linecoordinate(ori, cllen,  angle)可以根据圆的中心点个中心线长及角度算出线起点和终点的坐标
49def linecoordinate(ori, cllen,  angle): #ori:线要过的中心点坐示, clen:中心线长,angle在笛卡尔坐标系中的角度,今后会提到极坐标
50    clenhalf = 0.5*cllen
51    angle = math.radians(angle)
52    pointsv =  (ori[0]-clenhalf*math.cos(angle), ori[1]-clenhalf*math.sin(angle))
53    pointev =  (ori[0]+clenhalf*math.cos(angle), ori[1]+clenhalf*math.sin(angle))
54    return pointsv, pointev
55
56
57# 以下将为使用add_line()函数为设备的外圆圈添加中心线
58pointendarr = []  #pointendarr用来接收中心线起始点的坐标。
59for deg in [0, 90]: #中心线就是0和90度
60#clhorpoint[0], clhorpoint[1],  dxfattribs={'layer': layercl, 'ltscale': ltscale}
61    cllen = 1.2*eqpradius*2  #中心线按圆形的直径1.2倍
62    cllinepoint = linecoordinate(eqpori,  cllen, deg)
63    msp.add_line(cllinepoint[0],  cllinepoint[1], dxfattribs={'layer': 'layer_cl', 'linetype': 'CENTER2',  'ltscale': 1000})
64    pointendarr.append(cllinepoint)  #  把0°/90°起始点收到pointendarr列表中,下面为中心线端部添加0°,90°,180°, 270°文字要用到
65               # cllinepoint[0]表示起点,  cllinepoint[1]表示终点
66                # 'layer_cl'来自layerset
67                # ltscale  表示线形比例为让点画线型比较合适表示建议设置为中心线长/10
68#以下将为中心线的两头添加0°,90°,180°,  270°文字, 定义了phase相位角的字典数据库
69phasedeg = {90:  (pointendarr[0][1], 'MIDDLE_LEFT'),
70            0: (pointendarr[1][1],  'BOTTOM_CENTER'),
71            270: (pointendarr[0][0],  'MIDDLE_RIGHT'),
72            180: (pointendarr[1][0],  'TOP_CENTER')}
73for deg in [0, 90, 180, 270]:
74    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])
75
76msp.add_text(eqpname,  dxfattribs={'style': 'nozz_Style', 'height': 1000, 'color': 4, 'width':  0.75}). set_pos(phasedeg[deg][0], align=phasedeg[deg][1])
77    
78
79###########################  以下第80行~116行为本次分享所补充的内容,本次要完成3个顶部管口的绘制及管口号的生成
80#Nozzle table 自PDMS中导出,此处不做介绍,  以下管口M,A,B为顶部的三个管口
81#以下的82~84中信息以逗号为分隔,包括了管口号,管口端面型式,端面坐标,管口朝向,管口法兰OD及管口管道的OD
82nozztable =  ['/TK-2020/M,600mm,FBP,E 0mm N 0mm U 15500mm WRT /*,U WRT /*,812.8,610',
83             '/TK-2020/A,200mm,FBP,E 4000mm N  4000mm U 15500mm WRT /*,U WRT /*,340,219',
84             '/TK-2020/B,200mm,FBP,W 4000mm N  4000mm U 15500mm WRT /*,U WRT /*,340,219']
85#以下的列表中元组表示需要对PDMS抽出来的坐标进行处理,如W,  S, D表示“-”
86directsign = [('WRT /*',''),  ('E', ''), ('N', ''), ('U', ''), ('W', '-'), ('S', '-'), ('D', '-'), (' ',  ''), ('mm', ',')]
87#以下开始遍历第46中的列表,提取管口号,管口位置,管口外径等信息。
88for nozz in nozztable:
89    nozzarr = nozz.split(',')
90    nozzblkname =  'nozz'+nozzarr[0].replace('/', '_') #定义管口图形block块的名称定义
91    print(nozzblkname)
92    nozzpos = nozzarr[3]
93    for direct in directsign:
94        nozzpos = nozzpos.replace(direct[0],  direct[1])
95    nozzcoordinate =  (float(nozzpos.split(',')[0]), float(nozzpos.split(',')[1]))
96    nozzflgOD = float(nozzarr[5])  #管口法兰外径,就是管口图形中的外圈
97    nozzpipeOD = float(nozzarr[6])  #管口接管的外径,就是管口图形中的内圈
98    print(nozzcoordinate)
99    nozzflag =  doc.blocks.new(name=nozzblkname) #开始向管口图形block块中添加图形元素
100    nozzflag.add_circle(eqpori,  nozzflgOD*0.5, dxfattribs={'layer': 'level_nozz'})
101    nozzflag.add_circle(eqpori, nozzpipeOD *  0.5, dxfattribs={'layer': 'level_nozz'})
102    nozzflag.add_point(eqpori,  dxfattribs={'layer': 'level_nozz', 'lineweight': 13})
103    msp.add_blockref(nozzblkname,  nozzcoordinate) #管口图形block块中添加图形元素结束
104
105    tagblk = 'tag'+nozzarr[0].replace('/',  '_') #定义管口位号(带属性)block名称
106    tagflag = doc.blocks.new(name=tagblk)  #开始向管口位号block属性块中添加图形元素
107    tagflag.add_circle(eqpori, 150,  dxfattribs={'layer': 'level_tagText'}) #管口号属性块的外圈
108    tagflag.add_attdef('NAME', eqpori,  dxfattribs={'style': 'nozz_Style', 'layer': 'level_tagText', 'height':  150}).\
109        set_pos(eqpori,) #定义一个'NAME'字段做为属性块来存储管号号
110    inserttagPosX = nozzcoordinate[0]
111    inserttagPosY = nozzcoordinate[1] + 50 +  nozzflgOD
112    insertagPos = (inserttagPosX,  inserttagPosY) #这表示管口号属性块在图面中的位置,其实就是位于管口号的正上方,看第75行, Y坐标有偏移
113    blockref = msp.add_blockref(tagblk,  insertagPos) #管口号属性块元素添加结束
114    values = {'NAME':  nozzarr[0].split('/')[2]} #为管口号属性块的"NAME"字段添加文字,如管口号"A"
115    blockref.add_auto_attribs(values)  #管口号属性块的"NAME"字段属性添加结束
116###########################
117doc.saveas(dxfile)  #  保存以上所有操作进dxf文件中,下面可以去查看'd:\\nozzdraft.dxf'下生成的文件了

往期回顾:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Asterisk的VoIP开发指南(2)——Asterisk AGI程序编写指南

5. Asterisk AGI程序编写指南 5.1概述 很多时候,我们需要在拨号方案中做某些业务逻辑的判断或者外部数据库的查询,根据具体地需要,有几种做法: 1.使用Asterisk的通道变量、Goto函数、Gotoif函数等实现某些简单跳转…

win7关闭休眠_【科普】笔记本电脑,待机/睡眠/休眠有啥区别?(ACPI SPM S0-S5)...

本文聊聊笔记本电脑话题下,经常有人问到的内容——关机 睡眠 休眠 这三个选项有什么区别?电脑可以不关机只合上盖子吗?花了俩小时,求个赞,希望有专栏能收这篇内容~先说答案:快速唤醒:开盖/操作鼠…

k8s dashboard_【大强哥-k8s从入门到放弃02】Kubernetes1.17部署Dashboard2.0

号外号外,后面所有提升视频都会更新到知乎和B站上去,不会直接发群里了,哈哈,能看懂这句话的我都认识,大家可以先关注一下,我知乎上的所有文档也会录成视频更多视频详见 杨哥天云:https://space.…

Andoid 采用ListView三种显示数据列表

Android系统中列表形式的显示方式应该是我们最熟悉不过的界面了,例如通讯录、通话记录、信息列表等等,例如下面的形式: 我们在开发项目需要用到这种形式显示信息时除了调用系统给我们提供的ListView控件以外我们还可以自定义该控件&#xff0…

url采集器_Linux「第三节」-centos7.5部署数据采集器Telegraf

Telegraf采集器采集数据后,会存储到influxdb数据库,然后grafana从influxdb读取数据,在grafana面板上展示,整体的流程就是这样。下面就演示下Telegraf、influxdb、grafana相互间的配置与衔接下载Telegrafwget https://dl.influxdat…

西门子主程序调用子程序_S7200Smart 子程序局部变量使用教程

全新的 S7-200 SMART 带来两种不同类型的 CPU 模块,标准型和经济型,全方位满足不同行业、不同客户、不同设备的各种需求。标准型作为可扩展 CPU 模块,可满足对 I/O 规模有较大需求,逻辑控制较为复杂的应用 ;而经济型 C…

电脑怎么结束进程_深刻了解windows系统的任务管理器,电脑高手的成长之路

伙伴们我们每天都在用电脑,电脑和手机已经离不开了,可以说手机和电脑就是我们的左膀右臂。我们用电脑的时候,如果电脑卡了或者反应慢了,我们都会想到吧任务管理器调出来看看,可以说调出任务管理器就像医生看病一样&…

手机连接投影机的步骤_家用投影仪如何安装 家用投影仪安装方法【步骤详解】...

家用投影仪怎么安装 根据安装方式的不同,投影仪可以分为桌式正投、吊顶正投、桌式背投、吊顶背投几种。方便随时随地使用的便携式投影仪一般是桌式正投,这种投影方法受环境光影响较大 但如果装修时就设计成吊顶正投方式,不仅在性价比方面更加…

win7锁屏时间怎么设置_电脑锁屏时间怎么设置

以WIN10系统为例演示。1/3打开“控制面板”;点击“电源选项”2/3点击“更改计划设置”;设置锁屏时间3/3点击“保存修改”即可

Ajax原理

引用:http://www.cnblogs.com/xugang/archive/2007/10/16/925993.html 看了“坐断东南 笑煞之”的那篇 .net组件开发系列(二)之武林系列 太极拳 开发ajax控件 总有一种意犹味尽的感觉。没有想到 金色海洋(jyk)竟“晕了”,我感觉写…

cdh界面 hue 配置hbase_海量数据存储技术之HBase:使用HBase Shell操纵HBase

Apache HBase Shell是JRuby的IRB,并在此基础上加入了HBase特有的命令。JRuby是用Java实现的Ruby解释器。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的类库。IRB即interactive ruby,交互式Ruby。运行HBase Shell&#xff1…

安卓 图像清晰度识别_智能车牌识别系统的常见故障和解决方法

车牌号是车辆的唯一身份标志,它的特殊性与重要性从而决定了车牌识别系统在智慧城市交通管理系统中成为不可或缺的重要组成部分。下面智能车牌识别系统厂家畅荧智能科技将详细为您介绍一些智能车牌识别系统常见的故障问题和对应的解决方法。智能车牌识别系统的常见故…

post postman 传递数组对象_如何使用postman做接口测试

一,接口测试是什么什么是接口测试,不说广泛的概念,直接电脑打开浏览器,进入开发者工具(F12)随意进入一些网站可以看到下面左侧栏出现了一系列的数据:上面条数据都是一个单独的接口,点击单个接口&#xff0c…

形位公差符号大全_玩转CAD快捷键(大全),一篇文章就够了

CAD快捷键命令大全符号键(CTRL开头)CTRL1 PROPCLOSEOROPEN 对象特性管理器CTRL2或4 ADCENTER 设计中心CTRL3 CTOOLPALETTES 工具选项板CTRL8或QC QuickCalc 快速计算器控制键CTRLA AI_SELALL 全部选择CTRLC或CO/CP COPYCLIP或COpy 复制CTRLD或F6 COORDIN…

k近邻算法_K近邻(knn)算法是如何完成分类的?

摘要:K近邻算法是机器学习中的一个非常基础的算法。本文通过自生成数据,通过绘图的方式演示KNN算法的思路,让你不看数学公式就看了解什么是KNN算法。关键词:KNN算法1 生成一个二分类的数据集本文很多内容参考文献[1]。先生成一个两…

登录不上_《盗贼之海》登录不上?还在傻傻等待,快来让我教教你

大家都对这款海盗题材的游戏《盗贼之海》有兴趣了吧,相信大家都入手了它,但是也有很多朋友在入手后遇见了很多问题,别怕,今天干货来了,手把手教你。保证你流畅游戏,快人一步。我看见很多朋友都在问&#xf…

苹果X可以升级5G吗_苹果x可以用5g网络吗

随着5G网络的逐渐商用,越来越多5G原型机和量产机都即将推出,那么苹果iPhone X能够支持5G网络吗?下面就为您带来苹果iPhone x可以用5G网络吗的相关介绍,希望以上的介绍能够帮助到您。苹果x可以用5g网络吗1、iPhone X并不支持5G网络…

提交显示成功但是没有看到文件_如何向RTThread提交一个BSP?

RT-Thread今天的快速发展和所取得成绩,离不开所有开发者的持续贡献和社区小伙伴的竭力支持。一、前言今年6月,我在一款智能混合型的FPGA芯片上,完成了RT-Thread的移植,并向RT-Thread提交了一个完整的BSP,后续又根据审查…

WinForm中使用WPF的控件

在WinForm中可以使用WPF中的控件,或者由WPF创建的自定义控件; 步骤1:创建WinForm工程; 步骤2:在WinForm工程的解决方案资源管理器中,在刚刚创建的WinForm解决方案中新建或者添加现有的WPF用户控件工程&…

docker php composer 使用_「PHP编程」如何使用Docker制作自己的LNMP/LAMP镜像

LNMP和LAMP是PHP常用的两种运行环境,L代表Linux,N代表Nginx,A代表Apache,M代表Mysql,P代表PHP。在文章《「PHP编程」安装开发环境太烦?告诉你几个简单方法,分分钟搞定》中我们介绍了&#xff0c…