Home > The CATIA Object Model > Developing proper names to use in product relations

Developing proper names to use in product relations


Developing proper names to use in product relations

In the last article, I introduced some scenarios where you need to develop the proper name of an object to use in a part relation. This article follows up by discussing some other scenarios where the relation is created in a product and refers to various objects in both parts and products.

The scenarios

The table below summarizes four common scenarios you are likely to encounter when creating or modifying relations inside a product.

Case Where is the relation? Object referred to by the relation Example syntax
#3 Product Parameter in same product NumberOfHoles
#4 Product Non-published parameter in another product * `Product3\Hole Spacing`
#5 Product Published parameter in another product * ..!Product4!Product5!OverallWidth
#5 Product Published object in another part * ..!Product2!Part5!ResultArea
#6 Product Non-published object in another part * `Part1\Geometrical Set.1\Join.1`

* The item should be in the same assembly and in a common branch of the tree

Case #3 – Parameter in same product

In this case, we want to create a relation inside a product that refers to a parameter in the same product. As shown in the table above for case #3, the name used is typically just the parameter name itself. In this case just like in the previous article, the best way to develop the proper name is to use the GetNameToUseInRelation method of a Parameters object. The only real difference is that instead of accessing the parameters collection of a part, this time we will access the parameters collection of the product.

Let’s look at an example. Below, I will create a formula in a product that simply divides one parameter value in half and assigns that value to a second parameter. Both of those parameters also exist in the same product.

Sub Example_Case3()

   'Assume there are two real parameters in the main
   'parameter set of the root product in the active window

   Dim objProd As Product
   Dim objParams As Parameters
   Dim objParam1 As Parameter
   Dim objParam2 As Parameter
   Dim strName As String

   'Get at the two parameters
   Set objProd = CATIA.ActiveDocument.Product
   Set objParams = objProd.ReferenceProduct.Parameters.RootParameterSet.DirectParameters
   Set objParam1 = objParams.Item("Real.1")
   strName = objParams.GetNametoUseInRelation(objParam1)
   Set objParam2 = objParams.Item("Real.2")

   'Create the formula
   objProd.Relations.CreateFormula "", "", objParam2, strName &"/2"

End Sub

Case #4 – Non-published parameter in another product

In this case, we want to create a relation in a product that refers to a parameter in another product within the same assembly. Note that the other product should share a common branch in the assembly as well. Typically, in this scenario the name of the parameter will be made up of the product part number followed by a backslash then the parameter name. However, it is possible that the parameter is in a nested parameter set so the name could be something like, `Product3\ParameterSet1\ParameterSet2\Hole Spacing` instead of `Product3\Hole Spacing`. As in Case #3, the best way to develop this name is the GetNameToUseInRelation method. It will consider these special scenarios and always return the proper name.

To show some example code for this scenario, lets assume we have a product structure as shown below. The goal is to create a formula that simply makes the Hole Spacing parameter in Product1 equal to the Hole Spacing parameter in Product3.

Sub Example_Case4()

   Dim objProd1 As Product
   Dim objProd3 As Product
   Dim objParams As Parameters
   Dim objParam1 As Parameter
   Dim objParam3 As Parameter
   Dim strName As String

   'Access the 2 product objects
   Set objProd1 = CATIA.ActiveDocument.Product
   Set objProd3 = objProd1.Products.Item("Product2").Products.Item("Product3")

   'Get at the 2 parameters
   Set objParams = objProd1.Parameters.RootParameterSet.DirectParameters
   Set objParam1 = objParams.Item("Hole Spacing")
   Set objParams = objProd3.Parameters.RootParameterSet.DirectParameters
   Set objParam3 = objParams.Item("Hole Spacing")

   'Develop the proper name for objParam3
   'Then create the formula inside Product1
   Set objParams = objProd1.Parameters
   strName = objParams.GetNameToUseInRelation(objParam3)
   objProd1.Relations.CreateFormula "", "", objParam1, strName

End Sub

Case #5 – Published parameter in another product or published item in another part

In this case, we want to create a relation in a product that refers to either a published parameter in another product or to some published object inside a part in the same assembly. This is one of the unique cases where the GetNameToUseInRelation method cannot be used. Instead, I created a custom function that will return the proper name of a published object.

For this case I will show two examples. First, lets use the same scenario as in Case #4, except we will assume that the Hole Spacing parameter in Product3 is published. In this example, if we want to use the Hole Spacing publication from Product3 in a relation that exists in Product1, the proper name would be `..!Product2!Product3!Hole Spacing`. You can see some differences when publications are involved:

  • The name will always start with a ..!
  • The path between the products or product and part is important
  • The path will separate each node in the assembly with the ! character

