Objeto de bloque de AutoCAD en Python

En este artículo, explico los objetos de bloque en AutoCAD y cómo se puede automatizar el trabajo con ellos usando Python.

Aunque para este ejemplo práctico estoy usando la librería pyautocad también puedo usar pythoncom. He explicado cómo usar módulos de comunicación en Python en publicaciones de blog anteriores. Más precisamente, me refiero específicamente a pythoncom y win32com .

Creación de objetos de bloque de AutoCAD en Python

En primer lugar, permítanme explicar por qué los objetos de bloque de AutoCAD son tan importantes.

Cada vez que quiero usar ciertos objetos repetidamente, creo un bloque para esos objetos. Ese objeto de bloque puede contener muchos otros objetos con, por ejemplo, diferentes geometrías, atributos, etc.

Una vez que creo un objeto de bloque de AutoCAD con el módulo pyautocad en Python, se guarda en la base de datos de documentos. He explicado cómo funciona este objeto Documento en uno de mis artículos anteriores.

Puedo guardar varios objetos de bloque de AutoCAD en la base de datos de documentos. Del mismo modo, puedo hacer lo mismo para los bloques de forma colectiva en forma de un objeto de colección de bloques.

Creando instancias con el método InsertBlock() en pyautocad

Ahora que he creado bloques, quiero usarlos en mi dibujo. Aquí es cuando uso el método InsertBlock. Este método crea una instancia de objeto de bloque de AutoCAD para el bloque que paso como valor de parámetro de entrada.

El bloque que está presente en mi dibujo ahora se conoce como el objeto BlockReference.

Permítanme escribir el código para explicar esto teniendo en cuenta todo lo anterior.

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)
Objeto de referencia de bloque creado usando Block from Block Collections

Propiedades de objeto Block y BlockReference de AutoCAD

Como ya he creado los objetos AutoCAD Block y AutoCAD BlockReference, ahora lo guiaré a través de las diferentes propiedades de estos dos tipos de objetos.

En primer lugar, permítanme hablar sobre algunas de las propiedades importantes del objeto Bloque de AutoCAD. Mientras uso bloques tengo diferentes requisitos. Por ejemplo, tengo que decidir si mi bloque debe ser explotable o no, si debe ser dinámico o estático, si quiero mantenerlo flexible a escala o no, etc.

A continuación se muestra el código que muestra cómo puedo usar todas esas propiedades usando el módulo pyautocad en Python.

# 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

En el código anterior, la propiedad BlockScaling devuelve un «0». Esto representa un tipo de escala de la lista de tipos dada a continuación:

  • acCualquiera: 0
  • uniforme ac: 1

Por otro lado, tengo propiedades BlockReference. Compruebe el código que se muestra a continuación.

# 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

Métodos de bloque (referencia) en AutoCAD usando Python

Esta sección es solo para presentar dos de los métodos importantes para los objetos de bloque:

  • Insertar bloque
  • Borrar

Como ya mencioné en la primera sección, necesito el objeto BlockCollections de Document (objeto/base de datos) para poder insertar un Bloque.

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

Para eliminar un objeto de bloque de AutoCAD, simplemente puedo tomar la instancia de bloque de AutoCAD respectiva y aplicar el método Eliminar en el mismo.

block.Delete()

En cuanto al objeto BlockReference, hay algunos métodos que debo mencionar:

  • Convertir en bloque anónimo
  • ConvertToStaticBlock
  • ObtenerAtributosConstantes
  • Obtener propiedades de bloque dinámico
  • Restablecer bloque

El método ConvertToAnonymousBlock convierte un bloque dinámico en un bloque anónimo.

block_ref1.ConvertToAnonymousBlock 

Por otro lado, el método ConvertToStaticBlock convierte un bloque dinámico en un bloque con nombre. Esto toma un nombre como parámetro.

block_ref1.ConvertToStaticBlock("static_block1")

Para obtener los atributos constantes de un bloque o una referencia externa, puedo usar el método GetConstantAttributes. Este método devuelve una matriz de objetos de atributo de AutoCAD que son constantes para el objeto BlockReference.

block_ref1.GetConstantAttributes

Además, si quiero obtener una matriz de propiedades dinámicas asignadas a un bloque, puedo usar el siguiente código:

block_ref1.GetDynamicBlockProperties

Por último, para restablecer cualquier bloque dinámico al estado predeterminado, puedo usar el método ResetBlock.

block_ref1.ResetBlock

Además de eso, el objeto BlockReference tiene todos los mismos métodos disponibles que uso con cualquier otro objeto de AutoCAD, como Línea , Capa, Círculo, Raster, etc. Algunos de esos métodos importantes se enumeran a continuación:

  • MatrizPolar
  • matrizrectangular
  • Copiar
  • Borrar
  • ObtenerCuadroDelimitador
  • IntersecarCon
  • Espejo
  • Espejo3D
  • Muevete
  • Girar
  • Rotar3D
  • ScaleEntity
  • Actualizar
  • Actualizar MTextAttribute

Consulte mis publicaciones de blog anteriores para comprender cómo implementar esos métodos.

Ejemplo de un bloque con atributos de AutoCAD

Llegando al final, me gustaría compartir un ejemplo de un Bloque Atribuido. Un bloque con atributos es el que contiene diferentes atributos que además contienen metadatos de ese Bloque o entidades dentro del mismo.

Explicaré más sobre los objetos Attribute y los objetos AttributeReference por separado en el futuro.

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, editor de atributos mejorado

Evidentemente, como contiene atributos, si uso el método de propiedad HasAttribute para esta referencia de Bloque, obtendré un valor Verdadero.

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

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

Observaciones finales

En resumen, puedo concluir que con los métodos anteriores puedo automatizar diferentes tareas relacionadas con los objetos AutoCAD Block y AutoCAD BlockReference.

Además, en caso de cualquier consulta, deje su pregunta en la sección de comentarios a continuación. Así como también puedes contactar conmigo a través de nuestro formulario de contacto para cualquier tipo de consulta técnica. Consulte mis otros artículos para comprender el uso y la importancia de los módulos de Python pyautocadpywin32 .

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.