Цепочка размеров

Автор Тема: Цепочка размеров  (Прочитано 4669 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Владимир ПАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Цепочка размеров
« : 22-05-2017, 20:47:45 »
Здравствуйте, знатоки Revit API.
Есть код по созданию нескольких осей.
Код - C# [Выбрать]
  1.             // вертикальные оси
  2.             for (i = 0; i < kol_sh_X; i++)
  3.             {
  4.                 startPoint = new XYZ(startPoint.X + ShagX[i] * ku, startPoint.Y, 0);
  5.                 endPoint = new XYZ(startPoint.X, endPoint.Y, 0);
  6.                 geomLine = Autodesk.Revit.DB.Line.CreateBound(endPoint, startPoint);
  7.                 // Create a grid using the geometry line
  8.                 lineGrid = document.Create.NewGrid(geomLine);
  9.             } // End of for block
  10.  
Все работает.

В другом приложении есть код образмеривания нескольких выбранных на экране осей.

Код - C# [Выбрать]
  1.     Document doc = m_revit.Application.ActiveUIDocument.Document;
  2.  
  3.     ElementSet selections = new ElementSet();
  4.     foreach (ElementId elementId in m_revit.Application.ActiveUIDocument.Selection.GetElementIds())
  5.     {
  6. selections.Insert(m_revit.Application.ActiveUIDocument.Document.GetElement(elementId));
  7.     }
  8.    ReferenceArray referenceArray = new ReferenceArray();
  9.     foreach (Grid grid in selections)
  10.     {
  11.     //for grid in selection:
  12.                 referenceArray.Append(grid.Curve.Reference);
  13.     }
  14.     Autodesk.Revit.DB.XYZ p1 = new XYZ(0, 0, 0);
  15.     Autodesk.Revit.DB.XYZ p2 = new XYZ(10, 0, 0);
  16.                
  17.     Line line = Line.CreateBound(p1, p2);
  18.          
  19.         Transaction t = new Transaction(m_revit.Application.ActiveUIDocument.Document, "create dimension");
  20.         t.Start();
  21.          
  22.         doc.Create.NewDimension( doc.ActiveView, line, referenceArray );
  23.          
  24.         t.Commit();
  25.  
Тоже все работает.

Хочу объединить эти два куска в один. Т. е. теперь задача - программно отрисовать несколько осей и проставить размеры между ними. Казалось, все просто… однако, добавляю строки из второго кода в первый
Код - C# [Выбрать]
  1.             // вертикальные оси
  2.             //Autodesk.Revit.DB.ReferenceArray referenceArray;
  3.             //referenceArray = new Autodesk.Revit.DB.ReferenceArray();
  4.    ReferenceArray referenceArray = new ReferenceArray();
  5.             for (i = 0; i < kol_sh_X; i++)
  6.             {
  7.                 startPoint = new XYZ(startPoint.X + ShagX[i] * ku, startPoint.Y, 0);
  8.                 endPoint = new XYZ(startPoint.X, endPoint.Y, 0);
  9.                 geomLine = Autodesk.Revit.DB.Line.CreateBound(endPoint, startPoint);
  10.                 // Create a grid using the geometry line
  11.                 lineGrid = document.Create.NewGrid(geomLine);
  12.                 referenceArray.Append(lineGrid.Curve.Reference);
  13.             } // End of for block
и НЕ работает.
В самом коде при построении ошибок не показывает. Но при запуске надстройки в самом Ревите обнаруживает исключение на строке 
                referenceArray.Append(lineGrid.Curve.Reference);

Пожалуйста, подскажите, что не так.

Оффлайн shss

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Цепочка размеров
« Ответ #1 : 23-05-2017, 07:03:35 »
Но при запуске надстройки в самом Ревите обнаруживает исключение на строке referenceArray.Append(lineGrid.Curve.Reference);
А какую ошибку выдает исключение?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Цепочка размеров
« Ответ #2 : 23-05-2017, 07:21:56 »
В самом коде при построении ошибок не показывает. Но при запуске надстройки в самом Ревите обнаруживает исключение на строке 
                referenceArray.Append(lineGrid.Curve.Reference);
А какое исключение? NullReference?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Цепочка размеров
« Ответ #3 : 23-05-2017, 07:32:06 »
Владимир,
Я думаю дело все в том, что вы пытаетесь сделать все в одной транзакции. Проблема в том, что пока транзакция не подтверждена, то ссылки на кривую грида lineGrid.Curve.Reference еще не существует.
Решение - разделить транзакции. В первой создаете сетку. Записываете созданные сетки в промежуточный массив. Во второй - создаете размерности.
Примерно так:
Код - C# [Выбрать]
  1.             // вертикальные оси
  2.             //Autodesk.Revit.DB.ReferenceArray referenceArray;
  3.             //referenceArray = new Autodesk.Revit.DB.ReferenceArray();
  4.            var createdGrids = new List<Grid>();
  5.  
  6.             using (var t = new Transaction(doc, "Create grids"))
  7.             {
  8.             for (i = 0; i < kol_sh_X; i++)
  9.             {
  10.                 startPoint = new XYZ(startPoint.X + ShagX[i] * ku, startPoint.Y, 0);
  11.                 endPoint = new XYZ(startPoint.X, endPoint.Y, 0);
  12.                 geomLine = Autodesk.Revit.DB.Line.CreateBound(endPoint, startPoint);
  13.                 // Create a grid using the geometry line
  14.                 lineGrid = document.Create.NewGrid(geomLine);
  15.                 createdGrids.Add(lineGrid );
  16.  
  17.             } // End of for block
  18.  
  19.             }
  20.  
  21.             using (var t = new Transaction(doc, "Create dimensions"))
  22.             {
  23.                    ReferenceArray referenceArray = new ReferenceArray();
  24.                     foreach (var grid in createdGrids)
  25.                         referenceArray.Append(grid.Curve.Reference);
  26.                    // создание размерностей
  27.              }
  28.  

Оффлайн Владимир ПАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Цепочка размеров
« Ответ #4 : 23-05-2017, 17:26:08 »
Решение - разделить транзакции.
Сделал так, как Вы, Виктор порекомендовали. Не получилось.
Попробовал оставить практически только один ваш код (ну, добавил недостающие определения и переменные). Но получил то же самое... А именно - картинка ниже.
Ломается на строке 14 Вашего кода.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Цепочка размеров
« Ответ #5 : 23-05-2017, 17:29:19 »
Ошибка говорит о том, что производится попытка модификация модели вне транзакции. В коде Виктора Чекалин такого нет.
Так что следует отследить где именно возникает это исключение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Владимир П 23-05-2017, 17:57:30

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Цепочка размеров
« Ответ #6 : 23-05-2017, 17:45:02 »
Ломается на строке 14 Вашего кода.
Ну это был скорей псевдо-код, а не рабочий) Я там упустил t.Start() и t.Commit().
Код - C# [Выбрать]
  1.             using (var t = new Transaction(doc, "Create grids"))
  2.             {
  3.             t.Start();
  4.             for (i = 0; i < kol_sh_X; i++)
  5.             {
  6.                 startPoint = new XYZ(startPoint.X + ShagX[i] * ku, startPoint.Y, 0);
  7.                 endPoint = new XYZ(startPoint.X, endPoint.Y, 0);
  8.                 geomLine = Autodesk.Revit.DB.Line.CreateBound(endPoint, startPoint);
  9.                 // Create a grid using the geometry line
  10.                 lineGrid = document.Create.NewGrid(geomLine);
  11.                 createdGrids.Add(lineGrid );
  12.  
  13.             } // End of for block
  14.              t.Commit();
  15.             }
  16.  
  17.             using (var t = new Transaction(doc, "Create dimensions"))
  18.             {
  19.                    t.Start();
  20.                    ReferenceArray referenceArray = new ReferenceArray();
  21.                     foreach (var grid in createdGrids)
  22.                         referenceArray.Append(grid.Curve.Reference);
  23.                    // создание размерностей
  24.                    t.Commit();
  25.              }
