Objeto de bloco do AutoCAD (Python)

Neste artigo eu elaboro objetos Block no AutoCAD e como trabalhar com eles pode ser automatizado usando Python.

Embora para este exemplo prático eu esteja usando a biblioteca pyautocad, também posso usar pythoncom. Expliquei como usar módulos de comunicação em Python em posts anteriores. Mais precisamente, estou me referindo especificamente a pythoncom e win32com .

Criando objetos de bloco do AutoCAD em Python

Em primeiro lugar, deixe-me explicar por que os objetos AutoCAD Block são tão significativos.

Sempre que quero usar determinados objetos repetidamente, crio um bloco para esses objetos. Esse objeto de bloco pode conter vários outros objetos com, por exemplo, diferentes geometrias, atributos, etc.

Depois de criar um objeto Bloco do AutoCAD com o módulo pyautocad em Python, ele é salvo no banco de dados Documento. Expliquei como esse objeto Document funciona em um dos meus artigos anteriores.

Posso salvar vários objetos de bloco do AutoCAD no banco de dados de documentos. Da mesma forma, posso fazer o mesmo para Blocos coletivamente na forma de um objeto Coleção de Blocos.

Criando instâncias com o método InsertBlock() em pyautocad

Agora que criei blocos, quero usá-los no meu desenho. Isso é quando eu uso o método InsertBlock. Este método cria uma instância do objeto AutoCAD Block para o bloco que eu passo como um valor de parâmetro de entrada.

O bloco que está presente no meu desenho agora é conhecido como o objeto BlockReference.

Deixe-me escrever o código para explicar isso considerando todas as coisas acima.

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 Block Reference criado usando Block from Block Collections

Propriedades do objeto AutoCAD Block e BlockReference

Como já criei os objetos AutoCAD Block e AutoCAD BlockReference, agora o guiarei pelas várias propriedades diferentes desses dois tipos de objeto.

Em primeiro lugar, deixe-me falar sobre algumas das propriedades importantes do objeto AutoCAD Block. Ao usar blocos, tenho requisitos diferentes. Por exemplo, eu tenho que decidir se meu bloco deve ou não ser explosivo, se deve ser dinâmico ou estático, e se quero mantê-lo flexível para escalar ou não, etc.

Abaixo está o código mostrando como posso usar todas essas propriedades usando o módulo pyautocad em 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

No código acima a propriedade BlockScaling está retornando um “0”. Isso representa um tipo de dimensionamento da lista de tipos fornecida abaixo:

  • qualquer: 0
  • acUniforme: 1

Por outro lado, tenho propriedades BlockReference. Verifique o código exibido abaixo.

# 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 bloco (referência) no AutoCAD usando Python

Esta seção é apenas para apresentar dois dos métodos importantes para objetos Block:

  • Inserir bloco
  • Excluir

Como já mencionei na primeira seção, preciso do objeto BlockCollections do Document (objeto/banco de dados) para poder inserir um Bloco.

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

Para excluir um objeto AutoCAD Block, posso simplesmente pegar a respectiva instância do AutoCAD Block e aplicar o método Delete na mesma.

block.Delete()

Chegando ao objeto BlockReference, existem alguns métodos que devo mencionar:

  • ConvertToAnonymousBlock
  • ConvertToStaticBlock
  • GetConstantAttributes
  • GetDynamicBlockProperties
  • Redefinir bloco

O método ConvertToAnonymousBlock converte um bloco dinâmico em bloco anônimo.

block_ref1.ConvertToAnonymousBlock 

Por outro lado, o método ConvertToStaticBlock converte um bloco dinâmico em um bloco nomeado. Isso leva um nome como parâmetro.

block_ref1.ConvertToStaticBlock("static_block1")

Para buscar os atributos constantes de um bloco ou referência externa posso usar o método GetConstantAttributes. Este método retorna uma matriz de objetos AutoCAD Attribute que são constantes para o objeto BlockReference.

block_ref1.GetConstantAttributes

Além disso, se eu quiser buscar uma matriz de propriedades dinâmicas atribuídas a um bloco, posso usar o seguinte código:

block_ref1.GetDynamicBlockProperties

Por fim, para redefinir qualquer bloco dinâmico para o estado padrão, posso usar o método ResetBlock.

block_ref1.ResetBlock

Além disso, o objeto BlockReference tem todos os mesmos métodos disponíveis que eu uso com qualquer outro objeto AutoCAD, como Line , Layer, Circle, Raster, etc. Alguns desses métodos importantes estão listados abaixo:

  • MatrizPolar
  • MatrizRetangular
  • cópia de
  • Excluir
  • GetBoundingBox
  • Intersecção Com
  • Espelho
  • Espelho 3D
  • Jogada
  • Girar
  • Girar3D
  • ScaleEntity
  • Atualizar
  • UpdateMTextAttribute

Confira meus posts anteriores para entender como implementar esses métodos.

Exemplo de um bloco atribuído do AutoCAD

Chegando ao fim, gostaria de compartilhar um exemplo de um Bloco Atribuído. Um bloco atribuído é aquele que contém diferentes atributos que contém ainda metadados desse Bloco ou entidades dentro do mesmo.

Explicarei mais sobre os objetos Attribute e os objetos AttributeReference separadamente no 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)
Bloco AutoCAD, editor de atributos aprimorado

Evidentemente, como contém atributos, se eu usar o método da propriedade HasAttribute para essa referência de bloco, obterei um valor True.

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

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

Observações finais

Para resumir, posso concluir que, usando os métodos acima, posso automatizar diferentes tarefas relacionadas aos objetos AutoCAD Block e AutoCAD BlockReference.

Além disso, em caso de dúvidas, deixe sua pergunta na seção de comentários abaixo. Assim como você pode entrar em contato comigo através do nosso formulário de contato para qualquer tipo de consulta técnica. Confira meus outros artigos para entender o uso e o significado dos módulos Python pyautocad e pywin32.

You May Also Like

Leave a Reply

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.