日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 二次开发 AutoCAD 简介

發(fā)布時間:2023/12/14 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 二次开发 AutoCAD 简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目 錄

  • Blog Links
  • 一、前言
  • 二、ActiveX Automation
  • 三、開發(fā)文檔/工具
    • 3.1 AutoCAD Help
    • 3.2 ArxDbg
  • 四、可用Python庫
    • 4.1 pyautocad
    • 4.2 pywin32
    • 4.3 ezdxf
    • 4.4 dxfgrabber
    • 4.5 dxfwrite
    • 4.6 gdal
  • 五、與CAD的連接
    • 5.1 ProgID
    • 5.2 示例
  • 六、數(shù)據(jù)轉(zhuǎn)換
  • 七、繪圖
    • 7.1 倒角矩形
    • 7.2 閉合多段線圖案填充
    • 7.3 動態(tài)塊
  • 八、顏色
  • 九、重要方法
    • 9.1 SendCommad
    • 9.2 GetEntity
    • 9.3 SetXData/GetXData
  • 十、文件
    • 10.1 另存為.dwg/.dxf
    • 10.2 另存為.pdf
    • 10.3 另存為.jpg/.png
  • 十一、致謝
  • 十二、說明
  • 十三、尾聲
  • 十四、參考文獻



Blog Links


  • DalNur | 博客總目錄

  • Python 二次開發(fā) AutoCAD 簡介

  • Python 二次開發(fā) AutoCAD 設(shè)置

  • Python 二次開發(fā) AutoCAD 圖層

  • Python 二次開發(fā) AutoCAD 繪圖

  • Python 二次開發(fā) AutoCAD 修改

  • Python 二次開發(fā) AutoCAD 塊組

  • Python 二次開發(fā) AutoCAD 注釋

  • Python 二次開發(fā) AutoCAD 文件

  • Python 二次開發(fā) AutoCAD 選擇集






一、前言


??AutoCAD(Autodesk Computer Aided Design)是 Autodesk(歐特克)公司首次于 1982 年開發(fā)的自動計算機輔助設(shè)計軟件,在土木建筑,裝飾裝潢,工業(yè)制圖,工程制圖,電子工業(yè),服裝加工等諸多領(lǐng)域有著廣泛的應(yīng)用,主要用于二維繪圖、詳細繪制、設(shè)計文檔和基本三維設(shè)計,現(xiàn)已經(jīng)成為國際上廣為流行的繪圖工具。


??上世紀 80 年代末 90 年代初, Guido van Rossum 在荷蘭國家數(shù)學和計算機科學研究所設(shè)計出計算機程序設(shè)計語言 Python 。 Python 是一個高層次的結(jié)合了解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言,具有很強的可讀性。相比其他語言,語法結(jié)構(gòu)更具特色。同時,它也是一種跨平臺的計算機程序設(shè)計語言,越來越多地用于獨立的、大型項目的開發(fā)。



??為什么采用 Python 語言二次開發(fā) AutoCAD ?


????Python 是一種代表簡單主義思想的語言,簡單易學,應(yīng)用范圍廣泛 。

????Python 擁有大量第三方庫,可輕易實現(xiàn)各種應(yīng)用程序間的數(shù)據(jù)交換,如 AutoCAD 與 Excel / Word 間的數(shù)據(jù)交換。

????只要具有基礎(chǔ)的 Python 編程能力,就可實現(xiàn)對 AutoCAD 的二次開發(fā),而不必特意學習 VBA 或者 LISP 。



??吾生也有涯,而知也無涯,以有涯隨無涯,殆己。



??總之,人的精力是有限的, Windows 平臺上的應(yīng)用程序是各種各樣的,我們力爭只熟練掌握一門編程語言就能將各種應(yīng)用程序串聯(lián)起來,以實現(xiàn)數(shù)據(jù)的順利傳遞,從而大幅度地提高工作效率和質(zhì)量。這也是我當時在全網(wǎng)參考代碼很少的情況下堅持用 Python 調(diào)用 CAD 的原因。


??這個過程并非順利,本人純野生學習 Python,很多小 bug 都要查很久的資料才能解決。因粗心看錯了幫助文檔的參數(shù)定義,在繪制橢圓這卡了將近一個月;因不了解 CAD 系統(tǒng)對顏色的定義規(guī)則,在模型空間背景色設(shè)置上卡了將近3個月,通過不斷測試,硬是靠最原始的總結(jié)規(guī)律得到了顏色指定的換算公式;因不了解 Python 中的數(shù)據(jù)類型如何對應(yīng) AutoCAD 中的 Variant,圖案填充這又卡了好幾個月,最終在 ke1078 大神的幫助下,順利實現(xiàn)了圖案填充的繪制。


??為了使后續(xù)的學習者少走彎路,把寶貴的時間用于所研究的問題上,而非軟件操作層面,特此,將本人所了解到的 Python 語言二次開發(fā) CAD 的有關(guān)內(nèi)容記錄在此系列博客上。還需說明的是,因本人能力和水平確實有限,博客中的有關(guān)表述可能不嚴謹,甚至錯誤,還請大家及時批評指正。






二、ActiveX Automation


??AutoCAD 二次開發(fā)主要接口有 ObjectARX 接口、.net API 接口、AutoLisp 接口、ActiveX (com) 接口,更多詳見: AutoCAD二次開發(fā)簡介 。


AutoCAD API Performance

