Как определить является ли текущий пользователь владельцем элемента при совместной работе
Вопрос: Как определить, что владельцем элемента, который мы хотим редактировать, является текущий пользователь, пред тем как сделать коммит транзакции?
Ответ: Для любого видимого элемента в модели, над которой ведется совместная разработка, мы можем получить идентификатор рабочего набор элемента WorkSetId с помощью метода Document.GetWorksetId(). Затем вы можете получить соответствующий Рабочий набор с помощью метода WorkSetTable.GetWorkSet(). Свойство WorkSet.Owner вернет владельца рабочего набора. Все что нам остается сделать, так это сравнить имя владельца с текущим именем пользователя Revit.
Вот пример кода для демонстрации:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Windows.Forms;
- using Autodesk.Revit.DB;
- using Autodesk.Revit.UI;
- using Autodesk.Revit.ApplicationServices;
- using Autodesk.Revit.Attributes;
- using Autodesk.Revit.UI.Selection;
- [TransactionAttribute(TransactionMode.Manual)]
- public class RevitCommand : IExternalCommand
- {
- public Result Execute(ExternalCommandData commandData,
- ref string messages, ElementSet elements)
- {
- UIApplication app = commandData.Application;
- Document doc = app.ActiveUIDocument.Document;
- Transaction trans = new Transaction(doc);
- trans.Start("Тест");
- Selection sel = app.ActiveUIDocument.Selection;
- Reference ref1 = sel.PickObject(ObjectType.Element, "Выберите элемент");
- Element elem = doc.GetElement(ref1);
- //Получаем информацию о рабочем наборе
- WorksetId idWS = doc.GetWorksetId(elem.Id);
- WorksetTable table = doc.GetWorksetTable();
- Workset ws = table.GetWorkset(idWS);
- string owner = ws.Owner;
- trans.Commit();
- //Сравниваем с текущим пользователем.
- if (owner == app.Application.Username)
- {
- TaskDialog.Show("Синхронизация", "Выбранный элемент был обновлен. Пожалуйста, синхронизируйте файл");
- }
- return Result.Succeeded;
- }
- }
Примечание переводчика. Возможно автор не знал, но эту задачу можно решить гораздо проще. Как минимум в Revit 2013 (для более ранних не проверял), есть статический класс WorksharingUtils, у которого есть метод GetChekoutStatus(). CheckoutStatus как раз нам и сообщает, является ли текущий пользователь владельцем элемента или нет.
Код в этом случае будет выглядеть так:
- Reference ref1 = sel.PickObject(ObjectType.Element, "Выберите элемент");
- Element elem = doc.GetElement(ref1);
- var checkoutStatus = WorkSharingUtils.GetCheckoutStatus(doc, elem.Id);
- //Сравниваем с текущим пользователем.
- if (checkoutStatus == CheckoutStatus. OwnedByCurrentUser)
- {
- TaskDialog.Show("Синхронизация", "Выбранный элемент был обновлен. Пожалуйста, синхронизируйте файл");
- }
Автор перевода: Виктор Чекалин
Обсуждение: http://adn-cis.org/forum/index.php?topic=815
Опубликовано 21.06.2014