AccessViolationException при доступе к свойствам «Выше», «Ниже», «Суффикс» и «Префикс» измерения

В Revit 2013 у меня есть инструмент, который я делаю, чтобы копировать размеры с одного чертежного вида на другой. У меня получилось правильно создать новую версию измерения, включая Curve, DimensionType и References, но у меня возникли проблемы со свойствами Above, Below, Prefix и Suffix. Они отлично копируются, если хотя бы один из них имеет значение. Однако, если ни один из них не имеет значения, он выдаст AccessViolationException, когда я попытаюсь получить к ним доступ. Я пытался поймать это исключение, но оно всплывает и вызывает сбой Revit (я предполагаю, что это вызвано сбоем собственного кода).

Как я могу проверить, имеют ли эти свойства какое-либо значение, когда я копирую, не вызывая этот AccessViolationException?

Autodesk Вопрос группы обсуждения

Я использую класс DimensionData для хранения информации об измерении, чтобы его можно было использовать для создания измерения в отдельном документе.

private IEnumerable<DimensionData> GetDimensionDataSet(Document document, 
  View view)
{
  if (document == null)
    throw new ArgumentNullException("document");

  if (view == null)
    throw new ArgumentNullException("view");

  List<DimensionData> dimensionDataSet = new List<DimensionData>();

  FilteredElementCollector dimensionCollector = 
    new FilteredElementCollector(document, view.Id);

  dimensionCollector.OfClass(typeof(Dimension));

  foreach (Dimension oldDimension in dimensionCollector)
  {
    Line oldDimensionLine = (Line)oldDimension.Curve;
    string dimensionTypeName = oldDimension.DimensionType.Name;

    List<ElementId> oldReferences = new List<ElementId>();

    foreach (Reference oldReference in oldDimension.References)
      oldReferences.Add(oldReference.ElementId);

    DimensionData dimensionData;

    try
    {
      string prefix = oldDimension.Prefix;

      dimensionData = new DimensionData(oldDimensionLine,
                                        oldReferences,
                                        dimensionTypeName,
                                        prefix,
                                        oldDimension.Suffix,
                                        oldDimension.Above,
                                        oldDimension.Below);
    }
    catch (AccessViolationException)
    {
      dimensionData = new DimensionData(oldDimensionLine, 
        oldReferences, dimensionTypeName);
    }

    dimensionDataSet.Add(dimensionData);
  }

  return dimensionDataSet;
}

person skeletank    schedule 30.01.2013    source источник
comment
Это своего рода выстрел в темноту, но я припоминаю некоторые фрагменты кода в API, которые ведут себя неправильно, если нет открытой транзакции. У вас есть открытая транзакция, когда вы делаете код, который вы показываете выше?   -  person Matt    schedule 01.02.2013


Ответы (2)


Что касается транзакций: насколько мне известно, вы должны находиться внутри транзакции только тогда, когда вы делаете какие-либо ИЗМЕНЕНИЯ (модификации, удаления, добавления). Если все, что вы делаете, это собираете информацию об измерениях, вам не нужна транзакция, но когда вы используете эту информацию для создания новых измерений в другом документе, этот код должен быть внутри транзакции. У меня было несколько разрабатываемых программ, которые еще не изменяли документ, а просто собирали настройки параметров и размещали их в TaskDialog.Show(). Эти программы работали нормально, и я не вижу в вашем коде ничего, что фактически изменяет вашу модель, так что, похоже, это не ваша проблема.

person KeachyPeen    schedule 08.07.2014

Кажется, я глючу. Можете ли вы сообщить о проблеме в службу поддержки ADN?

Решение, которое я могу предложить, состоит в том, чтобы использовать Parameters из Dimension element вместо свойств класса Dimension.

Например, вы можете получить Suffix и Prefix по следующему коду

var suffixParameter =
    oldDimension.get_Parameter(BuiltInParameter.SPOT_SLOPE_SUFFIX);
string suffix = null;
if (suffixParameter != null)
{
    suffix = suffixParameter.AsString();
}

var prefixParameter =
    oldDimension.get_Parameter(BuiltInParameter.SPOT_SLOPE_PREFIX);
string prefix = null;
if (prefixParameter != null)
{
    prefix = prefixParameter.AsString();
}

К сожалению, я не говорю вам, как получить свойства Above и Below через параметры, потому что у меня нет проекта для тестирования. Но вы можете легко определить параметры, используя Встроенная проверка параметров

Надеюсь, поможет.

person Victor Chekalin    schedule 31.01.2013
comment
Параметры BuiltInParameter.SPOT_SLOPE_PREFIX и BuiltInParameter.SPOT_SLOPE_SUFFIX не соответствуют Prefix и Suffix на Dimension, так что это не сработает. Я попытался получить их с помощью get_Parameter, но он вернул null, хотя Prefix и Suffix возвращали значения. Использование встроенного средства проверки параметров также не сработало, поскольку эти 4 свойства не отображаются в качестве параметров. :( - person skeletank; 31.01.2013
comment
Срок действия нашей подписки ADN истек, поэтому мы не можем отправить запрос в службу поддержки ADN. - person skeletank; 31.01.2013
comment
Это немного странно. Прежде чем опубликовать свое предложение, я проверил свой код в своем тестовом проекте. Если вы поделитесь своим проектом, я постараюсь вам помочь. - person Victor Chekalin; 01.02.2013
comment
Вам нужен мой проект Revit или мой проект Visual Studio? Я проверил BuiltInParameter.SPOT_SLOPE_PREFIX и BuiltInParameter.SPOT_SLOPE_SUFFIX, и, как указано в их названиях, они относятся конкретно к размерам точечного уклона, а не к размерам в целом. - person skeletank; 01.02.2013
comment
Я получил ответ от saikat на форумах Autodesk, и он попросил тестовый проект и тестовый файл Revit. Вы можете загрузить ZIP-файл, который я разместил. - person skeletank; 05.02.2013
comment
В предоставленном вами файле размер не имеет свойства префикса или суффикса. Я не очень разбираюсь в размерах. Я уверен, что если размер имеет свойство префикса или суффикса, вы можете получить его через параметр. Или, может быть, только размер Spot Slope может иметь префикс или суффикс? - person Victor Chekalin; 07.02.2013
comment
Я проверил размер с префиксом/суффиксом/выше/ниже, и вы не можете получить их с помощью параметра. Я проверил с помощью инструмента поиска. У размеров, отличных от точечных откосов, есть суффикс/префикс, потому что я могу получить их с помощью прямых свойств. - person skeletank; 07.02.2013