在本文中,我详细介绍了 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)
显然,由于它包含属性,如果我为此 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 对象相关的不同任务。
此外,如果有任何疑问,请在下面的评论部分留下您的问题。您也可以使用我们的联系表与我联系以进行任何技术咨询。请查看我的其他文章,了解 pyautocad 和pywin32 Python 模块的用法和意义。
Leave a Reply