Option Explicit
' COPYRIGHT DASSAULT SYSTEMES 2005

' *****************************************************************************
'   Purpose:      This sample illustrats the use of IDL interfaces
'                 CATIAPspFunctional, CATIAPspPhysical and CATIAPspSpatial
'   Assumption:   Looks for document CAAPspEduIn.CATProduct'  
'                 
'                 
'   Languages:    VBScript
'   Locales:      English 
'   CATIA Level:  V5R15 
' *****************************************************************************

'--- strMessage_g is a global variable visible to all private Sub/Function

Dim strMessage_g As String


Sub CATMain()

    ' ------------------------------------------------------------------------- 
    ' Optional: allows to find the sample wherever it's installed
    dim sDocPath As String 
    dim sDocFullPath As String 
    sDocPath=CATIA.SystemService.Environ("CATDocView")

    If (Not CATIA.FileSystem.FolderExists(sDocPath)) Then
      Err.Raise 9999,sDocPath,"No Doc Path Defined"
    End If

    ' ------------------------------------------------------------------------- 
    ' Open the Distributive system document 
    Dim objPspDoc As Document
    
	sDocFullPath = CATIA.FileSystem.ConcatenatePaths(sDocPath, _    
       "online\CAAScdPspUseCases\samples\CAAPspEduIn.CATProduct" )
    
    
    Set objPspDoc = CATIA.Documents.Open(sDocFullPath)


    strMessage_g = _
      "--------------------------------------------------------------------" & vbCr
    strMessage_g = strMessage_g & _
      "Output traces from CAAPspQueryFunctionPhysical.CATScript" & vbCrLf


    Dim objPrdRoot        As Product
    Dim objPspWorkbench   As PspWorkbench
    

    ' Find the top node of the Distributive System object tree - .  
    
    If ( Not ( objPspDoc Is Nothing ) ) Then
      Set objPrdRoot = objPspDoc.Product 
      If ( Not ( objPrdRoot Is Nothing ) ) Then
        Set objPspWorkbench = objPrdRoot.GetTechnologicalObject ("PspWorkbench")
      End If
    End If


    Dim objPspApplication As PspApplication
    Dim objPspAppFactory  As PspAppFactory
    Dim objPspResource    As PspResource
    

    Dim objPspPhysical    As PspPhysical
    Dim objPspSpatial     As PspSpatial
    Dim objPspFunctional  As PspFunctional

    Dim objPspPhyID       As PspID
    Dim objPhyPspObject   As PspObject


    
    Dim objLPhysicals     As PspListOfObjects
    Dim intNbPhysical     As Integer
    Dim ePspIDLDomainID   As CatPspIDLDomainID
    Dim objLStrAttrNames  As PspListOfBSTRs

    Dim intIndex          As Integer
    Dim intNbAttr         As Integer

    ePspIDLDomainID = catPspIDLCATPIP            

    '-----------------------------------------------------------------------
    ' Get PspWorkBench, PspApplication 
    '-----------------------------------------------------------------------

    
    If ( Not ( objPspWorkbench Is Nothing ) ) Then
      Set objPspApplication = objPspWorkbench.GetApplication(catPspIDLCATPiping)

      If ( objPspApplication Is Nothing  ) Then
        strMessage_g = strMessage_g & "Unable to get objPspApplication" & vbCr               
      Else
        strMessage_g = strMessage_g & "Success in getting objPspApplication" & vbCr      
        objPspApplication.Initialization()             
      End If
    End If '--- If ( Not ( objPspWorkbench Is Nothing )...
    

    '-----------------------------------------------------------------------
    ' Get  a PspPhysical object in the Piping domain
    '-----------------------------------------------------------------------

    If ( Not ( objPspWorkbench Is Nothing ) And _
         Not ( objPspApplication Is Nothing ) ) Then
                        
      Set objPspAppFactory = objPspWorkbench.GetInterface("CATIAPspAppFactory", _
                                                objPspApplication )      
      Set objPspResource = objPspWorkbench.GetInterface("CATIAPspResource", _
                                                objPspApplication )      

      If ( Not ( objPspAppFactory Is Nothing ) ) Then      

        Set objLPhysicals = objPspAppFactory.ListPhysicals ( objPrdRoot , catPspIDLCATPIP)
        If ( Not ( objLPhysicals Is Nothing ) And _
           ( objLPhysicals.Count > 0 ) ) Then      
          Set objPspPhysical =  objLPhysicals.Item( 1, "CATIAPspPhysical" )
        End If
      End If

    End If '--- If ( Not ( objPspWorkbench Is Nothing ) and objPspApplication
    
    '-----------------------------------------------------------------------
    ' Get Spatial object and Functional Object
    '-----------------------------------------------------------------------

    If ( Not ( objPspWorkbench Is Nothing ) And _
         Not ( objPspPhysical Is Nothing ) ) Then  

      Set objPspSpatial = objPspPhysical.GetSpatial     
      Set objPspFunctional = objPspPhysical.GetFunctional           
      Set objPspPhyID = objPspWorkbench.GetInterface("CATIAPspID", _
                                                    objPspPhysical )      
      Set objPhyPspObject = objPspWorkbench.GetInterface("CATIAPspObject", _
                                                    objPspPhysical )

      If ( Not (objPspPhyID Is Nothing) ) Then
        strMessage_g = strMessage_g & "Physical object ID =" &  objPspPhyID.GetID & vbCr               
      End If 

    End If

    '-----------------------------------------------------------------------
    ' Query Spatial Information
    '-----------------------------------------------------------------------
    
    If( Not ( objPspSpatial Is Nothing )) Then
        QuerySpatial objPspSpatial
    End if

    '-----------------------------------------------------------------------
    ' Query Functional-Physical Information
    '-----------------------------------------------------------------------
    If( Not ( objPspFunctional Is Nothing ) And _
        Not ( objPspPhysical Is Nothing ) And _
        Not ( objPspResource Is Nothing )   ) Then
            
      QueryFunctionalPhysical objPspPhysical, objPhyPspObject, _
                              objPspFunctional, objPspResource
    End if

 

    strMessage_g = strMessage_g & _
      "---------------------------------------------------------------" & vbCr
    MsgBox strMessage_g

