In diesem Artikel erläutere ich Blockobjekte in AutoCAD und wie die Arbeit mit ihnen mit Python automatisiert werden kann.
Obwohl ich für dieses praktische Beispiel die pyautocad-Bibliothek verwende, kann ich auch pythoncom verwenden. Ich habe in früheren Blogbeiträgen erklärt, wie man Kommunikationsmodule in Python verwendet. Genauer gesagt beziehe ich mich speziell auf pythoncom und win32com .
Erstellen von AutoCAD-Blockobjekten in Python
Lassen Sie mich zunächst erklären, warum AutoCAD-Blockobjekte so wichtig sind.
Immer wenn ich bestimmte Objekte wiederholt verwenden möchte, erstelle ich einen Block für diese Objekte. Dieses eine Blockobjekt kann mehrere andere Objekte mit z. B. unterschiedlichen Geometrien, Attributen usw. enthalten.
Sobald ich ein AutoCAD-Blockobjekt mit dem pyautocad-Modul in Python erstellt habe, wird es in der Dokumentendatenbank gespeichert. Wie dieses Document-Objekt funktioniert, habe ich in einem meiner vorherigen Artikel erklärt.
Ich kann mehrere AutoCAD-Blockobjekte in der Dokumentendatenbank speichern. Ebenso kann ich dasselbe für Blocks kollektiv in Form eines Blocks Collection-Objekts tun.
Erstellen von Instanzen mit der InsertBlock()-Methode in Pyautocad
Jetzt, da ich Blöcke erstellt habe, möchte ich sie in meiner Zeichnung verwenden. Dies ist, wenn ich die InsertBlock-Methode verwende. Diese Methode erstellt eine AutoCAD-Blockobjektinstanz für den Block, den ich als Eingabeparameterwert übergebe.
Der Block, der jetzt in meiner Zeichnung vorhanden ist, wird als BlockReference-Objekt bezeichnet.
Lassen Sie mich den Code schreiben, um dies unter Berücksichtigung aller oben genannten Dinge zu erklären.
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 Block- und BlockReference-Objekteigenschaften
Da ich nun sowohl AutoCAD-Block- als auch AutoCAD-BlockReference-Objekte erstellt habe, werde ich Sie nun durch die verschiedenen Eigenschaften dieser beiden Objekttypen führen.
Lassen Sie mich zunächst auf einige wichtige Eigenschaften des AutoCAD-Blockobjekts eingehen. Bei der Verwendung von Blöcken habe ich andere Anforderungen. Zum Beispiel muss ich entscheiden, ob mein Block explodierbar sein muss oder nicht, ob er dynamisch oder statisch sein soll, ob ich ihn skalierbar halten möchte oder nicht usw.
Unten ist der Code, der zeigt, wie ich alle diese Eigenschaften mit dem pyautocad-Modul in Python verwenden kann.
# 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
Im obigen Code gibt die BlockScaling-Eigenschaft eine „0“ zurück. Dies stellt eine Art der Skalierung aus der folgenden Liste von Typen dar:
- acAny: 0
- acUniform: 1
Andererseits habe ich BlockReference-Eigenschaften. Überprüfen Sie den unten angezeigten Code.
# 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
Block-(Referenz-)Methoden in AutoCAD mit Python
In diesem Abschnitt werden nur zwei der wichtigen Methoden für Block-Objekte vorgestellt:
- Block einfügen
- Löschen
Wie ich bereits im ersten Abschnitt erwähnt habe, benötige ich das BlockCollections-Objekt aus Document (Objekt/Datenbank), um einen Block einfügen zu können.
acad.doc.Blocks.Add(Insertion point, Block name)
Um ein AutoCAD-Blockobjekt zu löschen, kann ich einfach die entsprechende AutoCAD-Blockinstanz nehmen und die Delete-Methode darauf anwenden.
block.Delete()
Kommen wir zum BlockReference-Objekt, gibt es ein paar Methoden, die ich erwähnen muss:
- ConvertToAnonymousBlock
- ConvertToStaticBlock
- GetConstantAttributes
- GetDynamicBlockProperties
- Block zurücksetzen
Die ConvertToAnonymousBlock-Methode konvertiert einen dynamischen Block in einen anonymen Block.
block_ref1.ConvertToAnonymousBlock
Andererseits konvertiert die ConvertToStaticBlock-Methode einen dynamischen Block in einen benannten Block. Dies nimmt einen Namen als Parameter.
block_ref1.ConvertToStaticBlock("static_block1")
Um die konstanten Attribute aus einem Block oder einer externen Referenz abzurufen, kann ich die Methode GetConstantAttributes verwenden. Diese Methode gibt ein Array von AutoCAD-Attributobjekten zurück , die für das BlockReference-Objekt konstant sind.
block_ref1.GetConstantAttributes
Wenn ich ein Array dynamischer Eigenschaften abrufen möchte, die einem Block zugewiesen sind, kann ich den folgenden Code verwenden:
block_ref1.GetDynamicBlockProperties
Um einen dynamischen Block auf den Standardzustand zurückzusetzen, kann ich schließlich die ResetBlock-Methode verwenden.
block_ref1.ResetBlock
Abgesehen davon verfügt das BlockReference-Objekt über dieselben Methoden, die ich mit allen anderen AutoCAD-Objekten wie Line , Layer, Circle, Raster usw. verwende. Einige dieser wichtigen Methoden sind unten aufgeführt:
- ArrayPolar
- ArrayRechteckig
- Kopieren
- Löschen
- GetBoundingBox
- SchnittmengeMit
- Spiegel
- Mirror3D
- Bewegen
- Drehen
- Drehen3D
- ScaleEntity
- Aktualisieren
- UpdateMTextAttribute
Sehen Sie sich meine vorherigen Blog-Beiträge an, um zu verstehen, wie Sie diese Methoden implementieren.
Beispiel eines AutoCAD-attributierten Blocks
Abschließend möchte ich ein Beispiel für einen attributierten Block vorstellen. Ein attributierter Block ist derjenige, der verschiedene Attribute enthält, die ferner Metadaten dieses Blocks oder der darin enthaltenen Entitäten enthalten.
Ich werde in Zukunft mehr über die Attribute-Objekte und die AttributeReference-Objekte separat erklären.
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)
Da es Attribute enthält, wenn ich die HasAttribute-Eigenschaftsmethode für diese Blockreferenz verwende, erhalte ich offensichtlich einen True-Wert.
print("Does the Block contain any Attributes: ", end="")
print(br.HasAttributes)
O/p:
Does the Block contain any Attributes: True
Abschließende Bemerkungen
Zusammenfassend kann ich feststellen, dass ich mit den oben genannten Methoden verschiedene Aufgaben im Zusammenhang mit AutoCAD-Block- und AutoCAD-BlockReference-Objekten automatisieren kann.
Hinterlassen Sie bei Fragen auch Ihre Frage im Kommentarbereich unten. Außerdem können Sie mich über unser Kontaktformular für jede Art von technischer Beratung kontaktieren. Bitte lesen Sie meine anderen Artikel, um die Verwendung und Bedeutung der Python-Module pyautocad und pywin32 zu verstehen.
Leave a Reply