업무 자동화/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

반응형