Thursday, July 23, 2009

Revit API Wish List Survey

Autodesk currently have a survey up that allows Revit API developers to give some feedback on what they would like to see in the API of future Revit releases.

It closes on the 31st of July and is available here: http://www.zoomerang.com/Survey/?p=WEB229BU6PH7J9 

Make sure you head over there and give your feedback. You have no excuse to complain about missing features if you don’t!

Some specific things that I’ve submitted to ADN as a wish list in the past have been:

  • Ability to work with filters (view filters, not the document element filters)
  • Ability to pick a point in the document
  • Ability to change the active view
  • More of the ‘override graphics in view’ menu actions exposed, ie setting elements to be transparent or half tone.
  • Ability to ‘duplicate as dependant’
  • Section mark creation

Now is your chance to tell yours to Autodesk, wether you are in ADN or not!

Wednesday, July 8, 2009

Revit API Search Engine

Hi all,
I had an idea today whilst doing some research for an API program I'm attempting to create.  My normal procedure for this after exhausting my usual resources (SDK, RvtMgdDbg etc), is to search a few of the Revit API blogs out there, then AUGI, Autodesk.com forums etc.

I've found this 'Google custom search' feature that Google has now - you can setup your own search engine to only search certain sites. So I decided to create own with Revit API resources.

http://www.google.com/coop/cse?cx=003379886482190238526:wi7yjrtrkd8 is the full link. I’ve created a slightly easier redirect page at http://RevitAPISearch.RodH.org/

The blogs I’ve got there at the moment are:
http://redbolts.com/blog/
http://revit-programmer.blogspot.com/
http://thebuildingcoder.typepad.com/blog/
http://cadappdev.blogspot.com/
http://roddotnet.blogspot.com

I've added AUGI and Autodesk.com forums in there now, but I'm having trouble restricting the results to just Revit API sections..

http://discussion.autodesk.com/forum...pa?forumID=160
http://forums.augi.com/forumdisplay.php?f=218 are the two links I’ve inserted, and I can choose one of these options:
Include all pages this page links to
Include all partial sites this page links to
Include all sites this page links to

I've experimented with the first 2, and found they still seem to show up results from other forum sections, so I'll have to keep working on that.
My goal here is to try and narrow the results down to the API as much as possible - ie not find info about what buttons to click to insert columns in Revit when you are trying to do it programmatically.

If anyone would like to suggest sites to index please let me know! I’ve started a discussion about AUGI HERE.

Tuesday, July 7, 2009

How to use an app.config file in a DLL plugin (External Command)

This post relates to wider .Net app.config files and linked DLL’s, but more specifically, my instance was relating to the Revit API.

For those that don’t know, an app.config file is a nice, easy way of doing configuration for your applications in .net. You can use the System.Configuration namespace to quickly access an XML config file without needing to do any manual XML reading. Unfortunately, you can only have one app.config file per executable, so if you have DLL’s linked into your application, they cannot have their own app.config files.

Seeing as the Revit API is done by external .Net DLL files which are opened within the Revit environment, this applies to them as well.

At Bornhorst + Ward, we have all of our external commands on a central network share, and each staff members ini is edited (using a tool I’ve written) to point to these external commands. I’d previously tried to use app.config files, and found they weren’t working, it seems they weren’t looking for the correct file in that network directory.

The way around it for me, was to manually locate the app.config file in my code.

   1: /// <summary>
   2: /// Get the configuration for the supplied type
   3: /// </summary>
   4: /// <param name="type">type of class</param>
   5: /// <returns>a configuration</returns>
   6: public static System.Configuration.Configuration GetConfig(Type type)
   7: {
   8:     //workout app.config lokcation
   9:     string dllLocation = type.Assembly.Location + ".config";
  10:  
  11:     if (dllLocation == null)
  12:         throw new Exception("Could not find config file, add .config in DLL location");
  13:  
  14:     //create config
  15:     ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
  16:     fileMap.ExeConfigFilename = dllLocation;
  17:     System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
  18:  
  19:     return config;
  20: }

Seeing as app.config files on DLL’s are named dllName.dll.config this gave me an easy rule for finding the config file. I then used an ExeConfigurationFileMap pointed to that location to generate the Configuration. The ‘type’ parameter, is for me to supply a type (using typeof(ClassName)) to identify the correct dll – as this method for me was written in a separate helper dll which contains some commonly used functions for all of my tools.

Then, to access the properties in that file:

   1: /// <summary>
   2: /// Gets a specific config property
   3: /// </summary>
   4: /// <param name="key">the property to get</param>
   5: /// <param name="type">type of class asking - to get right assembly</param>
   6: /// <returns>value</returns>
   7: public static string GetConfigProperty(string key, Type type)
   8: {
   9:     System.Configuration.Configuration config = GetConfig(type);
  10:     return config.AppSettings.Settings[key].Value;
  11: }

I call that method, supply the typeof(ClassName) of the class calling it, and it gets the configuration from my previous method, and then uses an access method similar to the standard AppSettings class.

Now I can have .configs for all of my revit external commands and access them easily!