??ActiveX Automation 是 ActiveX 為 Windows 用戶提供的一項重要技術(shù),可以使各應(yīng)用程序間通過數(shù)據(jù)嵌入或鏈接的方式共享數(shù)據(jù),并在 Windows 系統(tǒng)統(tǒng)一管理下進行協(xié)調(diào),讓這些應(yīng)用程序以一定的流程相互溝通,相互控制,即一個程序暴露其可用對象,另一個程序控制這些對象,設(shè)置屬性、調(diào)用方法,從而實現(xiàn)某種功能,完成所要求的動作。


??AutoCAD 程序開放某些對象給 Windows 系統(tǒng),使用程序語言并通過 ActiveX Automation,我們就可以對這些對象進行存取。 AutoCAD ActiveX 接口的主要構(gòu)件就對象,每一個顯露的對象均精確代表一個 AutoCAD 組件。


??AutoCAD 以分層結(jié)構(gòu)來組織對象,分層結(jié)構(gòu)的視圖稱為“對象模型”,如下圖所示。Application 對象是 AutoCAD ActiveX Automation 對象模型的根對象,通過它,用戶可以訪問任何其他的對象或任何對象指定的特性或方法。對象模型給出了上級對象與下級對象之間的訪問關(guān)系。




AutoCAD對象模型 (部分)

??AutoCAD 對象都至少具有一個屬性,用于描述對象。例如,圓具有半徑、面積、線型等屬性,通過這些屬性能描述出一個具體的圓。


????參考資料: AutoCAD ActiveX 二次開發(fā)技術(shù) 。




三、開發(fā)文檔/工具


3.1 AutoCAD Help


??AutoCAD 二次開發(fā)的兩個官方幫助文檔: ActiveX Reference Guide ActiveX Develop’s Guide 可在 CAD 的安裝目中獲得,兩個文件名分別為:acadauto.chm 和 acad_aag.chm 。


??可按如下方式獲取: 首先,安裝文件搜索神器 Everything;然后,在搜索欄內(nèi)輸入 acadauto.chm,便可看到 ActiveX Reference Guide 文件及其所在路徑,該文件是隨 AutoCAD 程序的安裝一起附帶到你的電腦內(nèi)的,只要你安裝了 CAD,該文件必然存在。




幫助文檔的獲取


3.2 ArxDbg


??ArxDbg 是 ObjectARX SDK 中包含多年的示例項目的名稱。它的主要目的是演示如何使用 ObjectARX API,但它本身就是一個完全獨立的實用程序。ObjectARX 程序員經(jīng)常在開發(fā)期間使用此實用程序來測試和執(zhí)行他們的應(yīng)用程序代碼。更多詳見: [ObjectARX] ArxDbg介紹、自動加載及其下載 。



ArxDbg

????下載鏈接: ACAD二次開發(fā)必備輔助工具-ArxDbg 2005-2021各版本 。




四、可用Python庫


??在介紹各種 Python 庫前,有必要對 AutoCAD 的文件系統(tǒng)做一個簡單的了解。


??dwg 是 AutoCAD 以及基于 AutoCAD 的軟件保存設(shè)計數(shù)據(jù)所用的一種專有文件格式 (AutoCAD的圖形文件)。


??dxf 是 AutoCAD 繪圖交換文件,它是 Autodesk 公司開發(fā)的用于 AutoCAD 與其它軟件之間進行 CAD 數(shù)據(jù)交換的 CAD 數(shù)據(jù)文件格式。


??dxf (圖形交換文件) 是一種開放的矢量數(shù)據(jù)格式,它包含對應(yīng)的 dwg 文件的全部信息,主要用于不同版本 CAD 間的數(shù)據(jù)交換。可以分為兩類:ASCII 格式和二進制格式;ASCII 具有可讀性好的特點,但占用的空間較大;二進制格式則占用的空間小、讀取速度快。由于 AutoCAD 是最流行的 CAD 系統(tǒng),DXF 也被廣泛使用,成為事實上的標準。絕大多數(shù) CAD 系統(tǒng)都能讀入或輸出 DXF 文件。ASCII 格式的 DXF 可以用文本編輯器進行查看。它包含對應(yīng)的 dwg 文件的全部信息,不是 ASCII 碼形式,可讀性差,但用它形成圖形速度快,不同類型的計算機哪怕是用同一版本的文件,其 dwg 文件也是不可交換的。為了克服這一缺點,AutoCAD 提供了 dxf 類型文件,其內(nèi)部為 ASCII 碼,這樣不同類型的計算機可通過交換 dxf 文件來達到交換圖形的目的,由于 dxf 文件可讀性好,用戶可方便地對它進行修改,編程,達到從外部圖形進行編輯和修改的目的。


??dwg 格式以及它的 ASCII 格式變體 dxf,已經(jīng)成為 CAD 制圖數(shù)據(jù)交換中的事實文件標準。



??.dwg:脫離 AutoCAD 軟件環(huán)境讀寫 dwg 格式文件,基本無法實現(xiàn),通過 COM 自動化操作是一個可選的方案。[1]


??.dxf:是與其它軟件進行 CAD 數(shù)據(jù)交換的文件格式,可脫離 AutoCAD 軟件環(huán)境讀寫,如利用 ezdxf 庫。[1]




4.1 pyautocad


??pyautocad 庫由俄羅斯工程師 Roman Haritonov 開發(fā),用于簡化使用 Python 語言書寫 AutoCAD ActiveX Automation 腳本。主要參考資料如下:


????PiPy: pyautocad 0.2.0 。

????GitHub: reclosedev/pyautocad 。

????Documentation: pyautocad’s documentation 。

????Blog: 1. Python3操作AutoCAD:利用pyautocad庫能夠自動化地進行CAD畫圖. 陸壹爵爺 。

