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

Feature가 종속 하는 파일 이름이 Session에 없는 경우

by ToolBOX01 2022. 12. 19.
반응형

Part를 구성 하는 Feature에 오류가 생기면, 어셈블을 Save As 하면, 오류 때문에 "재사용"이 불가능 합니다.
필요에 의해 최상위 어셈블 파일만 새롭게 만들어야 합니다. (Part를 변경하지 않고 어셈블리만 복사본 저장) 

[ Reuse 불가 ]

수백, 수천개의 부품이 "재사용" 불가 상태 입니다. 수백개의 파일을 수정 할수 없습니다. 

다음과 같은 방법을 사용 합니다. >> 편법을 사용 합니다.

1) 최상위 어셈블리를 엽니다.
2)
삽입 화살표를 트리의 맨 위로 이동합니다(효과적으로 모든 항목을 억제 합니다)


3) 이제 어셈블리 사본을 새 이름으로 저장합니다. 

4) 기존 어셈블리를 닫고 지웁니다. 

5) 새 어셈블리를 열고 삽입 화살표를 취소합니다.  어셈블 이름만 변경된 파일을 만들수 있습니다.


A, B plate에 체결을 위한 구멍을 만들때 "B"는 "A" 구멍을 스케치 참조로 사용 합니다. 스케치 참조한 "A" Part 파일이 Session에 없으면 오류 입니다. 수백, 수천개의 Part 파일에 참조 오류가 없는지 자동으로 알고 싶습니다.

"B" Part는 시간이 지남에 따라 "B-1", "B-2" . . .  등으로 파생 모델이 생성 됩니다. 불필요한 "참조"가 있는지 검색 하는 기능이 가능 한지 테스하는 코드 입니다 

사람들이 가장 빠른 시간 또는 가장 적은 수의 Feature로 모델을 만들고자 합니다. 이같은 잘못된 목표로 모델을 만들면,
강력하고 유연하지 않은 파라메트릭 CAD 모델링으로 재 활용이 어려운 모델을 만들게 됩니다.
모델에 이러한 품질이 부족하면 재사용이 불가능하지는 않더라도 엉성하고 어려울 것입니다.

초기 설계 단계에서 우리는 요구 사항과 모델이 미래에 어떻게 변할 것으로 예상 할 수 있습니다

그러나 시간이 지나 갈수록 모델을 간단하게 변경해도 재생성 실패를 겪을 것입니다. Circular References가 표시되고 
어느 시점에서 지저분한 참조가 너무 다루기 힘들어지고, 모델을 다시 만들어야 한다는 것을 느끼게 됩니다

 

[ 재 활용이 가능하게 모델링 ]


■ 어셈블에 포함된 어셈블 및 Part 파일 모두 표시

Sub PartDependency_check()

On Error GoTo RunError
    Dim asynconn As New pfcls.CCpfcAsyncConnection
    Dim conn As pfcls.IpfcAsyncConnection: Set conn = asynconn.Connect("", "", ".", 5)

    Dim oBaseSession As pfcls.IpfcBaseSession: Set oBaseSession = conn.session
    Dim oModel As pfcls.IpfcModel: Set oModel = oBaseSession.CurrentModel
    Dim oDependencies As IpfcDependencies: Set oDependencies = oModel.ListDependencies
    
    Dim i As Long
    Dim oDependency As IpfcDependency
    Dim oModelDescriptor As IpfcModelDescriptor
         
    For i = 0 To oDependencies.Count - 1
    
         Set oDependency = oDependencies.Item(i)
         Set oModelDescriptor = oDependency.DepModel
         Cells(i + 2, "D") = oModelDescriptor.GetFileName
      
    Next i
    
    'Disconnect with Creo
    conn.Disconnect (2)

    'Cleanup
    Set asynconn = Nothing
    Set conn = Nothing
    Set oBaseSession = Nothing
    Set oSession = Nothing
    Set oModel = Nothing
    