End Sub

' -----------------------------------------------------------------------------
' | QuerySpatial methods 
' | 
' | Input: objPspSpatialArg        : PspSpatial object
' |        
' |        
' -----------------------------------------------------------------------------

Private Sub QuerySpatial (objPspSpatialArg As PspSpatial)  
    Dim objLPhysAssocSpatial  As PspListOfObjects
    Dim intNbPhysicals        As Integer
        
    Dim bIsIDGenerated   As Boolean
    
    If ( Not ( objPspSpatialArg Is Nothing ) ) Then         
      '--------------
      ' Get list of physical objects associate with spatial object
      Set objLPhysAssocSpatial = objPspSpatialArg.Physicals

      If ( Not ( objLPhysAssocSpatial Is Nothing ) ) Then
        intNbPhysicals = objLPhysAssocSpatial.Count
        
        strMessage_g = strMessage_g & _
           "Number of Physicals Associate with spatial=" & intNbPhysicals & vbCr                 
      
      End If       
    End If 
End Sub

' -----------------------------------------------------------------------------
' | QueryFunctionalPhysical : Query Functional physical integration
' | 
' | Input: objPspPhysicalArg    :  PspPhysical object
' |        objPspPhysicalArg    :  PspObject object
' |        objPspFunctionalArg  :  PspFunctional object
' |        objPspResourceArg    :  PspResource object  
' -----------------------------------------------------------------------------