?????? 2. 利用python控制Autocad:pyautocad. bsider 。



pyautocad庫與AutoCAD的連接

??事實上,pyautocad 庫僅僅起到了接口作用,pyautocad 利用 comtypes.client 啟動或連接 CAD (pyautocad源代碼),如下圖所示:



pyautocad源代碼 (部分)

import comtypes.clienttry:acad = comtypes.client.GetActiveObject('AutoCAD.Application', dynamic=True) except WindowsError:acad = comtypes.client.CreateObject('AutoCAD.Application', dynamic=True)acad.Visible = True pyautocad啟動/連接CAD的Python代碼

4.2 pywin32


??pywin32 是一個 Python 庫,為 Python 提供訪問 Windows API 的擴展,提供了齊全的 windows 常量、接口、線程以及 COM 機制等。了解更多詳見博客:如何利用Python和win32編程避免重復(fù)性體力勞動(一) 。主要參考資料如下:


????PiPy: https://pypi.org/project/pywin32 。

????Github: https://github.com/mhammond/pywin32 。


????與 CAD 的連接

#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """import win32com.client as win32wincad = win32.Dispatch("AutoCAD.Application") doc = wincad.ActiveDocument msp = doc.ModelSpacedoc.Utility.Prompt("Hello! Autocad from pywin32com.\n")print(doc.Name)

????示例

win32com連接CAD示例 (與Excel交互)

????pywin32 Help

??首先確保你已經(jīng)成功安裝了 pywin32 模塊,然后在搜索神器 Everything 的搜索欄中輸入 PyWin32.chm,便可得到其所在的路徑。



PyWin32幫助文檔的獲取

PyWin32幫助文檔

4.3 ezdxf


????ezdxf 庫的安裝

??如已安裝 Anaconda,在 Anaconda Prompt 中鍵入 pip install ezdxf 便可自動完成該庫的導(dǎo)入,如下圖所示;如未安裝 Anaconda,也可 pip 手動導(dǎo)入,其在 PyPI (Python Package Index) 上的注冊地址為:https://pypi.org/project/ezdxf/ 。


????Github: https://github.com/mozman/ezdxf 。

????Documentation: https://ezdxf.readthedocs.io/en/stable/ 。

????Blog: 使用Python讀寫DXF和DWG文件 。


????示例

import ezdxf# Create a new DXF document. doc = ezdxf.new(dxfversion='R2010')# Create new table entries (layers, linetypes, text styles, ...). doc.layers.new('TEXTLAYER', dxfattribs={'color': 2})# DXF entities (LINE, TEXT, ...) reside in a layout (modelspace, # paperspace layout or block definition). msp = doc.modelspace()# Add entities to a layout by factory methods: layout.add_...() msp.add_line((0, 0), (10, 10), dxfattribs={'color': 7}) msp.add_text('Test',dxfattribs={'layer': 'TEXTLAYER'}).set_pos((0, 0.2), align='CENTER')# Save DXF document. doc.saveas('test.dxf')

ezdxf生成.dxf文件

4.4 dxfgrabber


????Github: https://github.com/mozman/dxfgrabber 。

????Documentation: https://dxfgrabber.readthedocs.io/en/latest/ 。



4.5 dxfwrite


????Github: https://github.com/mozman/dxfwrite 。

????Documentation: https://dxfwrite.readthedocs.io/en/latest/ 。



4.6 gdal


????Blog: 使用Python讀寫DXF和DWG文件 。



??以上,便是截止目前常見的 AutoCAD 二次開發(fā) Python 庫,可根據(jù)個人需要,選擇合適的 Python 庫。


??若想創(chuàng)建 .dwg 文件,建議采用 pywin32 庫;若想創(chuàng)建 .dxf 文件,同時脫離 AutoCAD 軟件環(huán)境,則可采用 ezdxf、dxfwrite,也可以采用 pywin32 庫繪制好相應(yīng)的文件后,以另存為的方式創(chuàng)建 .dxf 文件。


??事實上,pyautocad 庫和 pywin32 庫僅僅起到了接口作用,它們只是構(gòu)建好數(shù)據(jù)傳輸?shù)耐ǖ?#xff0c;真正實現(xiàn)圖形創(chuàng)建的是 AutoCAD 程序本身,AutoCAD 應(yīng)用程序接收來自 Python 的命令后,完成圖形的繪制等。因此,大家不必糾結(jié)于采用何種方式與 CAD 建立連接。


??就反應(yīng)速度而言,pyautocad 庫相對較慢,而且好多高級的繪圖功能 pyautocad 庫暫時無法實現(xiàn),如圖案填充、選擇集功能的實現(xiàn)等。所以,建議大家采用 pywin32 庫 即 win32com 方式連接 CAD 創(chuàng)建 .dwg 文件。除了速度方面的原因外,利用這個庫,可以與 Excel、Word、Sap2000 等其他程序構(gòu)建起數(shù)據(jù)傳輸通道,看到這是不是覺得很爽,對的,我們的最終目的就是要用 Python 將各種計算軟件聯(lián)系起來,以實現(xiàn)某一工程問題的快速處理。例如一幢超高層建筑的設(shè)計,我們可以按如下方式進行: Excel 提供用戶輸入數(shù)據(jù)、SAP2000 進行全局多工況內(nèi)力彈性計算、Abaqus 完成局部彈塑性分析、nCode 進行個別鋼構(gòu)件的高周疲勞分析、AutoCAD 完成施工圖的繪制、Word 生成最終的計算說明文件,以上操作均可在 Python 的控制下快速進行。



????Python 二次開發(fā) Excel 簡介

????Python 二次開發(fā) SAP2000 概述

