본문 바로가기
  • Welcome!
VBA SOLIDWORK

어셈블리 구조를 가져 오는 코드 - 컨셉

by ToolBOX01 2024. 12. 19.
반응형

□ 컨셉 코드

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