ImportInstance Geometry vs get_Geometry

ImportInstance Geometry vs get_Geometry

michellem
Advocate Advocate
1,685 Views
3 Replies
Message 1 of 4

ImportInstance Geometry vs get_Geometry

michellem
Advocate
Advocate

Hello Everyone;

 

I am working thru some sample code that is meant to get the geometry from an Autocad import instance and I have a question about the get_Geometry call shown below:

 

 

 

 Reference r = uidoc.Selection.PickObject( 
      ObjectType.Element,
      new JtElementsOfClassSelectionFilter<ImportInstance>() );

    var import = doc.GetElement( r ) as ImportInstance;

    // Get Geometry

    var ge = import.get_Geometry( new Options() );

    foreach( var go in ge )
    {
      if( go is GeometryInstance )
      {
        var gi = go as GeometryInstance;

        var ge2 = gi.GetInstanceGeometry();

        if( ge2 != null )

 

 

 Retrieve Visible dwg geometry Link 

 

My understanding is that the code gets an ImportInstance and the calls get_Geometry to get the geometry. However, when I look at the Revit API docs for this object I see only a Geometry property but not a get_Geometry property or method. Shouldn't the code call the Geometry property since that is what the API says is available? What am I missing? (I am trying to convert the code to Python.) ( Revit API link  )

 

Also when I am working in the Revit Pyhon Shell app, the autocomplete shows that the Geometry property is available for use but not get_Geometry. If I try to use the Geometry property I get an error but if I try get_Geometry things work. So why is get_Geometry not listed? And why does Geometry returns an error? (TypeError: indexer# is not callable).

 

Sincerely;

Michelle

 

0 Likes
Accepted solutions (2)
1,686 Views
3 Replies
Replies (3)
Message 2 of 4

architect.bim
Collaborator
Collaborator
Accepted solution

Hi!

I you look into the documentation you can see that Geometry is actually an indexer. To get its value you need to specify the index in square brackets:

# Python sample
geometry = import.Geometry[Options()]

But also any property, including the indexer, can be replaced by a method with a get prefix. In this case, the value is passed in parentheses, not square brackets. This is not mentioned in the Revit API documentation as it is the basic syntax of IronPython and C# languages.

# Python sample
geometry = import.get_Geometry(Options())

Maxim Stepannikov | Architect, BIM Manager, Instructor
Message 3 of 4

michellem
Advocate
Advocate

Hello Maxim;

 

Thank you for the response and for including the link to Indexers. So after reading the material on Indexers, I see that it is the word "this" (and maybe the square brackets) in the Revit API that indicates that ImportInstance.Geometry is an indexer. Since I don't know C# and barely remember the original C language, it was certainly something that flew over my head.

public GeometryElement this[
	Options options
] { get; }

 

Is it correct to say, the statement y = ImportInstance.Geometry[Options()] returns a value based on the index presented by Options()? Put another way, if I had bucket of misc fruit with an indexer attached to it and wrote y =  FruitBucket["apple"], the indexer would return an object associated with index of "apple" - that is an Apple object.

 

Also, if there is a "get_" prefix would there also be a "set_" prefix in IronPython?

Finally, would anyone know of a good book, or online link, that would discuss this "_get" prefix in more detail? I tried to Google it and had no luck.

Michelle

 

 

0 Likes
Message 4 of 4

jeremy_tammik
Alumni
Alumni
Accepted solution

Here is a nice little booklet on the topic for you to print at your leisure:

  

https://duckduckgo.com/?q=.net+get_+property+prefix

  

🙂

  

Jeremy Tammik Developer Advocacy and Support + The Building Coder + Autodesk Developer Network + ADN Open