????Abaqus 二次開發(fā) 基本概念

????nCodeDL 疲勞分析 簡明教程

????Python 二次開發(fā) Word 簡介



.dwg文件的創(chuàng)建邏輯

.dxf文件的創(chuàng)建邏輯


五、與CAD的連接


5.1 ProgID


??如果電腦中安裝了不止一個版本的 AutoCAD 為了順利完成指定版本 CAD 的調(diào)用則需指定 ProgID,即 ×××.Dispatch(“AutoCAD.Application.19”),其中 “AutoCAD.Application.19” 就是 2014 版 AutoCAD 的 ProgID。如下代碼將建立起 Python 與 2010 版 AutoCAD 的連接:


#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """import win32com.client import pythoncomwincad = win32com.client.Dispatch("AutoCAD.Application.18") doc = wincad.ActiveDocument doc.Utility.Prompt("Hello! Autocad from pywin32com.\n") msp = doc.ModelSpace print(doc.Name)

??根據(jù) CAD 版本的不同, ProgID 可能會發(fā)生變化,部分版本 CAD 的 ProgID 如下:


AutoCAD 版本ProgID
2010AutoCAD.Application.18
2014AutoCAD.Application.19

??常見版本 CAD 的 ProgID 詳見博文: autocad application 版本 。


??另外,CAD 的 ProgID 可在官方二次開發(fā)幫助文檔 ActiveX Reference Guide 中查看,具體操作如下圖所示:



ProgID的查看

5.2 示例


#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """from pyautocad import Autocad, APoint import comtypes.client import time# 1.CAD自動啟動 ProgID = "AutoCAD.Application.19" # 2014版CADProgramIDtry:acad = comtypes.client.GetActiveObject(ProgID, dynamic=True) except WindowsError:acad = comtypes.client.CreateObject(ProgID, dynamic=True)acad.Visible = Trueprint("The program will pause for 60 seconds.") # 防止報錯 time.sleep(60) # 程序暫停60s運行# 2.連接方式的轉(zhuǎn)換 acad = Autocad(create_if_not_exists=True) acad.prompt("Hello! AutoCAD from pyautocad.") doc = acad.ActiveDocument print(doc.Name) msp = doc.ModelSpacedwgobj = acad.ActiveDocument.Application.Documents.Add("") dwgobj.Activate() # 設(shè)為當前文件。 doc = acad.ActiveDocument print(doc.Name) msp = doc.ModelSpace# 3.創(chuàng)建圖元 x1, y1 = 0, 0 x2, y2 = 100, 100 p1, p2, = APoint(x1, y1), APoint(x2, y2) msp.AddLine(p1, p2)# 4.文件保存 directory = r"D:" # 工作目錄 dwgname = "ZK.dwg" # 工作目錄 path = directory + "\\" + dwgname dwgobj.Close(True, path)# 5.程序退出 acad.ActiveDocument.Application.Quit()


六、數(shù)據(jù)轉(zhuǎn)換


??目的: 為了保證程序的順利運行,用戶輸入的數(shù)據(jù)類型需轉(zhuǎn)換成 CAD 能識別的數(shù)據(jù)類型。


??說明: 本人非計算機專業(yè)出身,以下表述純屬個人理解,不妥/錯誤之處還請各位批評指正。


??Python 中的數(shù)據(jù)類型較少,且對數(shù)據(jù)本身的要求也較為寬松,如一個列表中的各個元素可以分別屬于不同的數(shù)據(jù)類型,這雖然有利于降低程序的編寫難度,但也對 CAD 的二次開發(fā)產(chǎn)生了一些不必要的麻煩。


??在 CAD 二次開發(fā)過程中,很多函數(shù)/方法的參數(shù)要求輸入的數(shù)據(jù)類型為 Variant (array of objects) ,但在 Python 中似乎又沒有哪一種數(shù)據(jù)類型與之直接相對應(yīng),若采用 list 代替 Variant,那么程序無法順利執(zhí)行,報錯為 “ 對象數(shù)組無效 ”。因此,需要某種轉(zhuǎn)換方式,將 Python 中定義的變量轉(zhuǎn)換為能夠被 CAD 識別的數(shù)據(jù)類型 Variant 。


??VARIANT 結(jié)構(gòu)體主要是使用在 COM(組件對象模型)中用于傳遞參數(shù)使用,它的存在主要是為了保持一個在 COM 參數(shù)傳遞方法的統(tǒng)一性,它幾乎包含了所有普通常用類型的數(shù)據(jù)類型的傳遞,如整型,浮點型,布爾型等,以及相應(yīng)類型的指針類型,如整型指針。[2]



??部分類型與變量對應(yīng)關(guān)系如下表:


Member nameDescription
VT_EMPTYIndicates that a value was not specified.
VT_R8Indicates a double value.
VT_DISPATCHIndicates an IDispatch pointer.


??另外,NumPy arrays can be passed as VARIANT arrays arguments. The array is converted to a SAFEARRAY according to its type. [3] ( 此為 comptypes 庫幫助文檔原文,本人對計算機了解有限,為了不曲解原文,此處不做翻譯),部分對應(yīng)關(guān)系如下:


NumPy typeVARIANT type
int32, int, intc, int_VT_I4
uint32, uint, uintcVT_UI4
float64, float_VT_R8


??comtypes 是一個輕量級的 python com 包,其中文網(wǎng)站詳見:https://www.cnpython.com/pypi/comtypes;官方文檔詳見:comtypes 1.1.3 documentation 。


??NumPy 是用 Python 進行科學計算的基礎(chǔ)軟件包,其官方的中文文檔詳見網(wǎng)站: Numpy 中文網(wǎng) 。


