본문 바로가기
  • Welcome!
VBA, VB.NET For Creo

IpfcAssembly 는 IpfcSolid 의 인스턴스입니다

by ToolBOX01 2024. 11. 13.
반응형

□ IpfcAssembly

IpfcAssembly가 IpfcSolid의 인스턴스라는 것은, IpfcAssembly 객체가 IpfcSolid 클래스에서 정의된 속성과 메서드를 사용할 수 있음을 의미합니다. IpfcSolid가 지니는 메서드와 속성을 물려받기 때문에 IpfcAssembly는 특정 메서드들을 자동으로 활용할 수 있는 권한을 갖습니다. 그러나 이와 별개로 어셈블리라는 객체 특성상 솔리드 지오메트리 데이터(예: 구멍, 슬롯)는 포함되지 않으며, 데이텀 요소(점, 평면, 축 등)만 포함된다는 점이 특징입니다.

▷어셈블리 안의 부품에 실제 형상(솔리드 기하학)이 있습니다

  • 어셈블리의 실제 형상(구멍이나 슬롯 등)은 각각의 부품에 들어 있습니다.
  • 어셈블리에서 구멍이나 슬롯을 추가해도, 실제로는 그 형상 정보가 수정된 특정 부품 내에 저장되며 어셈블리 자체에는 형상 정보가 저장되지 않습니다.
  • 어셈블리 내의 각 부품은 IpfcComponentFeat이라는 종류로, 부품 자체나 다른 어셈블리에 대한 참조(reference)이며, 이 부품이 어셈블리 안에서 위치가 어떻게 되는지 설정하는 파라미터도 가지고 있습니다.

어셈블리는 계층 구조를 가지며, 여러 레벨의 어셈블리와 파트를 포함할 수 있습니다. 루트 어셈블리의 컨텍스트에서 특정 데이터베이스 항목을 식별하기 위해서는 단순히 정수 식별자나 IpfcFeature 설명으로는 부족하며, 해당 항목까지의 전체 어셈블리-구성 요소 경로를 제공해야 합니다. 이를 위해 IpfcComponentPath 객체가 사용됩니다. 이 경로를 통해 특정 구성 요소에 대한 정확한 참조를 제공하여 API의 다양한 어셈블리 함수에 활용됩니다.
동일한 부품이 다양한 서브 어셈블에 조립 됩니다. 볼트의 경우 매우 많은 곳에 조립 됩니다.

▷ 계층 구조와 부품 식별 방법:

  • 어셈블리 안에는 여러 단계의 부품과 하위 어셈블리가 포함될 수 있으며, 일부 부품이나 어셈블리는 여러 번 등장할 수 있습니다.
  • 이렇게 복잡한 구조 안에서 부품을 정확히 식별하기 위해서는 단순히 숫자 ID(식별자)만으로는 부족합니다. 
    대신 최상위(root) 어셈블리에서 각 부품이나 하위 어셈블리까지 내려가는 “경로”를 지정해야 합니다.

IpfcComponentPath 객체:
IpfcComponentPath는 어셈블리 계층 구조 속에서 특정 부품이나 하위 어셈블리로 가는 경로를 지정하는 객체입니다.
이를 통해 복잡한 구조에서도 어셈블리 함수들이 정확하게 해당 부품을 찾을 수 있게 됩니다.

[Feature ID]

Feature ID(ComponentId)는 자동으로 Creo에서 발행 되며, 해당 어셈블에서만 유니크 합니다. 위 그림과 같이 Feature ID  "50"번은 전체 어셈블에서 보면 중복됩니다. 경로 와  Feature ID를 조합 해야 부품을 선택 할수 있습니다.

어셈블리가 계층적으로 구성된 모습이 있고, 이 구조에서 IpfcComponentPath 객체가 어떻게 특정 부품이나 하위 어셈블리의 경로를 나타내는지 두 가지 예시를 통해 설명 합니다. 어셈블리에서 부품 및 하위 어셈블리의 식별자와 IpfcComponentPath 객체의 사용법에 대해 설명합니다.

예를 들어, 1)어셈블리 A 내에서 서브어셈블리 C는 부품 식별자 11을 가지고 있고, 2)어셈블리 AB 내에서는 부품 B가 식별자 3을 가집니다. 이와 같은 방식으로 각 부품은 고유한 식별자를 가집니다. 

부품 식별자 = ComponentId = Feature ID   /  IpfcComponentPath = Level

부품 ID 참조:
각 부품을 참조할 때는 ComponentIds 객체를 사용하여 특정 부품을 식별할 수 있습니다. 하지만 " IpfcComponentPath"를 조합해야 구분 할수 있습니다.

예를 들어:
ComponentIds.Item(0) = 2, ComponentIds.Item(1) = 11처럼 각 아이템은 부품 식별자 번호를 지정합니다.
부품 B가 두 번 등장하므로 두 번째 경우의 ComponentIds는 두 번 나타나는 B를 구별할 수 있도록 부품 식별자 번호 를 설정합니다.

Component B’                    
ComponentIds.Item(0) = 2   
ComponentIds.Item(1) = 2   
ComponentIds.Item(2) = 5   
ComponentIds.Item(3) = 2  
ComponentIds.Item(4) = 3

