日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2023/12/10 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python导出dxf图_在PDMS中使用python直接生成管口方位图(开源分享第三集) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在PDMS中使用python直接生成管口方位圖(開(kāi)源分享第三集)

? ?距離上一次發(fā)推送已有5個(gè)月之久,上周立了冬,這二季我為五斗米折了腰,最近才緩過(guò)氣來(lái)。

? ?令我沒(méi)想到的是,大家竟然對(duì)這個(gè)主題這么有興趣,有關(guān)注者幾次在私信詢(xún)問(wèn)我什么時(shí)候更新,大家的期盼無(wú)形之中給了我繼續(xù)分享的動(dòng)力。

上一集給大家介紹了如何生成設(shè)備的輪廓及相位中心線(xiàn)。

? ?這一集里要完成生成3個(gè)頂部管口的平面圖形及位號(hào)標(biāo)注功能。

其主要步驟如下:

1:提取設(shè)備管口的基本信息(這里可以通過(guò)宏文件在PDMS提取,本集不做詳細(xì)介紹),其提取的信息要包含如下內(nèi)容:管口號(hào),管口端面型式,端面坐標(biāo),管口朝向,管口法蘭OD值及管口接管的OD值;

2:生成管口圖形,其圖形將以2個(gè)同心圓表示,這兩個(gè)同心圓分別表示法蘭外徑及接管端的外徑;

3:生成管口位號(hào)標(biāo)簽(管口號(hào)外面以一個(gè)圈的型式表示)。

本集主要的精華部分在將管口圖形及管口位號(hào)標(biāo)簽以塊的型式生成,特別是管口位號(hào)標(biāo)簽塊是以屬性塊的型式表示(如下圖所示)。

其對(duì)應(yīng)視頻如下:

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