??在 Python 調(diào)用 AutoCAD 過程中,常用的數(shù)據(jù)轉(zhuǎn)換函數(shù)如下:


#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """import win32com.client import pythoncomwincad = win32com.client.Dispatch("AutoCAD.Application.19") doc = wincad.ActiveDocument doc.Utility.Prompt("Hello! Autocad from pywin32.") msp = doc.ModelSpace print(doc.Name)def vtpnt(x, y, z=0):"""坐標點轉(zhuǎn)化為浮點數(shù)"""return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))def vtobj(obj):"""轉(zhuǎn)化為對象數(shù)組"""return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, obj)def vtfloat(lst):"""列表轉(zhuǎn)化為浮點數(shù)"""return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, lst)def vtint(lst):"""列表轉(zhuǎn)化為整數(shù)"""return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, lst)def vtvariant(lst):"""列表轉(zhuǎn)化為變體"""return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, lst)

七、繪圖


??本部分僅介紹一些復(fù)雜圖形的繪制,更多基礎(chǔ)圖形的繪制詳見博客:Python AutoCAD 繪圖 。


7.1 倒角矩形


#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """from pyautocad import Autocad, APoint, aDouble import mathpyacad = Autocad(create_if_not_exists=True) pyacad.prompt("Hello! AutoCAD from pyautocad.") print(pyacad.doc.Name)[L, B, R] = [400, 200, 50] # L、B、R分別為矩形的長度、矩形的寬度及圓角半徑。x = [0.5 * (L - 2 * R), 0.5 * L] # 倒角矩形各關(guān)鍵點橫坐標的絕對值; y = [0.5 * (B - 2 * R), 0.5 * B] # 倒角矩形各關(guān)鍵點縱坐標的絕對值;pnts = [APoint(x[0], -y[1]), APoint(x[1], -y[0]), APoint(x[1], y[0]),APoint(x[0], y[1]), APoint(-x[0], y[1]), APoint(-x[1], y[0]),APoint(-x[1], -y[0]), APoint(-x[0], -y[1])]pnts = [j for i in pnts for j in i] # 將各點坐標順序變換為行數(shù)據(jù) pnts = aDouble(pnts) # 轉(zhuǎn)化為雙精度浮點數(shù)plineObj = pyacad.model.AddPolyLine(pnts) plineObj.Closed = True # 閉合多段線 bulgeValue = math.tan(math.pi / 8) # 凸度,為四分之一倍圓弧所對圓心角的正切值。[plineObj.SetBulge(2 * i, bulgeValue) for i in range(4)] # 將多段線的第1、3、5、7部分設(shè)置為凸度為bulgevalue的圓弧。

倒角矩形

7.2 閉合多段線圖案填充


#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """import pythoncom import win32com.clientwincad = win32com.client.Dispatch("AutoCAD.Application") doc = wincad.ActiveDocument doc.Utility.Prompt("Hello! AutoCAD from pywin32.") msp = doc.ModelSpacedef vtobj(obj):return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, obj)def vtfloat(lst):return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, lst)[ptnName, ptnType, bAss] = ["ANSI31", 0, True]pnts = [100, -50, 0, 100, 50, 0, -100, 50, 0, -100, -50, 0] pnts = vtfloat(pnts)plineObj = msp.AddPolyLine(pnts) plineObj.Closed = TrueouterLoop = [] outerLoop.append(plineObj) outerLoop = vtobj(outerLoop) hatchObj = msp.AddHatch(ptnType, ptnName, bAss) hatchObj.AppendOuterLoop(outerLoop) hatchObj.Evaluate() # 進行填充計算,使圖案吻合于邊界。

閉合多段線的圖案填充


7.3 動態(tài)塊


??創(chuàng)建動態(tài)塊的標準流程為:創(chuàng)建普通塊(B) → 編輯塊 → 指定參數(shù) → 設(shè)置動作,詳見: AutoCAD-如何創(chuàng)建動態(tài)塊。


??創(chuàng)建如下圖所示的動態(tài)塊,塊的名稱為 door,由矩形、圓弧及直線三個圖元構(gòu)成,并具有三種用戶自定義狀態(tài),分別為縮放、旋轉(zhuǎn)和翻轉(zhuǎn)。



#!/usr/bin/env python # -*- coding: utf-8 -*-"""==============================Author: Wang Yifang (SINOMACH)============================== """import win32com.client acad = win32com.client.Dispatch("AutoCAD.Application")# iterate through all objects (entities) in the currently opened drawing # and if its a BlockReference, display its attributes.for entity in acad.ActiveDocument.ModelSpace:name = entity.EntityNameprint(name)if name == 'AcDbBlockReference':if entity.IsDynamicBlock:print("Is dynamic block")block_ = entity.GetDynamicBlockProperties()print(block_)print("print property")for p in block_:print("{")print(p.AllowedValues)print(p.Description)print(p.PropertyName )print(p.ReadOnly)print(p.Show)print(p.UnitsType)print(p.Value)print("}")print("===================================")# 修改動態(tài)塊的尺寸if p.PropertyName == "距離1":p.Value = float(10)if p.PropertyName == "角度1":p.Value = float(3.14159265/3)# 角度為弧度制# if p.PropertyName == "翻轉(zhuǎn)狀態(tài)1":# p.Value = 1# 此功能報錯,原因待查明。


長度10 旋轉(zhuǎn)60度


八、顏色


