利用python控制Autocad:pyautocad方式

发现pyautocad模块:可以用python控制autocad的包。今天把文档中的重点内容摘录出来,以后绘图、计算大工程量、或者识别施工图的时候时候也许可以用到。

一、连接cad

pyautocad包可以用任何版本的cad进行操作,实际上接口都是一样的。文档中首先给出连接cad的代码:

from pyautocad import Autocad, APoint
acad = Autocad(create_if_not_exists=True)
acad.prompt("Hello, Autocad from Python\n")
print acad.doc.Name

第一行:自动连接上cad,只要cad是开着的,就创建了一个<pyautocad.api.Autocad> 对象。这个对象连接最近打开的cad文件。

如果此时还没有打开cad,将会创建一个新的dwg文件,并自动开启cad软件(贴心)

第二行:acad.prompt() 用来在cad控制台中打印文字

第三行:acad.doc.Name储存着cad最近打开的图形名

二、ActiveX interface(这个到底是什么东西)

可以利用ActiveX interface,python中储存的autocad对象中保存了一些可以简化操作的自动化操作(可以迭代对象、搜索对象等等)

三、用acad.model 对象绘制简单图形

acad.model对象是用来在图形中添加图元的,先来做一个简单的功能,在两点之间画线,以一个点为圆心画圆

# 已经导入 APoint 类
p1 = APoint(0, 0)
p2 = APoint(50, 25)
for i in range(5):
  text = acad.model.AddText(u'Hi %s!' % i, p1, 2.5)
  acad.model.AddLine(p1, p2)
  acad.model.AddCircle(p1, 10)
  p1.y += 10

1、循环中的第一行用于添加一个Text,参数:(u'%s' % text, x, y)

如果后面不需要操作AddText对象的话,只是实现在cad中创建一个Text并不一定要创建变量,直接调用acad.model.AddText()方法就可以做到了。

2、acad.model.AddCircle(p1, 10) 画圆,同理

3、可以尝试更多的 addXxxx 方法,由于文档中并没有写输入变量究竟是什么,慢慢尝试吧