Код не проверял ) так что где то в мелочах мог ошибиться опять.

Оффлайн shss

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Цепочка размеров
« Ответ #7 : 23-05-2017, 17:45:53 »
Добавьте в код:
Код - C# [Выбрать]
  1. using (var t = new Transaction(doc, "Create grids"))
  2. {
  3. t.Start();
  4. ...
  5. t.Commit();
  6. }
Пока писал, Виктор, уже ответил:)

Оффлайн Владимир ПАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Цепочка размеров
« Ответ #8 : 23-05-2017, 18:01:16 »
Есть! Сработало! Большое спасибо, Виктор!

Оффлайн Владимир ПАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Цепочка размеров
« Ответ #9 : 17-06-2017, 19:13:10 »
И снова проблемы с размерами. предыдущее решение остается в силе все работало, пока не возникла необходимость перехода с Revit 2015 на 2017.
По поводу создания текстовых элементов (TextNote) и осей были показаны ошибки и как это исправить я быстро нашел. А вот по поводу создания размеров ошибок не возникало, но вылетает программа на последней строке из кода ниже:
Код - C# [Выбрать]
  1.                    ReferenceArray referenceArray = new ReferenceArray();
  2.                 foreach (var grid in createdGrids)
  3.                     referenceArray.Append(grid.Curve.Reference);
  4.  
  5.                 XYZ p1 = new XYZ(-10, -10, 0);
  6.                 XYZ p2 = new XYZ(100, -10, 0);
  7.                 Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(p1, p2);
  8.                
  9.                 document.Create.NewDimension(document.ActiveView, line, referenceArray);
  10.  
Что делать? В интернете ничего, вроде бы, нет про изменения создания размеров от 2015 версии к 2017.
« Последнее редактирование: 17-06-2017, 19:14:24 от Александр Ривилис »