How to use GroupIds in OptiCroSec component

Dear experts,

I´m trying to optimize a tower structure using the Optimize Cross-Section component (OptCroSec). (78.0 KB)

By contrast to the image, all columns and girders at the same floor must be equal. I´m sure there is a way to do this, e.g. using the GroupIds input, but I don´t know how. The girders and columns are arranged as individual branches of the beam elements tree.

Would you help me?


When you assemble the model, you need to make beam sets, and then these sets you reference later in the OptiCroSec component (GroupIds). See the manual here for how to make beam sets:


1 Like

Thank you very much John for your help…, however I don´t get it yet, sorry!

I think I have generated the element sets correctly (see panel), but upon several connection trials to Assemble and OptCroSec componets I haven´t found the way.
Here it is the updated GH file: (68.2 KB).

The element groups seem not to be accounted for as expected. For some reason it seems to get 10 elements (in white) instead of 8, which are shown in the Set list.

What am I doing wrong? Thanks again!


I’ve tried to open your file but it’s quite difficult to get my head around!
Have a look at the attached example for how to use beam sets, that should help you on your quest:

Optimise (33.2 KB)

Best of luck with it,


1 Like

Hello @Vigardo

I managed to find some time this afternoon to go through your definition. I hope you don’t mind, but I changed a little how the model is assembled in order to fully get my head around it. One thing to mention is that I think you might have an earlier version of Karamba to me (or the other way around), so you will have to rewire the ‘loads’ part as I had to guess at it from the missing component.

A few things to mention:

  • As I say, the geometry modelling has changed and I’ve split things into columns and rings. In your definition you actually had some lines with zero length.
  • IDs are given to the beams when the elements are made.
  • From these IDs, you can construct the beam sets. I have made sets for the columns, and separate sets for the ring beams. Not sure if you needed the latter, but there you go.
  • There is a subtle point here that is not intuitive and took me a while to figure out actually - the beam sets go into the Assemble Component, however in the OptiCroSec, you need to hand it the names of the beam sets rather than the beam sets themselves. This actually tripped me up and I’ve spent at least an hour this afternoon trying to see if I was going crazy!
  • You need to hand at least one of the cross sections to the assemble component, preferably the largest one as the optimisation algorithm then works back from there (I think).
  • For the optimisation, you may wish to limit the displacement as it is currently 45cm. I changed the target utilisation to 80%, but I think the elements buckle. I’ll leave the finer points to yourself! (49.5 KB)

Anyway, that should help you out. It’s not completely intuitive, but it is a nice little algorithm if you can get it running.

Best wishes,



Thank you so much John for your kind help! All your answers were very illustrative!

I´ll summarize here your approach for further reference:

  1. all elements belonging to the same group must be named the same and connected to the OptiCroSec component,
  2. groups must be created accordingly with Make Element-Set (MkSet) component,
  3. the so generated group list must be connected to the Set input of Assemble component.

*It is highly recommended to providing a random color scheme to the group elements in MkSet for checking (enable Elements tag in ModelView and Cross-section in the Render panel in BeamView).

PS: Thanks for pointing out the zero-length beams found in my model definition. I´ve fixed it and cross-checked my script with yours, you can find it here: (81.0 KB)

1 Like