Макрос образмеривания (аналог Autocad Quick Dimension)

Автор Тема: Макрос образмеривания (аналог Autocad Quick Dimension)  (Прочитано 13272 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Здравствуйте. При создании макроса по образмериванию столкнулся с NullReferenceException. Подобньій макрос мною уже создавался, но бьіл утерян при перестановке ОС. И вот теперь неожиданно столкнулся с проблемой, не встречаемой раньше... Возможно я что-то не так делаю. Прошу помочь дельньім советом.
Вот код :
Код - C# [Выбрать]
  1. public void BeamDimensioner()
  2.                 {
  3.                         Document doc = ActiveUIDocument.Document;
  4.                         View view = ActiveUIDocument.ActiveView;
  5.                         ZCatSelectionFilter beamFilter = new ZCatSelectionFilter(doc.Settings.Categories.get_Item(BuiltInCategory.OST_StructuralFraming));// structural framing selectionfilter
  6.                         IList<Reference> refList = ActiveUIDocument.Selection.PickObjects(ObjectType.Element,beamFilter);
  7.                         Line l = (((doc.GetElement(refList.First()) as FamilyInstance).Location as LocationCurve).Curve) as Line;
  8.                         XYZ point1 = l.GetEndPoint(0);
  9.                         XYZ point2 = point1.Subtract(l.Direction.CrossProduct(XYZ.BasisZ) );
  10.                         Line line = Line.CreateBound(point1,point2);
  11.                         ReferenceArray refArray = new ReferenceArray();
  12.                         foreach (Reference r in refList)
  13.                         {
  14.                                 FamilyInstance beam = doc.GetElement(r) as FamilyInstance;
  15.                                 Reference refer = (beam.Location as LocationCurve).Curve.Reference; //null
  16.                                 refArray.Append(refer);
  17.                         }
  18.                         using (Transaction tx = new Transaction(doc))
  19.                         {
  20.                                 tx.Start("Add Dimensions");
  21.                                 Dimension dim = doc.Create.NewDimension(view,line,refArray);
  22.                                
  23.                                 tx.Commit();
  24.                         }
  25.                        
  26.                 }
« Последнее редактирование: 26-03-2016, 19:29:16 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13923
  • Карма: 1793
  • Рыцарь ObjectARX
  • Skype: rivilis
Wrath
Приветствую на форуме. Пожалуйста ознакомься с правильным форматированием кода на форуме (у меня в подписи).
Что касается твоего вопроса, то надеюсь, что к понедельнику кто-то подскажет решение. Пока же уточни версию Revit.
« Последнее редактирование: 26-03-2016, 22:41:35 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Александр Ривилис, спасибо. Ознакомился.
 Revit 2015.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Reference refer = (beam.Location as LocationCurve).Curve.Reference; //null

С большой долей вероятности beam.Location as LocationCurve равен null.
Свойство FamilyInstance.Location имеет тип Location. Этот класс в свою очередь имеет два дочерних класса: LocationPoint и LocationCurve.
Таким образом, при выполнении данного кода, если месторасположение объекта определяется точкой, а не кривой, то и возникает такой эксепшн.

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Да нет. null именно Reference,  а так же Start/End Point Reference.
У меня семейство именно а основе линии. Сама кривая есть(только что проверил в Revit Lookup), но почему то без ссьілки.

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

  • Administrator
  • *****
  • Сообщений: 13923
  • Карма: 1793
  • Рыцарь ObjectARX
  • Skype: rivilis
Wrath
Думаю, что если ты предоставишь файл, Виктору будет проще тебе помочь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Да нет. null именно Reference
В исходном сообщении было упоминание о NullReferenceException из чего я и сделал такой вывод. Если Reference = null, то эксепшн возникает не на 15 строке, а ниже.
Ну а если Reference = null, то в файле справке по свойству Curve.Reference прямо говорится, что оно может быть null
Цитировать
This value is set for curve geometry obtained from Revit elements. a null (Nothing in Visual Basic) if the curve was created via parameters, copying, transform, or other operations.[/qoute]

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Wrath, сейчас проверил на нескольких элементах, на всех Curve.Reference равен null.
На мой взгляд, задача решается с помощью извлечения геометрии объекта. В геометрии Reference присутствует.

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Александр Ривилис,  да я бьі без проблем предоставил, но єто , собственно, и есть весь код.)
Виктор Чекалин, исключение действительно возникает на 21 строке...
Разве в геометрии имеется серединная плоскость?
Дело в том, что , как я писал вьіше, я уже создавал такой же вполне рабочий маркос и ,насколько мне помнится, точно таким же способом...)  Поєтому сейчас я удивлен и смущен одновременно...

Отмечено как Решение Wrath 30-03-2016, 10:11:58

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
да я бьі без проблем предоставил, но єто , собственно, и есть весь код.)
Александр имел ввиду предоставить файл с проблемным элементом:) но думаю он не понадобится.
Разве в геометрии имеется серединная плоскость?
Не очень понял что имеется ввиду в данном случае.
Дело в том, что , как я писал вьіше, я уже создавал такой же вполне рабочий маркос и ,насколько мне помнится, точно таким же способом...)
Т.е. может быть таким, а может быть и другим:) Работал в той же самой версии Revit?

В общем нужно определиться, что нужно получить в итоге - узнать, почему раньше работало, а сейчас нет (хотя это маловероятно, так как нет полной уверенности, что был именно такой же код). Хотя мне тоже интересно, вроде бы справка говорит, что Curve.Reference может быть null, но у меня на простых объектах типа стены, она всегда null.
Либо нужно решить поставленную задачу и найти рабочее решение?

Что будет кстати, если убрать строки 14-15, а в строке 16 использовать refArray.Append(r);?

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

  • Administrator
  • *****
  • Сообщений: 13923
  • Карма: 1793
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр имел ввиду предоставить файл с проблемным элементом:)
Именно! Может там какое-то особое семейство...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Александр Ривилис,  семейство самое обьічное... да и на всех испьітанньіх семействах балок та же песня.
Виктор Чекалин,  конечно же я не уверен в полной идентичности кода.) Но в использованном принципе - на 100%. Работал в той же 2015 версии.
Цитировать
Что будет кстати, если убрать строки 14-15, а в строке 16 использовать refArray.Append(r);?
да ничего хорошего- кажеться мне.) r вроде как ссьілка на весь обьект... тьісяча чертей! сработало!). Видимо, так и делал раньше -  усложнил себе задачу... Спасибо.)

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

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

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Александр Ривилис, так сразу же и отметил. Оно разве не отмечено?

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

  • Administrator
  • *****
  • Сообщений: 13923
  • Карма: 1793
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Ривилис, так сразу же и отметил. Оно разве не отмечено?
Всё в порядке. Просто ты сначала написал ответ, а потом отметил Решение. Я увидел ответ, но отметки не увидел и решил, что ты еще не в курсе всех особенностей данного форума. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение