
圖形學【免費下載鏈接】ezdxfPython interface to DXF項目地址https://gitcode.com/gh_mirrors/ez/ezdxf點擊查看免費下載dxf2code 是 ezdxf 提供的代碼生成型 Add-on它把 DXF 文件中的實體、塊定義與表格條目翻譯成可直接執(zhí)行的 Python 源碼從而讓讀圖 → 生成代碼 → 重建圖形成為一條可復現(xiàn)、可版本化的流水線。讀完本文你將掌握entities_to_code、block_to_code、table_entries_to_code三個核心入口與Code源碼容器類的完整用法并了解生成代碼在圖層、線型、文字樣式等資源層面的處理策略及其邊界限制。本文以 dxf2code 官方文檔 為主體結合倉庫中的實現(xiàn)源碼 src/ezdxf/addons/dxf2code.py、運行示例 examples/addons/dxf2code.py 與單元測試 tests/test_08_addons/test_803_entities_to_code.py 展開講解。dxf2code 是什么dxf2code 的核心定位一句話即可概括Translate DXF entities and structures into Python source code——把 DXF 實體和結構翻譯成 Python 源碼。它是ezdxf.addons.dxf2code模塊docs/source/addons/index.rst 中的 Add-on 之一面向以下典型場景代碼復用把一個已有 DXF 圖紙中的圖元直線、圓弧、文字、塊引用等批量轉成 Python 代碼之后只需運行代碼即可重建同樣的圖形無需再依賴原始 DXF 文件圖紙生成程序化將 CAD 中手工繪制的內(nèi)容逆向為 ezdxf 繪圖腳本作為模板或基線結構遷移把模型空間、塊定義乃至圖層、線型、文字樣式、標注樣式等表格條目從一個文檔遷移到另一個文檔代碼即遷移方案教學與調試把復雜圖紙翻譯成易讀的 API 調用序列便于理解 ezdxf 各實體的構造方式。從源碼結構看src/ezdxf/addons/dxf2code.py模塊對外只暴露四個公共符號entities_to_code、block_to_code、table_entries_to_code和black內(nèi)部翻譯工作全部由私有類_SourceCodeGenerator完成??焖偕鲜忠粋€完整的轉換示例原文檔給出了最簡示例這里基于它補充完整可運行的流程讀取 DXF → 生成模型空間源碼 → 生成塊定義源碼 → 合并 → 寫出文件。import ezdxf from ezdxf.addons.dxf2code import entities_to_code, block_to_code doc ezdxf.readfile(original.dxf) msp doc.modelspace() source entities_to_code(msp) # create source code for a block definition block_source block_to_code(doc.blocks[MyBlock]) # merge source code objects source.merge(block_source) with open(source.py, modewt) as f: f.write(source.import_str()) f.write(\n\n) f.write(source.code_str()) f.write(\n)關鍵點拆解entities_to_code(msp)返回一個 Code 對象其中import_str()生成所需的 import 語句縮進層級 0全局導入code_str()生成主體代碼block_to_code(doc.blocks[MyBlock])返回塊定義對應的Code對象其代碼以doc.blocks.new(...)調用開頭source.merge(block_source)把塊源碼并入主源碼同時自動合并兩邊用到的 imports、圖層、線型等資源集合分三段寫文件imports、空行分隔、主體代碼。生成的source.py運行后即可重建原圖。倉庫中的示例 examples/addons/dxf2code.py 展示了另一種組裝方式——先寫import ezdxf再寫doc ezdxf.new()與msp ezdxf.modelspace()最后寫入source.code_str()這樣生成的文件本身就是自包含的獨立腳本with open(SOURCE_CODE_FILE, modewt) as f: f.write(import ezdxf\n) f.write(source.import_str()) f.write(\n\n) f.write(doc ezdxf.new()\n) f.write(msp ezdxf.modelspace()\n\n) f.write(source.code_str()) f.write(\n)三個核心轉換入口entities_to_code轉換實體集合def entities_to_code( entities: Iterable[DXFEntity], layout: str layout, ignore: Optional[Iterable[str]] None, ) - Codeentities任意可迭代的 DXF 實體對象如msp模型空間布局本身、query()的查詢結果layout生成代碼中布局變量的名字默認layout。例如傳入layoutmsp時生成的代碼會調用msp.add_line(...)、msp.new_entity(...)等見 tests/test_08_addons/test_803_entities_to_code.py 中l(wèi)ayoutmsp的用法ignore需要跳過的實體類型名列表如[IMAGE, DIMENSION]常用于排除尚無法完整復現(xiàn)的實體類型。從實現(xiàn)看src/ezdxf/addons/dxf2code.py該函數(shù)內(nèi)部創(chuàng)建_SourceCodeGenerator(layoutlayout)并調用其translate_entities(entities, ignoreignore)逐實體翻譯返回生成器持有的Code對象。block_to_code轉換塊定義def block_to_code( block: BlockLayout, drawing: str doc, ignore: Optional[Iterable[str]] None, ) - Codeblock塊定義布局對象doc.blocks[Name]的返回類型drawing生成代碼中 Drawing 變量的名字默認docignore同entities_to_code。實現(xiàn)中src/ezdxf/addons/dxf2code.py先生成b doc.blocks.new(MyBlock, base_point(...), dxfattribs{...})的調用base_point與其余 dxfattribs 分離處理隨后把塊內(nèi)實體翻譯成對b的追加調用。table_entries_to_code轉換表格條目def table_entries_to_code(entities: Iterable[DXFEntity], drawingdoc) - Code用于把圖層LAYER、線型LTYPE、文字樣式STYLE、標注樣式DIMSTYLE、APPID 等表格條目翻譯為在目標文檔中重建這些條目的代碼src/ezdxf/addons/dxf2code.py。生成的關鍵字是if Name not in doc.layers:形式的冪等守衛(wèi)——目標文檔中若已存在同名條目則跳過避免重復創(chuàng)建見 new_table_entry 的實現(xiàn)。測試 test_layer_entry 與 test_ltype_entry 驗證了生成的代碼可以被exec()直接執(zhí)行并在doc.layers/doc.linetypes中重建出屬性一致的條目線型條目還會自動補充Tags、dxftag、LinetypePattern三個 import 并重建pattern_tags。Code 源碼容器類Code是 dxf2code 的返回值類型同時充當源碼行存儲與資源清單src/ezdxf/addons/dxf2code.py。六個資源屬性追蹤生成代碼的依賴屬性存儲內(nèi)容對目標文檔的要求code主體源碼行列表每行不含結尾\n無imports全局 import 語句集合縮進層級 0無layers生成代碼用到的圖層名集合AutoCAD 接受無 LAYER 表條目的圖層名可自動創(chuàng)建linetypes用到的線型名集合必須在 LTYPE 表中存在條目否則 AutoCAD 會崩潰styles用到的文字樣式名集合必須在 STYLE 表中存在條目否則 AutoCAD 會崩潰dimstyles用到的標注樣式名集合必須在 DIMSTYLE 表中存在條目否則 AutoCAD 會崩潰blocks用到的塊名集合必須存在對應的 BLOCK 定義否則 AutoCAD 會崩潰原文檔特別強調了后四類資源的風險差異圖層可以不建表條目AutoCAD 自動接受而線型、文字樣式、標注樣式、塊定義缺表條目會導致 AutoCAD 崩潰。layers、linetypes、styles、dimstyles由add_used_resources()在翻譯每個實體時從 dxfattribs 中登記src/ezdxf/addons/dxf2code.pyblocks在翻譯 INSERT 塊引用時登記src/ezdxf/addons/dxf2code.py。輸出方法code_str(indent0)把code行拼接為單個字符串indent為每行前置空格數(shù)__str__直接委托給它black_code_str(line_length88)先用 Black 格式化再返回字符串需要安裝 Blackpip3 install black否則拋出ImportErrorimport_str(indent0)把imports集合拼接為單個字符串。編輯與合并方法add_import(statement)追加 import 語句相同的語句自動去重合并imports是setadd_line(code, indent0)追加單行源碼不帶\nadd_lines(code, indent0)批量追加多行源碼merge(code, indent0)并入另一個Code對象——同時合并imports、layers、linetypes、styles、dimstyles、blocks六組資源集合并把對方code行以indent縮進追加到末尾src/ezdxf/addons/dxf2code.py。black可選的代碼格式化def black(code: str, line_length88, fast: bool True) - str模塊級函數(shù)black()依賴第三方格式化工具 Black參數(shù)說明line_length最大行寬默認 88與 Black 默認一致fastTrue走快速模式不校驗格式化結果False校驗重排后的代碼是否合法未安裝 Black 時拋出ImportError。它等價于Code.black_code_str()內(nèi)部所用邏輯src/ezdxf/addons/dxf2code.py適合對整段生成代碼做統(tǒng)一風格化。源碼級工作原理實體分發(fā)機制_SourceCodeGenerator采用按 DXF 類型名反射分發(fā)的策略src/ezdxf/addons/dxf2code.pytranslate_entity()取出entity.dxftype()通過getattr(self, _ dxftype.lower())找到對應的翻譯方法找不到時生成一行# unsupported DXF entity 類型名注釋而不是報錯中斷。這保證了轉換過程的健壯性——未覆蓋的實體類型至少會在代碼中留下明確標記。專用 API 與通用 new_entity 兩種翻譯路徑每個實體翻譯方法內(nèi)部會選用兩種代碼生成方式之一專用 API 調用api_call()src/ezdxf/addons/dxf2code.py對 LINE、POINT、CIRCLE、ARC、TEXT、SHAPE、ATTRIB、ELLIPSE、SPLINE、MESH、HATCH、MPOLYGON 等生成layout.add_line(start..., end..., dxfattribs{...})形式的可讀調用。關鍵幾何參數(shù)從 dxfattribs 中提取為關鍵字參數(shù)其余屬性落入dxfattribs字典通用構造調用generic_api_call()src/ezdxf/addons/dxf2code.py對 SOLID、TRACE、3DFACE、ATTDEF、VIEWPORT、MTEXT、LWPOLYLINE、POLYLINE、LEADER、DIMENSION、IMAGE、WIPEOUT 等生成layout.new_entity(TYPE, dxfattribs{...})。例如_line生成msp.add_line(start..., end..., dxfattribs{...})而_solid生成msp.new_entity(SOLID, dxfattribs{...})。兩類非 DXF 屬性數(shù)據(jù)的特殊處理很多實體的核心幾何數(shù)據(jù)并不存于 dxfattribs而是獨立的結構dxf2code 為此生成賦值代碼LWPOLYLINEe.set_points([...])src/ezdxf/addons/dxf2code.pySPLINE依次生成e.fit_points、e.control_points、e.knots、e.weights列表賦值src/ezdxf/addons/dxf2code.pyPOLYLINE頂點是獨立實體逐頂點生成e.append_vertex(location, dxfattribs{...})并刪除頂點中冗余的 layer 屬性頂點自動繼承 POLYLINE 的圖層src/ezdxf/addons/dxf2code.pyMTEXT正文text不是單一 DXF tag單獨生成e.text ...src/ezdxf/addons/dxf2code.pyLEADERe.set_vertices([...])MESHe.vertices、e.edges、e.faces、e.creasesedges/faces 轉 tupleHATCH / MPOLYGON生成e.set_seed_points(...)、e.set_pattern_definition([...])、e.set_gradient(...)并按路徑逐條生成e.paths.add_polyline_path([...], is_closed..., flags...)或e.paths.add_edge_path(flags...)后者再細分ep.add_line/ep.add_arc/ep.add_ellipse/ep.add_spline。格式化的可讀性細節(jié)_fmt_mapping()對字符串值統(tǒng)一用json.dumps()轉義保證帶引號、反斜杠等特殊字符的字符串如xxx yyy zzz能安全落回 Python 字符串字面量非字符串值轉str()Vec3 借此輸出為元組形式見測試 test_fmt_mapping_fmt_dxf_tags()生成dxftag(code, value)調用序列用于線型 pattern_tags 等原始 tag 數(shù)據(jù)的重建_PURGE_DXF_ATTRIBUTESsrc/ezdxf/addons/dxf2code.py在翻譯前剔除handle、owner、paperspace、material_handle、visualstyle_handle、plotstyle_handle——這些句柄在新文檔中必然失效或由 ezdxf 自動設置必須清掉。各實體類型的翻譯注意事項邊界與限制基于源碼中逐實體的實現(xiàn)整理以下必須知道的限制INSERT塊引用登記塊名到blocks資源集若帶屬性ATTRIB會把每個 ATTRIB 的 layer 強制對齊到 INSERT 的 layer 后生成a msp.new_entity(ATTRIB, ...)再e.attribs.append(a)src/ezdxf/addons/dxf2code.pyDIMENSION生成# Dimension style attribute overriding is not supported!注釋并要求手工創(chuàng)建匿名塊形式的圖形表達否則 DXF 對 AutoCAD 無效對 BricsCAD 有效代碼中會預留# DimStyleOverride(e).render()提示src/ezdxf/addons/dxf2code.pyIMAGE提示需要 OBJECTS 段中的 IMAGEDEF 與 IMAGEDEFREACTOR 對象并生成e.set_boundary_path([...])與設置有效 image_def_handle / image_def_reactor_handle注釋VIEWPORT提示需設置有效 handle 或移除_handle結尾屬性否則 DXF 對 AutoCAD 無效HATCH關聯(lián)associative填充不被支持生成代碼強制associative 0LEADER不支持標注樣式屬性覆蓋dimstyle override同樣以注釋標明。生成代碼可執(zhí)行性如何保證dxf2code 的一個重要設計目標是生成即正確。單元測試文件 tests/test_08_addons/test_803_entities_to_code.py 的做法是把生成的代碼直接exec()執(zhí)行再把重建出的實體與原實體逐屬性比對。輔助函數(shù)translate_to_code_and_execute第 84-87 行清晰展示了這一驗證回路def translate_to_code_and_execute(entity): code str(entities_to_code([entity], layoutmsp)) exec(code, globals()) return msp[-1]覆蓋測試包括 LINE、POINT、CIRCLE、ARC、TEXT、SOLID、SHAPE、ELLIPSE、INSERT、ATTDEF、MTEXT含引號轉義正文、LWPOLYLINE、POLYLINE頂點數(shù)量與 flags、SPLINEknots/control_points/fit_points/weights 全量比對、LEADER、MESH立方體頂點與面、LAYER/LTYPE 表格條目、BLOCK 定義以及 HATCH圖案填充等。這意味著文檔所述能力在倉庫中均有測試背書——生成代碼可以放進exec()/eval()直接運行并復現(xiàn)原始實體屬性。實用組合實體 塊 表格條目的遷移工作流把三類入口組合起來即可實現(xiàn)從一個文檔到另一個文檔的完整結構遷移import ezdxf from ezdxf.addons.dxf2code import ( entities_to_code, block_to_code, table_entries_to_code, ) doc ezdxf.readfile(original.dxf) # 1) 表格條目圖層 / 線型 / 文字樣式 / 標注樣式生成冪等創(chuàng)建代碼 table_code table_entries_to_code(doc.layers, drawingdoc) table_code.merge(table_entries_to_code(doc.linetypes, drawingdoc)) # 2) 模型空間實體 msp_code entities_to_code(doc.modelspace(), layoutmsp, ignore[DIMENSION, IMAGE]) # 3) 所有塊定義 for block in doc.blocks: if block.name.startswith(*): # 跳過匿名塊 continue msp_code.merge(block_to_code(block, drawingdoc)) # 4) 輸出自包含腳本 with open(recreate.py, wt) as f: f.write(import ezdxf\n) f.write(doc ezdxf.new()\n) f.write(msp ezdxf.modelspace()\n\n) f.write(table_code.import_str() \n table_code.code_str() \n\n) f.write(msp_code.import_str() \n\n msp_code.code_str() \n)需要留意合并順序上表格條目代碼應位于實體代碼之前實體可能引用其圖層/線型ignore參數(shù)可先排除尚不能完整復現(xiàn)的實體類型再手工補齊注釋中提示的步驟如 DIMENSION 的匿名塊渲染、IMAGE 的句柄設置。總結dxf2code 以實體類型分發(fā) 專用/通用雙路徑構造 資源清單追蹤為核心機制把 DXF 內(nèi)容穩(wěn)定地翻譯為可執(zhí)行、可格式化的 Python 源碼三個入口分別覆蓋實體集合、塊定義與表格條目且都支持ignore過濾Code對象既是源碼容器也是資源清單merge支持多來源組合六個資源集合明確區(qū)分了可自動創(chuàng)建圖層與必須補表條目線型、樣式、塊兩類依賴生成代碼由單元測試驗證可直接exec()執(zhí)行并復現(xiàn)實體屬性已知限制關聯(lián)填充、標注樣式覆蓋、IMAGE/VIEWPORT 句柄等在生成代碼中以注釋形式顯式提示不會靜默出錯。如需進一步實踐可運行倉庫中的 examples/addons/dxf2code.py讀取 CADKit 樣例文件并輸出重建腳本并參照 tests/test_08_addons/test_803_entities_to_code.py 理解各實體的生成形態(tài)與驗證方式。贊分享圖形學【免費下載鏈接】ezdxfPython interface to DXF項目地址https://gitcode.com/gh_mirrors/ez/ezdxf點擊查看免費下載相關推薦Python DXF處理終極指南用ezdxf實現(xiàn)CAD自動化Python DXF處理終極指南用ezdxf實現(xiàn)CAD自動化 在當今數(shù)字化設計時代Python DXF處理技術已成為CAD自動化領域的核心利器。ezdxf作圖形學ezdxf 的 MTextSurrogate 插件為 DXF R12 用 TEXT 實體構建多行文本ezdxf 的 MTextSurrogate 插件為 DXF R12 用 TEXT 實體構建多行文本 導讀 MTextSurrogate 是 ezdxf 提供圖形學Python DXF自動化革命ezdxf庫的工程實踐指南Python DXF自動化革命ezdxf庫的工程實踐指南 在數(shù)字化設計時代CAD圖紙?zhí)幚硪殉蔀楣こ填I域不可或缺的環(huán)節(jié)。傳統(tǒng)的CAD軟件操作繁瑣、成本高昂而圖形學上一篇MLflow 項目中使用 MinIO 存儲時垃圾回收失敗問題分析下一篇sticky-headers-recyclerview深度解析核心組件與實現(xiàn)原理詳解創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考