업무 자동화/VBA, VB.NET For Creo

IpfcBaseSession : Method (Sub RegisterRelationFunction)

ToolBOX01 2025. 11. 3. 10:01
반응형

◎ Sub RegisterRelationFunction (Name as String, Listener as IpfcRelationFunctionListener, Options as IpfcRelationFunctionOptions [optional])

사용자(외부) 정의 함수를 Creo의 Relations 대화상자에서 사용 가능하게 등록하는 API입니다. 등록하면 사용자는 Relations 식 안에서 MYFUNC(x,y)처럼 이 함수를 호출할 수 있고, Creo가 호출될 때마다 등록한 리스너가 처리합니다

주요 포인트:

  • Name: Relations에서 보이는 함수 이름(고유). 동일 이름이 이미 있으면 IpfcXToolkitFound 예외가 발생합니다. 
  • Listener: IpfcRelationFunctionListener 인터페이스를 구현한 객체. 인자 검증(CheckArguments), 함수 평가(EvaluateFunction), 좌변 대입(AssignValue) 등 메서드를 제공해야 합니다.
  • Options: IpfcRelationFunctionOptions로 어떤 리스너 메서드(인자 체크, 표현식 평가, 값 할당)를 활성화/비활성화할지 설정할 수 있습니다.

실무 사용 예: 제조 공정 표(step table)에서 외부 함수를 사용해 파라미터를 자동계산하거나, 설계 규칙에 맞춘 사용자 함수(예: 단위 변환, 커스텀 수학 함수)를 Relations에서 직접 호출하게 할 때 유용합니다.

Relations 문장 안에서 호출 가능한 외부 함수(RegisterRelationFunction로 등록)를 만들어서, 
공정표의 입력값(길이·두께·재질 등)을 받아 

절삭 속도, 공정 시간, 툴 선택, 단위 변환, 표 조회 등을 자동으로 계산하거나 파라미터로 반영한다. 
이렇게 하면 공정 파라미터를 모델 내부에서 일관되게 유지하고, 설계 변경 시 공정도 자동 갱신된다.

용도·효과 (왜 쓰나?)

  • 자동화: 귀찮은 수식이나 표 참조를 Relations에 직접 쓰지 않고, 검증된 함수로 캡슐화 → 유지보수 쉬움.
  • 일관성: 회사 고유의 공정 규칙(예: 절삭속도 표, 두께 기반 공차 등)을 한 곳(함수)에서 관리.
  • 재사용성: 여러 모델/어셈블리에서 동일 함수 호출 가능 → 규칙 변경 시 함수만 수정하면 전체 반영.
  • 가독성: Relations가 간단해지고, 복잡한 계산은 함수 내부로 숨김.
  • 사용자 친화성: 디자인 엔지니어가 어려운 계산 없이 STEP_TIME(length, feed) 같은 간단한 식 사용.

실무 사용 시나리오 (구체적 사례들)

A. 절삭/가공 시간 자동 계산 (예)

  • 입력: 공작물 길이 L, 절삭이격 또는 깊이 d, 절삭속도 S(또는 재질에 따른 표)
  • 함수: STEP_TIME(L, feed, opType) → 가공 시간(초 또는 분) 반환
  • 이 함수 내부는 표(재질→절삭속도), 도구별 보정계수, 시작/정지 시간 상수 등을 이용해 계산.
proc_time = STEP_TIME(length, feedrate, "MILL")

 

B. 툴/홀더 자동 선택

  • 입력: 재질, 가공 깊이, 공차 요구치
  • 함수: SELECT_TOOL(material, depth, tolerance) → 툴 ID 또는 툴 반경 반환
  • 장점: CAM 연계 시 툴표 자동 매핑 가능.

C. 단위 변환 및 표준화

  • 함수: CONVERT("mm","inch", value) 또는 UNIT_CONV(value, "mm","in")
  • 이유: 사용자 입력 단위가 섞여 있어도 Relations에서 일관 단위로 처리.

D. 공정/품질 규칙 검증

  • 함수: CHECK_MIN_WALL(thickness, featureType) → True/False 또는 에러 코드
  • Relations에서 조건부 분기 가능:
IF NOT CHECK_MIN_WALL(thk, "RIB") THEN ERROR = 1

E. 회사 표(lookup table) 참조

  • 함수: LOOKUP_TABLE("cut_speed", material, thickness) → 표에 따른 권장값 반환
  • 표는 외부 DB, 엑셀, JSON 파일 등에서 읽을 수 있음(리스너 내부에서 처리).

 


