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

Creo 모델 이름 표시하기 #1/2

by ToolBOX01 2024. 12. 6.
반응형

□ Visual Basic.NET 애플리케이션

VB API를 사용하여 다음 작업을 수행할 수 있습니다.

  • VB.NET 폼을 생성하여 그래픽 사용자 인터페이스 없이 소프트웨어를 시작하거나 연결하고, 사용자 입력을 받아 모델 수정 또는 결과물을 생성할 수 있습니다.(그래픽 사용자 인터페이스(GUI) 없이 Creo 소프트웨어를 시작하거나 연결하고, 사용자 입력을 받아 모델 수정 또는 결과물을 생성하는 방식)
  • 자체 사용자 인터페이스(UI)를 가지거나 가지지 않을 수 있는 VB.NET 애플리케이션을 생성할 수 있습니다. 이 애플리케이션은 세션 내에서 하나 이상의 UI 또는 이벤트 리스너를 설정하고, VB.NET 코드를 사용하여 해당 이벤트를 처리할 수 있습니다.

▷ Crei VB.NET 개발 환경 설정

Creo VB API 애플리케이션을 개발하고 실행하기 위해 추가적인 라이선스는 필요하지 않습니다.
만약 Creo VB API Toolkit이 이미 설치되어 있다면, Creo 설치 폴더 안에서 관련 파일과 폴더를 확인할 수 있습니다.

From Creo 5.0 to Creo 8.0 : Creo 설치가 완료되면, 폴더 및 파일 이름을 확인 하십시요

  1. <Load point>\Common Files\vbapi
  2. <Load point>\Common Files\%PRO_MACHINE_TYPE%\obj\pfclscom.exe
  3. <Load point>\Parametric\bin\vb_api_register.bat and vb_api_unregister.bat

다음과 같이 VB.NET 사용을 위한 설정을 합니다.

1. PTC Creo Parametric VB API 타입의 COM 라이브러리를 등록하려면, 배치 파일을 실행해야 합니다.
   - 컴퓨터가 VB API(Visual Basic Application Programming Interface)를 인식하고 사용할 수 있도록 필요한 설정이
     자동으로 등록 (COM 라이브러리 등록)
     COM 라이브러리 등록은 API와 Creo 간의 연결을 설정하는 과정이라고 생각하면 됩니다.
   - \Parametric\bin\vb_api_register.bat 파일을 관리자 모드에서 실행 합니다

2. Window 환경 설정
 PRO_COMM_MSG_EXE=D:\PTC\CRE9.0\COMMON~1\\86e_win64\obj\pro_comm_msg.exe
 PRO_DIRECTORY=D:\PTC\CREO9.0\COMMON~1
 PFCLS_START_DIR=C:\TEMP

3. 프로젝트 선택 > 참조 메뉴에서 오른쪽 마우스 클릭 > 참조 추가 선택 (아래 그림을 참고 하십시요)

라이브러리 추가 합니다.


□ Visual Basic.NET 예외 처리

 

VB.NET에서 Try는 예외 처리를 위해 사용됩니다. Try 블록은 프로그램 실행 중 발생할 수 있는 예외를 감지하고 처리할 수 있도록 합니다. 예외는 코드 실행 중에 발생하는 예기치 않은 오류로, 이를 적절히 처리하지 않으면 프로그램이 충돌할 수 있습니다.

Try 블록은 일반적으로 Catch, Finally와 함께 사용됩니다. 기본 구조는 아래와 같습니다.

Try
    '// 예외가 발생할 가능성이 있는 코드
    Catch ex As Exception
    '// 예외가 발생했을 때 실행할 코드
    Finally
    '// 예외 발생 여부와 상관없이 항상 실행되는 코드 (선택적)
End Try

 

▷ 주요 구성 요소

  • Try 블록: 예외가 발생할 가능성이 있는 코드를 작성하는 부분입니다.
  • Catch 블록:특정 예외가 발생했을 때 이를 처리하는 코드입니다.
                       여러 개의 Catch 블록을 사용하여 다양한 예외 유형을 처리할 수 있습니다.
  • Finally 블록: 예외가 발생했는지 여부와 관계없이 항상 실행됩니다. 
                         파일 닫기, 리소스 해제 등 정리 작업에 유용합니다. (선택적)

