1

在 Revit 2013 中,我正在制作将尺寸从一个绘图视图复制到另一个绘图视图的工具。我已经可以正确创建一个新版本的维度,包括CurveDimensionType和 ,References但是我在使用属性AboveBelowPrefix和时遇到了问题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;
}
4

2 回答 2

0

关于交易:据我所知,仅当您进行任何类型的更改(修改、删除、添加)时,您才需要在交易中。如果您所做的只是收集维度信息,则不需要事务,但是当您使用该信息在另一个文档中创建新维度时,该代码必须在事务中。我有许多正在开发的程序,它们还没有修改文档,只是收集了参数设置并将它们发布到 TaskDialog.Show()。这些程序运行良好,我在您的代码中没有看到任何实际修改您的模型的内容,因此这似乎不是您的问题。

于 2014-07-08T16:48:23.803 回答
-1

好像我有问题。您可以将问题发布到 ADN 支持吗?

我可以建议的解决方案是使用ParametersDimension element不是Dimension类属性。

例如,您可以通过以下代码获取SuffixandPrefix

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();
}

不幸的是,我没有告诉你如何通过参数获取AboveBelow属性,因为我没有要测试的项目。但是您可以使用BuiltInParameter Checker轻松确定参数

希望能帮助到你。

于 2013-01-31T06:17:03.887 回答