Python中的AutoCAD块对象

在本文中,我详细介绍了 AutoCAD 中的块对象以及如何使用 Python 自动处理它们。

尽管对于这个实际示例,我使用的是 pyautocad 库,但我也可以使用 pythoncom。我已经在之前的博文中解释了如何在 Python 中使用通信模块。更准确地说,我特指 pythoncom 和win32com

在 Python 中创建 AutoCAD 块对象

首先,让我解释一下为什么 AutoCAD 块对象如此重要。

每当我想重复使用某些对象时,我都会为这些对象创建一个块。一个块对象可以包含多个其他对象,例如具有不同的几何形状、属性等。

一旦我在 Python 中使用 pyautocad 模块创建了一个 AutoCAD 块对象,它就会保存在文档数据库中。我已经在我之前的一篇文章中解释了这个 Document 对象是如何工作的。

我可以在文档数据库中保存多个 AutoCAD 块对象。同样,我可以以 Blocks Collection 对象的形式对 Blocks 做同样的事情。

在 pyautocad 中使用 InsertBlock() 方法创建实例

现在我已经创建了块,我想在我的绘图中使用它们。这是我使用 InsertBlock 方法的时候。此方法为我作为输入参数值传递的块创建 AutoCAD 块对象实例。

现在出现在我的绘图中的 Block 称为 BlockReference 对象。

考虑到上述所有情况,让我编写代码来解释这一点。

from pyautocad import Autocad, APoint, aDouble
acad = Autocad(create_if_not_exists=True)


# flow
# Document > BlocksCollection > Block > BlockReference

# insertion point for block
ip = APoint(0, 0, 0)


# adding block to documents block collection
b1 = acad.doc.Blocks.Add(ip, "Test_block_1")

# adding geometries to block
pl = b1.AddPolyline(aDouble(0, 0, 0, 10000, 0, 0, 10000, 5000, 0, 0, 5000, 0, 0, 0, 0))
l = b1.AddLine(APoint(0, 250, 0), APoint(10000, 250, 0))


# adding block instance to drawing (creating a reference to the block)
block_ref1 = acad.model.InsertBlock(APoint(50, 50, 0), "Test_block_1", 1, 1, 1, 0)
使用块集合中的块创建的块参考对象

AutoCAD 块和块参考对象属性

由于我现在已经创建了 AutoCAD Block 和 AutoCAD BlockReference 对象,我现在将引导您了解这两种对象类型的各种不同属性。

首先,让我谈谈AutoCAD Block对象的一些重要属性。在使用块时,我有不同的要求。例如,我必须决定我的块是否必须是可爆炸的,它应该是动态的还是静态的,以及是否要保持它的灵活缩放等等。

下面的代码显示了如何使用 Python 中的 pyautocad 模块使用所有这些属性。

# properties

print("Object Name: " + b1.ObjectName)
print("Name of Block: " + b1.Name)
print("Native units of measures for the Block: ", end="")
print(b1.Units)
print("Is scaling allowed for the Block ? ", end="")
print(b1.BlockScaling)
print("Is the Block explodable ? ", end="")
print(b1.Explodable)
print("Is the Block dynamic ? ", end="")
print(b1.IsDynamicBlock)

O/p:

Object Name: AcDbBlockTableRecord
Name of Block: Test_block_1
Native units of measures for the Block: 0
Is scaling allowed for the Block ? 0
Is the Block explodable ? True
Is the Block dynamic ? False

在上面的代码中,BlockScaling 属性返回“0”。这表示下面给出的类型列表中的一种缩放类型:

  • 交流:0
  • 交流制服:1

另一方面,我有 BlockReference 属性。检查下面显示的代码。

# properties of BlockReference
print("Object Name: " + block_ref1.ObjectName)
print("Block Name: " + block_ref1.Name)
print("Original Block Name: " + block_ref1.EffectiveName)

print("Entity Transparency: ", end="")
print(block_ref1.EntityTransparency)

print("Does the Block contain any Attributes: ", end="")
print(block_ref1.HasAttributes)

print("Insertion Point: ", end="")
print(block_ref1.InsertionPoint)

print("Insert units saved with Blocks: ", end="")
print(block_ref1.InsUnits)

print("Conversion factor between Block units and drawing units: ", end="")
print(block_ref1.InsUnitsFactor)

print("Is the Block dynamic ? ", end="")
print(block_ref1.IsDynamicBlock)

print("Layer: " + block_ref1.Layer)

print("Line type: " + block_ref1.Linetype)

print("Line type scale: ")
print(block_ref1.LinetypeScale)

print("Line weight: ")
print(block_ref1.Lineweight)

print("Rotation angle for the block: ")
print(block_ref1.Lineweight)

#Scale factors
print("X Scale factor of block: ", end="")
print(block_ref1.XEffectiveScaleFactor)

print("X Scale factor for block or external reference (xref): ", end="")
print(block_ref1.XScaleFactor)

print("Y Scale factor of block: ", end="")
print(block_ref1.YEffectiveScaleFactor)