??在 AutoCAD 中,顏色設(shè)置是普遍存的,如設(shè)置圖層的顏色,指定標注文字的顏色等等。多數(shù)情況下可以通過設(shè)置 RGB 值來實現(xiàn),但有時需要直接指定一個數(shù)字來代表該顏色。在此,把代表該顏色的數(shù)值變量稱為 顏色標識號 (可能有專門的術(shù)語,管它呢,我就這么叫,愛誰誰),用 clr 表示。某一顏色的 clr 值可由該顏色的 RGB 值計算得到,計算公式如下:


clr=R+256×G+256×256×B{clr} = R + 256 × G + 256 × 256 × B clr=R+256×G+256×256×B


??例如: 對于白色(R=255,G=255,B=255),其對應(yīng)的顏色標識號 clr 為 255 + 256 × 255 + 256 × 256 × 255 = 16777215。


??根據(jù)上述公式,幾種常用的標準顏色的顏色標識號如下:


顏色clr顏色clr
黑色0青色16776960
紅色255藍色16711680
黃色65535洋紅16711935
綠色65280白色16777215


????示例


??將 AutoCAD 程序的模型空間背景色設(shè)置成如下所示的淡綠色:


R=198 G=224 B=180

clr=198+256×224+256×256×180=11854022{clr} = 198 + 256 × 224 + 256 × 256 × 180 = 11854022 clr=198+256×224+256×256×180=11854022

#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """from pyautocad import Autocadpyacad = Autocad(create_if_not_exists=True) pyacad.prompt("Hello! AutoCAD from pyautocad.") print(pyacad.doc.Name)clr = 11854022 pyacad.ActiveDocument.Application.preferences.Display.GraphicsWinModelBackgrndColor = clr

模型空間背景色的設(shè)置

??該功能的實現(xiàn)歷經(jīng)波折,卡頓了近三個月,終于,在那一天下班鈴響后測試成功。


??值得注意的是,不是所有的顏色指定都可以采用該種方式,如圖案填充顏色的設(shè)置就是通過直接設(shè)置 RGB 的方式實現(xiàn)的。


??藍色的定義: doc.Application.GetInterfaceObject(“AutoCAD.AcCmColor.19”).SetRGB(0, 0, 255) 。




九、重要方法


9.1 SendCommad


SendCommand方法

??極個別情況下,采用常規(guī)方式很難實現(xiàn)某一功能,如設(shè)置默認視圖、定義永久標注樣式等。此時,可嘗試采用 SendCommand 方式來實現(xiàn)。具體方法為,先在 AutoCAD 軟件界面操作一遍,然后查看在此過程中提示工具欄內(nèi)的數(shù)據(jù)變化,最后,將這些變化稍加改動按照 CAD 二次開發(fā)的規(guī)則輸入到 SendCommand 內(nèi),即可得到相應(yīng)的 Python 代碼。


??以直線的繪制為例,在 AutoCAD 軟件中的操作步驟為:輸入繪制直線的快捷命令 “L” > 回車 > 屏幕上點選第一個點 > 回車 > 屏幕上點選第二個點 > 回車,直覺告訴我們 SendCommand 括號內(nèi)數(shù)據(jù)輸入也應(yīng)該是這一順序,即


SendCommand ("L" + 回車 + 第一個點坐標 + 回車 + 第二個點坐標 + 回車)

直線繪制過程中命令欄內(nèi)的顯示情況

SendCommand方式繪制直線的Python代碼

??另一個典型的例子是將程序的預(yù)設(shè)視圖由俯視變更為西南等軸測,將視覺樣式由二維線框變更為真實,在 CAD 界面操作后,命令欄讓將顯示出如下數(shù)據(jù):



預(yù)設(shè)視圖及視覺樣式的修改

預(yù)設(shè)視圖及視覺樣式修改過程中命令欄內(nèi)的顯示情況


??顯然,實現(xiàn)這兩項功能的 Python 代碼為:


#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """from pyautocad import Autocadpyacad = Autocad(create_if_not_exists=True) pyacad.prompt("Hello! AutoCAD from pyautocad.") print(pyacad.doc.Name)pyacad.ActiveDocument.SendCommand("_-view" + chr(13) + "_swiso" + chr(13)) # 定義預(yù)設(shè)視圖為西南等軸測。 pyacad.ActiveDocument.SendCommand("_vscurrent" + chr(13) + "_R" + chr(13)) # 視圖樣式設(shè)置為真實。

??值得注意的是,不是所有的功能均可由該方式實現(xiàn),極其個別的功能就實現(xiàn)不了,但是這些功能通常也沒必要采用二次開發(fā)的方式實現(xiàn),直接點下軟件界面不好么。



9.2 GetEntity


??更多圖元選擇即選擇集功能的實現(xiàn),詳見博客:Python AutoCAD 選擇集 。



??以下代碼實現(xiàn)將所選圖元的顏色更改為紅色。


#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """import pythoncom import win32com.client import mathwincad = win32com.client.Dispatch("AutoCAD.Application") doc = wincad.ActiveDocument doc.Utility.Prompt("Hello! Autocad from pywin32com.\n") msp = doc.ModelSpace print(doc.Name)def vtpnt(x, y, z=0):"""坐標點轉(zhuǎn)化為浮點數(shù)"""return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))pnt1, pnt2, pnt3 = vtpnt(-40, -40), vtpnt(500, 500), vtpnt(300, 200) lineObj = msp.AddLine(pnt1, pnt2) circleObj = msp.AddCircle(pnt3, 100)print("請在CAD程序界面點選圖元,未選中則報錯!") # try...except處理報錯 rtnObj = doc.Utility.GetEntity() # 返回對象print(rtnObj) print("所選圖元的ID:", rtnObj[0].ObjectID) print("鼠標單擊處的坐標:", rtnObj[1])sltObject = doc.ObjectIdToObject(rtnObj[0].ObjectID) # 圖元ID轉(zhuǎn)化為對應(yīng)的圖元clr = doc.Application.GetInterfaceObject("AutoCAD.AcCmColor.19") clr.SetRGB(255, 0, 0) # 創(chuàng)建紅色 sltObject.TrueColor = clr # 指定顏色doc.Application.Update()

