Read-only Workset API
Originally Published inAnother 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.