You are on page 1of 7

Tekla Website


User Assistance

Discussion Forum



Tekla Discussion Forum →  Tekla Structures Open API Forums →  General discussions

Accessing the secondary members of a custom component
Débuté par, nov. 18 2009 10:49
Page 1 sur 2
Posté 18 novembre 2009 ­ 10:49

Hi Juan!
As I noticed the custom components are mapped by the API as details (instances of Detail class),
and have the number set to ­1.
For details you have access to the primary object via the GetPrimaryObject() method.
Is there any way to have access to the secondary objects of a custom component via the API? I
see that there is no GetSecondaryObjects() method defined for details as it is for the Connection
Thank you for the help,
Posté 18 novembre 2009 ­ 11:12

Juan Rodriguez

Hi Vali,
As I understand, details can only have a primary part in the API, not sure if you can model a
detail with secondaries though. So there is no point in having a GetSecondaryObjects method for
details when you cannot set them, at least in the API is not supported.
Best regards, 
Posté 18 novembre 2009 ­ 11:22

I'm interested only to get the secondaries for a detail, not to set them. The secondaries are set via
the user interface, when the user inserts a custom component into the model. The user selects
the primary and the secondary objects for the custom component and inserts it into the model.
This custom component that requires a primary and some secondary objects from the user at
insert time, is mapped with the API into a detail object.
The question was if there is any way to get the secondary objects for the detail also, as the user
could not insert the custom component into the model in the first place without setting them. 
Posté 18 novembre 2009 ­ 11:48

Juan Rodriguez

But is it actually a Detail? or a Component? I wonder if you can cast it as Component in the
API... Then you could get the secondaries.

Posté 18 novembre 2009 ­ 11:59

The object that I tested the API with. Vali  Posté 18 novembre 2009 ­ 02:12 Juan Rodriguez Hi Vali. I've used it some previous times without any Hi again! I've just talked with my Tekla user and it seems that in order for a user to create a custom connection he must choose the "Connection" item as type in the "Custom Connection Wizard". was a detail indeed. Custom connections should appear as Connection in the API.   Regards.  . as I recall.Unfortunatelly it's a detail. Best regards. Best regards.   Posté 18 novembre 2009 ­ 12:07 Juan Rodriguez Can you send the component to take a look to it? I don't know how you can have a detail with more than one input objects. get the one you want to modify and modify Thank you Juan! That's great news!   Posté 12 mai 2010 ­ 09:13 John Norbury How can you modify only secondary parts and not main parts?  Posté 12 mai 2010 ­ 11:04 Juan Rodriguez Just use GetSecondaryObjects() to get the secondaries.chiru@technyx.. As you know.chiru@technyx. Can you confirm that all the connections done in this way will be mapped as Connection class instances with the API? Sorry for the initial confusion.  Posté 18 novembre 2009 ­ 02:16 valentin. It will throw me an InvalidCastException. in connection you can use the GetSecondaryObjects() method.  Posté 18 novembre 2009 ­ 01:57 valentin.. but I'm interested in custom connections in particular and not custom components in general.  And I don't see how to cast it to a component. That doesn't affect main parts.

