Object Relationships in VB

We recently presented Saikat Bhattacharya’s neat little

object relationship
analyser and displayer, implemented in C#.
Yesterday I received a very friendly submission from Jose Guia saying “Thought I would share my code as well, … I converted the project to VB for sharing.”

I compiled his solution and it works fine for me.
I did run into two little issues which were easy to solve, both of them involving namespaces:

  • Different access to imported namespaces.
  • Different namespace when exporting the external command.

Jose initially used explicit import statements in the VB source code to access the Revit API functionality:


Imports Autodesk
Imports Autodesk.Revit
Imports Autodesk.Revit.Elements

I much prefer that approach, since it is similar to the syntax used in C#.
However, when I tried to compile the code like that, it caused a number of errors like these (copy to an editor to see the full truncated lines):


'Element' is not accessible in this context because it is 'Friend'.
'Symbol' is not accessible in this context because it is 'Friend'.
'FamilyBase' is not accessible in this context because it is 'Friend'.
'ElementId' is not accessible in this context because it is 'Friend'.

The only way I found to resolve this was to remove the explicit import statements from the code and add global namespace importing requests to the project settings instead:

VB project references settings

The global imports are defined at the bottom:

VB project global import settings

The second issue has to do with the exported namespace containing the external command.
The VB code specifies the same export namespace as the C# version in the source code, ObjRel:


Namespace ObjRel
    Public Class Command
        Implements IExternalCommand

In spite of this, the Visual Studio environment surreptitiously prepends another namespace specified in the global project settings, the so-called root namespace, in this case ObjRelationsVB:

VB project root namespace settings

Therefore, the class name entry in Revit.ini needs to be different for the C# and VB versions:


ECName2=Object Relationship
ECDescription2=Object Relationship Sample by Saikat
ECClassName2=ObjRel.Command
ECAssembly2=C:binObjRel.dll
ECName3=Object Relationship VB
ECDescription3=Object Relationship Sample by Jose
ECClassName3=ObjRelationsVB.ObjRel.Command
ECAssembly3=C:binObjRelationsVB.dll

Alternatively, of course, you can set the VB root namespace to an empty string, I hope.
Or, alternatively, of course, you can use the

Add-In Manager
to
load the application as suggested by Joe, and avoid dealing with Revit.ini at all.
Once loaded, the VB port obviously presents the same functionality as Saikat’s original C# version.

Here is Jose’s complete
ObjRelationsVB
source code and Visual Studio solution.

Very many thanks to Jose for sharing this code!


Comments

One response to “Object Relationships in VB”

  1. Great Post…Very informative, hope this would be of help to the newbie’s.

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading