Получить доступ к текущему документу Revit

Автор Тема: Получить доступ к текущему документу Revit  (Прочитано 5005 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GeorgАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
Добрый день,
Пишу ноды на C# под Dynamo. Доселе писал чисто вычислительные сценарии, работавшими с числами не трогая RevitAPI и не знал проблем; вот захотел попробовать в рамках метода прочесть параметры объектов Revit (в данном случае - базовой точки), и намертво встал на моменте как получить доступ к текущему проекту Revit.
Ниже извращенное решение с помощью Python-скрипта, как посоветовали на форуме dynamobim.org [Я не пойму - как эту фразу переписать на C#, если это конечно, будет решение проблемы...]


Притом, что сам код ожидает на вход параметр Autodesk.Revit.DB.Document doc
Ну и сам выглядит ниже:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using Autodesk.Revit.DB;
  8. using Autodesk.DesignScript.Runtime;
  9.  
  10. namespace BasePoint_coord2
  11. {
  12.     public class RevitAPI
  13.     {
  14.  
  15.     [MultiReturn(new[] { "BasePoint_X", "BasePoint_Y", "BasePoint_Z", "BasePoint_Angle" })]
  16.         public static Dictionary<string, object> GetCoordOfRevitBasePoint(Autodesk.Revit.DB.Document doc)
  17.         {
  18.         var basePoint = new FilteredElementCollector(doc).OfClass(typeof(BasePoint)).Cast<BasePoint>().Where(p => !p.IsShared).ToList().FirstOrDefault(); //https://adn-cis.org/forum/index.php?topic=8972.msg36051#msg36051
  19.  
  20.             //Инициация параметров
  21.             double BasePoint_X = 0;
  22.             double BasePoint_Y = 0;
  23.             double BasePoint_Z = 0;
  24.             double BasePoint_Angle = 0;
  25.  
  26.             //Присвоение переменным значений
  27.             BasePoint_Y = basePoint.get_Parameter(BuiltInParameter.BASEPOINT_NORTHSOUTH_PARAM).AsDouble();
  28.             BasePoint_X = basePoint.get_Parameter(BuiltInParameter.BASEPOINT_EASTWEST_PARAM).AsDouble();
  29.             BasePoint_Z = basePoint.get_Parameter(BuiltInParameter.BASEPOINT_ELEVATION_PARAM).AsDouble();
  30.             BasePoint_Angle = basePoint.get_Parameter(BuiltInParameter.BASEPOINT_ANGLETON_PARAM).AsDouble();
  31.  
  32.             string result = BasePoint_Y + "," + BasePoint_X + "," + BasePoint_Z + "," + BasePoint_Angle;
  33.             return new Dictionary<string, object>
  34.             {
  35.                 {"BasePoint_X", BasePoint_X},
  36.                 {"BasePoint_Y", BasePoint_Y},
  37.                 {"BasePoint_Z",  BasePoint_Z},
  38.                 {"BasePoint_Angle",  BasePoint_Angle},
  39.             };
  40.         }
  41.     }
  42. }

Суть моего вопроса - как это сделать изнутри метода?
Конструкция типа ниже не распознается как код вообще,  (если оно конечно корректно с точки зрения программирования). Не распознается = то есть в Dynamo не отображаются как ноды
Код - C# [Выбрать]
  1.         public Autodesk.Revit.UI.Result Execute (ExternalCommandData revit, ref string message, ElementSet elements)
  2.         {
  3.             UIApplication app = revit.Application;
  4.             Document doc_find = app.ActiveUIDocument.Document;
  5.             ref Document doc = ref doc_find;
  6.             return Result.Succeeded;
  7.         }
  8.     [MultiReturn(new[] { "BasePoint_X", "BasePoint_Y", "BasePoint_Z", "BasePoint_Angle" })]
  9.         public static Dictionary<string, object> GetCoordOfRevitBasePoint(ref Document doc)
  10.         {... //далее как в коде выше
Помогите, пожалуйста, я совсем уже запутался :(
« Последнее редактирование: 12-10-2020, 10:45:51 от Александр Ривилис »

Отмечено как Решение Александр Ривилис 12-10-2020, 10:55:56

Оффлайн GeorgАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
Простите, что вообще это опубликовал сюда, ибо не знаю, где еще кроме forum.dynamobim.com спрашивать подобные вещи, если Autodesk Support открещивается от поддержки своего же творения, а на форуме dynamobim не факт что вообще дождешься ответа по экзотичным темам (в этот раз, на удивление, оперативно ответили).
К слову о решении - по-простому, подключить к проекту C:\Program Files\Autodesk\Revit 2020\AddIns\DynamoForRevit\Revit\RevitServices.dll (помимо, конечно, стандартного пакета ZeroTouchLibary) и создать конструкцию присваивания типа
Код - C# [Выбрать]
  1. var doc = RevitServices.Persistence.DocumentManager.Instance.CurrentDBDocument;
Более подробно объяснил товарищ Thomas Mahon в сообщении тут - https://forum.dynamobim.com/t/node-with-revit-api-how-get-access-to-current-document/56078/8
//Осталось посмотреть как это делать для AutoCAD  :-[
//Выглядеть будет код так:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Autodesk.Revit.DB;
  5. using Autodesk.DesignScript.Runtime;
  6.  
  7. namespace BasePoint_coord2
  8. {
  9.  
  10.     public class RevitAPI
  11.     {
  12.  
  13.         [MultiReturn(new[] { "BasePoint_X", "BasePoint_Y", "BasePoint_Z", "BasePoint_Angle" })]
  14.         public static Dictionary<string, object> GetCoordOfRevitBasePoint()
  15.         {
  16.             var doc = RevitServices.Persistence.DocumentManager.Instance.CurrentDBDocument;
  17.             var basePoint = new FilteredElementCollector(doc).OfClass(typeof(BasePoint)).Cast<BasePoint>().Where(p => !p.IsShared).ToList().FirstOrDefault();
  18.             //Инициация параметров
  19.             double BasePoint_X = 0;
  20.             double BasePoint_Y = 0;
  21.             double BasePoint_Z = 0;
  22.             double BasePoint_Angle = 0;
  23.  
  24.             //Присвоение переменным значений
  25.             BasePoint_Y = basePoint.get_Parameter(BuiltInParameter.BASEPOINT_NORTHSOUTH_PARAM).AsDouble();
  26.             BasePoint_X = basePoint.get_Parameter(BuiltInParameter.BASEPOINT_EASTWEST_PARAM).AsDouble();
  27.             BasePoint_Z = basePoint.get_Parameter(BuiltInParameter.BASEPOINT_ELEVATION_PARAM).AsDouble();
  28.             BasePoint_Angle = basePoint.get_Parameter(BuiltInParameter.BASEPOINT_ANGLETON_PARAM).AsDouble();
  29.  
  30.             return new Dictionary<string, object>
  31.             {
  32.                 {"BasePoint_X", BasePoint_X},
  33.                 {"BasePoint_Y", BasePoint_Y},
  34.                 {"BasePoint_Z",  BasePoint_Z},
  35.                 {"BasePoint_Angle",  BasePoint_Angle},
  36.             };
  37.         }
  38.     }
  39. }
А в среде Revit Dynamo - будет работать так (да, надо бы еще перевести из дюймов в метры, но это уже опосредственный вопрос)



« Последнее редактирование: 12-10-2020, 10:46:44 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13923
  • Карма: 1793
  • Рыцарь ObjectARX
  • Skype: rivilis
Georg,
Во-первых, приветствую на форуме!
Во-вторых, рад что нашелся ответ. На нашем форуме специалистов, работающих на стыке Dynamo с Revit API не много, так что ответа можно было и не дождаться.
В-третьих, обрати внимание на правило форматирования кода на нашем форуме (в правилах форума и у меня в подписи).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
да, надо бы еще перевести из дюймов в метры

Тут лучшим решением будет использование Autodesk.Revit.DB.UnitUtils