Read-only Workset API

Another one of the new

Revit 2012 API features
that
we still never had a detailed look at is the worksharing API, a comprehensive read-only API to worksharing features, access the list of worksets, find out what elements are in a workset, who borrowed what, whether an element went out of date with central, etc.
Here is a quick Q & A on some basic aspects of that API:

Question: I know that the built-in parameter ELEM_PARTITION_PARAM identifies the workset of an element in some manner.
Its value is an integer.
How can I retrieve the workset name from this value?

Answer: The integer value stored in the parameter is actually the workset id, which is used as a key in the workset table.

To access the workset, you therefore first have to
obtain the document workset table, for instance via the GetWorksetTable method:


  WorksetTable worksetTable
    = doc.GetWorksetTable();

You can then create a workset id from the parameter value and access the workset of a given element ‘e’ using that:


  Parameter p = e.get_Parameter(
    BuiltInParameter.ELEM_PARTITION_PARAM );
 
  int paramValue = param.AsInteger();
 
  WorksetId wid = new WorksetId( paramValue );
 
  Workset workset = WorksetId.InvalidWorksetId == wid
    ? null
    : worksetTable.GetWorkset( wid );

Just like a standard Revit database element, the workset provides a property returning its name.

There is also a simpler direct way to access the workset of an element, however, using the document method GetWorksetId, which returns the workset id for a given element id:


  WorksetId wid = doc.GetWorksetId( e.Id );

Question: How can I iterate the workset table to obtain a list of all the worksets defined in the project?

Answer: There are dedicated FilteredWorksetCollector and WorksetFilter classes for that purpose.
Here is some sample code demonstrating their use:


  FilteredWorksetCollector coll
    = new FilteredWorksetCollector( doc );
 
  // You may want to filter them...
 
  //coll.OfKind(WorksetKind.UserWorkset);
 
  StringBuilder worksetNames = new StringBuilder();
 
  foreach( Workset workset in coll )
  {
    worksetNames.AppendFormat( "{0}: {1}n",
      workset.Name, workset.Kind );
  }
 
  TaskDialog.Show( "Worksets",
    worksetNames.ToString() );

As mentioned in the comment, please note that the FilteredWorksetCollector class provides an OfKind method which can be used to limit the filters returned to a given workset kind, e.g. to UserWorkset only, i.e. worksets defined by users, including the two default Revit ones.


Comments

2 responses to “Read-only Workset API”

  1. Liono-1 Avatar
    Liono-1

    Hello Jeremy,
    Do you know of a way to assign worksets to content within the project? If there is could you provide the code for this? If there isn’t do you know of a work around to achieve the same outcome?

  2. Dear Liono,
    I have no code nor experience with this, but it sure looks doable just perusing the Revit API help file.
    You can see the Workset class in there, and worksets have WorksetId identifiers, even though they are not element ids, and the Element class has a WorksetId property, so it all looks nicely doable.
    I’ll let you provide the code.
    Cheers, Jeremy.

Leave a Reply

Discover more from Autodesk Developer Blog

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

Continue reading