배포·운영 고려사항 (현업 팁)

  • 초기 로드: Creo 시작 시 자동 등록하도록 start 매크로나 Windows 시작 스크립트 추가.
  • 버전 관리: 함수 버전(예: CMP_STEP_TIME_v1) 네이밍도 고려 — 규칙 변경 시 충돌 방지.
  • 권한·보안: 외부 DB나 파일 접근 시 보안·접근 권한 확인.
  • 로깅: 함수 내부 로깅(파일 또는 중앙 로그 서버)으로 문제 추적 용이.
  • 테스트 케이스: 표준 케이스 + 경계값 + 단위 혼용 케이스 작성.
  • 문서화: Relations 예제, 인자 설명, 반환 단위(분/초) 반드시 문서화.
  • 성능 모니터링: 모델 열 때/저장 시 Relations 재평가 비용 확인.

 


Sample code

    Dim session As pfcls.IpfcBaseSession
    Dim listener As SquareRelationListener
    Dim options As pfcls.IpfcRelationFunctionOptions
    
    
    '// 옵션 생성: 인자체크와 평가(EvaluateFunction) 사용 가능하게 설정 //'
    Set options = pfcls.CCpfcRelationFunctionOptions.Create()
    options.EnableArgumentCheckMethod = True
    options.EnableExpressionEvaluationMethod = True
    options.EnableValueAssignmentMethod = False  '// AssignValue는 사용하지 않음(예시) //'
    
    '// 리스너 객체 생성 (아래 클래스 정의 참조) '//
    Set listener = New SquareRelationListener
    
    ''' 함수 등록 — Relations 대화상자에서 SQUARE(...)로 사용 가능 //'
    session.RegisterRelationFunction "SQUARE", listener, options
    MsgBox "Relation function 'SQUARE' registered."

 

' --- Class Module: SquareRelationListener (implements IpfcRelationFunctionListener) ---
' 클래스 이름: SquareRelationListener
' implements pfcls.IpfcRelationFunctionListener

Option Explicit
Implements pfcls.IpfcRelationFunctionListener

' CheckArguments: 인자 수/타입 검사
Private Function pfcls_IpfcRelationFunctionListener_CheckArguments( _
    ByVal Owner As pfcls.IpfcRelationOwner, _
    ByVal FunctionName As String, _
    ByVal Arguments As pfcls.IpfcParamValues) As Boolean _
    Implements pfcls.IpfcRelationFunctionListener.CheckArguments

    ' 기대: 1개의 숫자 인자
    If Arguments.Count <> 1 Then
        pfcls_IpfcRelationFunctionListener_CheckArguments = False
        Exit Function
    End If
    
    Dim pv As pfcls.IpfcParamValue
    Set pv = Arguments.Item(1)
    
    ' 타입 확인: 숫자 (double 또는 integer) — 체크 방법은 API 버전에 따라 다름
    If pv.ParamType = pfcls.pfcParamTypeReal Or pv.ParamType = pfcls.pfcParamTypeInteger Then
        pfcls_IpfcRelationFunctionListener_CheckArguments = True
    Else
        pfcls_IpfcRelationFunctionListener_CheckArguments = False
    End If
End Function

' EvaluateFunction: 함수가 호출될 때 값을 계산해 반환
Private Function pfcls_IpfcRelationFunctionListener_EvaluateFunction( _
    ByVal Owner As pfcls.IpfcRelationOwner, _
    ByVal FunctionName As String, _
    ByVal Arguments As pfcls.IpfcParamValues) As pfcls.IpfcParamValue _
    Implements pfcls.IpfcRelationFunctionListener.EvaluateFunction

    Dim inVal As Double
    Dim outVal As Double
    Dim resultPv As pfcls.IpfcParamValue
    
    ' 단일 인자 읽기
    inVal = CDbl(Arguments.Item(1).GetDouble) ' 가정: GetDouble 메서드로 값 얻기 가능
    outVal = inVal * inVal
    
    ' 반환용 ParamValue 객체 생성 (구체적 생성 메서드는 API에 따라 다름)
    Set resultPv = pfcls.CCpfcParamValue.CreateReal(outVal) ' 예시 팩토리
    Set pfcls_IpfcRelationFunctionListener_EvaluateFunction = resultPv
End Function

' AssignValue: 함수가 좌변에 사용된 경우(예: SQUARE(a) = 9)
' 이 예제에서는 지원하지 않으므로 False 또는 에러 처리
Private Function pfcls_IpfcRelationFunctionListener_AssignValue( _
    ByVal Owner As pfcls.IpfcRelationOwner, _
    ByVal FunctionName As String, _
    ByVal Arguments As pfcls.IpfcParamValues, _
    ByVal Value As pfcls.IpfcParamValue) As Boolean _
    Implements pfcls.IpfcRelationFunctionListener.AssignValue

    ' 좌변 대입을 간단히 비지원 처리
    pfcls_IpfcRelationFunctionListener_AssignValue = False
End Function

 

by korealionkk@gmail.com


반응형