Python 二次開發 AutoCAD 簡介



Blog Links





轉載請註明出處!



一、前沿


  AutoCAD(Autodesk Computer Aided Design)是 Autodesk(歐特克)公司首次於 1982 年開發的自動計算機輔助設計軟件,在土木建築,裝飾裝潢,工業製圖,工程製圖,電子工業,服裝加工等諸多領域有着廣泛的應用,主要用於二維繪圖、詳細繪製、設計文檔和基本三維設計,現已經成爲國際上廣爲流行的繪圖工具。

  上世紀 80 年代末 90 年代初, Guido van Rossum 在荷蘭國家數學和計算機科學研究所設計出計算機程序設計語言 Python 。 Python 是一個高層次的結合瞭解釋性、編譯性、互動性和麪向對象的腳本語言,具有很強的可讀性。相比其他語言,語法結構更具特色。同時,它也是一種跨平臺的計算機程序設計語言,越來越多地用於獨立的、大型項目的開發。


  爲什麼採用 Python 語言二次開發 AutoCAD ?


  • Python 是一種代表簡單主義思想的語言,簡單易學,應用範圍廣泛 。

  • Python 擁有大量第三方庫,可輕易實現各種應用程序間的數據交換,如 AutoCAD 與 Excel / Word 間的數據交換。

  • 只要具有基礎的 Python 編程能力,就可實現對 AutoCAD 的二次開發,而不必特意學習 VBA 或者 LISP 。


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


  總之,人的精力是有限的, Windows 平臺上的應用程序是各種各樣的,我們力爭只熟練掌握一門編程語言就能將各種應用程序串聯起來,以實現數據的順利傳遞,從而大幅度地提高工作效率和質量。這也是我當時在全網參考代碼很少的情況下堅持用 Python 調用 CAD 的原因。這個過程並非順利,本人純野生學習 Python,很多小 bug 都要查很久的資料才能解決。因粗心看錯了幫助文檔的參數定義,在繪製橢圓這卡了將近一個月;因不瞭解 CAD 系統對顏色的定義規則,在模型空間背景色設置上卡了將近3個月,通過不斷測試,硬是靠最原始的總結規律得到了顏色指定的換算公式;因不瞭解 Python 中的數據類型如何對應 AutoCAD 中的 Variant,圖案填充這又卡了好幾個月,最終在 ke1078 大神的幫助下,順利實現了圖案填充的繪製。爲了使後續的學習者少走彎路,把寶貴的時間用於所研究的問題上,而非軟件操作層面,特此,將本人所瞭解到的 Python 語言二次開發 CAD 的有關內容記錄在此係列博客上。還需說明的是,因本人能力和水平確實有限,博客中的有關表述可能不嚴謹,甚至錯誤,還請大家及時批評指正。



在這裏插入圖片描述



二、ActiveX Automation


  ActiveX Automation 是 ActiveX 爲 Windows 用戶提供的一項重要技術,可以使各應用程序間通過數據嵌入或鏈接的方式共享數據,並在 Windows 系統統一管理下進行協調,讓這些應用程序以一定的流程相互溝通,相互控制,即一個程序暴露其可用對象,另一個程序控制這些對象,設置屬性、調用方法,從而實現某種功能,完成所要求的動作。

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

  AutoCAD 以分層結構來組織對象,分層結構的視圖稱爲“對象模型”,如下圖所示。Application 對象是 AutoCAD ActiveX Automation 對象模型的根對象,通過它,用戶可以訪問任何其他的對象或任何對象指定的特性或方法。對象模型給出了上級對象與下級對象之間的訪問關係。



在這裏插入圖片描述


AutoCAD對象模型 (部分)


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


  • 參考資料AutoCAD ActiveX 二次開發技術



三、幫助文檔


3.1 AutoCAD Help


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

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


在這裏插入圖片描述


在這裏插入圖片描述

幫助文檔的獲取


3.2 pywin32 Help


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


在這裏插入圖片描述

PyWin32幫助文檔的獲取

在這裏插入圖片描述

PyWin32幫助文檔


