欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python通過dxfgrabber庫實現(xiàn)獲取CAD信息

 更新時間:2023年06月02日 09:28:21   作者:一個有夢有戲的人  
dxfgrabber?是一個?Python?庫,用于讀取和解析?AutoCAD?DXF(Drawing?Exchange?Format)文件,本文就來教教大家如何利用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)文章

  • Python中使用__hash__和__eq__方法的問題

    Python中使用__hash__和__eq__方法的問題

    這篇文章主要介紹了Python中使用__hash__和__eq__方法的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 簡介二分查找算法與相關(guān)的Python實現(xiàn)示例

    簡介二分查找算法與相關(guān)的Python實現(xiàn)示例

    這篇文章主要介紹了二分查找算法與相關(guān)的Python實現(xiàn)示例,Binary Search同時也是算法學習當中最基礎的知識,需要的朋友可以參考下
    2015-08-08
  • Python海龜繪圖(Turtle)應用指南

    Python海龜繪圖(Turtle)應用指南

    python2.6版本中后引入的一個簡單的繪圖工具,叫做海龜繪圖(Turtle?Graphics)。海龜繪圖(turtle庫)是python的內(nèi)部模塊,使用前導入即可。本文將展示三個通過海龜繪圖實現(xiàn)的小程序,快來跟隨小編一起學習吧
    2022-03-03
  • Python基礎知識_淺談用戶交互

    Python基礎知識_淺談用戶交互

    下面小編就為大家?guī)硪黄狿ython基礎知識_淺談用戶交互。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 三分鐘熟練使用Python的os.path.join()

    三分鐘熟練使用Python的os.path.join()

    在Python中os.path.join()函數(shù)用于將多個路徑組合成一個路徑,下面這篇文章主要給大家介紹了關(guān)于熟練使用Python的os.path.join()的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • 對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解

    對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解

    今天小編就為大家分享一篇對python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python使用cartopy在地圖中添加經(jīng)緯線的示例代碼

    python使用cartopy在地圖中添加經(jīng)緯線的示例代碼

    gridlines可以根據(jù)坐標系,自動繪制網(wǎng)格線,這對于普通繪圖來說顯然不必單獨拿出來說說,但在地圖中,經(jīng)緯線幾乎是必不可少的,本文將給大家介紹了python使用cartopy在地圖中添加經(jīng)緯線的方法,需要的朋友可以參考下
    2024-01-01
  • 詳解Python中的文件操作

    詳解Python中的文件操作

    在日常生活中,文件操作主要包括打開、關(guān)閉、讀、寫等操作,這篇文章主要為大家詳細介紹了Python中這些文件操作的實現(xiàn),需要的可以了解下
    2023-07-07
  • Python中map,reduce,filter和sorted函數(shù)的使用方法

    Python中map,reduce,filter和sorted函數(shù)的使用方法

    這篇文章主要介紹了Python中map,reduce,filter和sorted函數(shù)的使用方法,是Python入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08
  • Python使用matplotlib實現(xiàn)的圖像讀取、切割裁剪功能示例

    Python使用matplotlib實現(xiàn)的圖像讀取、切割裁剪功能示例

    這篇文章主要介紹了Python使用matplotlib實現(xiàn)的圖像讀取、切割裁剪功能,結(jié)合實例形式分析了Python基于matplotlib操作圖片的加載、讀取、坐標控制及裁剪相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04

最新評論