Part A = B. How can I do this? P.Connection;     ArrayList Secondaries = Connection.AssemblyNumber.GetAssembly().PICK_ONE_OBJECT)                         if (ModelObject is TSM.MoveNext())                     {                         TSM. there might be several secondaries.Text;                             B.GetModelObjectSelector(). Note that for assemblies and connections the methods to get the secondaries are different.GetSecondaryObjects();         Beam Beam = (Beam) Secondaries[0];                                         if (Beam != null) {   Beam.GetAssembly().Connection Connection = ModelObject as TSM.GetSize() > 0)                 {                     while (P.Text;                             B.GetSecondaries() into a Part as it's an arraylist.Current as Part;                         B.GetSecondaries() like so: TSM.Prefix = textBox4.Posté 13 mai 2010 ­ 02:06 John Norbury But how can you do this without being in a connection? Just secondary parts in the model.ModelObjectEnumerator P = M.  In the next example is getting the first secondary of a connection or assembly and modifying its PartNumber.Prefix.PartNumber.GetSecondaries();                         if (B != null)                         {                             B. I probably should have made a new thread for this. I've been trying B.GetAssembly(). Probably this could be more nicely put using delegates but I won't go into that  .GetSelectedObjects();                 if (P. When you use GetSecondaries you need to store them in an ArrayList and then modified the one you want.Prefix = "J";   Beam.PartNumber. Sorry  Posté 14 mai 2010 ­ 09:24 Juan Rodriguez Hi John.CommitChanges();                 } In another code I use this line for getting main parts and it works: TSM.PickObjectEnum.GetAssembly().GetMainPart() as Part; But it won't let me turn B.Part B = P.S.Modify();                         }                     }                     M.Modify(); } .PickObject(Picker.Prefix = textBox3.Connection) {   TSM. You code should look a little more like this: Picker Picker = new Picker();   ;                 ModelObject ModelObject = Picker.

.Connection Connection = A as TSM.CommitChanges(); .Current as TSM.GetSecondaries();                             Beam B = (Beam) Secondaries[0];                             if ((B != null) && ((B. what do I need to reference to get ArrayList working? It just underlines it in red and I can't work it out.Modify();                             }                         }                     }            can just tell I'm a noob    EDIT: After searching though 13+pages I finally found it haha.Name != "TREAD") || (B.PartNumber.GetSize() > 0)                 {                     while (P.ModelObject A = P.Collections.Prefix = textBox4.Collections.Collections.                        } else if(ModelObject is Assembly) {   Assembly Assem = ModelObject as Assembly;         ArrayList Secondaries = Assem.Name != "TURNBUCKLE")))                             {                                 B.GetSecondaryObjects();                             Beam B = (Beam) Secondaries[0];                             if ((B != null) && ((B.GetSecondaries();         Beam Beam = (Beam)Secondaries[0];                                               } if (Beam != null) {   Beam.Prefix = textBox4..  Posté 17 mai 2010 ­ 07:04 John Norbury Hi Juan.GetModelObjectSelector().MoveNext())                     {                         TSM.Text;                                 B.Connection;                             System.Prefix = "J";   Beam..Connection)                         {                             TSM.ArrayList Secondaries = Connection. System.AssemblyNumber. Best regards. I am trying this code.Text;                                 B.AssemblyNumber.Text;                                 B.ModelObjectEnumerator P = M.ArrayList EDIT2: I still can't get it.PartNumber.Prefix = textBox3.ArrayList Secondaries = Assem.Name != "TREAD") || (B.Modify(); }       M.Prefix = textBox3.ModelObject;                         if (A is TSM. Whats wrong with it? TSM.Text;                                 B..Name != "TURNBUCKLE")))                             {                                 B.Modify();                             }                         }                         else if (A is Assembly)                         {                             Assembly Assem = A as Assembly;                             System.CommitChanges(); I hope this helps.PartNumber.GetSelectedObjects();                 if (P.

right click on the line in your code and use "resolve" Posté 18 mai 2010 ­ 01:23 John Norbury Ahhh I see. Thanks Tobias! Any ideas what's wrong with my code?  Posté 18 mai 2010 ­ 09:47 Juan Rodriguez Hi John.... This line will be highlighted by Visual Studio as containing an error.. also remember to add the "using" in the beginning of your cs file. check that you have "Select components" active. And also if the code goes inside the if clauses. please: . . Now to the finding reference part. simply define a new ArrayList like so: ArrayList myList = new ArrayList(); (Note that it will not show up in the scroll list so you will need to type the entire line). ..g..  Posté 19 mai 2010 ­ 09:09 John Norbury I think you may have misunderstood what I'm trying to do as this code is not doing what I want.Collections; Best regards.                } Posté 17 mai 2010 ­ 08:56 Tobias Svenberg If you are using Visual Studio there is an easy way to find the proper reference for common items such as ArrayList. not "Select objects in components". debug your code in order to see if the enumerator is empty or not.. e. check that you have selected the correct items. Your code is working nicely   .. . using System. make sure that you are using the references needed by your code in the project. All I want to do is modify secondary parts like this welded cleat here or anything else welded to that beam: .

tekla. I was just telling some reasons why the code might not be working. loop through tha ArrayList returned by GetSecondaryObjects or GetSecondaries. so I tested your code and it works.(https://forum. and that works.PNG)  Posté 19 mai 2010 ­ 09:16 Juan Rodriguez Citation Any ideas what's wrong with my code? You ask­8e61­4ebb­a919­03c816c24bb7. Posté 19 mai 2010 ­ 09:37 John Norbury Yes the code has no errors but it is modifying one of those beams and not the plate even though the beam is not a secondary.  Page 1 sur 2 Retourner dans General discussions · Prochain sujet non­lu → Tekla Discussion Forum →  Tekla Structures Open API Forums →  General discussions Nous contacter       Facebook TwitterLinkedIn YouTube . I just want to select a heap of parts in the model but only modify the secondary parts it finds. Your code just gets the first secondary and modifies the prefix of assembly number and part number. If you want to modify all the secondaries and not just one.

Tekla France: ZA Albipôle 8 Avenue Albipôle 81150 Terssac France Téléphone: +33 5 6348 1160  Tekla Website Tekla Campus Tekla User Assistance Tekla Discussion Forum Tekla Warehouse   Tekla Downloads Télécopie: +33 5 6348 1161 Conditions générales  Utilisation légale des licences  Politique de confidentialité Tekla est une entreprise Trimble © Copyright 2015 Tekla Corporation .