Forge, API и программирование – Русский – только для чтения
Задавайте вопросы и делитесь знаниями по Autodesk Forge и программированию на API программного обеспечения Autodesk
отмена
Отображаются результаты для 
Показать  только  | Вместо этого искать 
Вы имели в виду: 
Ответить
Сообщение 1 из 72
kart1984
7396 просмотров, 71 ответов

Revit API

Доброго времени суток!

Предлагаю в данной теме вести обсуждение Revit API. Сейчас готовлю статью для новичков, не только в АПИ Revit, но и впрограммировании тоже. Думаю со временем наберется русскоязычный материал для этой темы и обсуждений будет много... Некоторый материал и мои нароботки присутствуют на моем блоге.

Для начала дам общую информацию по дополнениям. Как они регистрируются в Revit.

Для регистрации дополнения используется файл манифест который находится в папке:

  • Если используется Windows XP: C:\Documents and Settings\All Users\Application Data\Autodesk\Revit\Addins\2011\
  • Если Windows 7: C:\ProgramData\Autodesk\Revit\Addins\2011\

 

Естественно если у вас Windows установлен на другом диске, то ищете папку там. Файл манифест имеет разширение *.addin.

Вот код, написанный в одном из моих файлов:

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
  <AddIn Type="Application">
    <Name>Editing</Name>
    <Assembly>C:\ProgramData\Autodesk\Revit\AddIns\2011\Editing.dll</Assembly>
    <AddInId>76eb700a-2c85-4888-a78d-31429ecae9ef</AddInId>
    <FullClassName>Editing.App</FullClassName>
  </AddIn>
  <AddIn Type="Command">
    <Assembly>C:\ProgramData\Autodesk\Revit\AddIns\2011\Editing.dll</Assembly>
    <AddInId>a9551912-c6e3-44a6-844d-e4d140c33916</AddInId>
    <FullClassName>Editing.Flipped</FullClassName>
    <Text>Антиотзеркаливание</Text>
    <Description>Возвращает отзеркаленным дверям заложеную в семействе ориентацию Право/лево</Description>
    <LongDescription>Описание</LongDescription>
    <AvailabilityClassName>Editing.Antimirror.FlippedAviability</AvailabilityClassName>
    <VisibilityMode>NotVisibleInFamily</VisibilityMode>
    <VisibilityMode>NotVisibleWhenNoActiveDocument</VisibilityMode>
    <LanguageType>Unknown</LanguageType>
  </AddIn>
</RevitAddIns>
Это не весь код, но я оставил основной. Я выделил цветом то, что нам может пригодиться. Как видно дополнения делятся на две категории. Это Application и Command. Дополнения типа Application запускаются сразу после старта Revit. Command  запускается при нажатии кнопки или выборе из списка дополнений во вкладке Надстройки. В тег Assembly у нас заключен путь к файлу дополнения. В теге FullClassName указан путь к классу, с которого стартует наше дополнение. AvailabilityClassName и VisibilityMode управляют доступностью к комманды в том или ином случае. Остальные теги относятся к описанию нашего дополнения.

Думаю для начала хватит.

 

С уважением
Артур Кураков
Теги (2)
71 ОТВЕТ 71
Сообщение 21 из 72
kart1984
в ответ: Sadykov

Это сделано для того чтобы избежать повторения стандартной нуммерации Ревит. Можно название Альбома делать невидимыми символами. Формула составления номера листа ревит Альбом.Номер листа. Можно попробовать вместе найти компромис. Еще как вариант создать марку с произвольным текстом. Чисто как обозначение и все

 

С уважением
Артур Кураков
Сообщение 22 из 72
otmoroz
в ответ: kart1984

Артур, в начале темы Вы говорили, что пишите статью для чайников. Готова ли она?

Сообщение 23 из 72
otmoroz
в ответ: kart1984

С помощью какого метода создать линию детализации? В справке к SDK не нашёл 2012-я версия)

 

Что означает надпись "Overloaded" в описании некоторых методов?

 

Снимок.PNG

Сообщение 24 из 72
kart1984
в ответ: otmoroz

Доброго времени суток! Да, статья есть (точнее перевод статьи ))), но в данный момент ждем пока ее разместит Autodesk. Как только это случится я сразу же сообщу на своем блоге и продублирую здесь.

По поводу надписи Overloaded. Она означает что метод перегружен. То есть у него есть несколько вариантов вызова. Например:

Один и тот же метод GetElement в качестве данных может принимать как ElementId так и Reference. То есть у него два варианта написания. Или в классе DialogBox метод Show вообще имеет не только разные типы атрибутов но и разное их количество! Но задача у этих методов одинаковая.

Надеюсь объяснил понятно )))
С уважением, Артур.