9.3 SetXData/GetXData

#!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """# This example creates a line and attaches extended data to that line.import pythoncom import win32com.clientwincad = win32com.client.Dispatch("AutoCAD.Application") doc = wincad.ActiveDocument doc.Utility.Prompt("Hello! Autocad from pywin32com.\n") msp = doc.ModelSpace print(doc.Name)def vtpnt(x, y, z=0):return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))def vtfloat(val):return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, val)def vtint(val):return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, val)def vtvariant(var):return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, var)# Create the linestartPntCoords = vtpnt(1, 1, 0) startPoint = msp.AddPoint(startPntCoords) endPntCoords = vtpnt(5, 5, 0) endPoint = msp.AddPoint(endPntCoords) lineObj = msp.AddLine(startPntCoords, endPntCoords)# Initialize all the xdata values. Note that first data in the list should be # application name and first datatype code should be 1001DataType = [1001, 1000, 1003, 1040, 1041, 1070, 1071, 1042] Data = ["Test_Application", "This is a test for xdata","0", 1.23479137438413E+40, 1237324938, 32767, 32767, 10] reals3 = [-2.95, 100, -20] # DataType.append(1010) # Data.append(reals3) # worldPos = [4, 400.99999999, 2.798989] # DataType.append(1011) # Data.append(worldPos)DataType = vtint(DataType) Data = vtvariant(Data) # Attach the xdata to the line lineObj.SetXData(DataType, Data)# Return the xdata for the line xtypeOut, xdataOut = lineObj.GetXData("Test_Application") print(xtypeOut) print(xdataOut)

??所添加的拓展數(shù)據(jù)可按如下方式查看: [ObjectARX] ArxDbg介紹、自動加載及其下載 。


擴展數(shù)據(jù)的查看


十、文件


??更多文件相關(guān)的操作,詳見博客:Python AutoCAD 文件 。


10.1 另存為.dwg/.dxf