四、可用Python庫


  在介紹各種Python庫前,有必要對 AutoCAD 的文件系統做一個簡單的瞭解。


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

  dxf 是 AutoCAD 繪圖交換文件,它是 Autodesk 公司開發的用於 AutoCAD 與其它軟件之間進行 CAD 數據交換的 CAD 數據文件格式。

  DXF是一種開放的矢量數據格式,可以分爲兩類:ASCII格式和二進制格式;ASCII具有可讀性好的特點,但佔用的空間較大;二進制格式則佔用的空間小、讀取速度快。由於AutoCAD是最流行的CAD系統,DXF也被廣泛使用,成爲事實上的標準。絕大多數CAD系統都能讀入或輸出DXF文件。ASCII 格式的 DXF 可以用文本編輯器進行查看。

  dxf (圖形交換文件) 是一種 ASCII 文本文件,它包含對應的 dwg 文件的全部信息,不是 ASCII 碼形式,可讀性差,但用它形成圖形速度快,不同類型的計算機哪怕是用同一版本的文件,其 dwg 文件也是不可交換的。爲了克服這一缺點,AutoCAD 提供了 dxf 類型文件,其內部爲 ASCII 碼,這樣不同類型的計算機可通過交換 dxf 文件來達到交換圖形的目的,由於 dxf 文件可讀性好,用戶可方便地對它進行修改,編程,達到從外部圖形進行編輯和修改的目的。

  dwg 格式以及它的 ASCII 格式變體 dxf,已經成爲 CAD 製圖數據交換中的事實文件標準。


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

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




4.1 pyautocad


  pyautocad 庫由俄羅斯工程師 Roman Haritonov 開發,用於簡化使用 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源代碼


pyautocad源代碼 (部分)


4.2 pywin32


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


  • PiPy: https://pypi.org/project/pywin32

  • Github: https://github.com/mhammond/pywin32


  • 與 CAD 的連接

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

import win32com.client as win32

wincad = win32.Dispatch("AutoCAD.Application")
doc = wincad.ActiveDocument
msp = doc.ModelSpace

doc.Utility.Prompt("Hello! Autocad from pywin32com.\n")

print(doc.Name)

  • 示例

在這裏插入圖片描述

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


4.3 ezdxf


  • ezdxf 庫的安裝

  如已安裝 Anaconda,在 Anaconda Prompt 中鍵入 pip install ezdxf 便可自動完成該庫的導入,如下圖所示;如未安裝 Anaconda,也可 pip 手動導入,其在 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 二次開發 Python 庫,可根據個人需要,選擇合適的 Python 庫。

  若想創建 .dwg 文件,建議採用 pywin32 庫;若想創建 .dxf 文件,同時脫離 AutoCAD 軟件環境,則可採用 ezdxf、dxfwrite,也可以採用 pywin32 庫繪製好相應的文件後,以另存爲的方式創建 .dxf 文件。

  事實上,pyautocad 庫和 pywin32 庫僅僅起到了接口作用,它們只是構建好數據傳輸的通道,真正實現圖形創建的是 AutoCAD 程序本身,AutoCAD 應用程序接收來自 Python 的命令後,完成圖形的繪製等。因此,大家不必糾結於採用何種方式與 CAD 建立連接。

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



  • Python 二次開發 Excel 簡介

  • Python 二次開發 SAP2000 概述

  • Abaqus 二次開發 基本概念

  • nCodeDL 疲勞分析 簡明教程

  • Python 二次開發 Word 簡介



在這裏插入圖片描述

.dwg文件的創建邏輯


在這裏插入圖片描述

.dxf文件的創建邏輯


五、ProgID


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


#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

import win32com.client
import pythoncom

wincad = win32com.client.Dispatch("AutoCAD.Application.18")
doc = wincad.ActiveDocument
doc.Utility.Prompt("Hello! Autocad from pywin32com.\n")
msp = doc.ModelSpace
print(doc.Name)

  根據 CAD 版本的不同, ProgID 可能發生變化,部分版本 CAD 的 ProgID 如下:


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

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


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


在這裏插入圖片描述


ProgID的查看


六、數據轉換



  目的: 爲了保證程序的順利運行,用戶輸入的數據類型需轉換成 CAD 能識別的數據類型。

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


  Python 中的數據類型較少,且對數據本身的要求也較爲寬鬆,如一個列表中的各個元素可以分別屬於不同的數據類型,這雖然有利於降低程序的編寫難度,但也對 CAD 的二次開發產生了一些不必要的麻煩。

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

  VARIANT 結構體主要是使用在 COM(組件對象模型)中用於傳遞參數使用,它的存在主要是爲了保持一個在 COM 參數傳遞方法的統一性,它幾乎包含了所有普通常用類型的數據類型的傳遞,如整型,浮點型,布爾型等,以及相應類型的指針類型,如整型指針。[2]


  部分類型與變量對應關係如下表:


