ワークセット内の要素

ワークセット内の要素

ドキュメント内の各要素は 1 つのワークセット(複数不可)に属している必要があります。各要素は、それが属する一意のワークセットを識別するための WorksetId を持ちます。また、WorksetId を指定すると、下に示すように ElementWorksetFilter を使用して、該当するワークセットに属するドキュメント内のすべての要素を取得することができます。

コード領域: 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);
}

新しい要素は、ユーザのモデルのローカル コピーのアクティブなワークセットに自動的に配置されます。要素の WorksetId は読み込み専用のプロパティであるため、パラメータ ELEM_PARTITION_PARAM を使用します。次の例は、別のワークセットに属するように変更された要素の作成を示しています。

コード領域: 新しい要素のワークセットを変更

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();
}

現在の所有者や要素のチェックアウト ステータスなどのワークシェアリング情報は、WorksharingUtils クラスを使用して取得することができます。これは、ワークシェアリングに関連するユーティリティ関数を含む静的なクラスです。

コード領域: 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);
}