??以下方法另存為的文件格式只能是 .dwg 和 .dxf,這與在 CAD 軟件中,依次點擊 文件 >> 另存為 是相對應(yīng)的。


  • 當前文件另存為.dwg/.dxf
  • ??將當前文件另存為 TestSaveAs.dxf,文件的版本是:AutoCAD 2013 DXF,代碼如下:

    pyacad.ActiveDocument.SaveAs("D:\\AutoCAD\\TestSaveAs", 61)

    ??上一代碼執(zhí)行完畢后,當前文件被程序關(guān)閉,TestSaveAs.dxf 文件被打開,且設(shè)定為當前活躍文件。

    ??參數(shù) 61 為 AcSaveAsType enum,表示另存為文件的類型是 AutoCAD 2013 DXF,其他常用類型如下:


    版本.dwg.dxf
    AutoCAD 20001213
    AutoCAD 20042425
    AutoCAD 20073637
    AutoCAD 20104849
    AutoCAD 20136061

    ??AcSaveAsType enum 可在官方二次開發(fā)幫助文檔 ActiveX Develop’s Guide 中查看,查看方式如下圖所示:




  • 特定文件另存為.dwg/.dxf
  • ??將特定文件 PyAutoCAD.dwg 另存為 TestSaveAs.dxf,文件的版本是:AutoCAD 2013 DXF,代碼如下:

    pyacad.ActiveDocument.Application.Documents("PyAutoCAD.dwg").SaveAs("D:\\AutoCAD\\TestSaveAs", 61)

    10.2 另存為.pdf


    ??首先,確認繪圖儀 DWG To PDF.pc3 的工作目錄,在搜索神器 Everything 的搜索欄中輸入 DWG To PDF.pc3,便可得到繪圖儀的工作目錄,如下圖所示:




    ??另存為 .pdf 文件的 Python 代碼如下:


    #!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """from pyautocad import Autocadpyacad = Autocad(create_if_not_exists=True) pyacad.prompt("Hello! AutoCAD from pyautocad.") print(pyacad.doc.Name)print(pyacad.ActiveDocument.ActiveLayout.ConfigName)# 設(shè)置繪圖儀管理器的工作目錄 ACADPref = pyacad.ActiveDocument.Application.preferences.FilesoriginalValue = ACADPref.PrinterConfigPath \= r"C:\Users\33876\AppData\Roaming\Autodesk\AutoCAD 2014\R19.1\chs\Plotters"print(ACADPref) print(originalValue)oplot = pyacad.ActiveDocument.PlotConfigurations.Add("PDF", acad.ActiveDocument.ActiveLayout.ModelType)# acad.ActiveDocument.SetVariable("sdi", 0) pyacad.ActiveDocument.ActiveLayout.ConfigName = "DWG To PDF.pc3" pyacad.ActiveDocument.SetVariable("Filedia", 0)# acad.ActiveDocument.SetVariable("RASTERPREVIEW", 1) pyacad.ActiveDocument.SetVariable("BACKGROUNDPLOT", 0) pyacad.ActiveDocument.Plot.QuietErrorMode = True# acad.ActiveDocument.Plot.PlotToFile("D:\\" + "123" + ".pdf", "Foxit Reader PDF Printer") pyacad.ActiveDocument.Plot.PlotToFile("D:\\" + "test" + ".pdf")oplot.Delete() oplot = None obj = pyacad.ActiveDocument.GetVariable("DBMOD") print(obj)

    ????參考資料: 使用python將cad批量導(dǎo)出至pdf 。

    ??本代碼只是簡單介紹該功能的實現(xiàn),打印范圍等更為詳細的設(shè)置,請查看二次開發(fā)幫助文檔。



    10.3 另存為.jpg/.png


    ??更改繪圖儀設(shè)置即可,可參考另存為.dpf。



    確定繪圖儀的工作路徑
    #!/usr/bin/env python # -*- coding: utf-8 -*-"""=============================Author: DalNurEmail: liyang@alu.hit.edu.cn============================= """import win32com.clientwincad = win32com.client.Dispatch("AutoCAD.Application") doc = wincad.ActiveDocument doc.Utility.Prompt("Hello! Autocad from pywin32com.\n") msp = doc.ModelSpaceprint(doc.Name) print(doc.ActiveLayout.ConfigName)# 設(shè)置繪圖儀管理器的工作目錄 ACADPref = doc.Application.preferences.FilesoriginalValue = ACADPref.PrinterConfigPath \= r"C:\Users\33876\AppData\Roaming\Autodesk\AutoCAD 2014\R19.1\chs\Plotters"print(ACADPref) print(originalValue)oplot = doc.PlotConfigurations.Add("JPG", doc.ActiveLayout.ModelType)doc.ActiveLayout.ConfigName = "PublishToWeb JPG.pc3" doc.SetVariable("Filedia", 0)doc.SetVariable("BACKGROUNDPLOT", 0) doc.Plot.QuietErrorMode = Truedoc.Plot.PlotToFile("D:\\" + "test" + ".jpg")oplot.Delete() oplot = None obj = doc.GetVariable("DBMOD") print(obj)

    ??CAD轉(zhuǎn)化為JPG后,圖片模糊不清楚怎么辦 ?




    十一、致謝


    ??特別感謝 ke1078 同學提供的無私幫助,使得 Python 語言二次開發(fā) AutoCAD 的許多高級功能得以順利實現(xiàn)。




    十二、說明


    ??2018年12月13日,該系列博客僅僅以一篇名為 【Python pyautocad庫 使用簡介】 的博客形式出現(xiàn)在 CSDN 上。為了清晰直觀,2019年7月20日左右,博主以博客【Python pyautocad庫 使用簡介】為基礎(chǔ),按部分將原文擴展成 9 篇博客,后續(xù)又陸續(xù)進行了修改和編輯,特此說明。這 9 篇博客以 AutoCAD 草圖與注釋 工作空間菜單欄內(nèi)的功能區(qū)分為標準,較為詳細地介紹了 Python 調(diào)用 AutoCAD 相關(guān)功能的實現(xiàn)。碼字不易,轉(zhuǎn)載還請注明出處!


    AutoCAD草圖與注釋

    轉(zhuǎn)載請注明出處!
    轉(zhuǎn)載請注明出處!
    轉(zhuǎn)載請注明出處!


    原博客部分內(nèi)容

    ??這 9 篇博客分別是:


    ???? - Python 二次開發(fā) AutoCAD 簡介

    ???? - Python 二次開發(fā) AutoCAD 系統(tǒng)設(shè)置

    ???? - Python 二次開發(fā) AutoCAD 圖層

    ???? - Python 二次開發(fā) AutoCAD 繪圖

    ???? - Python 二次開發(fā) AutoCAD 修改

    ???? - Python 二次開發(fā) AutoCAD 塊組

    ???? - Python 二次開發(fā) AutoCAD 注釋

    ???? - Python 二次開發(fā) AutoCAD 文件

    ???? - Python 二次開發(fā) AutoCAD 選擇集




    十三、尾聲


    ??以上,便是 Python 語言二次開發(fā) AutoCAD 的簡單介紹。

    ??因篇幅有限,某些非關(guān)鍵功能未做詳細介紹,如有疑問,歡迎郵件交流。

    ??Email: liyang@alu.hit.edu.cn 。

    ??僅以此文為我斷斷續(xù)續(xù)一年多的 Python 調(diào)用 AutoCAD 的相關(guān)工作做一個總結(jié)。

    ??與此同時,也希望能夠為初學者/有需要的人提供多一點參考。

    ??本文僅用于個人學習,除此之外,無其他任何用途。

    ??因個人水平有限,文中難免有所疏漏,還請各位大神不吝批評指正。

    ??胸藏文墨懷若谷,腹有詩書氣自華,希望各位都能在知識的 pāo 子里快樂徜徉。

    ??本文最早發(fā)表于 2018-12-13 18:20:21,最后修改于 2020-4-25 22:02:07。

    ??如無特殊原因,不再更新!

    ??本文邏輯清楚,內(nèi)容詳實,引例豐富。

    ??歡迎大家點贊、評論及轉(zhuǎn)載,轉(zhuǎn)載請注明出處!

    ??為我打call,不如為我打款!

    ??打賞可備注郵箱,本人將贈送本系列博客的全部 Python 源代碼。

    ??最后,祝各位攻城獅們,珍愛生命,保護發(fā)際線!






    十四、參考文獻


    [1]. 使用Python讀寫DXF和DWG文件. 大專欄.

    [2]. VARIANT的使用方法. xinzhiyounizhiyouni.

    [3]. comtypes 1.1.3 documentation




    總結(jié)

    以上是生活随笔為你收集整理的Python 二次开发 AutoCAD 简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。