* Item(0) 은 root 입니다.  ComponentIds.Item(0) = 2 은 root에서 " ComponentId : 2"를 나타냅니다.
                                        ComponentIds.Item(2) = 2 은 레벨 1에서 " ComponentId : 2"를 나타냅니다.

Component B"
ComponentIds.Item(0) = 11
ComponentIds.Item(1) = 6
ComponentIds.Item(2) = 12
ComponentIds.Item(3) = 3

동일한 서브 어셈블을 동일한 레벨에 조립하면, 서브 어셈블의 ID는 다릅니다. 하지만 동일한 쌍둥이 입니다. 내부가 변경 되면, 자동으로 업데이트 됩니다.


▷어셈블 모델이 가지고 있는 부품의 구분자 정보 가지고 오는 코드

Public useAsm As IpfcAssembly
Public pathArray As New Collection

Set useAsm = Model

'======================================================================
'This function returns an array of all ComponentPath's to all component parts ('leafs') in an assembly.
'======================================================================
Public Function listEachLeafComponentPath(ByVal assemblyIn As IpfcAssembly) As Collection
    Dim startLevel As New Cintseq
    Dim i As Integer
    
    Set pathArray = New Collection
    Set useAsm = assemblyIn
    
    Call listSubAsmComponents(startLevel)
  
    Dim compPaths() As IpfcComponentPath
    ReDim compPaths(pathArray.Count)
    
        For i = 0 To (pathArray.Count - 1)
                Set compPaths(i) = pathArray.item(i + 1)
        Next i
        
    Set listEachLeafComponentPath = pathArray

End Function

'================================================================================
'This function is used to recursively visits all levels of the assembly structure.
'================================================================================
Private Function listSubAsmComponents(ByVal currentLevel As Cintseq)
    Dim currentComponent As IpfcSolid
    Dim currentComponentModel As IpfcModel
    Dim currentPath As IpfcComponentPath
    Dim ComponentFeat As IpfcModelItem
    Dim subComponents As IpfcFeatures
    Dim compIds As New Cintseq
    Dim CMpfcAssembly_ As New CMpfcAssembly
    Dim i, id, level As Integer
    
    
        level = currentLevel.Count
        
                '======================================================================
                'Special case, level is 0 for the top level assembly.
                '======================================================================
            If level > 0 Then
                Set currentPath = CMpfcAssembly_.CreateComponentPath(useAsm, currentLevel)
                Set currentComponent = currentPath.Leaf
                Set currentComponentModel = currentPath.Leaf
                
                Else
                    
                    Set currentComponent = useAsm
                    Set currentComponentModel = useAsm
                    
            End If
              
              
            If (currentComponentModel.Type = EpfcMDL_PART) And (level > 0) Then
                    pathArray.Add currentPath
                Else
                
                If Not currentPath Is Nothing Then
                    pathArray.Add currentPath
                End If
                
                
                    '======================================================================================================================
                    'Find all component features in the current component object. Visit each (adjusting the component id paths accordingly).
                    '======================================================================================================================
                    
                    Set subComponents = currentComponent.ListFeaturesByType(False, EpfcFeatureType.EpfcFEATTYPE_COMPONENT)
                        
                        For i = 0 To (subComponents.Count - 1)
                            If (subComponents.item(i).Status = EpfcFeatureStatus.EpfcFEAT_ACTIVE) Then ''//Collect only Active Components
                                Set ComponentFeat = subComponents.item(i)
                                id = ComponentFeat.id

                                currentLevel.Set level, id
                                
                                
                                Call listSubAsmComponents(currentLevel)
                            End If
                        Next i
            End If
            '======================================================================
            'Clean up current level of component ids before returning up one level.
            '======================================================================
            If Not level = 0 Then
            currentLevel.Remove level - 1, level
            End If
      
End Function

 

▷ Function listEachLeafComponentPath(ByVal assemblyIn As IpfcAssembly) As Collection 활용 하는 코드

 

Public useAsm As IpfcAssembly
Public pathArray As New Collection
Public ComponetModel As pfcls.IpfcModel

Set useAsm = Model
Set pathArray = listEachLeafComponentPath(useAsm)

Dim eachPath As IpfcComponentPath
Dim ComponetIDIintseq As Iintseq

For iCnt = 0 To (pathArray.Count - 1)
	Set eachPath = pathArray.item(iCnt + 1)
    Set ComponetModel = eachPath.Leaf
    Set ComponetIDIintseq = eachPath.ComponentIds
    
    Worksheets("Suppress").Cells(kCnt + 6, "B") = ComponetModel.fileName
    Worksheets("Suppress").Cells(kCnt + 6, "D") = ComponetIDIintseq.item(ComponetIDIintseq.Count - 1)
    Worksheets("Suppress").Cells(kCnt + 6, jCnt + 4) = ComponetIDIintseq.item(jCnt)
    
Next iCnt

 

 

'VBA, VB.NET For Creo' 카테고리의 다른 글

Iintseq 클래스  (0) 2024.11.15
Cintseq  (0) 2024.11.15
개발 요청] 이미지 생성 프로그램 #2  (1) 2024.11.10
개발 요청] 이미지 생성 프로그램 #1  (0) 2024.11.03
깃 데스탑 설치와 사용 방법  (0) 2024.10.15