본문 바로가기
  • You find inspiration to create your own path !
업무 자동화/VBA, VB.NET For Creo

초보자를 위해 . . . . Feature 정보 가져오기 #2 - Type

by ToolBOX01 2026. 5. 7.
반응형

모델은 다양한 요소를 가지고 있습니다. Feature, Dimension, Parameter  . . .등의 정보가 저장 되어 있습니다. 모델은 데이터 덩어리 입니다. 모델 안에 있는 요소들을 가져올수 있습니다. IpfcModelItemOwner는 Creo Parametric VBA API에서 모델 아이템(Feature, Datum 등)을 소유(포함)하는 객체에 대한 인터페이스입니다. 쉽게 말하면, "모델 아이템들을 리스트로 가져올 수 있는 능력을 부여하는 인터페이스"입니다.

디양한 요소들은 배열(Array)로 저정되어 있습니다, 순차적으로 저장 됩니다. (k1,k2,k3...)

 

예시 코드 : AI로 아래 코드를 분석 해보세요

Sub ListExample()
    Dim myFruitList As New Collection
    
    ' 1. 데이터 추가 (Add)
    myFruitList.Add "사과"
    myFruitList.Add "바나나"
    myFruitList.Add "포도"
    
    ' 2. 특정 데이터 출력 (인덱스 사용)
    Debug.Print myFruitList(1) ' 결과: 사과
    
    ' 3. 전체 데이터 순환 (For Each)
    Dim fruit As Variant
    For Each fruit In myFruitList
        Debug.Print fruit
    Next fruit
End Sub

 


인터페이스란?

한 마디로 말하면 "무엇을 할 수 있는가"를 약속한 계약서입니다.

비유를 들면, 콘센트(인터페이스)를 생각해보세요. 콘센트는 "220V, 50Hz 전기를 꽂을 수 있다"는 약속만 정의합니다. 선풍기든, 냉장고든, TV든 — 이 약속을 지키는 제품이면 무엇이든 꽂을 수 있습니다. 콘센트는 내부 구조를 신경 쓰지 않고, 오직 "꽂는 행위"만 보장합니다.

프로그래밍에서 인터페이스도 똑같습니다. IpfcModelItemOwner는 ListItems()를 반드시 가져야 한다고만 선언합니다. 실제로 어떻게 동작하는지는 그 인터페이스를 구현하는 클래스(IpfcModel 등)가 결정합니다.

인터페이스는 "무엇을"만 정의하고, "어떻게"는 정의하지 않습니다. IpfcModelItemOwner는 ListItems()가 있어야 한다고만 선언하고, 실제 동작은 IpfcModel이 결정합니다.

여러 클래스가 같은 인터페이스를 구현할 수 있습니다. 콘센트 규격을 따르는 제품이 선풍기도, 냉장고도 될 수 있듯이, IpfcModelItemOwner를 구현하는 클래스는 IpfcModel 외에도 여러 개가 될 수 있습니다.

코드가 유연해집니다. Dim owner As IpfcModelItemOwner로 선언하면, model 자리에 나중에 다른 객체가 와도 ListItems() 호출 코드는 그대로 유지됩니다. 이것이 인터페이스를 쓰는 가장 큰 이유입니다.

예제 코드

Dim model As pfcls.IpfcModel
Dim Modelowner As IpfcModelItemOwner
Dim FeatureItems As IpfcModelItems

Set Modelowner = model                          ' IpfcModel → IpfcModelItemOwner로 할당
Set FeatureItems = Modelowner.ListItems(EpfcModelItemType.EpfcITEM_FEATURE)

 

EpfcModelItemType 예시

 

 

Option Explicit