RunError:

    If Err.Number <> 0 Then
        MsgBox "Process Failed : Unknown error occurred." + Chr(13) + _
                "Error No: " + CStr(Err.Number) + Chr(13) + _
                "Error: " + Err.Description, vbCritical, "Error"

        If Not conn Is Nothing Then
            If conn.IsRunning Then
                conn.Disconnect (2)
            End If
        End If
    End If

End Sub

 

프로그램 실행 결과

 

위 코드는 Part 파일 과 어셈블 파일에서 사용 결과가 다릅니다. Part 모드에서는  모델이 종속 하는 "참조 모델들"을 표시 합니다. VBA 코드를 이용하여 오류가 발생한 Feature를 검색 하는 기능을 테스트 합니다. - 어떤 모델이 Session에 없는지  검색 할수 없습니다.

 - 모델 참조 뷰

아래 코드는 Part 파일에서 참조하는 모델중, Session에 없으면 파일 이름이 null 이 됩니다. 이 경우 만 엑셀 파일에 표시 됩니다

Option Explicit
Sub Failchek()

Application.EnableEvents = False
On Error GoTo RunError

        Dim asynconn As New pfcls.CCpfcAsyncConnection
        Dim conn As pfcls.IpfcAsyncConnection: Set conn = asynconn.Connect("", "", ".", 5)
        Dim oSession As pfcls.IpfcBaseSession: Set oSession = conn.session
        Dim oModel As IpfcModel: Set oModel = oSession.CurrentModel
        Dim oSolid As IpfcSolid: Set oSolid = oModel
        
        Cells(1, "B") = oModel.Filename
        
        Dim oModelDependencies As IpfcDependencies
        Set oModelDependencies = oModel.ListDependencies
        Dim oModelDependency As IpfcDependency
        Dim oModelDescriptor As IpfcModelDescriptor
        Dim oSessionFileName As String
                
        Dim oCreateModelDescriptor As New CCpfcModelDescriptor
        Dim oSessioncheck As IpfcModel
        
        Dim iCnt As Long
        
        If oModelDependencies.Count > 0 Then
        
            For iCnt = 0 To oModelDependencies.Count - 1
            
                Set oModelDependency = oModelDependencies.Item(iCnt)
                Set oModelDescriptor = oModelDependency.DepModel
                oSessionFileName = oModelDescriptor.GetFileName        
                Set oModelDescriptor = oCreateModelDescriptor.CreateFromFileName(oSessionFileName)
                Set oSessioncheck = oSession.GetModelFromDescr(oModelDescriptor)  '// Retrieve model name from session
                 
                 '// Referance Model Fail Check
                 
                If oSessioncheck Is Nothing Then
                
                   Cells(iCnt + 4, "A") = iCnt + 1
                   Cells(iCnt + 4, "B") = oSessionFileName
                   Cells(iCnt + 4, "c") = "Session has no files"
                
                End If
                
            Next iCnt
        
        End If
        
        '// Feature Fail Check
        
        Dim oFailedFeatures As IpfcFeatures
        Set oFailedFeatures = oSolid.ListFailedFeatures
        
        Dim oFailedFeature As IpfcFeature
        Dim i As Long
              
        If oFailedFeatures.Count > 0 Then
        
                For i = 0 To oFailedFeatures.Count - 1
                
                    Cells(i + 4 + oModelDependencies.Count, "E") = i + 1 + oModelDependencies.Count
                    Set oFailedFeature = oFailedFeatures.Item(i)
                    Cells(i + 4 + oModelDependencies.Count, "F") = oFailedFeature.Number
                    Cells(i + 4 + oModelDependencies.Count, "G") = "regenerate Failed"
                
                Next i
        
        End If           
              
        conn.Disconnect (2)
    
    'Cleanup
    Set asynconn = Nothing
    Set conn = Nothing
    Set oSession = Nothing
    Set oModel = Nothing


    
RunError:
    If Err.Number <> 0 Then
        MsgBox "Process Failed : Unknown error occurred." + Chr(13) + _
                "Error No: " + CStr(Err.Number) + Chr(13) + _
                "Error: " + Err.Description, vbCritical, "Error"
        If Not conn Is Nothing Then
            If conn.IsRunning Then
                conn.Disconnect (2)
            End If
        End If
    End If

End Sub