Now lets develop that custom function. The idea here is to start at the product or part that has the publication and crawl back up the tree until we get to the product where the relation will be created. Along the way, we will add the ! character to separate each node in the assembly.

Function GetPubNameToUseInRelation(ByRef iRelationProd As Product, ByRef iPubProd As Product, ByRef iPub as Publication) As String

   ' iRelation product     The product where the relation is created
   ' iPubProd                The product containing the publication
   ' iPub                      the publication

   Dim objParent As Object
   Dim strName As String

   'Get the name of the publication and its product
   Set objParent = iPubProd
   strName = objParent.ReferenceProduct.PartNumber &"!" &iPub.Name

   'Walk back up the tree to the RelationProduct
   Set objParent = objParent.Parent
   Do While TypeName(objParent) <> "Application"
      If TypeName(objParent) = "Product" Then
         strName = objParent.ReferenceProduct.PartNumber &"!" &strName
         If objParent.Parent.Parent.ReferenceProduct.PartNumber = iRelationProd.ReferenceProduct.PartNumber Then Exit Do
      End If
      Set objParent = objParent.Parent
   Loop

   strName = "`..!" &strName &"`"

   GetPubNameToUseInRelation = strName

End Function

A few things to take note of in this function…

  • We don’t know how many product nodes might exist between the relation product and the publication product, so we have to loop an unknown number of times. Since this could result in an infinite loop, I added a while condition to the loop to check whether we have somehow walked all the way up the tree and never reached the product where the relation will be created. Here, I check for an object of type Application because the parent of the root product document will be the application object so we should stop the loop in this case. If we didn’t stop here, it will actually loop forever because the parent of the CATIA application is the CATIA application so it will never end.
  • The parent of a Product object is always a Products object unless the product is the root node in the assembly. This means that when we walk up the tree, every other loop cycle will access a Products object, not an actual product. This is why I check the TypeName and only add to strName if we have accessed a Product object.
  • It is safe to compare the PartNumber property of two products to see if they are the same product because CATIA requires that every part number must be unique in an assembly.

Here is an example showing how to use this new function in the scenario mentioned above.

Sub Example_Case5()

   Dim objProd1 As Product
   Dim objProd3 As Product
   Dim objParams As Parameters
   Dim objParam1 As Parameter
   Dim objPub As Publication
   Dim strName As String
   Dim objFormula As Formula

   'Access Product1 and its parameter
   Set objProd1 = CATIA.ActiveDocument.Product
   Set objParams = objProd1.Parameters.RootParameterSet.DirectParameters
   Set objParam1 = objParams.Item("Hole Spacing")

   'Access Product3 and its publication
   Set objProd3 = objProd1.Products.Item("Product2").Products.Item("Product3")
   Set objPub = objProd3.ReferenceProduct.Publications.Item("Hole Spacing")

   'Develop the proper name for the publication
   'Then create the formula inside Product1
   strName = GetPubNameToUseInRelation(objProd1, objProd3, objPub)
   Set objFormula = objProd1.Relations.CreateFormula("", "", objParam1, "")
   objFormula.Modify strName

End Sub

You can handle a similar scenario involving a publication in a part with the same code shown above. This might seem strange because the code above involves products, not parts. The key point to realize here is that every part actually has its own product object as well. You don’t see that product when a part is open in its own window but in an assembly it appears as the instance. Publications made in a part are always accessed through this product object, not the part object. This means that the code above would remain unchanged if you were to replace Product3 in the assembly with a part named Product3 that had the same publication called Hole Spacing.

Case #6 – Non-published object in another part

In this final scenario, we want to refer to an unpublished object that exists within some part in the assembly. This happens to be another case where the GetNameToUseInRelation method cannot be used on its own to get the proper name of that object. However, the solution does still utilize the GetNameToUseInRelation method with a bit of a twist.

In this scenario, the proper naming will look follow this convention: PartNumber\PathOfObjectInPart Unfortunately, the GetNameToUseInRelation function will return the second portion that I referred to as PathOfObjectInPart but it doesn’t include the part number and backslash in between. So this is another case where I use a custom function to give me the proper name every time. The custom function simply gets the part number and concatenates it to the object path. Here is the code:

