Dimensioning Groups of Bolts – Tekla Open API (Code snippets attached)

_config.yml

We want to create a little drawing plug-in

What we want to do is to select and dimension all the bolts to a particular grid line. Here’s how it should work:

  • The user selects a group of bolts.
  • The user selects a gridline.
  • Dimensions are drawn from the Bolts to the Gridline.

But quelle surprise – the Tekla API doesn’t expose an object which can select or pick multiple drawing objects.

What are some solutions around this problem?

We’ll we’re gonna have to be a little creative. Thankfully, Trimble have exposed the ability to programmatically obtain drawing objects. Given these objects we need to somehow filter out the stuff we want to dimension. Here are some possible ways:

  • We could provide a Control where we can choose and filter what objects we want to dimension, after reading/seeing it’s properties in some type of user interface (you could have a WPF application and use its fancy data binding ability + MVVM pattern + Command objects working with Service layers and Messengers) – but that would require considerable effort.
  • You could just select everything individually. But that would take forever.
  • You could extend the PickerInputWithinAView abstract method to allow you to select multiple objects.
  • Or you could find a way to easily filter it all. And I think I’ve found a way.

Deep in the annals of the Tekla API Reference Guide, I found that the Picker type exposes the PickTwoPoints method. And if we can pick two points, then we can certainly filter our selections.

Issues In the Algorithm We Need to Address

  1. User picks two points.
  2. User picks a gridline
  3. We then filter all bolts within the bounding box of the original two picked points, and we create dimensions to the appropriate gridline. We need to understand the Drawing API.
  4. We also need to know about saving and reverting transformation planes.
  5. This is the hello world version of what we are trying to do, but perhaps on a scale that is a little more grand. We need some basic code on how to create dimensions.

How to Programmatically Pick Two Points

How to programmatically select a grid line

Understanding the Tekla Drawing API

Please refer to the below diagram.

_config.yml

The things that you see in the drawing, are not exactly what you can see on the model. They are drawing representations of what you see in the model. If you want specific geometry based information concerning what you see in the drawing you must:

  1. First get the drawing object (i.e. the drawing representation you see as a Bolt in the drawing).
  2. Then you must get that same Bolt in the model.
  3. You must then inquire in the model about the particular attributes or positional properties of that bolt – which is represented as a bolt in the drawing.
  4. You must also bear in mind that Views etc have their own coordinate system. So if you may need to translate any differences which exist in the model to the local coordinate system of the particular view you are using. You can set and retrieve the transformation plane like so (see section below).
  5. So if you need to create some dimensions, the exact lengths etc must be derived by querying the pertinent model object representations of what you see in the drawing.

How to Save And Revert Transformation Planes

How to Create some Dimensions

Study the below diagrm to get an understanding of what it all means:

_config.yml

How to get the drawing objects (in this case bolts) and programmatically filter them out

A Primer on how the Tekla.Structures.Drawing namespace is structured

Firstly you have a Drawing class. There are many types of drawing sub-classes:

  • AssemblyDrawing
  • CastUnitDrawing
  • GADrawing
  • MultiDrawing
  • SinglePartDrawing

Within each drawing is what is called the ConatinerView. A sheet is a container view. A container view is simply – if I were to use an everyday metaphor if you were grocery shopping – a bag which you can use to put: (i) other bags or (ii) shopping items inside. In order to get the ContainerView object, you can use the Drawing.GetSheet method – and you will be returned a ContainerView object.

Inside a container view you can typically:

  • GetObjects()
  • Or you can GetAllViews
  • Or you can GetAllObjects of a certain type.

And within the container view, using some of the above methods you can get all sorts of DrawingObjects:

  • DetailMark
  • Dimensions etc
  • Drawing representations of ModelObjects – like: Bolts, Connections, Grids, Gridlines, Parts, Welds etc.

Put all the elements together

If you put all the elements together, you can create some powerful little Plugins. I can’t post the full code because my boss will murder me, so I’ve done my best to teach you the key elements so you can create something powerful yourselves.

The Demo

Here is the video demonstrating it in action:

Tekla Open API Plugin - Dimensioning all selected bolts from Tek1 on Vimeo.

Thank you for watching!

I hope you learned something from this post.

Written on September 29, 2017