Option Explicit ' COPYRIGHT DASSAULT SYSTEMES 2004 ' ***************************************************************************** ' Purpose: Schematic component placement in free space and connected to ' existing component. ' Languages: VBScript ' Locales: English ' CATIA Level: V5R15 ' ***************************************************************************** Sub CATMain() ' ------------------------------------------------------------------------- ' Optional: allows to find the sample wherever it's installed dim sDocPath 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 schematic document Dim sCtlgFilePath sCtlgFilePath = CATIA.FileSystem.ConcatenatePaths(sDocPath, _ "online\CAAScdSchUseCases\samples\CAASCH_Sample.catalog") Dim objSchCtlgDoc As Document Set objSchCtlgDoc = CATIA.Documents.Open(sCtlgFilePath) ' Open main schematic P&ID design document (for new component instances created here) Dim sFilePath sFilePath = CATIA.FileSystem.ConcatenatePaths(sDocPath, _ "online\CAAScdSchUseCases\samples\CAASCH_RouteForPlacement2.CATProduct") Dim objSchDoc As Document Set objSchDoc = CATIA.Documents.Open(sFilePath) Dim strMessage As String strMessage = _ "--------------------------------------------------------------------" & vbCr strMessage = strMessage & _ "Output traces from CAASchPlaceComponent.CATScript" & vbCrLf ' ' Find the top node of the schematic object tree - schematic root. Dim objPrdRoot As Product Dim objSchRoot As SchematicRoot If ( Not ( objSchDoc Is Nothing ) ) Then Set objPrdRoot = objSchDoc.Product If ( Not ( objPrdRoot Is Nothing ) ) Then Set objSchRoot = objPrdRoot.GetTechnologicalObject("SchematicRoot") End If End If Dim objSchGRRCtlg As SchGRR Dim objSchCntblRef As SchAppConnectable Dim objSchComp2Ref As SchComponent2 Dim objSchCompInstA As SchComponent Dim objSchGRRCompInstA As SchGRRComp Dim objSchCompGraphInstA As SchCompGraphic Dim objSchCompatInstA As SchCompatible Dim objSchCompInstB As SchComponent '-------------------------------------------------------------------------- ' Component instance (to be created below) orientation matrix. ' x-axis = (1.0,0.0) ' y-axis = (0.0,1.0) ' origin = (100.0,300.0) '-------------------------------------------------------------------------- Dim db6Array(6) As CATSafeArrayVariant db6Array(0)=1.0 db6Array(1)=0.0 db6Array(2)=0.0 db6Array(3)=1.0 db6Array(4)=145.0 db6Array(5)=130.0 If ( Not ( objSchRoot Is Nothing ) ) Then '----------------------------------------------------------------------- ' Get the first symbol from component catalog. '----------------------------------------------------------------------- Set objSchGRRCtlg = objSchRoot.GetCompSymbolFromCatalog ("Blocking Valve",objSchCtlgDoc) If ( Not ( objSchGRRCtlg Is Nothing ) ) Then strMessage = strMessage & "Got the first catalog symbol" & vbCr '--------------------------------------------------------------------- ' Get the owner of the first symbol. That is a reference component ' in the catalog. '--------------------------------------------------------------------- Set objSchCntblRef = objSchGRRCtlg.GetSchObjOwner If ( Not ( objSchCntblRef Is Nothing ) ) Then strMessage = strMessage & "Got catalog connectable of the first symbol" & vbCr '------------------------------------------------------------------- ' Place an instance of the catalog reference in an empty space in ' the design document ' Note that the target document is an input to PlaceInSpace '------------------------------------------------------------------- Set objSchComp2Ref = objSchRoot.GetInterface ("CATIASchComponent2",objSchCntblRef) If ( Not ( objSchComp2Ref Is Nothing ) ) Then strMessage = strMessage & "Got catalog component reference of the symbol" & vbCr objSchComp2Ref.PlaceInSpace objSchGRRCtlg,db6Array,objSchDoc,objSchCompInstA If ( Not ( objSchCompInstA Is Nothing ) ) Then strMessage = strMessage & "Place component instance in space is successful" & vbCr End If End If End If End If '----------------------------------------------------------------------- ' Get another symbol from component catalog. '----------------------------------------------------------------------- Dim objSchGRRCVCtlg As SchGRR Dim objSchCntblCVRef As SchAppConnectable Dim objSchCompCVRef As SchComponent Set objSchGRRCVCtlg = objSchRoot.GetCompSymbolFromCatalog ("Control Valve",objSchCtlgDoc) If ( Not ( objSchGRRCVCtlg Is Nothing ) ) Then strMessage = strMessage & "Got the second catalog symbol" & vbCr '--------------------------------------------------------------------- ' Get the owner of the second symbol. That is a reference component ' in the catalog. '--------------------------------------------------------------------- Set objSchCntblCVRef = objSchGRRCVCtlg.GetSchObjOwner If ( Not ( objSchCntblCVRef Is Nothing ) ) Then strMessage = strMessage & "Got catalog connectable of the second symbol" & vbCr '------------------------------------------------------------------- ' Place an instance of the second reference connecting it to the ' first one. That is to "place" a new instance B connecting to ' the existing instance A. '------------------------------------------------------------------- Dim objCompRefPlaceInfo As AnyObject Dim objCompatInfo As AnyObject Dim objFinalPlaceInfo As AnyObject Dim bYesCompat As Boolean Dim bFindAllSolutions As Boolean Set objSchCompCVRef = objSchRoot.GetInterface ("CATIASchComponent",objSchCntblCVRef) If ( Not ( objSchCompCVRef Is Nothing ) ) Then strMessage = strMessage & "Got catalog component reference of the second symbol" & vbCr End If '------------------------------------------------------------------- ' Preparing to place B on A. ' 1- need to retreive a CATIASchCompatibility interface handle ' from the existing instance (objSchCompInstA), the one we have ' just placed in empty space. ' 2- need to retreive the graphical image (symbol instance) of ' objSchCompInstA. This is needed for the compatibility ' checking. ' For this we need another interface handle: CATIASchCompGraphic '------------------------------------------------------------------- If ( Not ( objSchCompInstA Is Nothing ) ) Then Set objSchCompatInstA = objSchRoot.GetInterface ("CATIASchCompatible", _ objSchCompInstA) Set objSchCompGraphInstA = objSchRoot.GetInterface ("CATIASchCompGraphic", _ objSchCompInstA) Set objSchGRRCompInstA = GetComponentImage (objSchCompGraphInstA) End If If ( Not ( objSchCompatInstA Is Nothing ) And _ Not ( objSchGRRCompInstA Is Nothing ) And _ Not ( objSchCompCVRef Is Nothing ) ) Then '---------------------------------------------------------------- ' 1- QueryConnectAbility. ' Ask the reference of the new instance B for information ' to use in compatibility checking. The objCompRefPlaceInfo ' is an output and should be used as a "black box". ' It is the input to the next call. ' ' 2- IsTargetOKForPlace ' Check whether A is compatible to B in making a connection. ' A is the first instance, it is the "target". ' objCompatInfo is an output and should be used as ' a "black box". It is an input to the next call. ' ' 3- GetBestFitPlaceInfo ' Input the placement location, close to the x-y location of ' the connector of objSchCompInstA (A) that you want to connect ' B to. ' objFinalPlaceInfo is an output and should be used as ' a "black box". It is an input to the next call. ' ' 4- PlaceOnComponentWithInfo ' Place a new instance with the black box info. ' '---------------------------------------------------------------- ' -- step 1 Set objCompRefPlaceInfo = objSchCompCVRef.QueryConnectAbility _ (objSchGRRCVCtlg) ' -- step 2 objSchCompatInstA.IsTargetOKForPlace objSchGRRCompInstA, _ objCompRefPlaceInfo, objCompatInfo, bYesCompat Dim db2Pt(2) As CATSafeArrayVariant '-- 6.50 is the relative x coordinate of the right connector '-- from the symbol origin db2Pt(0) = 145.0 + 5.00 db2Pt(1) = 130.0 If ( bYesCompat ) Then strMessage = strMessage & "Target is compatible" & vbCr bFindAllSolutions = false ' -- step 3 objSchCompatInstA.GetBestFitPlaceInfo db2Pt, objCompatInfo, _ objFinalPlaceInfo, bFindAllSolutions If ( Not ( objFinalPlaceInfo is Nothing ) ) Then ' -- step 4 Set objSchCompInstB = objSchCompCVRef.PlaceOnComponentWithInfo _ (objFinalPlaceInfo) If ( Not ( objSchCompInstB is Nothing ) ) Then strMessage = strMessage & _ "Place a new component instance on another existing object is successful" & vbCr End If End If Else strMessage = strMessage & "Target is NOT compatible" & vbCr End If End If '----If ( Not ( objSchCompatInstA Is Nothing )... End If '---- If ( Not ( objSchCntblCVRef Is Nothing )... End If '---- If ( Not ( objSchGRRCVCtlg Is Nothing )... End If '----If ( Not ( objSchRoot Is Nothing )... strMessage = strMessage & _ "--------------------------------------------------------------------" & vbCr MsgBox strMessage End Sub ' ----------------------------------------------------------------------------- ' | Find the first symbol used for the input schematic component. ' | Input: objSchCompGraphArg: the schematic component ' | (a CATIASchCompGraphic interface handle). ' | Returns: the component image (the symbol instance) ' ----------------------------------------------------------------------------- Private Function GetComponentImage (objSchCompGraphArg As SchCompGraphic) As SchGRRComp Dim objSchLSymbols As SchListOfObjects If ( Not ( objSchCompGraphArg Is Nothing ) ) Then Set objSchLSymbols = objSchCompGraphArg.ListGraphicalImages If ( Not ( objSchLSymbols Is Nothing ) ) Then Set GetComponentImage = objSchLSymbols.Item (1,"CATIASchGRRComp") End If End If End Function