예제

1) 예제 코드 - 기본 예외 처리

Try
    Dim number As Integer = Convert.ToInt32("123a") '// 예외 발생
    
    Catch ex As FormatException
    Console.WriteLine("형식 변환 오류 발생: " & ex.Message)
    
    Catch ex As Exception
    Console.WriteLine("알 수 없는 오류 발생: " & ex.Message)
    
    Finally
        Console.WriteLine("예외 처리 완료.")
End Try

결과 출력 :
- number 변수의 유형은 정수 입니다. "123a"은 문자가 포함 되어 있습니다.
- Integer 데이터 형식은 32비트 프로세서에서 최적의 성능을 제공합니다.

형식 변환 오류 발생: 입력 문자열의 형식이 잘못되었습니다.
예외 처리 완료.

2) 예제 코드 - Finally 블록 사용

Try
        Dim result As Integer = 10 / 0  '// 0으로 나누기 예외 발생
        
        Catch ex As DivideByZeroException
        Console.WriteLine("0으로 나눌 수 없습니다: " & ex.Message)
        
        Finally
        Console.WriteLine("프로그램이 종료되었습니다.")
End Try

결과 출력 :
- result 값은 정수 입니다.

0으로 나눌 수 없습니다: 0으로 나눌 수 없습니다.
프로그램이 종료되었습니다.

▷ 주요 포인트

  • 예외 처리의 중요성:
    예외 처리를 통해 프로그램이 갑작스럽게 종료되는 것을 방지하고, 사용자에게 유용한 메시지를 제공할 수 있습니다.
  • 구체적인 예외 처리: 
    구체적인 예외(FormatException, DivideByZeroException 등)를 먼저 처리하고, 일반적인 예외(Exception)는 나중에 처리하는 것이 좋습니다.
  • Finally의 활용: 파일 닫기, 데이터베이스 연결 해제 등 리소스 정리가 필요한 경우에 Finally 블록을 활용합니다.

□ Creo 모델 이름 가져오기

"Click" 버튼을 클릭하면, 현재 활성화된 Creo 모델 이름 가져오기는 기능

"Click" 버튼 코드

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim AConnection As IpfcAsyncConnection
        Dim CConnection As New CCpfcAsyncConnection
        Dim BSession As IpfcBaseSession
        Dim Model As IpfcModel

        Try
            If Not AConnection Is Nothing Then
                AConnection = CConnection.GetActiveConnection
            Else
                AConnection = (New CCpfcAsyncConnection).Connect(Nothing, Nothing, Nothing, Nothing)
            End If

                BSession = AConnection.Session
                Model = BSession.CurrentModel

                MsgBox(Model.FileName)
            
        Catch ex As Exception

                MsgBox("ok")

        End Try

    End Sub
End Class

 

IpfcAsyncConnection : 이 클래스는 Creo Parametric에 대한 비동기 연결을 나타냅니다.

AConnection = CConnection.GetActiveConnection
애플리케이션이 Creo Parametric과 연결된 경우, 이 함수를 호출하여 연결 객체를 가져올 수 있습니다.

Function CCpfcAsyncConnection.GetActiveConnection () as IpfcAsyncConnection [optional]

 

아래 코드를 참고 하였습니다.

 

How to get parameter values by API

