이 기사에서는 AutoCAD의 블록 개체와 Python을 사용하여 개체 작업을 자동화하는 방법에 대해 자세히 설명합니다.
이 실용적인 예에서는 pyautocad 라이브러리를 사용하고 있지만 pythoncom을 사용할 수도 있습니다. 이전 블로그 게시물에서 Python에서 통신 모듈을 사용하는 방법을 설명했습니다. 보다 정확하게는 pythoncom 및 win32com 을 구체적으로 언급하고 있습니다 .
Python에서 AutoCAD 블록 개체 만들기
먼저 AutoCAD Block 객체가 중요한 이유를 설명하겠습니다.
특정 개체를 반복적으로 사용하고 싶을 때마다 해당 개체에 대한 블록을 만듭니다. 하나의 블록 객체는 다른 지오메트리, 속성 등을 가진 여러 개의 다른 객체를 포함할 수 있습니다.
Python에서 pyautocad 모듈을 사용하여 AutoCAD 블록 개체를 생성하면 문서 데이터베이스에 저장됩니다. 이전 기사 중 하나에서 이 Document 객체가 어떻게 작동하는지 설명했습니다.
문서 데이터베이스에 여러 AutoCAD 블록 객체를 저장할 수 있습니다. 마찬가지로 Blocks Collection 개체의 형태로 Blocks에 대해서도 동일한 작업을 일괄적으로 수행할 수 있습니다.
pyautocad에서 InsertBlock() 메서드로 인스턴스 만들기
이제 블록을 만들었으므로 도면에 사용하고 싶습니다. InsertBlock 메서드를 사용할 때입니다. 이 방법은 입력 매개변수 값으로 전달한 블록에 대한 AutoCAD 블록 객체 인스턴스를 작성합니다.
지금까지 내 그림에 있는 블록은 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 Block 및 BlockReference 객체 속성
이제 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”을 반환합니다. 이것은 아래 주어진 유형 목록에서 스케일링 유형을 나타냅니다.
- acAny: 0
- ac 유니폼: 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
Python을 사용하는 AutoCAD의 블록(참조) 메서드
이 섹션에서는 Block 개체에 대한 두 가지 중요한 방법을 소개합니다.
- 블록 삽입
- 삭제
첫 번째 섹션에서 이미 언급했듯이 블록을 삽입하려면 Document(객체/데이터베이스)의 BlockCollections 객체가 필요합니다.
acad.doc.Blocks.Add(Insertion point, Block name)
AutoCAD 블록 개체를 삭제하려면 해당 AutoCAD 블록 인스턴스를 가져와서 동일한 인스턴스에 Delete 메서드를 적용하면 됩니다.
block.Delete()
BlockReference 개체에 대해 언급해야 할 몇 가지 방법이 있습니다.
- ConvertToAnonymousBlock
- ConvertToStaticBlock
- GetConstant속성
- GetDynamicBlockProperties
- 차단 재설정
ConvertToAnonymousBlock 메서드는 동적 블록을 익명 블록으로 변환합니다.
block_ref1.ConvertToAnonymousBlock
반면에 ConvertToStaticBlock 메서드는 동적 블록을 명명된 블록으로 변환합니다. 이것은 이름을 매개변수로 사용합니다.
block_ref1.ConvertToStaticBlock("static_block1")
블록 또는 외부 참조에서 상수 속성을 가져오기 위해 GetConstantAttributes 메서드를 사용할 수 있습니다. 이 메서드는 BlockReference 객체에 대해 일정한 AutoCAD Attribute 객체 의 배열을 반환 합니다.
block_ref1.GetConstantAttributes
또한 블록에 할당된 동적 속성 배열을 가져오려면 다음 코드를 사용할 수 있습니다.
block_ref1.GetDynamicBlockProperties
마지막으로 모든 동적 블록을 기본 상태로 재설정하려면 ResetBlock 메서드를 사용할 수 있습니다.
block_ref1.ResetBlock
그 외에도 BlockReference 개체에는 Line , Layer, Circle, Raster 등과 같은 다른 AutoCAD 개체와 함께 사용하는 것과 동일한 모든 방법이 있습니다. 이러한 중요한 방법 중 일부는 아래에 나열되어 있습니다.
- 어레이폴라
- ArrayRectangular
- 복사
- 삭제
- GetBoundingBox
- 교차하다
- 거울
- 미러3D
- 이동하다
- 회전
- 3D 회전
- ScaleEntity
- 업데이트
- 업데이트MText속성
이러한 방법을 구현하는 방법을 이해하려면 이전 블로그 게시물을 확인하십시오.
AutoCAD 속성 블록의 예
끝으로 나는 Attributed Block의 예를 공유하고 싶습니다. 속성이 있는 블록은 해당 블록의 메타데이터 또는 동일한 내부 엔티티를 추가로 포함하는 다른 속성을 포함하는 블록입니다.
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)



분명히 이 블록 참조에 대해 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