Private Sub QueryFunctionalPhysical (objPspPhysicalArg As PspPhysical, _
                               objPhysicalPspObjArg    As PspObject, _
                               objPspFuncArg As PspFunctional, _
                               objPspResourceArg As PspResource )  

    Dim objLPhysicals           As PspListOfObjects

    Dim objLStrCompPartTypes    As PspListOfBSTRs
        

    Dim  strStdName             As String
    Dim  strPartType            As String
    Dim  strPartNumber          As String
    Dim  strResNamePipingParts  As String

    Dim  strCatalogPartName     As String
    Dim  strPartCatName         As String

    Dim  bIsSpecDriven          As CATBoolean
    Dim  bIsRealized            As CATBoolean
    Dim  bIsOkToIntegrate       As CATBoolean

    Dim  iNbCompPTypes          As Integer
    Dim  intIdx                 As Integer
    Dim  strCompPType           As String
    

    strStdName = "ASTL"
    strResNamePipingParts = "PipingPartsCatalog"

    If ( Not ( objPspFuncArg Is Nothing ) And _
         Not ( objPspPhysicalArg Is Nothing ) ) Then               
      '--------------------------
      ' Check if the function object IsSpecDriven
      
      bIsSpecDriven = objPspFuncArg.IsSpecDriven

      If ( bIsSpecDriven ) Then
        strMessage_g = strMessage_g & _
               "Function object is Spec driven" & vbCr                         
      Else 
        strMessage_g = strMessage_g & _
               "Function object is not Spec driven" & vbCr                         
      End If 

      '-------------------------------------------------------
      ' Check if Function object is associated with a placed
      ' physial part

      bIsRealized = objPspFuncArg.IsRealized

      
      If ( bIsSpecDriven ) Then
        strMessage_g = strMessage_g & _
               "Function object is Realized" & vbCr                         
      Else 
        strMessage_g = strMessage_g & _
               "Function object is not Realized" & vbCr                         
      End If 

      '-----------------------------------------
      ' Get Compatible part types
      '-----------------------------------------

      Set objLStrCompPartTypes = objPspFuncArg.GetCompatiblePartTypes (strStdName)

      If ( Not ( objLStrCompPartTypes Is Nothing ) ) Then  
        iNbCompPTypes = objLStrCompPartTypes.Count
        If ( iNbCompPTypes > 10 ) Then
           iNbCompPTypes = 10
       End If
          
        strMessage_g = strMessage_g & _
               "Number of compatible part types =" &  iNbCompPTypes & vbCr    
        For intIdx = 1 To iNbCompPTypes 
          strCompPType = objLStrCompPartTypes.Item (intIdx)
          strMessage_g = strMessage_g & _
               "Compatible part type = " &  strCompPType & vbCr    
          
        Next 
      End If

      '-----------------------------------------
      ' Get Physical startup type
      '-----------------------------------------

      If ( Not ( objPhysicalPspObjArg Is Nothing ) ) Then  
        strPartType = objPhysicalPspObjArg.StartupType
        strMessage_g = strMessage_g & _
               "Compatible Startup part type = " &  strPartType & vbCr    

      End If

      '-----------------------------------------
      ' Get PipingPartsCatalog full path 
      '-----------------------------------------
      If ( Not ( objPspResourceArg Is Nothing ) ) Then  
        strCatalogPartName = objPspResourceArg.GetResourcePath( strResNamePipingParts)      
        If ( strPartType <> "" ) Then
          strMessage_g = strMessage_g & _
               "PipingPartsCatalog= " & _
                strCatalogPartName & vbCr    
        End If

      End If
      
      Set objLPhysicals = objPspFuncArg.Physicals

      If ( Not ( objLPhysicals Is Nothing ) ) Then  
        strMessage_g = strMessage_g & _
          "Number of associated Physicals = " &  objLPhysicals.Count & vbCr          
      End If

      '-----------------------------------------
      ' Get Part Type of the associated physical object
      '-----------------------------------------


      strPartType   = objPspFuncArg.PartType 

      If ( strPartType <> "" ) Then
        strMessage_g = strMessage_g & _
               "Part type of physical object that realized this function = " & _
                strPartType & vbCr    
      End If

      '-----------------------------------------
      ' Get Part Number of the associated physical object
      '-----------------------------------------

      strPartNumber = objPspFuncArg.PartNumber
      If ( strPartNumber <> "" ) Then
        strMessage_g = strMessage_g & _
               "Part Number of physical object that realized this function = " & _
                strPartNumber & vbCr    
      End If

      '-----------------------------------------
      ' Get Catalog Part name of the associated physical object
      '-----------------------------------------

      strCatalogPartName= objPspFuncArg.CatalogPartName
      If ( strCatalogPartName <> "" ) Then
        strMessage_g = strMessage_g & _
               "CatalogPartName of physical object that realized this function = " & _
                strCatalogPartName & vbCr    
      End If

      
    

      '-----------------------------------------
      ' Check if the associated Physical object is OK to integrate
      '-----------------------------------------

      bIsOkToIntegrate = objPspFuncArg.IsOKToIntegrate

      If ( bIsOkToIntegrate) Then
        strMessage_g = strMessage_g & _
               "Function object is ok to integrate." & vbCr
                
      Else
        strMessage_g = strMessage_g & _
               "Function object is not ok to integrate" & vbCr
      End If

      '-----------------------------------------
      ' Function status
      '-----------------------------------------

      Dim eFunctionStatus As CatPspIDLFunctionStatus 
      eFunctionStatus = objPspFuncArg.FunctionStatus       
          
    End If 
End Sub