Hi everybody, I am using the VB.NET API for gathering informations about the current model. Especially the Creo parameters (see picture below). You can get the parameters by IpfcParameterOwner owner = (IpfcParameterOwner)currentModel; foreach (IpfcParamete

community.ptc.com

 

Sample Code (pfcAsynchronousModeExamples.vb)

'======================================================================
'   HISTORY
'
' 19-Mar-07  L-01-26    SNV    ##1  Created 
' 17-Apr-07  L-01-30    JCN    $$1  Submitted
' 13-Jun-07  L-01-33    SNV    $$2  Added working directory options
' 07-Jul-11  P-10-03  sbinawad  $$3 Updated form Rebranding
'======================================================================

Imports pfcls
Public Class pfcAsynchronousModeExamples

    'Async start example
    '======================================================================
    'Function   :   runProE 
    'Purpose    :   This function makes Creo Parametric run in batch mode, 
    '               without user input.  The application starts Creo 
    '               Parametric, performs the designated operations, and 
    '               shuts down Creo Parametric.
    '======================================================================
    Public Sub runProE(ByVal exePath As String, ByVal workDir As String)

        Dim asyncConnection As IpfcAsyncConnection = Nothing
        Dim cAC As CCpfcAsyncConnection
        Dim session As IpfcBaseSession

        Try
            '======================================================================
            'First Argument : The path to the Creo Parametric executable along with
            ' Command() line options. -i and -g flags make Creo Parametric run in 
            ' non-graphic, 'non-interactive mode.
            'Second Argument: String path to menu and message files. 
            '======================================================================
            cAC = New CCpfcAsyncConnection
            asyncConnection = cAC.Start(exePath + " -g:no_graphics -i:rpc_input", ".")
            session = asyncConnection.Session

            '======================================================================
            'Set working directory
            '======================================================================
            asyncConnection.Session.ChangeDirectory(workDir)

            '======================================================================
            'VB api process calls and other processing to be done
            '======================================================================
            Dim descModel As IpfcModelDescriptor
            Dim model As IpfcModel

            descModel = (New CCpfcModelDescriptor).Create(EpfcModelType.EpfcMDL_PART, _
                                                   "partModel.prt", Nothing)
            model = session.RetrieveModel(descModel)

        Catch ex As Exception
            MsgBox(ex.Message.ToString + Chr(13) + ex.StackTrace.ToString)
        Finally
            '======================================================================
            'End the Creo Parametric session when done
            '======================================================================
            If Not asyncConnection Is Nothing AndAlso asyncConnection.IsRunning Then
                asyncConnection.End()
            End If

        End Try
    End Sub

End Class

'Full Async example
'======================================================================
'Class      :   pfcFullAsyncExample 
'Purpose    :   This class demonstrates full async mode application. 
'               It first starts Creo Parametric and sets up action 
'               listeners for Creo Parametric events, in this case, 
'               the menu button and the termination listener.
'======================================================================
Public Class pfcFullAsyncExample

    Private asyncConnection As pfcls.IpfcAsyncConnection

    Public Sub New(ByVal exePath As String, ByVal workDir As String)
        Try
            startProE(exePath, workDir)
            addTerminationListener()
            addMenuAndButton()
            asyncConnection.WaitForEvents()

        Catch ex As Exception
            MsgBox(ex.Message.ToString + Chr(13) + ex.StackTrace.ToString)
        Finally
            If Not asyncConnection Is Nothing AndAlso asyncConnection.IsRunning Then
                asyncConnection.End()
            End If

        End Try

    End Sub

    '======================================================================
    'Function   :   startProE
    'Purpose    :   Start new Creo Parametric session and change to current 
    '               directory.
    '======================================================================
    Private Sub startProE(ByVal exePath As String, ByVal workDir As String)

        asyncConnection = (New CCpfcAsyncConnection).Start(exePath, ".")
        asyncConnection.Session.ChangeDirectory(System.Environment.CurrentDirectory)

    End Sub

    '======================================================================
    'Function   :   addTerminationListener
    'Purpose    :   This function adds termination listener to the Creo 
    '               Parametric session.
    '======================================================================
    Private Sub addTerminationListener()
        Dim terminationListener As New ProEExitListener()
        Try
            asyncConnection.AddActionListener(terminationListener)
        Catch ex As Exception
            MsgBox(ex.Message.ToString + Chr(13) + ex.StackTrace.ToString)
        End Try

    End Sub

    '======================================================================
    'Class      :   ProEExitListener
    'Purpose    :   This class must implement the listner interface along 
    '               with the correct client interface name. The OnTerminate
    '               function is called when the Creo Parametric session is 
    '               ended by the user.
    '======================================================================
    Private Class ProEExitListener
        Implements IpfcAsyncActionListener
        Implements ICIPClientObject
        Implements IpfcActionListener

        Public Function GetClientInterfaceName() As String Implements pfcls.ICIPClientObject.GetClientInterfaceName
            GetClientInterfaceName = "IpfcAsyncActionListener"
        End Function

        Public Sub OnTerminate(ByVal _Status As Integer) Implements pfcls.IpfcAsyncActionListener.OnTerminate
            Dim aC As pfcls.IpfcAsyncConnection

            aC = (New CCpfcAsyncConnection).GetActiveConnection
            aC.InterruptEventProcessing()

            MsgBox("ProE Exited")
        End Sub

    End Class

    '======================================================================
    'Function   :   addMenuAndButton
    'Purpose    :   This function demonstrates the usage of UI functions to
    '               add a new menu and button to Creo Parametric.
    '======================================================================
    Private Sub addMenuAndButton()
        Dim session As pfcls.IpfcSession
        Dim inputCommand As IpfcUICommand
        Dim buttonListener As IpfcUICommandActionListener
        Dim exitCommand As IpfcUICommand
        Dim eListener As IpfcUICommandActionListener

        Try
            session = asyncConnection.Session
            buttonListener = New ButtonListener()
            eListener = New ExitListener()

            '======================================================================
            'Command is created which will be associated with the button. The class
            'implementing the actionlistener must be given as input.
            '======================================================================
            inputCommand = session.UICreateCommand("INPUT", buttonListener)
            exitCommand = session.UICreateCommand("EXIT", eListener)

            '======================================================================
            'Menu is created and buttons are created in the menu 
            '======================================================================
            session.UIAddMenu("VB-Async", "Windows", "pfcAsynchronousModeExamples.txt", Nothing)

            session.UIAddButton(exitCommand, "VB-Async", Nothing, _
                                "USER Exit Listener", "USER Exit Help", "pfcAsynchronousModeExamples.txt")

            session.UIAddButton(inputCommand, "VB-Async", Nothing, _
                                "USER Async App", "USER Async Help", "pfcAsynchronousModeExamples.txt")


        Catch ex As Exception
            MsgBox(ex.Message.ToString + Chr(13) + ex.StackTrace.ToString)
        End Try

    End Sub

    '======================================================================
    'Class      :   ButtonListener
    'Purpose    :   This class must implement the listner interface along 
    '               with the correct client interface name. The OnCommand
    '               function is called when the user button is pressed.
    '======================================================================
    Private Class ButtonListener
        Implements pfcls.IpfcUICommandActionListener
        Implements ICIPClientObject

        Public Function GetClientInterfaceName() As String _
                        Implements ICIPClientObject.GetClientInterfaceName
            GetClientInterfaceName = "IpfcUICommandActionListener"
        End Function

        Public Sub OnCommand() Implements pfcls.IpfcUICommandActionListener.OnCommand
            Me.UserFunction()
        End Sub

        Public Sub UserFunction()
            MsgBox("User Button Pressed")
        End Sub

    End Class

    '======================================================================
    'Class      :   ExitListener
    'Purpose    :   This class must implement the listner interface along 
    '               with the correct client interface name. The OnCommand
    '               function is called when the user button is pressed to 
    '               exit the session listener.
    '======================================================================
    Private Class ExitListener
        Implements pfcls.IpfcUICommandActionListener
        Implements ICIPClientObject

        Public Function GetClientInterfaceName() As String _
                        Implements ICIPClientObject.GetClientInterfaceName
            GetClientInterfaceName = "IpfcUICommandActionListener"
        End Function

        Public Sub OnCommand() Implements pfcls.IpfcUICommandActionListener.OnCommand
            Me.UserFunction()
        End Sub

        Public Sub UserFunction()

            Dim aC As pfcls.IpfcAsyncConnection

            aC = (New CCpfcAsyncConnection).GetActiveConnection
            aC.InterruptEventProcessing()

            MsgBox("Listener Exited")
        End Sub

    End Class

End Class