背景资料
- 记录有CAD图中不同位置的各个点的坐标信息,具体形式如下图
![7805b5a41c156d63be5867086629d85b.png](https://i-blog.csdnimg.cn/blog_migrate/64b1ee62f556f9bd9a7d44f0d9c8db9a.jpeg)
- 已有以上各点的CAD图形文件(图片省略)
1
将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 = table.nrows # 获得指定sheet下单元格的总行数 for i in range(2, nrows): x_cood = float(table.cell(i, 2).value) y_cood = float(table.cell(i, 3).value) dot_num = table.cell(i, 1).value # 读取表中项目1的信息 circle = dxf.circle(2.0) # 新建一个圆,注意:不需指定坐标 circle['layer'] = 'dot' # 设置圆的图层为dot circle['color'] = 2 # 设置圆的颜色 text = dxf.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, refrom xlutils.copy 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模块官方文档中xlutils.copy部分 ''' 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 = len(wn.get_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.save(os.getcwd() + "/" + 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 = ezdxf.readfile(os.getcwd() + "/%s" %file_name) # 打开当前目录下的dxf文件(本人操作的CAD文件有12份) msp = doc.modelspace() # 打开dxf格式的文件 for text in msp.query("TEXT"): # 在当前dxf文件中查找TEXT文本 if text.dxf.layer == "ADD_PK": # 查找图层名为ADD_PK的文本 text_content = text.dxf.text # 获得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.walk(os.getcwd()): # 遍历当前目录下的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表添加的。具体效果图如下:
![7e948a53b7aeb7f4be9b45fe8b8fd6e9.png](https://i-blog.csdnimg.cn/blog_migrate/0c8950db5f531d0834eb1d380fe570f8.png)
![2b694c455b2e1c5fc7668bd92c2f6933.png](https://i-blog.csdnimg.cn/blog_migrate/a4bb74077933e200b4643ce861e29c79.jpeg)