分享

利用python控制Autocad:pyautocad

 昵称48132069 2017-11-14

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

一、连接cad

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

from pyautocad import Autocad, APointacad = Autocad(create_if_not_exists=True)acad.prompt('Hello, Autocad from Python\n')print acad.doc.Name
  • 1
  • 2
  • 3
  • 4

  第一行:自动连接上cad,只要cad是开着的,就创建了一个 对象。这个对象连接最近打开的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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

    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, APointacad = 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

     画出来是这个样子的,还是挺好玩的
这里写图片描述

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

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

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

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

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

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

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

     pyautocad还提供了一个比较

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


访问对象的属性
    以下内容文档中貌似没有写,探究一下:
    用dir(text)可以得出很多text下的属性和方法:

# 属性/方法 第一种形式(可以直接调用)AddRefApplicationArrayPolarArrayRectangularAttachmentPointBackgroundFillCopyDatabaseDeleteDocumentDrawingDirectionEntityNameEntityTransparencyEntityTypeEraseFieldCodeGetBoundingBoxGetExtensionDictionaryGetIDsOfNamesGetTypeInfoGetTypeInfoCountGetXDataHandleHasExtensionDictionaryHeightHighlightHyperlinksInsertionPointIntersectWithInvokeLayerLineSpacingDistanceLineSpacingFactorLineSpacingStyleLinetypeLinetypeScaleLineweightMaterialMirrorMirror3DMoveNormalObjectIDObjectID32ObjectNameOwnerIDOwnerID32PlotStyleNameQueryInterfaceReleaseRotateRotate3DRotationScaleEntitySetXDataStyleNameTextStringTransformByTrueColorUpdateVisibleWidth# 属性/方法 第二种形式_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_colorfrom_paramvalue
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200

     这些cad图元的属性和方法是分明存在的,但是应该怎么才能get或者set这些属性呢?
     可以看到形如“_IAcadMText__com__set_Width”的私有属性(现在我也不知道这些属性能够怎么利用,也许这个是句柄??不懂)。但是所有这些属性中,可以直接调用的方法中大部分(在代码区里的第一类公有属性中)是可以与之匹配的。
     这些公有属性应该是可以调用的,下面是一些例子:
    1、调用move方法(set)

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

    用这行代码就可以将所有的text对象向右、向上平移100个单位
2、访问layer属性(setter、getter)

print text.layer# 0
  • 1
  • 2

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

text.layer = 'new layer'print text.layer# new layer
  • 1
  • 2
  • 3

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个元素构成第二个坐标
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

     以上操作证明了确实可以通过调用对象的公有属性来操作cad中的对象,但是麻烦的是,由于这些方法都是ctype的,dir()这些方法无法得知具体应该输入那些参数和参数的类型,有待解决…
    如果实在没有找到这些方法的文档说明,就只好一个一个试出来使用方法了
    (补充:help(obj) 可以得到一些信息,但是好像还是没有参数类型信息。只能得到哪些obj的属性可以set,哪些可以get等等)

藏点东西
822811233

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多