□ 컨셉 코드
GetAssemblyStructure():
- 현재 활성화된 어셈블리 문서를 가져옵니다.
- 최상위 컴포넌트를 얻고, 재귀적으로 모든 하위 컴포넌트를 탐색합니다.
TraverseComponents():
- 각 컴포넌트의 이름을 출력하고, 자식 컴포넌트를 탐색합니다.
- 들여쓰기를 통해 계층 구조를 명확히 표시합니다.
Option Explicit
Sub GetAssemblyStructure()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swConfig As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
'// SolidWorks 애플리케이션 연결
Set swApp = GetObject(, "SldWorks.Application")
Set swModel = swApp.ActiveDoc
'// 활성화된 문서 확인
If swModel Is Nothing Then
MsgBox "활성화된 모델이 없습니다.", vbCritical
Exit Sub
End If
'// 어셈블리 문서인지 확인
If swModel.GetType <> swDocASSEMBLY Then
MsgBox "이 매크로는 어셈블리 파일에서만 실행할 수 있습니다."
Exit Sub
End If
'//어셈블리 문서 및 최상위 컴포넌트 가져오기
Set swAssy = swModel
Set swConfig = swModel.GetActiveConfiguration
Set swRootComp = swConfig.GetRootComponent3(True) ' // 최상위 컴포넌트 가져오기
' 구조 출력 시작
Debug.Print "어셈블리 구조:"
TraverseComponents swRootComp, 0
End Sub
Sub TraverseComponents(swComp As SldWorks.Component2, level As Integer)
Dim vChildComp As Variant
Dim swChildComp As SldWorks.Component2
Dim i As Integer
'// 현재 컴포넌트 이름 출력
Debug.Print String(level * 2, " ") & "- " & swComp.Name2
' // 하위 컴포넌트 가져오기
vChildComp = swComp.GetChildren
For i = LBound(vChildComp) To UBound(vChildComp)
Set swChildComp = vChildComp(i)
' // 재귀적으로 하위 컴포넌트 탐색
TraverseComponents swChildComp, level + 1
Next i
End Sub
Solidworks 모델 구조
MainAssembly
|- SubAssembly1
| |- Part1
| |- Part2
|- SubAssembly2
|- Part3
프로그램 실행 결과
어셈블리 구조:
- MainAssembly
- SubAssembly1
- Part1
- Part2
- SubAssembly2
- Part3
□ Code 설명
1. 문서 유형을 비교 하는 기능 입니다. 문서 유형은 상수 값으로 가져올수 있습니다.
'// 어셈블리 문서인지 확인
If swModel.GetType <> swDocASSEMBLY Then
MsgBox "이 매크로는 어셈블리 파일에서만 실행할 수 있습니다."
Exit Sub
End If
▷ SolidWorks 문서 유형 상수
문서 유형 | 상수 이름 | 값 |
부품 파일 (Part) | swDocPART | 1 |
어셈블리 파일 (Assembly) | swDocASSEMBLY | 2 |
도면 파일 (Drawing) | swDocDRAWING | 3 |
불명 파일 (Unknown) | swDocNONE | 0 |
▷ SolidWorks 상수 문서 설명
swDocPART (1):
SolidWorks에서 부품 파일(.SLDPRT)을 나타냅니다.
부품 설계나 단일 구성 요소의 3D 모델 작업에 사용됩니다.
swDocASSEMBLY (2):
어셈블리 파일(.SLDASM)을 나타냅니다.
여러 부품을 조합하여 조립된 제품 구조를 모델링할 때 사용됩니다.
swDocDRAWING (3):
도면 파일(.SLDDRW)을 나타냅니다.
부품이나 어셈블리의 2D 도면을 생성하거나 배치할 때 사용됩니다.
swDocNONE (0):
문서가 없거나 잘못된 경우를 나타냅니다.
예: 활성화된 문서가 없거나, SolidWorks에서 지원하지 않는 파일 형식.
예제 코드 : swModel.GetType을 활용하여 문서 유형을 판별하는 VBA 코드입니다
Sub CheckDocumentType()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim docType As Long
' SolidWorks 애플리케이션 가져오기
Set swApp = GetObject(, "SldWorks.Application")
Set swModel = swApp.ActiveDoc
' 활성화된 문서 확인
If swModel Is Nothing Then
MsgBox "활성화된 문서가 없습니다."
Exit Sub
End If
' 문서 유형 가져오기
docType = swModel.GetType
' 문서 유형 판별
Select Case docType
Case swDocPART
MsgBox "현재 문서는 부품 파일입니다."
Case swDocASSEMBLY
MsgBox "현재 문서는 어셈블리 파일입니다."
Case swDocDRAWING
MsgBox "현재 문서는 도면 파일입니다."
Case Else
MsgBox "알 수 없는 문서 유형입니다."
End Select
End Sub
2. 최상위 컴포넌트 가져오기
Set swConfig = swModel.GetActiveConfiguration
Set swRootComp = swConfig.GetRootComponent3(True)
Dim swConfig As SldWorks.Configuration
Set swConfig = swModel.GetActiveConfiguration
SldWorks.Configuration 객체는 부품이나 어셈블리 파일에 정의된 구성(Configuration)을 나타냅니다. SolidWorks의 구성은 동일한 부품 또는 어셈블리의 다양한 버전(크기, 모양, 상태 등)을 정의할 수 있는 강력한 도구입니다.
이 객체를 사용하면 특정 구성과 관련된 정보나 속성에 액세스하고 제어할 수 있습니다.
SldWorks.Configuration 주요 기능 및 역할
1) 구성 관리:
부품 또는 어셈블리의 모든 구성 목록을 가져올 수 있습니다.
활성 구성이나 특정 구성을 선택할 수 있습니다.
2) 구성 속성 접근:
구성 이름, 설명, BOM(Bill of Materials) 옵션 등의 속성에 액세스할 수 있습니다.
3) 최상위 컴포넌트 가져오기:
어셈블리에서 특정 구성의 루트 컴포넌트를 가져와 전체 어셈블리 구조를 탐색할 수 있습니다.
4) 구성 전환:
부품이나 어셈블리 파일에서 현재 활성 구성(active configuration)을 변경할 수 있습니다.
SldWorks.Configuration 주요 메서드 및 속성
메서드/속성 | 설명 |
GetName | 구성의 이름을 반환합니다. |
GetRootComponent3 | 어셈블리에서 구성의 최상위 컴포넌트를 반환합니다. (어셈블리 전용) |
Activate | 해당 구성을 활성화합니다. |
ReferencedConfiguration | 다른 구성에서 참조된 구성 이름을 반환합니다. |
GetCustomPropertyManager | 구성에 정의된 사용자 정의 속성을 가져옵니다. |
ShowConfiguration | 구성을 화면에 표시합니다. |
예제: 구성 이름 가져오기
다음 코드는 부품이나 어셈블리 파일에 정의된 구성 이름을 가져오는 VBA 매크로입니다.
Sub GetConfigurations()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfig As SldWorks.Configuration
Dim configName As String
' SolidWorks 애플리케이션 연결
Set swApp = GetObject(, "SldWorks.Application")
Set swModel = swApp.ActiveDoc
' 활성화된 문서 확인
If swModel Is Nothing Then
MsgBox "활성화된 문서가 없습니다."
Exit Sub
End If
' 첫 번째 구성 가져오기
Set swConfig = swModel.GetFirstConfiguration
Do While Not swConfig Is Nothing
' 구성 이름 가져오기
configName = swConfig.GetName
Debug.Print "구성 이름: " & configName
' 다음 구성으로 이동
Set swConfig = swConfig.GetNext
Loop
End Sub
예제: 특정 구성 활성화
다음은 특정 구성을 활성화하는 코드입니다
Sub ActivateConfiguration()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfig As SldWorks.Configuration
Dim configName As String
' SolidWorks 애플리케이션 연결
Set swApp = GetObject(, "SldWorks.Application")
Set swModel = swApp.ActiveDoc
' 활성화된 문서 확인
If swModel Is Nothing Then
MsgBox "활성화된 문서가 없습니다."
Exit Sub
End If
' 활성화하려는 구성 이름
configName = "Configuration1"
' 해당 구성 활성화
Set swConfig = swModel.ConfigurationByName(configName)
If swConfig Is Nothing Then
MsgBox "구성을 찾을 수 없습니다: " & configName
Else
swConfig.Activate
MsgBox "구성이 활성화되었습니다: " & configName
End If
End Sub
예제: 어셈블리에서 최상위 컴포넌트 가져오기
어셈블리에서 활성 구성의 최상위 컴포넌트를 가져옵니다.
Sub GetRootComponent()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swConfig As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
' SolidWorks 애플리케이션 연결
Set swApp = GetObject(, "SldWorks.Application")
Set swModel = swApp.ActiveDoc
' 어셈블리 문서인지 확인
If swModel.GetType <> swDocASSEMBLY Then
MsgBox "어셈블리 파일이 아닙니다."
Exit Sub
End If
' 활성 구성의 최상위 컴포넌트 가져오기
Set swAssy = swModel
Set swConfig = swModel.GetActiveConfiguration
Set swRootComp = swConfig.GetRootComponent3(True)
If Not swRootComp Is Nothing Then
MsgBox "최상위 컴포넌트 이름: " & swRootComp.Name2
Else
MsgBox "최상위 컴포넌트를 찾을 수 없습니다."
End If
End Sub
Dim swRootComp As SldWorks.Component2
Set swRootComp = swConfig.GetRootComponent3(True)
SldWorks.Component2 객체는 어셈블리에서 사용되는 컴포넌트(부품 또는 서브어셈블리)를 나타냅니다. 이 객체를 사용하면 어셈블리에 포함된 부품이나 서브어셈블리의 속성 및 상태에 액세스하고, 이를 조작할 수 있습니다. Component2는 어셈블리 내에서 개별 부품이나 하위 어셈블리를 관리하는 데 필수적입니다.
SldWorks.Component2 주요 기능 및 역할
1) 컴포넌트 정보 가져오기:
컴포넌트 이름, 파일 경로, 구성(Configuration) 등의 정보를 가져옵니다.
2) 컴포넌트 구조 탐색:
컴포넌트의 하위 컴포넌트(부품 또는 서브어셈블리)를 탐색할 수 있습니다.
3) 위치 및 변환 관리:
어셈블리 내 컴포넌트의 위치 및 변환 행렬(Transformation Matrix)을 가져오거나 설정할 수 있습니다.
4) 가시성 및 활성 상태 제어:
컴포넌트의 가시성(Visible), 고정 상태(Fixed), 활성 상태 등을 제어합니다.
5) 구성 관리:
컴포넌트가 사용하는 구성(Configuration)을 확인하거나 변경할 수 있습니다.
6) 속성 변경 및 커스터마이징:
사용자 정의 속성(Custom Properties)이나 특정 설정을 변경합니다.
SldWorks.Component2 주요 메서드 및 속성
메서드/속성 | 설명 |
Name2 | 컴포넌트 이름을 반환합니다. |
GetChildren | 하위 컴포넌트 배열을 반환합니다. |
GetModelDoc2 | 컴포넌트에 연결된 ModelDoc2 객체(부품 또는 어셈블리)를 반환합니다 |
GetPathName | 컴포넌트의 파일 경로를 반환합니다. |
Visible | 컴포넌트의 가시성을 가져오거나 설정합니다. |
GetTotalTransform | 어셈블리 기준으로 컴포넌트의 총 변환 행렬을 반환합니다. |
IsSuppressed | 컴포넌트가 억제(Suppressed) 상태인지 확인합니다. |
Select4 | 컴포넌트를 선택합니다. |
GetCustomPropertyManager | 컴포넌트의 사용자 정의 속성(Custom Properties)을 관리하는 객체를 반환합니다. |
GetReferencedConfiguration | 컴포넌트에서 참조하는 구성 이름을 반환합니다. |
SetSuppression2 | 컴포넌트의 억제(Suppress) 상태를 설정합니다. |
IGetMaterialPropertyValues | 컴포넌트의 재질(Material) 속성을 가져옵니다. |
예제 : 컴포넌트 이름 및 파일 경로 출력
다음 코드는 어셈블리의 모든 컴포넌트 이름과 파일 경로를 출력합니다.
Sub ListComponentNames()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swConfig As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
Dim swComp As SldWorks.Component2
Dim vChildComp As Variant
Dim i As Integer
' SolidWorks 애플리케이션 연결
Set swApp = GetObject(, "SldWorks.Application")
Set swModel = swApp.ActiveDoc
' 어셈블리 문서 확인
If swModel.GetType <> swDocASSEMBLY Then
MsgBox "어셈블리 문서가 아닙니다."
Exit Sub
End If
' 어셈블리의 루트 컴포넌트 가져오기
Set swAssy = swModel
Set swConfig = swModel.GetActiveConfiguration
Set swRootComp = swConfig.GetRootComponent3(True)
' 루트 컴포넌트의 하위 컴포넌트 탐색
vChildComp = swRootComp.GetChildren
For i = LBound(vChildComp) To UBound(vChildComp)
Set swComp = vChildComp(i)
Debug.Print "컴포넌트 이름: " & swComp.Name2
Debug.Print "파일 경로: " & swComp.GetPathName
Next i
End Sub
예제 : 하위 컴포넌트 재귀 탐색
어셈블리의 모든 컴포넌트를 재귀적으로 탐색합니다.
Sub TraverseComponents(swComp As SldWorks.Component2, level As Integer)
Dim vChildComp As Variant
Dim swChildComp As SldWorks.Component2
Dim i As Integer
' 현재 컴포넌트 이름 출력
Debug.Print String(level * 2, " ") & "- " & swComp.Name2
' 하위 컴포넌트 가져오기
vChildComp = swComp.GetChildren
For i = LBound(vChildComp) To UBound(vChildComp)
Set swChildComp = vChildComp(i)
' 재귀적으로 하위 컴포넌트 탐색
TraverseComponents swChildComp, level + 1
Next i
End Sub
예제 : 컴포넌트 억제(Suppress) 상태 변경
컴포넌트를 억제하거나 다시 활성화합니다.
Sub SuppressComponent()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swComp As SldWorks.Component2
' SolidWorks 애플리케이션 연결
Set swApp = GetObject(, "SldWorks.Application")
Set swModel = swApp.ActiveDoc
' 첫 번째 컴포넌트 가져오기
Set swComp = swModel.GetActiveConfiguration.GetRootComponent3(True).GetChildren(0)
' 억제 상태 변경
If swComp.IsSuppressed Then
swComp.SetSuppression2 1 ' 억제 해제 (Resolved)
Else
swComp.SetSuppression2 0 ' 억제 (Suppressed)
End If
End Sub
'VBA SOLIDWORK' 카테고리의 다른 글
BOM 컨셉 코드 (1) | 2024.12.20 |
---|---|
독립 프로그램 개발을 위한 VB.NET 개발 환경 설정 (1) | 2024.12.20 |
모델의 치수 이름 및 값을 가져오는 기능 (0) | 2024.12.17 |
모델의 Feature 이름 가져오기 (0) | 2024.12.15 |
모델 이름 Paramter 이름, 값, 유형 표시 하기 #2/2 (1) | 2024.12.13 |