Member name Description
VT_EMPTY Indicates that a value was not specified.
VT_R8 Indicates a double value.
VT_DISPATCH Indicates 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 庫幫助文檔原文,本人對計算機瞭解有限,爲了不曲解原文,此處不做翻譯),部分對應關係如下:


NumPy type VARIANT type
int32, int, intc, int_ VT_I4
uint32, uint, uintc VT_UI4
float64, float_ VT_R8

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


  NumPy 是用 Python 進行科學計算的基礎軟件包,其官方的中文文檔詳見網站: Numpy 中文網


  在 Python 調用 AutoCAD 過程中,常用的數據轉換函數如下:


#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

import win32com.client
import pythoncom

wincad = 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):
    """座標點轉化爲浮點數"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))

def 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)
    
def vtint(lst):
    """列表轉化爲整數"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, lst)

def vtvariant(lst):
    """列表轉化爲變體"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, lst)


七、繪圖


  本部分僅介紹一些複雜圖形的繪製,更多基礎圖形的繪製詳見博客:Python AutoCAD 繪圖


7.1 倒角矩形


#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

from pyautocad import Autocad, APoint, aDouble
import math

pyacad = 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]  # 倒角矩形各關鍵點橫座標的絕對值;
y = [0.5 * (B - 2 * R), 0.5 * B]  # 倒角矩形各關鍵點縱座標的絕對值;

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]  # 將各點座標順序變換爲行數據
pnts = aDouble(pnts)  # 轉化爲雙精度浮點數

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部分設置爲凸度爲bulgevalue的圓弧。

在這裏插入圖片描述

倒角矩形

7.2 閉合多段線圖案填充


#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

import pythoncom
import win32com.client

wincad = win32com.client.Dispatch("AutoCAD.Application")
doc = wincad.ActiveDocument
doc.Utility.Prompt("Hello! AutoCAD from pywin32.")
msp = doc.ModelSpace

def 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 = True

outerLoop = []
outerLoop.append(plineObj)
outerLoop = vtobj(outerLoop)
hatchObj = msp.AddHatch(ptnType, ptnName, bAss)
hatchObj.AppendOuterLoop(outerLoop)
hatchObj.Evaluate()  # 進行填充計算,使圖案吻合於邊界。

在這裏插入圖片描述

閉合多段線的圖案填充


八、顏色


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


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


  例如: 對於白色(R=255,G=255,B=255),其對應的顏色標識號 clr 爲 255 + 256 × 255 + 256 × 256 × 255 = 16777215。


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


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

  • 示例


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


在這裏插入圖片描述

R=198 G=224 B=180

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

from pyautocad import Autocad

pyacad = 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

在這裏插入圖片描述

模型空間背景色的設置


  該功能的實現歷經波折,卡頓了近三個月,終於,在那一天下班鈴響後測試成功。


  值得注意的是,不是所有的顏色指定都可以採用該種方式,如圖案填充顏色的設置就是通過直接設置 RGB 的方式實現的。


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



九、重要方法


9.1 SendCommad


在這裏插入圖片描述

SendCommand方法


  極個別情況下,採用常規方式很難實現某一功能,如設置默認視圖、定義永久標註樣式等。此時,可嘗試採用 SendCommand 方式來實現。具體方法爲,先在 AutoCAD 軟件界面操作一遍,然後查看在此過程中提示工具欄內的數據變化,最後,將這些變化稍加改動按照 CAD 二次開發的規則輸入到 SendCommand 內,即可得到相應的 Python 代碼。

  以直線的繪製爲例,在 AutoCAD 軟件中的操作步驟爲:輸入繪製直線的快捷命令 “L” > 回車 > 屏幕上點選第一個點 > 回車 > 屏幕上點選第二個點 > 回車,直覺告訴我們 SendCommand 括號內數據輸入也應該是這一順序,即


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


在這裏插入圖片描述

直線繪製過程中命令欄內的顯示情況


在這裏插入圖片描述

SendCommand方式繪製直線的Python代碼

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


在這裏插入圖片描述

預設視圖及視覺樣式的修改

在這裏插入圖片描述

預設視圖及視覺樣式修改過程中命令欄內的顯示情況


  顯然,實現這兩項功能的 Python 代碼爲:


#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

from pyautocad import Autocad

pyacad = 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))  # 定義預設視圖爲西南等軸測。
pyacad.ActiveDocument.SendCommand("_vscurrent" + chr(13) + "_R" + chr(13))  # 視圖樣式設置爲真實。

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


9.2 GetEntity


  更多圖元選擇即選擇集功能的實現,詳見博客:Python AutoCAD 選擇集


在這裏插入圖片描述


  以下代碼實現將所選圖元的顏色更改爲紅色。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

import pythoncom
import win32com.client
import math

wincad = 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))

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轉化爲對應的圖元

clr = doc.Application.GetInterfaceObject("AutoCAD.AcCmColor.19")
clr.SetRGB(255, 0, 0)  # 創建紅色
sltObject.TrueColor = clr  # 指定顏色

doc.Application.Update()


十、文件


  更多文件相關的操作,詳見博客:Python AutoCAD 文件


10.1 另存爲.dwg/.dxf


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


  1. 當前文件另存爲.dwg/.dxf

  將當前文件另存爲 TestSaveAs.dxf,文件的版本是:AutoCAD 2013 DXF,代碼如下:

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

  上一代碼執行完畢後,當前文件被程序關閉,TestSaveAs.dxf 文件被打開,且設定爲當前活躍文件。

  參數 61 爲 AcSaveAsType enum,表示另存爲文件的類型是 AutoCAD 2013 DXF,其他常用類型如下:


版本 .dwg .dxf
AutoCAD 2000 12 13
AutoCAD 2004 24 25
AutoCAD 2007 36 37
AutoCAD 2010 48 49
AutoCAD 2013 60 61

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


在這裏插入圖片描述



  1. 特定文件另存爲.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: DalNur
    Email: [email protected]
    =============================
"""

