pythondxfwrite_利⽤Dxfwriteezdxf操作CAD⽂件!
背景资料
记录有CAD图中不同位置的各个点的坐标信息,具体形式如下图
已有以上各点的CAD图形⽂件(图⽚省略)
1python怎么读取xls文件
将Excel表中各点的项⽬1信息按照已给坐标写⼊到新的CAD⽂件
为了能明显的将这些点的项⽬1信息表⽰在CAD中,把项⽬1名称和新建的圆(直径和颜⾊通过Dxfwrite来设定)做为⼀个块写⼊到固定坐标位置。其中项⽬1字体⼤⼩和颜⾊也通过Dxfwrite来设定。具体代码如下:
# coding: UTF-8import xlrd, dxfwritefrom dxfwrite import DXFEngine as dxf# draw a cad picturedrawing =
dxf.drawing('new_drawing.dxf')# read excel datasdata = xlrd.open_workbook('dot.xls') # 打开Excel⽂件,只能读取xls格式
num_sheets = len(data.sheets()) # 获得Excel⽂件的sheet数for n in range(num_sheets): table = data.sheets()[n] # 获得指定sheet下的单元格信息 nrows = ws # 获得指定sheet下单元格的总⾏数 for i in range(2, nrows): x_cood = ll(i, 2).value) y_cood = ll(i, 3).value) dot_num = ll(i, 1).value # 读取表中项⽬1的信息 circle = dxf.circle(2.0) #新建⼀个圆,注意:不需指定坐标 circle['layer'] = 'dot' # 设置圆的图层为dot circle['color'] = 2 # 设置圆的颜⾊ text =
<(dot_num, (y_cood, x_cood), height=1.207) #新建⽂本,并在指定坐标处写⼊项⽬1的信息 text['layer']='dot' # ⽂本图层为dot text['color'] = 2 # ⽂本字⾼为2 block = dxf.block(name='dot') # 新建名为dot的块,不需坐标信息 block.add(circle) # 把上述的圆加到到dot块中 drawing.blocks.add(block) blockref = dxf.insert(blockname='dot', insert=(y_cood, x_cood)) # 把dot块插⼊CAD图形的指定坐标处 drawing.add(blockref) # 把块写⼊到drawing.dxf中 drawing.add(text) # 把指定坐标处⽂本写⼊到
drawing.dxf中drawing.save() # 保存drawing.dxf⽂件
得到DXF格式的CAD⽂件,可以在CAD⾥另存为DWG格式,将其通过外部参照插⼊到对应的CAD⽂件中就可以作为参照信息使⽤了。
2
提取CAD⽂件中指定位置的TEXT信息写⼊到已有Excel⽂件中
对于CAD图形中某个位置相同类型的TEXT信息的整理,如果⽤贱⼈⼯具,达不到批量导出并保存的效果;可以结合贱⼈⼯具和python的ezdxf库,将指定位置处的同图层TEXT的信息(包括坐标、⽂字、等信息)批量提取后写⼊Excel中。(反过来,也可以把指定位置处的信息⽤TEXT表⽰在该位置处的CAD图形中,最后将各个关键词提取出来)。具体代码如下:
#!/usr/bin/env python3 # 这⼀⾏是linux系统下运⾏时必需的# -*-coding: UTF-8-*-import ezdxf, xlwt, os, py import copyfrom xlrd import open_workbookdef write_data_into_excel(excel_name, sheet_num, *args): '''write data extract from cad files into excel files(.xls) 具体参考xlutils模块官⽅⽂档中py部分 ''' print("Begin to read excel
files*****************") rb = open_workbook(excel_name) wb = copy(rb) wn = wb.get_sheet(sheet_num) # get the sheet of wb row_start = _rows()) # get the total rows of wn for i in range(1, len(args)+1): # 这⾥要注意,从提取的信息从第⼆列开始写⼊ wn.write(row_start, i, args[i-1]) # 提取的信息格式为args=(项⽬1,x_cood,y_cood,项⽬2,项⽬3,项⽬4),所以应该是args的i-1项 wb.wd() + "/" + excel_name)def get_and_write_data(file_name, excel_name, sheet_num): '''extract data from cad files(.dxf)''' print("Begin to extract data from dxf files****************") doc = wd() + "/%s" %file_name) # 打开当前⽬录下的dxf⽂件(本⼈操作的CAD⽂件有12份) msp = delspace() # 打
开dxf格式的⽂件 for text in msp.query("TEXT"): # 在当前dxf⽂件中查TEXT⽂本 if text.dxf.layer == "ADD_PK": # 查图层名为ADD_PK的⽂本 text_content = # 获得TEXT⽂本内容信息,格式为‘项⽬1/项⽬2/项⽬3/项⽬4’ text_x_cood = text.dxf.insert[1] # 获得TEXT的x 坐标 text_y_cood = text.dxf.insert[0] # 获得TEXT的y坐标 text_name = text_content.split("/")[0] # 提取出TEXT中的第⼀项(即项⽬1) pipe_diameter = text_content.split("/")[1] # 提取出TEXT中的第2项(即项⽬2) elevation = text_content.split("/")[2] # 依次类推,对照上⽂的Excel表 node_num = text_content.split("/")[3] # 同上 text_info = text_name, text_x_cood, text_y_cood,
pipe_diameter, elevation, node_num print(text_info) print("Begin to write data into excel files******************")
write_data_into_excel(excel_name, sheet_num, *text_info)global excel_namefor root, dirs, files in os.wd()): # 遍历当前⽬录下的dxf⽂件 for filename in files: if ".xls" in filename: # global excel_name (please notice this usage, it's wrong on Centos7 and can work on windows10) excel_name = filename print("[+]Get the excel file %s********************" % filename) if ".dxf" in filename: print("[+]Begin to operate %s********************" % filename) get_and_write_data(filename, excel_name,
int(re.findall(r"\d*", filename)[5])-1) # 本⼈将dxf⽂件保存为1.dxf, 2.dxf, ..., 12.dxf, 所以要减1才能对应到各⾃的sheet中
最后的效果就是从CAD中提取出来的TEXT信息写⼊到了对应的sheet表单中,并且是接着原来的Excel表添加的。具体效果图如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论