Each element in the document must belong to one and only one workset. Each element has a WorksetId which identifies the unique workset to which it belongs. Additionally, given a WorksetId, it is possible to get all of the elements in the document belonging to that Workset using the ElementWorksetFilter as shown below.
Code Region: ElementWorksetFilter |
public void WorksetElements(Document doc, Workset workset) { // filter all elements that belong to the given workset FilteredElementCollector elementCollector = new FilteredElementCollector(doc); ElementWorksetFilter elementWorksetFilter = new ElementWorksetFilter(workset.Id, false); ICollection<Element> worksetElemsfounds = elementCollector.WherePasses(elementWorksetFilter).ToElements(); // how many elements were found? int elementsCount = worksetElemsfounds.Count; String message = "Element count : " + elementsCount; // Get name and/or Id of the elements that pass the given filter and show a few of them int count = 5; // show info for 5 elements only foreach (Element ele in worksetElemsfounds) { if (null != ele) { message += "\nElementId : " + ele.Id; message += ", Element Name : " + ele.Name; if (0 == --count) break; } } Autodesk.Revit.UI.TaskDialog.Show("ElementsOfWorkset", message); } |
New elements are automatically placed in the active workset in the user's local copy of the model. Since the WorksetId for an element is a read only property, use the parameter ELEM_PARTITION_PARAM. The following example demonstrates the creation of an element that is changed to belong to a different workset.
Code Region: Changing a new element's workset |
Document doc = commandData.View.Document; String targetWorksetName = "Target workset"; //Find target workset FilteredWorksetCollector worksetCollector = new FilteredWorksetCollector(doc); worksetCollector.OfKind(WorksetKind.UserWorkset); Workset workset = worksetCollector.FirstOrDefault<Workset>(ws => ws.Name == targetWorksetName); // Workset not found, abort if (workset == null) { TaskDialog dialog = new TaskDialog("Error"); dialog.MainInstruction = String.Format("There is no workset named {0} in the document. Aborting this operation.", targetWorksetName); dialog.MainIcon = TaskDialogIcon.TaskDialogIconWarning; dialog.Show(); return Result.Cancelled; } // Find "Level 1" for the new wall FilteredElementCollector collector = new FilteredElementCollector(doc); collector.OfClass(typeof(Level)); Level level = collector.Cast<Level>().First<Level>(lvl => lvl.Name == "Level 1"); using (Transaction t = new Transaction(doc, "Add elements by API")) { t.Start(); // Create the wall Wall wall = Wall.Create(doc, Line.CreateBound(new XYZ(25, 0, 0), new XYZ(25, 15, 0)), level.Id, false); // Get the parameter that stores the workset id Parameter p = wall.get_Parameter(BuiltInParameter.ELEM_PARTITION_PARAM); // This parameter storage type is Integer p.Set(workset.Id.IntegerValue); t.Commit(); } |
Worksharing information such as the current owner and checkout status of an element can be obtained using the WorksharingUtils class. It is a static class that contains utility functions related to worksharing.
Code Region: WorksharingUtils |
public void GetElementWorksharingInfo(Document doc, ElementId elemId) { String message = String.Empty; message += "Element Id: " + elemId; Element elem = doc.GetElement(elemId); if(null == elem) { message += "Element does not exist"; return; } // The workset the element belongs to WorksetId worksetId = elem.WorksetId; message += ("\nWorkset Id : " + worksetId.ToString()); // Model Updates Status of the element ModelUpdatesStatus updateStatus = WorksharingUtils.GetModelUpdatesStatus(doc, elemId); message += ("\nUpdate status : " + updateStatus.ToString()); // Checkout Status of the element CheckoutStatus checkoutStatus = WorksharingUtils.GetCheckoutStatus(doc, elemId); message += ("\nCheckout status : " + checkoutStatus.ToString()); // Getting WorksharingTooltipInfo of a given element Id WorksharingTooltipInfo tooltipInfo = WorksharingUtils.GetWorksharingTooltipInfo(doc, elemId); message += ("\nCreator : " + tooltipInfo.Creator); message += ("\nCurrent Owner : " + tooltipInfo.Owner); message += ("\nLast Changed by : " + tooltipInfo.LastChangedBy); Autodesk.Revit.UI.TaskDialog.Show("GetElementWorksharingInfo", message); } |