尝试过可以使用的:addPolyLine(

练练手:

用递归程序写一个在cad中画一个螺旋图,写的有点啰嗦,

from pyautocad import Autocad, APoint

acad = Autocad(create_if_not_exists = True)
p = APoint(5, 0)

def recur(p, step, layer):
  if layer == 50:
    return
  p2 = next_p(p, layer, step)
  acad.model.AddLine(p, p2)
  layer += 1
  step += 5
  print step
  recur(p2, step, layer)

def next_p(p, i, step):
  x = p.x
  y = p.y
  if i % 4 == 0:
    x += step
  elif i % 4 == 1:
    y += step
  elif i % 4 == 2:
    x -= step
  elif i % 4 == 3:
    y -= step
  return APoint(x, y)
if __name__ == '__main__':
  recur(p, 0, 0)

画出来是这个样子的,还是挺好玩的

四、遍历cad图形对象以及访问/修改对象属性

基本的遍历图形中所有图元的方法:

for obj in acad.iter_objects():
  print obj.ObjectName
  # ObjectName 可以打印出对象的类型

想要按类型查找出所有某种图元(如所有Text对象):

for text in acad.iter_objects('Text'): print text.TextString, text.InsertionPoint

或者也可以在类型选择时填入多种类型,如:

for obj in acad.iter_objects(['Text', 'Line']): print obj.ObjectName

pyautocad还提供了一个比较

*文档中特地说明:按照类型查找可以混淆大小写,也可以只输入类型的一部分,比如查找”te”类型就可以自动匹配到text类型,输入”li“就自动匹配到Ellipse和Line类型,挺方便的吧~

访问对象的属性

以下内容文档中貌似没有写,探究一下:

用dir(text)可以得出很多text下的属性和方法:

# 属性/方法 第一种形式(可以直接调用)
AddRef
Application
ArrayPolar
ArrayRectangular
AttachmentPoint
BackgroundFill
Copy
Database
Delete
Document
DrawingDirection
EntityName
EntityTransparency
EntityType
Erase
FieldCode
GetBoundingBox
GetExtensionDictionary
GetIDsOfNames
GetTypeInfo
GetTypeInfoCount
GetXData
Handle
HasExtensionDictionary
Height
Highlight
Hyperlinks
InsertionPoint
IntersectWith
Invoke
Layer
LineSpacingDistance
LineSpacingFactor
LineSpacingStyle
Linetype
LinetypeScale
Lineweight
Material
Mirror
Mirror3D
Move
Normal
ObjectID
ObjectID32
ObjectName
OwnerID
OwnerID32
PlotStyleName
QueryInterface
Release
Rotate
Rotate3D
Rotation
ScaleEntity
SetXData
StyleName
TextString
TransformBy
TrueColor
Update
Visible
Width

# 属性/方法 第二种形式
_AddRef
_GetIDsOfNames
_GetTypeInfo
_IAcadEntity__com_ArrayPolar
_IAcadEntity__com_ArrayRectangular
_IAcadEntity__com_Copy
_IAcadEntity__com_GetBoundingBox
_IAcadEntity__com_Highlight
_IAcadEntity__com_IntersectWith
_IAcadEntity__com_Mirror
_IAcadEntity__com_Mirror3D
_IAcadEntity__com_Move
_IAcadEntity__com_Rotate
_IAcadEntity__com_Rotate3D
_IAcadEntity__com_ScaleEntity
_IAcadEntity__com_TransformBy
_IAcadEntity__com_Update
_IAcadEntity__com__get_EntityName
_IAcadEntity__com__get_EntityTransparency
_IAcadEntity__com__get_EntityType
_IAcadEntity__com__get_Hyperlinks
_IAcadEntity__com__get_Layer
_IAcadEntity__com__get_Linetype
_IAcadEntity__com__get_LinetypeScale
_IAcadEntity__com__get_Lineweight
_IAcadEntity__com__get_Material
_IAcadEntity__com__get_PlotStyleName
_IAcadEntity__com__get_TrueColor
_IAcadEntity__com__get_Visible
_IAcadEntity__com__get_color
_IAcadEntity__com__set_EntityTransparency
_IAcadEntity__com__set_Layer
_IAcadEntity__com__set_Linetype
_IAcadEntity__com__set_LinetypeScale
_IAcadEntity__com__set_Lineweight
_IAcadEntity__com__set_Material
_IAcadEntity__com__set_PlotStyleName
_IAcadEntity__com__set_TrueColor
_IAcadEntity__com__set_Visible
_IAcadEntity__com__set_color
_IAcadMText__com_FieldCode
_IAcadMText__com__get_AttachmentPoint
_IAcadMText__com__get_BackgroundFill
_IAcadMText__com__get_DrawingDirection
_IAcadMText__com__get_Height
_IAcadMText__com__get_InsertionPoint
_IAcadMText__com__get_LineSpacingDistance
_IAcadMText__com__get_LineSpacingFactor
_IAcadMText__com__get_LineSpacingStyle
_IAcadMText__com__get_Normal
_IAcadMText__com__get_Rotation
_IAcadMText__com__get_StyleName
_IAcadMText__com__get_TextString
_IAcadMText__com__get_Width
_IAcadMText__com__set_AttachmentPoint
_IAcadMText__com__set_BackgroundFill
_IAcadMText__com__set_DrawingDirection
_IAcadMText__com__set_Height
_IAcadMText__com__set_InsertionPoint
_IAcadMText__com__set_LineSpacingDistance
_IAcadMText__com__set_LineSpacingFactor
_IAcadMText__com__set_LineSpacingStyle
_IAcadMText__com__set_Normal
_IAcadMText__com__set_Rotation
_IAcadMText__com__set_StyleName
_IAcadMText__com__set_TextString
_IAcadMText__com__set_Width
_IAcadObject__com_Delete
_IAcadObject__com_Erase
_IAcadObject__com_GetExtensionDictionary
_IAcadObject__com_GetXData
_IAcadObject__com_SetXData
_IAcadObject__com__get_Application
_IAcadObject__com__get_Database
_IAcadObject__com__get_Document
_IAcadObject__com__get_Handle
_IAcadObject__com__get_HasExtensionDictionary
_IAcadObject__com__get_ObjectID
_IAcadObject__com__get_ObjectID32
_IAcadObject__com__get_ObjectName
_IAcadObject__com__get_OwnerID
_IAcadObject__com__get_OwnerID32
_IDispatch__com_GetIDsOfNames
_IDispatch__com_GetTypeInfo
_IDispatch__com_GetTypeInfoCount
_IDispatch__com_Invoke
_IUnknown__com_AddRef
_IUnknown__com_QueryInterface
_IUnknown__com_Release
_Invoke
_QueryInterface
_Release
__class__
__cmp__
__com_interface__
__ctypes_from_outparam__
__del__
__delattr__
__dict__
__doc__
__eq__
__format__
__getattr__
__getattribute__
__hash__
__init__
__map_case__
__metaclass__
__module__
__new__
__nonzero__
__reduce__
__reduce_ex__
__repr__
__setattr__
__setstate__
__sizeof__
__str__
__subclasshook__
__weakref__
_b_base_
_b_needsfree_
_case_insensitive_
_compointer_base__get_value
_idlflags_
_iid_
_invoke
_methods_
_needs_com_addref_
_objects
_type_
color
from_param
value

这些cad图元的属性和方法是分明存在的,但是应该怎么才能get或者set这些属性呢?

可以看到形如“_IAcadMText__com__set_Width”的私有属性(现在我也不知道这些属性能够怎么利用,也许这个是句柄??不懂)。但是所有这些属性中,可以直接调用的方法中大部分(在代码区里的第一类公有属性中)是可以与之匹配的。

这些公有属性应该是可以调用的,下面是一些例子:

1、调用move方法(set)

text.move(APoint(0,0), APoint(100,100)) #( 原点,相对原点的位置)

用这行代码就可以将所有的text对象向右、向上平移100个单位

2、访问layer属性(setter、getter)

print text.layer # 0

就提取出了text.layer的值,如果想要改变text对象的layer,直接赋值即可(给layer变量复制的layer名字必须已经存在,否则会报错)

text.layer = "new layer"
print text.layer
# new layer

3、提取PolyLine的各个顶点(很有用)

# for item in acad.iter_objects("PolyLine"):
  print item.Coordinates
'''
(-462.01707322354014, 719.8251441314151, 207.17175903027055, 1056.4031530064085, 389.6778054895749, 574.9096117303479, -143.80140284041954, 434.6687742615859, -326.30744929972207, -60.84885181138725, -564.9692056597924, 308.45202158973643, -327.4641724567995, 461.94033545845366, -593.0470534647193, 546.8614421365228, -616.4452718779175, 803.9696476627087)
'''
# 第1、2个元素构成第一个坐标, 3、4个元素构成第二个坐标

以上操作证明了确实可以通过调用对象的公有属性来操作cad中的对象,但是麻烦的是,由于这些方法都是ctype的,dir()这些方法无法得知具体应该输入那些参数和参数的类型,有待解决…

如果实在没有找到这些方法的文档说明,就只好一个一个试出来使用方法了

(补充:help(obj) 可以得到一些信息,但是好像还是没有参数类型信息。只能得到哪些obj的属性可以set,哪些可以get等等)

以上这篇利用python控制Autocad:pyautocad方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 利用Python自动化操作AutoCAD的实现

    1 Python自动绘图 在这里我主要运用了pyautocad库进行AutoCAD的自动化操作,pyautocad是一款功能非常强大的AutoCAD操作处理库,可以实现Python自动绘图.CAD图像对象读取.对象属性修改等操作. from pyautocad import Autocad,APoint # 连接及库导入 acad = Autocad(create_if_not_exists = True) acad.prompt("Hello! Autocad from Python.&quo

  • Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

    本文实例讲述了Python PyAutoGUI模块控制鼠标和键盘实现自动化任务.分享给大家供大家参考,具体如下: PyAutoGUI是用Python写的一个模块,使用它可以控制鼠标和键盘. 利用它可以实现自动化任务,再也不用担心有重复枯燥的任务了. pyautogui模块的功能: 移动鼠标.点击左右键和滚轮 发送虚拟按键 # 安装pyautogui 这个模块支持Windows, Mac OS X 和 Linux. 根据系统不同,你可能需要安装一些依赖. Linux系统(Debian系列): $

  • 详解Python中pyautogui库的最全使用方法

    在使用Python做脚本的话,有两个库可以使用,一个为PyUserInput库,另一个为pyautogui库.就本人而言,我更喜欢使用pyautogui库,该库功能多,使用便利.下面给大家介绍一下pyautogui库的使用方法.在cmd命令框中输入pip3 install pyautogui即可安装该库! 常用操作 我们在pyautogui库中常常使用的方法,如下: import pyautogui pyautogui.PAUSE = 1 # 调用在执行动作后暂停的秒数,只能在执行一些pyaut

  • Python AutoCAD 系统设置的实现方法

    1. 连接及库导入 #!/usr/bin/env python # -*- coding: utf-8 -*- ''' ============================= Author:DalNur Email: liyang@alu.hit.edu.cn Last Update: 2020.03.02 19:55 ============================= ''' from pyautocad import Autocad acad = Autocad(create_i

  • 利用python控制Autocad:pyautocad方式

    发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad包可以用任何版本的cad进行操作,实际上接口都是一样的.文档中首先给出连接cad的代码: from pyautocad import Autocad, APoint acad = Autocad(create_if_not_exists=True) acad.prompt("Hello, Autoc

  • 利用python实现平稳时间序列的建模方式

    一.平稳序列建模步骤 假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用ARMA模型对该序列进行建模.建模的基本步骤如下: (1)求出该观察值序列的样本自相关系数(ACF)和样本偏自相关系数(PACF)的值. (2)根据样本自相关系数和偏自相关系数的性质,选择适当的ARMA(p,q)模型进行拟合. (3)估计模型中位置参数的值. (4)检验模型的有效性.如果模型不通过检验,转向步骤(2),重新选择模型再拟合. (5)模型优化.如果拟合模型通过检验,仍然转向不走(2),充分考虑

  • python利用numpy存取文件的方式

    NumPy提供了多种存取数组内容的文件操作函数.保存数组数据的文件可以是二进制格式或者文本格式.二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型. numpy格式的文件可以保存为后缀为(.npy/.npz)格式的文件 1. tofile()和fromfile() tofile()将数组中的数据以二进制格式写进文件 tofile()输出的数据不保存数组形状和元素类型等信息 fromfile()函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改 import nump

  • 利用python合并csv文件的方式实例

    目录 1.用concat方法合并csv 2.glob模块批量合并csv 补充:Python处理(加载.合并)多个csv文件 总结 1.用concat方法合并csv 将两个相同的csv文件进行数据合并,通过pandas的read_csv和to_csv来完成,即采用concat方法: #加载第三方库 import pandas as pd import numpy as np #读取文件 df1 = pd.read_csv("文件-1.csv") df2 = pd.read_csv(&qu

  • 利用Python代码实现数据可视化的5种方法详解

    前言 数据科学家并不逊色于艺术家.他们用数据可视化的方式绘画,试图展现数据内隐藏的模式或表达对数据的见解.更有趣的是,一旦接触到任何可视化的内容.数据时,人类会有更强烈的知觉.认知和交流. 数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使事情变得更加清晰易懂,特别是对于大型.高维数据集.在项目结束时,以清晰.简洁和引人注目的方式展现最终结果是非常

  • 利用Python裁切tiff图像且读取tiff,shp文件的实例

    我就废话不多说了,还是直接看代码吧! from osgeo import gdal, gdalnumeric, ogr from PIL import Image, ImageDraw from osgeo import gdal_array import os import operator from functools import reduce gdal.UseExceptions() def readTif(fileName): dataset = gdal.Open(fileName)

  • 利用Python制作动态排名图的实现代码

    大家好,今天我们要讲的是如何使用 Pyecharts 制作动态排名变化图:point_down: 制作这样的一个动态图使用到的是 Pyecharts中的TimeLine(时间线轮播图) ,代码实现起来其实稍有难度,但我希望能 通过讲解这样一张动态图的制作过程,来让各位读者可以使用Pyecharts将任何一种图动起来 ,我们开始吧! 首先我们需要思考一下这样一种 动态图的生成逻辑 ,不就是把每天的数据制作成一张条形图然后轮动吗,OK那我们的 数据要整理成啥样 呢? 一个dataframe,每列是一

  • 利用Python读取微信朋友圈的多种方法总结

    目录 背景 法1,不适用 法2,已不能用 法3:Appnium 法4:模拟操作 整体代码 后续工作及扩展 总结 背景 由于课题需要爬取朋友圈的内容作为研究数据,稍微研究了一下. 目前爬取有四种方法,我们一一来分析一下. 法1,不适用 加某个微信号为好友,给这个微信号查看自己朋友圈的权限,然后那个微信号会把你自己朋友圈生成一个链接给你.一来这个和我需求不同,我是要爬取我好友的朋友圈,不是我自己的朋友圈,二来这个套路明显是公众号吸粉的套路,这个方法舍弃... 法2,已不能用 原理是在PC上操作,然后

  • 如何利用Python快速绘制海报级别地图详解

    目录 1 简介 2 利用prettymaps快速制作海报级地图 2.1 prettymaps的几种使用方式 2.1.1 圆形模式 2.1.2 圆角矩形模式 2.1.3 添加文字内容 总结 1 简介 基于Python中诸如matplotlib等功能丰富.自由度极高的绘图库,我们可以完成各种极富艺术感的可视化作品,关于这一点我在系列文章在模仿中精进数据可视化中已经带大家学习过很多案例了. 而今天我要给大家介绍的这个Python库prettymaps非常的有趣,基于它,我们只需要简单的代码就可以对地球

随机推荐