С уважением
Артур Кураков
Сообщение 25 из 72
otmoroz
в ответ: kart1984

Статью жду с нетерпением, очень мало информации на русском языке.

 

По поводу Overloaded пока ещё не до конца разобрался, наверное с практикой придёт понимание.

 

С линией детализации разобрался, оказалось всё просто )

Описание тут: http://blog.rodhowarth.com/2011/02/revit-api-how-to-draw-detail-line-on.html

Сообщение 26 из 72
otmoroz
в ответ: otmoroz

Сделал линию детализации, но работает только в планах. На разрезах не хочет работать, вываливается с ошибкой.

 

 

Спойлер

using System;

using System.Collections.Generic;

using Autodesk.Revit.ApplicationServices;

using Autodesk.Revit.Attributes;

using Autodesk.Revit.DB;

using Autodesk.Revit.DB.Structure;

using Autodesk.Revit.UI;

 

namespace

Draw_Line

{

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]

[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]

publicclassDraw_Line: IExternalCommand

{

Application app;

Document doc;

public Result Execute(ExternalCommandData commandData, refstringmessage, ElementSet elements)

{

UIApplication rvtUIApp = commandData.Application;

UIDocument uiDoc = rvtUIApp.ActiveUIDocument;

app = rvtUIApp.Application;

doc = uiDoc.Document;

 

Draw_Annotation_Line();

returnResult.Succeeded;

}

publicvoidDraw_Annotation_Line()

{

doublex1 = 5.0;

 

doubley1 = 5.0;

 

doublez = 0.0;

 

doublex2 = 117.0;

 

doubley2 = 115.0;

XYZ point1 = app.Create.NewXYZ(x1, y1, z);

XYZ point2 = app.Create.NewXYZ(x2, y2, z);

Line line = app.Create.NewLineBound(point1, point2);

DetailCurve detailCurve = doc.Create.NewDetailCurve(doc.ActiveView, line);stringa = doc.ActiveView.Category.Name;

TaskDialog.Show("Done", "Line Created");

 

}

 

}

}

 

Сообщение 27 из 72
kart1984
в ответ: otmoroz

Все опорные точки в АПИ рисуются в 3Д пространстве. В связи с этим на разрезах используется координата z в зависимости от плоскости разреза x или y.

С уважением
Артур Кураков
Сообщение 28 из 72
otmoroz
в ответ: kart1984

Получилось разместить линию аннотации в плоскостях фасадов/разрезов с помощью задания координат точек, полученных из

doc.ActiveView.RightDirection и doc.ActiveView.UpDirection

Сообщение 29 из 72
AAntonoff
в ответ: kart1984

Добрый день! 

Пробую программировать на visual studio 2010 c# для Revit 2011. Возникла сложность объединения элементов  в линейный массив для их последующего копирования (аналог функции ревита). Для начала решил объединить в массив.

Код:

 

Спойлер
public Autodesk.Revit.UI.Result Execute(
       ExternalCommandData commandData,
       ref string message, 
       ElementSet elements)
{
       try
       {
          var uidoc = commandData.Application.ActiveUIDocument;
          var sel = doc.Selection.Elements;
          ElementArray e = sel as Element;
          ElementArray elementList = new ElementArray();
          elementList.Append(e);

       return Result.Succeeded;
       }
       catch (Exception ex)
       {
          return Result.Failed;
       }
}

 

 

Выдает следующие ошибки:

sel as Element - Cannot implicitly convert type 'Autodesk.Revit.DB.Element' to 'Autodesk.Revit.DB.ElementArray'

 

                          Cannot convert type 'Autodesk.Revit.UI.Selection.SelElementSet' to 'Autodesk.Revit.DB.Element' via

                          a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null

                          type conversion

 

 

elementList.Append(e) - The best overloaded method match for

                                        'Autodesk.Revit.DB.ElementArray.Append(Autodesk.Revit.DB.Element)' has some invalid

                                        arguments

 

                                        Argument '1': cannot convert from 'Autodesk.Revit.DB.ElementArray' to

                                        'Autodesk.Revit.DB.Element'

 

Помогите разобраться.

 

Сообщение 30 из 72
kart1984
в ответ: kart1984

Приветствую!

Все очень просто. Вы пытаетесь преобразовать массив элементов SelElementSet в объект одного элемента Element. Естественно это не возможно. То есть переменная sel уже сама по себе является массивом элементов. Если вам нужно получить один элемент то нужно его забрать из массива сначала, даже если он в нем единсвенный.

На скорую руку пока так. Если нужно разжевать то позднее все распишу.

С уважением
Артур Кураков
Сообщение 31 из 72
AAntonoff
в ответ: kart1984

