ADN Open CIS
Сообщество программистов Autodesk в СНГ

21/06/2014

Как определить является ли текущий пользователь владельцем элемента при совместной работе

Вопрос: Как определить, что владельцем элемента, который мы хотим редактировать, является текущий пользователь, пред тем как сделать коммит транзакции?

Ответ: Для любого видимого элемента в модели, над которой ведется совместная разработка, мы можем получить идентификатор рабочего набор элемента WorkSetId с помощью метода Document.GetWorksetId(). Затем вы можете получить соответствующий Рабочий набор с помощью метода WorkSetTable.GetWorkSet(). Свойство WorkSet.Owner вернет владельца рабочего набора. Все что нам остается сделать, так это сравнить имя владельца с текущим именем пользователя Revit.

Вот пример кода для демонстрации:

Код - C#: [Выделить]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5.  
  6. using Autodesk.Revit.DB;
  7. using Autodesk.Revit.UI;
  8. using Autodesk.Revit.ApplicationServices;
  9. using Autodesk.Revit.Attributes;
  10. using Autodesk.Revit.UI.Selection;
  11.  
  12.  
  13. [TransactionAttribute(TransactionMode.Manual)]
  14. public class RevitCommand : IExternalCommand
  15. {
  16.     public Result Execute(ExternalCommandData commandData,
  17.       ref string messages, ElementSet elements)
  18.     {
  19.  
  20.         UIApplication app = commandData.Application;
  21.         Document doc = app.ActiveUIDocument.Document;
  22.  
  23.         Transaction trans = new Transaction(doc);
  24.         trans.Start("Тест");
  25.         Selection sel = app.ActiveUIDocument.Selection;
  26.         Reference ref1 = sel.PickObject(ObjectType.Element, "Выберите элемент");
  27.         Element elem = doc.GetElement(ref1);
  28.           
  29.         //Получаем информацию о рабочем наборе
  30.         WorksetId idWS = doc.GetWorksetId(elem.Id);
  31.         WorksetTable table = doc.GetWorksetTable();
  32.         Workset ws = table.GetWorkset(idWS);
  33.         string owner = ws.Owner;
  34.         trans.Commit();
  35.  
  36.         //Сравниваем с текущим пользователем.
  37.         if (owner == app.Application.Username)
  38.         {
  39.             TaskDialog.Show("Синхронизация", "Выбранный элемент был обновлен. Пожалуйста, синхронизируйте файл");
  40.         }
  41.         return Result.Succeeded;
  42.     }
  43. }

Примечание переводчика. Возможно автор не знал, но эту задачу можно решить гораздо проще. Как минимум в Revit 2013 (для более ранних не проверял), есть статический класс WorksharingUtils, у которого есть метод GetChekoutStatus(). CheckoutStatus как раз нам и сообщает, является ли текущий пользователь владельцем элемента или нет.

Код в этом случае будет выглядеть так:

Код - C#: [Выделить]
  1.         Reference ref1 = sel.PickObject(ObjectType.Element, "Выберите элемент");
  2.         Element elem = doc.GetElement(ref1);
  3.           
  4.         var checkoutStatus = WorkSharingUtils.GetCheckoutStatus(doc, elem.Id);
  5.  
  6.         //Сравниваем с текущим пользователем.
  7.         if (checkoutStatus == CheckoutStatus. OwnedByCurrentUser)
  8.         {
  9.             TaskDialog.Show("Синхронизация", "Выбранный элемент был обновлен. Пожалуйста, синхронизируйте файл");
  10.         }
  11.  

Источник: http://adndevblog.typepad.com/aec/2014/03/determine-if-the-an-revit-element-in-a-shared-model-is-owned-by-the-current-user.html

Автор: Виктор Чекалин
Автор перевода: Виктор Чекалин

Обсуждение: http://adn-cis.org/forum/index.php?topic=815

Опубликовано 21.06.2014