from pyautocad import Autocad

pyacad = Autocad(create_if_not_exists=True)
pyacad.prompt("Hello! AutoCAD from pyautocad.")
print(pyacad.doc.Name)

print(pyacad.ActiveDocument.ActiveLayout.ConfigName)

# 設置繪圖儀管理器的工作目錄
ACADPref = pyacad.ActiveDocument.Application.preferences.Files

originalValue = 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批量導出至pdf

  本代碼只是簡單介紹該功能的實現,打印範圍等更爲詳細的設置,請查看二次開發幫助文檔。


10.3 另存爲.jpg/.png


  更改繪圖儀設置即可,可參考另存爲.dpf。


在這裏插入圖片描述


在這裏插入圖片描述

確定繪圖儀的工作路徑

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: [email protected]
    =============================
"""

import win32com.client

wincad = win32com.client.Dispatch("AutoCAD.Application")
doc = wincad.ActiveDocument
doc.Utility.Prompt("Hello! Autocad from pywin32com.\n")
msp = doc.ModelSpace

print(doc.Name)
print(doc.ActiveLayout.ConfigName)

# 設置繪圖儀管理器的工作目錄
ACADPref = doc.Application.preferences.Files

originalValue = 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 = True

doc.Plot.PlotToFile("D:\\" + "test" + ".jpg")

oplot.Delete()
oplot = None
obj = doc.GetVariable("DBMOD")
print(obj)

  CAD轉化爲JPG後,圖片模糊不清楚怎麼辦 ?



十一、致謝


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



十二、說明


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


在這裏插入圖片描述

AutoCAD草圖與註釋


轉載請註明出處!

轉載請註明出處!

轉載請註明出處!



在這裏插入圖片描述

原博客部分內容

  這 9 篇博客分別是:


     - Python 二次開發 AutoCAD 簡介

     - Python 二次開發 AutoCAD 系統設置

     - Python 二次開發 AutoCAD 圖層

     - Python 二次開發 AutoCAD 繪圖

     - Python 二次開發 AutoCAD 修改

     - Python 二次開發 AutoCAD 塊組

     - Python 二次開發 AutoCAD 註釋

     - Python 二次開發 AutoCAD 文件

     - Python 二次開發 AutoCAD 選擇集



十三、尾聲


  以上,便是 Python 語言二次開發 AutoCAD 的簡單介紹。

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

  Email: [email protected]

  僅以此文爲我斷斷續續一年多的 Python 調用 AutoCAD 的相關工作做一個總結。

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

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

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

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

  本文最早發表於 2018-12-13 18:20:21,最後修改於 2020-4-25 22:02:07。

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

  本文邏輯清楚,內容詳實,引例豐富。

  歡迎大家點贊、評論及轉載,轉載請註明出處!

  爲我打call,不如爲我打款!

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

  最後,祝各位攻城獅們,珍愛生命,保護髮際線!



在這裏插入圖片描述




十四、參考文獻


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

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

[3]. comtypes 1.1.3 documentation




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章