print("Y Scale factor for block or external reference (xref): ", end="")
print(block_ref1.YScaleFactor)

print("Z Scale factor of block: ", end="")
print(block_ref1.ZEffectiveScaleFactor)

print("Z Scale factor for block or external reference (xref): ", end="")
print(block_ref1.ZScaleFactor)

O/p:

Object Name: AcDbBlockReference
Block Name: Test_block_1
Original Block Name: Test_block_1
Entity Transparency: ByLayer
Does the Block contain any Attributes: False
Insertion Point: (50.0, 50.0, 0.0)
Insert units saved with Blocks: Unitless
Conversion factor between Block units and drawing units: 1.0
Is the Block dynamic ? False
Layer: 0
Line type: ByLayer
Line type scale:
1.0
Line weight: 
-1
Rotation angle for the block:
-1
X Scale factor of block: 1.0
X Scale factor for block or external reference (xref): 1.0
Y Scale factor of block: 1.0
Y Scale factor for block or external reference (xref): 1.0
Z Scale factor of block: 1.0
Z Scale factor for block or external reference (xref): 1.0

在 AutoCAD 中使用 Python 的块(参考)方法

本节只是介绍 Block 对象的两个重要方法:

  • 插入块
  • 删除

正如我在第一节中已经提到的,我需要 Document(对象/数据库)中的 BlockCollections 对象才能插入块。

acad.doc.Blocks.Add(Insertion point, Block name)

要删除 AutoCAD 块对象,我可以简单地获取相应的 AutoCAD 块实例并对其应用 Delete 方法。

block.Delete()

谈到 BlockReference 对象,我必须提到一些方法:

  • 转换为匿名块
  • 转换成静态块
  • 获取常量属性
  • 获取动态块属性
  • 重置块

ConvertToAnonymousBlock 方法将动态块转换为匿名块。

block_ref1.ConvertToAnonymousBlock 

另一方面,ConvertToStaticBlock 方法将动态块转换为命名块。这需要一个名称作为参数。

block_ref1.ConvertToStaticBlock("static_block1")

要从块或外部引用中获取常量属性,我可以使用 GetConstantAttributes 方法。此方法返回一个AutoCAD Attribute对象数组,这些对象对于 BlockReference 对象是常量。

block_ref1.GetConstantAttributes

此外,如果我想获取分配给块的动态属性数组,我可以使用以下代码:

block_ref1.GetDynamicBlockProperties

最后,要将任何动态块重置为默认状态,我可以使用 ResetBlock 方法。

block_ref1.ResetBlock

除此之外,BlockReference 对象具有与我用于任何其他AutoCAD 对象(例如 Line、Layer、Circle、Raster 等)相同的所有方法。下面列出了其中一些重要方法:

  • ArrayPolar
  • 数组矩形
  • 复制
  • 删除
  • 获取边界框
  • 相交
  • 镜子
  • 镜像3D
  • 移动
  • 旋转
  • 旋转3D
  • 比例实体
  • 更新
  • 更新MTextAttribute

请查看我以前的博客文章以了解如何实现这些方法。

AutoCAD 属性块示例

即将结束,我想分享一个属性块的例子。属性块是包含不同属性的块,该属性进一步包含该块的元数据或同一块内的实体。

以后我会分别解释更多关于 Attribute 对象和 AttributeReference 对象的内容。

from pyautocad import Autocad, APoint, aDouble

acad = Autocad(create_if_not_exists=True)

ip = APoint(0, 0, 0)
b1 = acad.doc.Blocks.Add(ip, "Attributed_Block_1")

pl = b1.AddPolyline(aDouble(0, 0, 0, 10000, 0, 0, 10000, 5000, 0, 0, 5000, 0, 0, 0, 0))
l = b1.AddLine(APoint(0, 250, 0), APoint(10000, 250, 0))
l = b1.AddLine(APoint(5000, 250, 0), APoint(5000, 0, 0))

a1 = b1.AddAttribute(50, 0, "DATE", aDouble(200, 100, 0), "DATE", "Date: 17/07/2022")
a2 = b1.AddAttribute(50, 0, "DWG", aDouble(5200, 100, 0), "DWG", "Drawing Name: Drawing 1")

br = acad.model.InsertBlock(APoint(50, 50, 0), "Attributed_Block_1", 1, 1, 1, 0)
AutoCAD Block,增强的属性编辑器

显然,由于它包含属性,如果我为此 Block 引用使用 HasAttribute 属性方法,我将得到一个 True 值。

print("Does the Block contain any Attributes: ", end="")
print(br.HasAttributes)

O/p:
Does the Block contain any Attributes: True

结束语

总而言之,我可以得出结论,使用上述方法,我可以自动化与 AutoCAD Block 和 AutoCAD BlockReference 对象相关的不同任务。

此外,如果有任何疑问,请在下面的评论部分留下您的问题。您也可以使用我们的联系表与我联系以进行任何技术咨询。请查看我的其他文章,了解 pyautocadpywin32 Python 模块的用法和意义。

You May Also Like

Leave a Reply

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据