'// Creo Parametric의 피처 정보를 Excel로 가져오는 매크로
Sub Feature_name()
    On Error GoTo RunError ' 에러 발생 시 RunError 레이블로 이동
    
    ' 속도 향상 및 화면 깜빡임 방지를 위해 이벤트 비활성화
    Application.EnableEvents = False
    
    ' 1. 시트 존재 여부 확인
    ' "Program02"라는 이름의 시트가 있는지 체크합니다.
    If Not WorksheetExists("Program02") Then
        MsgBox "Worksheet 'Program02'를 찾을 수 없습니다.", vbExclamation, "오류"
        Exit Sub
    End If
    
    ' 2. Creo 접속을 위한 변수 선언
    Dim asynconn As New pfcls.CCpfcAsyncConnection ' 비동기 접속 객체 생성
    Dim conn As pfcls.IpfcAsyncConnection         ' 접속 상태 저장 객체
    
    ' 3. 실행 중인 Creo 세션에 연결
    ' Connect(디스플레이, 설정파일, IP주소, 타임아웃초)
    Set conn = asynconn.Connect("", "", ".", 5)
    
    ' 접속 실패 시 메시지 출력 후 종료
    If conn Is Nothing Then
        MsgBox "Creo Parametric 세션을 시작하거나 연결하는 중 오류가 발생했습니다.", vbInformation, "IDT"
        Exit Sub
    End If

    ' 4. Creo 세션 및 모델 정보 가져오기
    Dim BaseSession As pfcls.IpfcBaseSession
    Dim model As pfcls.IpfcModel

    Set BaseSession = conn.Session           ' 현재 활성화된 세션 할당
    Set model = BaseSession.CurrentModel    ' 세션에서 현재 열려 있는 모델 할당
    
    ' 만약 열린 모델이 없다면 종료
    If model Is Nothing Then
        MsgBox "활성화된 모델이 없습니다.", vbExclamation
        GoTo Cleanup
    End If
               
    ' 5. 현재 모델 정보를 엑셀 시트에 기록
    ' D2 셀에는 작업 디렉토리, D3 셀에는 파일명을 입력합니다.
    With Worksheets("Program02")
        .Cells(2, "D") = BaseSession.GetCurrentDirectory
        .Cells(3, "D") = model.FileName
    End With
    
    ' 6. 피처(Feature) 목록 추출 시작
    Dim Modelowner As IpfcModelItemOwner
    Dim FeatureItems As IpfcModelItems
    Dim Feature As IpfcFeature
    
    Set Modelowner = model ' 모델을 아이템 소유자 객체로 캐스팅
    
    ' 모델 내의 모든 '피처(ITEM_FEATURE)' 목록을 가져옵니다.
    Set FeatureItems = Modelowner.ListItems(EpfcModelItemType.EpfcITEM_FEATURE)
    
    Dim i As Long
    
    ' 7. 추출된 피처 목록을 순회하며 엑셀에 데이터 입력
    ' 루프는 0부터 (피처 개수 - 1)까지 반복됩니다.
    For i = 0 To FeatureItems.Count - 1
        
        Set Feature = FeatureItems(i) ' i번째 피처 객체 할당
        
        ' B열부터 E열까지 정보를 입력 (6행부터 시작)
        Cells(i + 6, "B") = i + 1                   ' 순번
        Cells(i + 6, "C") = Feature.FeatTypeName    ' 피처 타입 이름 (예: PRO_FEAT_EXTRUSION)
        Cells(i + 6, "D") = Feature.Number          ' 피처 번호 (ID)
        Cells(i + 6, "E") = Feature.FeatType        ' 피처 타입 (정수값)

    Next i
    
    ' 작업 완료 알림
    MsgBox "완료하였습니다"
    
' 8. 종료 및 메모리 정리 (Cleanup)
Cleanup:
    If Not conn Is Nothing Then
        If conn.IsRunning Then
            conn.Disconnect (2) ' Creo 세션과의 연결 해제
        End If
    End If
    
    ' 객체 변수 초기화 (메모리 해제)
    Set asynconn = Nothing
    Set conn = Nothing
    Set BaseSession = Nothing
    Set model = Nothing
    Application.EnableEvents = True
Exit Sub

' 에러 처리 핸들러
RunError:
    If Err.Number <> 0 Then
        MsgBox "프로세스 실패: 오류가 발생했습니다." & vbCrLf & _
               "오류 번호: " & CStr(Err.Number) & vbCrLf & _
               "오류 설명: " & Err.Description, vbCritical, "에러 발생"
        Resume Cleanup ' 에러가 발생해도 정리 코드로 이동
    End If
End Sub

'// 시트 존재 여부를 확인하는 보조 함수
Function WorksheetExists(shtName As String) As Boolean
    On Error Resume Next
    WorksheetExists = Not Worksheets(shtName) Is Nothing
    On Error GoTo 0
End Function

 

위 코드 실행 결과는 아래 사이트를 참고 하세요 

 

 

Creo Feature Type 가져오기

□ Feature Type을 표시 하는 방법Creo 모델은 다양한 Feature로 구성 되어 있습니다 다음과 같이 가져올 수 있습니다.PartAssemble □ 코드Option ExplicitSub Feature_name() On Error GoTo RunError Application.EnableEvents = Fa

tool-2020.tistory.com


by korealionkk@gmail.com

반응형