Function GetObjectNameInPartToUseInProduct(ByRef iPart As Part, ByRef iObject As Object) As String

   ' iPart        Part that contains the object
   ' iObject    Object inside the part whose name we want
   '               This could be geometry, surface, etc.

   Dim strName As String

   'Get the proper name within the part
   strName = iPart.Parameters.GetNameToUseInRelation(iObject)

   'Strip any of the special quotes if they exist
   strName = Replace(strName, "`", "")

   'Concatenate this name to the part number
   'and add the special quotes to the start and end
   strName = "`" &iPart.Name &"\" &strName &"`"

   'Return the final string
   GetObjectNameInPartToUseInProduct = strName

End Function

To see this function in action, lets picture the following scenario – we want to create a formula in the root product that computes a value for the TotalArea parameter by adding the area of a join surface in Part1 and the area of a join surface in Part2. The simplified tree looks like this:

And here is the code:

Sub Example_Case6()

   Dim objProd As Product
   Dim objPart1 As Part
   Dim objPart2 As Part
   Dim objJoin1 As HybridShapeAssemble
   Dim objJoin2 As HybridShapeAssemble
   Dim strName1 As String
   Dim strName2 As String
   Dim objParam As Parameter
   Dim strFormula As String

   'Get at the root product and the first two parts under it
   Set objProd = CATIA.ActiveDocument.Product
   Set objPart1 = objProd.Products.Item(1).ReferenceProduct.Parent.Part
   Set objPart2 = objProd.Products.Item(2).ReferenceProduct.Parent.Part

   'Get at the two join surfaces
   Set objJoin1 = objPart1.HybridBodies.Item(1).Hybridshapes.Item("Join_Result")
   Set objJoin2 = objPart2.HybridBodies.Item(1).Hybridshapes.Item("Join_Result")

   'Get the proper names to use in the formula
   strName1 = GetObjectNameInPartToUseInProduct(objPart1, objJoin1)
   strName2 = GetObjectNameInPartToUseInProduct(objPart2, objJoin2)

   'Get at the TotalArea parameter
   Set objParam = objProd.Parameters.RootParameterSet.DirectParameters.Item("TotalArea")

   'Create the formula
   strFormula = "area(" &strName1 &") + area(" &strName2 &")"
   objProd.Relations.CreateFormula "", "", objParam, strFormula

End Sub

Additional Tips

  1. When trying to access parameters that belong to a product, you should always access them specifically through the root parameter set of that product. This is because the parameter collection you will get with the syntax Product.Parameters will include all parameters of that product as well as every parameter in every product and part below it. As shown in the above examples, the way to do this is to access Product.Parameters.RootParameterSet instead. To read more about this, check out this article.
  2. You may have noticed that CATIA will surround the name of an object used in a relation with special quote characters in some situations such as when the name has spaces in it. The GetNameToUseInRelation method as shown in this article will always judge whether those quotes are needed and will automatically return the name with them if required. However, when developing names to use in relations yourself (like in the custom functions above), always include the special quotes at the start and end of the name. If they are not needed, CATIA will remove them.

Sorry this article ended up so long! I generally try to keep the topics quite a bit shorter than this one and still cover the important points. When I started it, I grabbed some pieces from old projects and it didn’t look too bad, but it ended up really long. Anyway, I think it shows most of the common scenarios you will encounter and I hope it is helpful when you are working with relations in your automation projects.

Please take a moment to rate this article…Just click the stars up near the title.

Add to: del.icio.us del.icio.us, StumbleUpon StumbleUpon, Digg Digg, Google Google

Advertisements
  1. July 14, 2010 at 1:54 pm

    how creat vb part how modifiy that kindly help me

    • July 14, 2010 at 8:13 pm

      Sorry, you need to be more specific. What exactly would you like to do?

  2. catia4inventorusersforum
    December 6, 2010 at 4:57 pm

    Thanks Mike,

    Again it made some yet unclear stuff (like start with the “!”)
    transparant for me.

    Keep up the good work!

    Regards,
    Jan, the Netherlands

  3. quattroalf
    February 3, 2011 at 2:27 pm

    Hello,

    i tested the case5. The macro runs ok, only the created relation is out of order. I changed the macro, so that i can see in the comment of the relation whats going on. But the relation is exact as described in case 5 (..!Product2!Part5!ResultArea)
    I use catia v5r19 sp6. Any idea why the relation has an yellow exclamation mark?

    Is there may be an other way to create external parameters in a product. Part is no problem, here i can use copy / paste

  4. harry lee
    September 30, 2011 at 12:47 pm

    I am looking for a solution for another case:
    Case : Where is the relation? : Object referred to by the relation
    #? : Part in one product : non-published parameter inside another product

    case #4 deals with product to product, but not part to product. Is there a solution for this particular case?

    Thanks for help.

    Harry

  1. No trackbacks yet.

Leave a Reply to v5vb Cancel reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: