We discussed reading the workset of an element, either using the built-in parameter ELEM_PARTITION_PARAM or, more easily, the dedicated document GetWorksetId method.
This is actually another example of the possibility to choose your data access method by using either a dedicated property or a parameter, as we recently explored to achieve changing the viewport type.
Although the Revit API provides a dedicated property to read an element workset, it does not do so for changing it, which begs the question:
Question: The Element.WorksetId property is read-only.
I would like to change an element's workset to other one, though.
Is this possible?
Answer: You can change the element's workset via the built-in parameter ELEM_PARTITION_PARAM.
Here is a code snippet to show how to retrieve all workset ids and set each one to a given element in turn:
Reference r = uidoc.Selection.PickObject( ObjectType.Element ); Element e = doc.GetElement( r.ElementId ); if( e == null ) return; WorksetId wid = e.WorksetId; TaskDialog.Show( "Workset id", wid.ToString() ); Parameter wsparam = e.get_Parameter( BuiltInParameter.ELEM_PARTITION_PARAM ); if( wsparam == null ) return; // Find all user worksets FilteredWorksetCollector worksets = new FilteredWorksetCollector( doc ) .OfKind( WorksetKind.UserWorkset ); using( Transaction tx = new Transaction( doc ) ) { tx.Start( "Change workset id" ); foreach( Workset ws in worksets ) { wsparam.Set( ws.Id.IntegerValue ); } tx.Commit(); } wid = e.WorksetId; TaskDialog.Show( "worksetid", wid.ToString() );
Many thanks to Phil Xia for this hint!