Python通過dxfgrabber庫實現(xiàn)獲取CAD信息
前言
最近需要通過python來獲取cad模型的內(nèi)容信息,然而筆者也沒學過python,只能用過查詢+動手摸索一步一步進行下去,然后通過dxfgrabber進行本次的學習與實踐,在通過Java去執(zhí)行腳本獲取值。以下就是筆者對本次學習與工作的記錄。
dxfgrabber庫
dxfgrabber 是一個 Python 庫,用于讀取和解析 AutoCAD DXF(Drawing Exchange Format)文件。DXF 是一種常用的 CAD 文件格式,用于存儲和交換二維和三維圖形數(shù)據(jù)。dxfgrabber 提供了一個簡單而強大的接口,用于從 DXF 文件中提取圖形對象的信息,如線段、圓、多邊形、文本等。它可以讀取 DXF 文件的實體(entities)、圖層(layers)、塊(blocks)、屬性(attributes)等元素,并提供了方便的方法來訪問和操作這些數(shù)據(jù)。使用 dxfgrabber,你可以編寫 Python 腳本來讀取和分析 DXF 文件,提取其中的幾何信息、屬性數(shù)據(jù)或其他圖形元素。這使得你可以輕松地處理和轉(zhuǎn)換 DXF 數(shù)據(jù),進行自動化的 CAD 數(shù)據(jù)處理、生成報告、可視化或其他相關(guān)任務??傊琩xfgrabber 是一個方便的工具,使你能夠輕松地處理和分析 DXF 文件,從中提取所需的圖形和屬性信息。
具體內(nèi)容與api可以看一下官方文檔:dxfgrabber — dxfgrabber 1.0.0 documentation
DXF的內(nèi)容
在解析CAD模型時,我們是通過轉(zhuǎn)成DXF文件,通過對DXF文件進行解析,從而得到所需的數(shù)據(jù)集。
我們通過讀取.dxf文件獲得一個dxf對象,這里我準備了一個dxf文件
dxf = dxfgrabber.readfile("D:\\Code\\draft.dxf")
接著我們在下一行打個斷點,可以查看讀到得文件得對象都有什么屬性。
從Expression中就已經(jīng)可以之間看到有那些數(shù)據(jù)了。
dxfgrabber中的entities
先看一下entities,在 dxfgrabber 中,entities 是一個 DXF 文件中所有實體對象的集合。每個實體對象都具有一組特定的屬性,可以通過訪問這些屬性來獲取有關(guān)實體的信息,他的基類是Shape
通過斷點查看屬性,但是不管是實體內(nèi)部還是實體各種類型下的屬性,不同的DXF文件可能包含其他自定義屬性或應用特定的標準屬性,這取決于創(chuàng)建DXF文件的工具和設置。
但是,不同得圖形類型就會呈現(xiàn)不同的數(shù)據(jù)屬性。
LINE類型的數(shù)據(jù)
首先看一下line類型的數(shù)據(jù),通過expression可以看出線形的某些數(shù)據(jù),其中start和end是其起始坐標。以及顏色等其他屬性。
這里我調(diào)用其方法打印出來每條線的起始位置坐標,這個如果是需要繪制那種特定的路線,那么可以根據(jù)他的顏色值來進行判斷。如下代碼,我通過每個實體的dxftype去判斷是何種類型,以下只是判斷了線型,并且獲取其起點坐標,以及顏色數(shù)值。
# -*- coding: utf-8 -*- import dxfgrabber def get_line_coordinates(): dxf = dxfgrabber.readfile("D:\\Code\\draft.dxf") coordinates = [] for e in dxf.entities: if e.dxftype == 'LINE': start_x = e.start[0] start_y = e.start[1] start_z = e.start[2] color = e.color coordinates.append((start_x, start_y, start_z)) print(u"顏色:" + str(color) + u", " + e.dxftype + u" - 起點坐標:" + str(start_x) + u", " + str(start_y) + u", " + str(start_z)); return coordinates line_coordinates = get_line_coordinates() print(line_coordinates)
結(jié)果如下的打印輸出
6547608e022&title=&width=810.6666666666666)
CIRCLE類型的數(shù)據(jù)
通過斷點的方式來查看circle類型中存在著那些屬性,其中最常見的就是以下屬性:
- center:圓心坐標,表示為一個包含X、Y、Z值的元組或點對象。
- radius:圓的半徑,表示為一個浮點數(shù)。
- thickness:圓的厚度,表示為一個浮點數(shù)。通常在2D繪圖中為0。
- color:圓的顏色,表示為一個整數(shù)值??梢允褂妙伾磉M行解釋。
- layer:圓所在的圖層名稱,表示為一個字符串。
- linetype:圓的線型名稱,表示為一個字符串。例如,"CONTINUOUS"表示實線。
- linetype_scale:圓的線型比例,表示為一個浮點數(shù)。
- extrusion:圓的擠壓方向,表示為一個包含X、Y、Z值的元組或向量對象。通常在2D繪圖中為(0, 0, 1)。
- start_angle:圓的起始角度,表示為一個浮點數(shù)。默認為0度,以弧度為單位。
- end_angle:圓的結(jié)束角度,表示為一個浮點數(shù)。默認為2π(360度),以弧度為單位。
這里接下來就不演示代碼了,需要查看屬性可以通過斷點的形式去查看,通過點屬性的方式得到相應的值,就只是介紹可能存在的屬性字段。
POLYLINE類型的數(shù)據(jù)
每個實體類型為POLYLINE(多段線)的實體對象具有以下常見屬性:
- points:多段線的頂點坐標列表,表示為包含X、Y、Z值的元組或點對象。
- closed:指示多段線是否閉合的布爾值。
- thickness:多段線的厚度,表示為一個浮點數(shù)。通常在2D繪圖中為0。
- color:多段線的顏色,表示為一個整數(shù)值。可以使用顏色表進行解釋。
- layer:多段線所在的圖層名稱,表示為一個字符串。
- linetype:多段線的線型名稱,表示為一個字符串。例如,"CONTINUOUS"表示實線。
- linetype_scale:多段線的線型比例,表示為一個浮點數(shù)。
- extrusion:多段線的擠壓方向,表示為一個包含X、Y、Z值的元組或向量對象。通常在2D繪圖中為(0, 0, 1)。
- elevation:多段線的高度(Z軸值),表示為一個浮點數(shù)。通常在2D繪圖中為0。
POINT類型的數(shù)據(jù)
每個實體類型為POINT(點)的實體對象具有以下常見屬性:
- point:點的坐標,表示為一個包含X、Y、Z值的元組或點對象。
- thickness:點的厚度,表示為一個浮點數(shù)。通常在2D繪圖中為0。
- color:點的顏色,表示為一個整數(shù)值??梢允褂妙伾磉M行解釋。
- layer:點所在的圖層名稱,表示為一個字符串。
還有許多數(shù)據(jù)類型就不一一介紹,根據(jù)具體的DXF文件,不同文件可能存在不同數(shù)據(jù)。
dxfgrabber中的layers
layers,在dxfgrabber庫中,要查看圖層的相關(guān)信息,可以通過庫里面的layers來獲取他包含所有圖層的列表。
通過斷點可以看到其內(nèi)部有哪些屬性,不同的dxf文件,屬性都可能不同。以下是我這個dxf文件所有的屬性
- name:圖層的名稱,表示為一個字符串。
- color:圖層的顏色,表示為一個整數(shù)值??梢允褂妙伾磉M行解釋。
- linetype:圖層的線型名稱,表示為一個字符串。例如,"CONTINUOUS"表示實線。
- frozen:一個布爾值,指示圖層是否被凍結(jié)(不可見)。
- on:屬性用于表示圖層是否處于打開狀態(tài)。
- locked:一個布爾值,指示圖層是否被鎖定,即無法進行編輯。
dxfgrabber中的blocks
DXF文件的塊(Blocks)信息可以通過訪問blocks屬性來獲取。blocks是一個包含所有塊的字典,其中鍵是塊的名稱,值是表示塊的對象。
每個塊對象具有以下常見屬性和方法:
- name:塊的名稱,表示為一個字符串。
- entities:塊中的實體對象列表。
- basepoint:塊的基點坐標,表示為一個包含X、Y、Z值的元組或點對象。
- insertion_points:塊的插入點坐標列表,表示為包含X、Y、Z值的元組或點對象。
- has_attributes:一個布爾值,指示塊是否包含屬性定義。
- get_attribute(tag):獲取塊的屬性值,其中tag為屬性的標簽。
- extrusion:實體對象的擠出方向。
- is_xref:屬性用于表示實體對象是否來自外部引用,外部引用是一種將其他DXF文件中的實體對象鏈接到當前DXF文件的機制。
案例
本次案例是編寫一個腳本,再通過Java來執(zhí)行這段代碼。用的環(huán)境是python2.7,jdk1.8。雖然比較老了,下次再把python升到3.10。
python代碼
首先是python代碼,本次編寫邏輯很簡單,只是單純的使用dxfgrabber庫讀取dxf文件,并且以json的形式把值返回回去,這里只是判斷實體的類型為LINE,輸出類型與起點的x,y坐標值。
# -*- coding: utf-8 -*- import sys import json import dxfgrabber def get_line_coordinates(): dxf = dxfgrabber.readfile("D:\\Code\\draft.dxf") coordinates = [] for e in dxf.entities: if e.dxftype == 'LINE': data = { "type": e.dxftype, "x": e.start[0], "y": e.start[1] } coordinates.append(data) return coordinates line_coordinates = get_line_coordinates() # 將結(jié)果寫入到標準輸出,而不是打印 sys.stdout.write(json.dumps(line_coordinates))
Java代碼
因為在Java環(huán)境中執(zhí)行python代碼,會出現(xiàn)環(huán)境不同,找不到庫,所以需要設置一下環(huán)境路徑,以及python的解釋器路徑。通過PythonInterpreter.get方法去執(zhí)行函數(shù),需要攜帶兩個參數(shù),一個是函數(shù)名,另一個是返回的對象類型,這里我們用PyFunction類來進行返回,通過調(diào)用__call__來獲得一個python對象,我們返回的是一個數(shù)組對象,所以這里可以轉(zhuǎn)成PyList對象。后面通過alibaba.fastjson來轉(zhuǎn)成JSONArray對象。
這些代碼也就只是為了學習而制作,身為一名python小白,對這些還不夠理解,可能常規(guī)做法并不這樣做,因此后續(xù)還需要更多的嘗試。
/** * @Author: lyd * @Description: 執(zhí)行代碼 * @Date: 2023/5/31 */ public class JavaExecutorPythonUtils { // TODO Auto-generated method stub public static void main(String[] args) throws JsonProcessingException { System.setProperty("python.path", "C:\\Users\\14194\\.windows-build-tools\\python27\\Lib\\site-packages"); PythonInterpreter interpreter = new PythonInterpreter(); interpreter.execfile("D:\\Code\\test.py"); // 設置 Python 解釋器路徑 interpreter.exec("import sys"); interpreter.exec("sys.path.append('C:\\Users\\14194\\.windows-build-tools\\python27')"); // 第一個參數(shù)為需要執(zhí)行的函數(shù)(變量)的名字,第二個參數(shù)為期望返回的對象類型 PyFunction pyFunction = interpreter.get("get_line_coordinates", PyFunction.class); //調(diào)用函數(shù),如果函數(shù)需要參數(shù),在Java中必須先將參數(shù)轉(zhuǎn)化為對應的“Python類型” PyObject pyobj = pyFunction.__call__(); PyList pyList = (PyList) pyobj; ObjectMapper objectMapper = new ObjectMapper(); String s = objectMapper.writeValueAsString(pyList); JSONArray jsonArray = JSON.parseArray(s); System.out.println("the anwser is: " + jsonArray); } }
運行結(jié)果
總結(jié)
本次就是第一次對python讀取cad信息進行摸索,好多都不是很會,也沒有學過python,對python語言還是不夠理解,這也就導致了在Java中執(zhí)行腳本的時候有些摸不著頭腦,也希望看到本篇文章的讀者能夠給一些建議與信息提示??偟膩碚f,就是用過dxfgrabber庫獲取文件對象,在讀取所需的內(nèi)容,工作使用肯定不可能如此簡單就完成,我的需求是獲取cad中的某些路徑,就差不多是cad圖中描繪了車的行動軌跡路線,然后我想把這些行動軌跡的坐標獲取出來,通過后端的一些處理在傳到前端web界面顯示。希望路過的伙伴給個建議或提示。
以上就是Python通過dxfgrabber庫實現(xiàn)獲取CAD信息的詳細內(nèi)容,更多關(guān)于Python獲取CAD信息的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡介二分查找算法與相關(guān)的Python實現(xiàn)示例
這篇文章主要介紹了二分查找算法與相關(guān)的Python實現(xiàn)示例,Binary Search同時也是算法學習當中最基礎的知識,需要的朋友可以參考下2015-08-08對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解
今天小編就為大家分享一篇對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07python使用cartopy在地圖中添加經(jīng)緯線的示例代碼
gridlines可以根據(jù)坐標系,自動繪制網(wǎng)格線,這對于普通繪圖來說顯然不必單獨拿出來說說,但在地圖中,經(jīng)緯線幾乎是必不可少的,本文將給大家介紹了python使用cartopy在地圖中添加經(jīng)緯線的方法,需要的朋友可以參考下2024-01-01Python中map,reduce,filter和sorted函數(shù)的使用方法
這篇文章主要介紹了Python中map,reduce,filter和sorted函數(shù)的使用方法,是Python入門學習中的基礎知識,需要的朋友可以參考下2015-08-08Python使用matplotlib實現(xiàn)的圖像讀取、切割裁剪功能示例
這篇文章主要介紹了Python使用matplotlib實現(xiàn)的圖像讀取、切割裁剪功能,結(jié)合實例形式分析了Python基于matplotlib操作圖片的加載、讀取、坐標控制及裁剪相關(guān)操作技巧,需要的朋友可以參考下2018-04-04