Буду очень признателен. Жду

Сообщение 32 из 72
AAntonoff
в ответ: kart1984

kart1984, спасибо за подсказку, вроде понял как выбрать элемент из массива.

var sel = commandData.Application.ActiveUIDocument.Selection.Elements;
string info = "Selected elements:\n";

//Поиск выбранного элемента
foreach (Element elem in sel)
{
    //Создаем сообщение с информацией об объекте
    info += elem.Name + "\n";
}
TaskDialog.Show("Revit",info);

Даже попробовал добавить элемент в ElementArray:

ElementArray elementList = new ElementArray();
elementList.Append(elem);

 

Теперь вот размышляю над тем как его скопировать. Может кто подскажет?

Сообщение 33 из 72
AAntonoff
в ответ: kart1984

Не пойму почему колонна не перемещается. Ее местоположение определяется, проверял.

И не выдается сообщение TaskDialog.Show("Revit", "OK");. В чем может быть причина?

var sel = commandData.Application.ActiveUIDocument.Selection.Elements;

foreach (Autodesk.Revit.DB.FamilyInstance column in sel)
{
   LocationPoint columnPoint = column.Location as LocationPoint;
   if (null != columnPoint)
   {
      //Положение выделенного элемента
      //String prompt = "The selected column location information:";
      //prompt += "\nPoint:  (" + columnPoint.Point.X + ", " + columnPoint.Point.Y + ", " + columnPoint.Point.Z + ")";
      //TaskDialog.Show("Revit", prompt);

      XYZ newLocation = new XYZ(10, 20, 0);
      columnPoint.Point = newLocation;
      TaskDialog.Show("Revit", "OK");
    }
}
Сообщение 34 из 72
AAntonoff
в ответ: kart1984

Для перемещения перепробовал следующий код

 

1) double tagOffset = 20;

columnPoint.Point = new XYZ(columnPoint.Point.X + tagOffset, columnPoint.Point.Y, columnPoint.Point.Z);

 

2) XYZ newLocation = new XYZ(10, 20, 0);
columnPoint.Point = newLocation;

 

3) Autodesk.Revit.DB.Document document;

XYZ newLocation = new XYZ(10, 20, 0);
document.Move(column, newLocation);

 

Ошибок не выдают, но и не работают...

Сообщение 35 из 72
kart1984
в ответ: AAntonoff

Могу предположить что изменения вне транзакции сделаны. Так же можно попробовать поменять свойство location которое у колонны возвращает LocationPoint. (сори - выше не прочитал). Еще очень советую в конце всех действий вызывать метод Regenerate документа, чтоб все изменения прошли процесс проверки на взаимодейсвия между собой.

С уважением
Артур Кураков
Сообщение 36 из 72
kart1984
в ответ: AAntonoff

Метод ElementTransformUtils.CopyElements .

С уважением
Артур Кураков
Сообщение 37 из 72
AAntonoff
в ответ: kart1984

Ну метода ElementTransformUtils.CopyElements в 2011 точно нет. Только что в справке посмотрел.

 

Вне транзакции - это как? И как вызвать Regenerate? Можно на примере показать?

Когда начинаю набирать, выдает: 

RegenerationAttribute и RegenerationOption

Сообщение 38 из 72
kart1984
в ответ: AAntonoff

Извиняюсь. Забыл что вы разрабатываете под 2011 версию. Чесно говоря под 2011 под рукой сейчас справки нет. В 2011 помоему все транзакции делались автоматом. Регенирация вызывалась в экземпляре класса Document.

С уважением
Артур Кураков
Сообщение 39 из 72
AAntonoff
в ответ: kart1984

Имеете ввиду вот это?

namespace RevitAddin
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]

    public class Command : IExternalCommand
    {
        public Result Execute(
            ExternalCommandData commandData, 
            ref string message, 
            ElementSet elements)
        {
            try
            {

                //КОД

                return Result.Succeeded;
            }
            catch (Exception ex)
            {
                return Result.Failed;
            }
        }
    }
}

 Есть продвижения)))) Поменял оба manual на automatic и все заработало!!!!!! Объясните для чего тогда manual нужен???

Сообщение 40 из 72
kart1984
в ответ: AAntonoff

Да - только еще нужно создать экземпляр класса транзакции

Transaction tr = new Transaction(doc);
tr.Name = "Копирование";
tr.Start();

// Действия
//......
doc.Regenerate();
tr.Commit();

 Хотя в справке написано что регенерация делается автоматически после завершения транзакции я всеравно его вызываю - бывали случаи ))))

С уважением
Артур Кураков

Не нашли то, что искали? Задайте вопросы в сообществе или поделитесь своими знаниями.

Новая тема  

Autodesk Design & Make Report