1__author__ = 'fenchane@wo.cn'
2# date@2020-11-16
3import ezdxf? # 導(dǎo)入ezdxf模塊
4import math? # 導(dǎo)入math模塊
5# ezdxf ?文檔網(wǎng)址為https://ezdxf.mozman.at/docs/
6dxfile = ?'d:\\nozzdraft.dxf'? # 將要生成的NOZZ方位文件
7doc = ezdxf.new('R2010', ?setup=True)? # 2010 格式, ?setup值為T(mén)rue時(shí)會(huì)加載默認(rèn)的線(xiàn)型等設(shè)置,建議設(shè)置為T(mén)rue
8doc.header['$INSUNITS'] = 4? # 文件為mm為單位
9msp = doc.modelspace() # ?modelspace 與CAD里的model模型相對(duì)應(yīng)
10
11# layer setting 下面將定義層新建一個(gè)列表
12#?????????? [層名稱(chēng)???????? 線(xiàn)型???? 顏色索引?? ?線(xiàn)寬(-1表示默認(rèn),30表示的的是0.3mm, 線(xiàn)寬依次類(lèi)推]
13layerset = (['level_cl', ?'CENTER2', 255, -1],???????? # 中心線(xiàn)用
14??????????? ['level_nozz', 'CONTINUOUS', 3, ?30],????? # 管口圖型用
15??????????? ['level_outline', 'CONTINUOUS', ?1, 30],?? # 設(shè)備外形用
16??????????? ['level_tagText', 'CONTINUOUS', ?2, -1],?? # 管口TAG用
17??????????? ['level_Dim', 'CONTINUOUS', 1, ?-1],?????? # 標(biāo)注用
18??????????? ['level_brd', 'CONTINUOUS', 5, ?30])?????? # 圖框用
19for layer in layerset: # ?循環(huán)向圖形中加載列表中的層設(shè)置
20??? #?????????????????? 名稱(chēng)???????? 屬性????????? 線(xiàn)型???????????????? 顏色??????????????? 線(xiàn)寬
21??? doc.layers.new(name=layer[0], ?dxfattribs={'linetype': layer[1], 'color': layer[2], 'lineweight': layer[3]})
22
23# fonts setting 字體設(shè)置/新建一個(gè)列表
24#??????? 【字體名稱(chēng)???????? 西文字體????? 中文字體??? ?字體大小 寬度因子】
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:? # 循環(huán)向圖形中加載字體設(shè)置
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# ?以上為設(shè)備信息通過(guò)PML語(yǔ)言可以從PDMS提取,并以“,”為分隔依次表示設(shè)備位號(hào),
33# /TK-2020
34# 直徑13000mm
35# CYLI表示PDMS中的元件類(lèi)型圓柱,
36# 坐標(biāo)E 0mm N 0mm U 7250mm WRT /*
37# 13500mm高
38# ?為簡(jiǎn)化處理過(guò)程這次我們直接改寫(xiě)成最終我們需要的列表型式,我們只需要設(shè)備位號(hào),坐標(biāo)X/Y對(duì)應(yīng)該E/N, 圓柱直徑
39#eqpinfo = ['TK-2020', (0, 0), ?13000]
40eqpinfo = ['TK-2020', (0, 0), ?13000]
41eqpname = eqpinfo[0]? # 設(shè)備名稱(chēng)
42eqpori = eqpinfo[1]?? # 設(shè)備原點(diǎn)X/Y對(duì)應(yīng)該E/N坐標(biāo)
43eqpradius = eqpinfo[2]/2? # 設(shè)備半徑
44###
45# ?以下為使用add_circle()函數(shù)向dxf圖形中添加設(shè)備的外圓圈
46msp.add_circle(eqpori, ?eqpradius, dxfattribs={'layer': 'level_outline'})? # level_outline來(lái)自layerset
47
48# ?為畫(huà)出過(guò)圓心的中心線(xiàn)先定義一個(gè)函數(shù)linecoordinate(ori, cllen, ?angle)可以根據(jù)圓的中心點(diǎn)個(gè)中心線(xiàn)長(zhǎng)及角度算出線(xiàn)起點(diǎn)和終點(diǎn)的坐標(biāo)
49def linecoordinate(ori, cllen, ?angle): #ori:線(xiàn)要過(guò)的中心點(diǎn)坐示, clen:中心線(xiàn)長(zhǎng),angle在笛卡爾坐標(biāo)系中的角度,今后會(huì)提到極坐標(biāo)
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()函數(shù)為設(shè)備的外圓圈添加中心線(xiàn)
58pointendarr = [] ?#pointendarr用來(lái)接收中心線(xiàn)起始點(diǎn)的坐標(biāo)。
59for deg in [0, 90]: #中心線(xiàn)就是0和90度
60#clhorpoint[0], clhorpoint[1], ?dxfattribs={'layer': layercl, 'ltscale': ltscale}
61??? cllen = 1.2*eqpradius*2? #中心線(xiàn)按圓形的直徑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°起始點(diǎn)收到pointendarr列表中,下面為中心線(xiàn)端部添加0°,90°,180°, 270°文字要用到
65?????????????? # cllinepoint[0]表示起點(diǎn), ?cllinepoint[1]表示終點(diǎn)
66??????????????? # 'layer_cl'來(lái)自layerset
67??????????????? # ltscale ?表示線(xiàn)形比例為讓點(diǎn)畫(huà)線(xiàn)型比較合適表示建議設(shè)置為中心線(xiàn)長(zhǎng)/10
68#以下將為中心線(xiàn)的兩頭添加0°,90°,180°, ?270°文字, 定義了phase相位角的字典數(shù)據(jù)庫(kù)
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行為本次分享所補(bǔ)充的內(nèi)容,本次要完成3個(gè)頂部管口的繪制及管口號(hào)的生成
80#Nozzle table 自PDMS中導(dǎo)出,此處不做介紹, ?以下管口M,A,B為頂部的三個(gè)管口
81#以下的82~84中信息以逗號(hào)為分隔,包括了管口號(hào),管口端面型式,端面坐標(biāo),管口朝向,管口法蘭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#以下的列表中元組表示需要對(duì)PDMS抽出來(lái)的坐標(biāo)進(jìn)行處理,如W, ?S, D表示“-”
86directsign = [('WRT /*',''), ?('E', ''), ('N', ''), ('U', ''), ('W', '-'), ('S', '-'), ('D', '-'), (' ', ?''), ('mm', ',')]
87#以下開(kāi)始遍歷第46中的列表,提取管口號(hào),管口位置,管口外徑等信息。
88for nozz in nozztable:
89??? nozzarr = nozz.split(',')
90??? nozzblkname = ?'nozz'+nozzarr[0].replace('/', '_') #定義管口圖形block塊的名稱(chēng)定義
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]) ?#管口接管的外徑,就是管口圖形中的內(nèi)圈
98??? print(nozzcoordinate)
99??? nozzflag = ?doc.blocks.new(name=nozzblkname) #開(kāi)始向管口圖形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塊中添加圖形元素結(jié)束
104
105??? tagblk = 'tag'+nozzarr[0].replace('/', ?'_') #定義管口位號(hào)(帶屬性)block名稱(chēng)
106??? tagflag = doc.blocks.new(name=tagblk) ?#開(kāi)始向管口位號(hào)block屬性塊中添加圖形元素
107??? tagflag.add_circle(eqpori, 150, ?dxfattribs={'layer': 'level_tagText'}) #管口號(hào)屬性塊的外圈
108??? tagflag.add_attdef('NAME', eqpori, ?dxfattribs={'style': 'nozz_Style', 'layer': 'level_tagText', 'height': ?150}).\
109??????? set_pos(eqpori,) #定義一個(gè)'NAME'字段做為屬性塊來(lái)存儲(chǔ)管號(hào)號(hào)
110??? inserttagPosX = nozzcoordinate[0]
111??? inserttagPosY = nozzcoordinate[1] + 50 + ?nozzflgOD
112??? insertagPos = (inserttagPosX, ?inserttagPosY) #這表示管口號(hào)屬性塊在圖面中的位置,其實(shí)就是位于管口號(hào)的正上方,看第75行, Y坐標(biāo)有偏移
113??? blockref = msp.add_blockref(tagblk, ?insertagPos) #管口號(hào)屬性塊元素添加結(jié)束
114??? values = {'NAME': ?nozzarr[0].split('/')[2]} #為管口號(hào)屬性塊的"NAME"字段添加文字,如管口號(hào)"A"
115??? blockref.add_auto_attribs(values) ?#管口號(hào)屬性塊的"NAME"字段屬性添加結(jié)束
116###########################
117doc.saveas(dxfile)? # ?保存以上所有操作進(jìn)dxf文件中,下面可以去查看'd:\\nozzdraft.dxf'下生成的文件了

往期回顧:

在PDMS中使用python直接生成管口方位圖(開(kāi)源分享第二集)

在PDMS中使用python直接生成管口方位圖(開(kāi)源分享第一集)

總結(jié)

以上是生活随笔為你收集整理的python导出dxf图_在PDMS中使用python直接生成管口方位图(开源分享第三集)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。