I denne artikel uddyber jeg Block-objekter i AutoCAD, og hvordan arbejdet med dem kan automatiseres ved hjælp af Python.
Selvom jeg til dette praktiske eksempel bruger pyautocad-biblioteket, kan jeg også bruge pythoncom. Jeg har forklaret, hvordan man bruger kommunikationsmoduler i Python i tidligere blogindlæg. Mere præcist refererer jeg specifikt til pythoncom og win32com .
Oprettelse af AutoCAD Block-objekter i Python
Lad mig først forklare, hvorfor AutoCAD Block-objekter er så vigtige.
Når jeg vil bruge bestemte objekter gentagne gange, opretter jeg en blok for disse objekter. Det ene blokobjekt kan indeholde flere andre objekter med fx forskellige geometrier, attributter osv.
Når jeg har oprettet et AutoCAD Block-objekt med pyautocad-modulet i Python, bliver det gemt i dokumentdatabasen. Jeg har forklaret, hvordan dette dokumentobjekt fungerer i en af mine tidligere artikler.
Jeg kan gemme flere AutoCAD Block-objekter i dokumentdatabasen. Ligeledes kan jeg gøre det samme for Blocks kollektivt i form af et Blocks Collection objekt.
Oprettelse af instanser med InsertBlock()-metoden i pyautocad
Nu hvor jeg har lavet blokke, vil jeg bruge dem i min tegning. Det er, når jeg bruger InsertBlock-metoden. Denne metode opretter en AutoCAD Block-objektforekomst for den blok, som jeg sender som en inputparameterværdi.
Blokken, der er til stede i min tegning nu, er kendt som BlockReference-objektet.
Lad mig skrive koden for at forklare dette i betragtning af alle ovenstående ting.
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 og BlockReference objektegenskaber
Da jeg nu har oprettet både AutoCAD Block- og AutoCAD BlockReference-objekter, vil jeg nu lede dig gennem de forskellige egenskaber for disse to objekttyper.
Lad mig først tale om nogle af de vigtige egenskaber ved AutoCAD Block-objektet. Mens jeg bruger blokke, har jeg forskellige krav. For eksempel skal jeg beslutte, om min blok skal være eksploderbar, om den skal være dynamisk eller statisk, og om jeg vil holde den fleksibel at skalere eller ej, osv.
Nedenfor er koden, der viser, hvordan jeg kan bruge alle sådanne egenskaber ved hjælp af pyautocad-modulet i 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
I ovenstående kode returnerer BlockScaling-egenskaben et “0”. Dette repræsenterer en type skalering fra listen over typer nedenfor:
- acAny: 0
- acuniform: 1
På den anden side har jeg BlockReference-egenskaber. Tjek koden vist nedenfor.
# 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
Bloker (reference) metoder i AutoCAD ved hjælp af Python
Dette afsnit er blot for at introducere to af de vigtige metoder til blokobjekter:
- Indsæt blok
- Slet
Som jeg allerede har nævnt i første afsnit, skal jeg bruge BlockCollections-objektet fra Document (objekt/database) for at kunne indsætte en blok.
acad.doc.Blocks.Add(Insertion point, Block name)
For at slette et AutoCAD Block-objekt kan jeg blot tage den respektive AutoCAD Block-instans og anvende Slet-metoden på samme.
block.Delete()
Når jeg kommer til BlockReference-objektet, er der et par metoder, jeg skal nævne:
- Konverter Til Anonym blok
- ConvertToStaticBlock
- GetConstantAttributes
- GetDynamicBlockProperties
- Nulstil blok
Metoden ConvertToAnonymousBlock konverterer en dynamisk blok til anonym blok.
block_ref1.ConvertToAnonymousBlock
På den anden side konverterer ConvertToStaticBlock-metoden en dynamisk blok til en navngivet blok. Dette tager et navn som en parameter.
block_ref1.ConvertToStaticBlock("static_block1")
For at hente konstantattributterne fra en blok eller ekstern reference kan jeg bruge metoden GetConstantAttributes. Denne metode returnerer en matrix af AutoCAD Attribute – objekter, der er konstante for BlockReference-objektet.
block_ref1.GetConstantAttributes
Hvis jeg vil hente en række dynamiske egenskaber, der er tildelt en blok, kan jeg også bruge følgende kode:
block_ref1.GetDynamicBlockProperties
Til sidst, for at nulstille enhver dynamisk blok til standardtilstanden, kan jeg bruge ResetBlock-metoden.
block_ref1.ResetBlock
Udover det har BlockReference-objektet alle de samme metoder tilgængelige, som jeg bruger med alle andre AutoCAD-objekter såsom Line , Layer, Circle, Raster osv. Nogle af disse vigtige metoder er anført nedenfor:
- ArrayPolar
- ArrayRektangulær
- Kopi
- Slet
- GetBoundingBox
- Kryds med
- Spejl
- Mirror3D
- Bevæge sig
- Rotere
- Roter 3D
- ScaleEntity
- Opdatering
- OpdaterMTextAttribute
Tjek mine tidligere blogindlæg for at forstå, hvordan man implementerer disse metoder.
Eksempel på en AutoCAD-tilskrevet blok
Når det er slut, vil jeg gerne dele et eksempel på en tilskrevet blok. En tilskrevet blok er den, der indeholder forskellige attributter, som yderligere indeholder metadata for den pågældende blok eller enheder i den samme.
Jeg vil forklare mere om Attribute-objekterne og AttributeReference-objekterne separat i fremtiden.
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 den indeholder attributter, hvis jeg bruger HasAttribute-egenskabsmetoden til denne blokreference, vil jeg åbenbart få en True-værdi.
print("Does the Block contain any Attributes: ", end="")
print(br.HasAttributes)
O/p:
Does the Block contain any Attributes: True
Afsluttende bemærkninger
For at opsummere kan jeg konkludere, at ved hjælp af ovenstående metoder kan jeg automatisere forskellige opgaver relateret til AutoCAD Block og AutoCAD BlockReference objekter.
I tilfælde af spørgsmål skal du også stille dit spørgsmål i kommentarfeltet nedenfor. Du kan også kontakte mig ved hjælp af vores kontaktformular for enhver form for teknisk konsultation. Tjek venligst mine andre artikler for at forstå brugen og betydningen af pyautocad- og pywin32 Python-modulerne.
Leave a Reply