【问题标题】:AccessViolationException when accessing the Above, Below, Suffix, and Prefix properties of a Dimension访问 Dimension 的 Above、Below、Suffix 和 Prefix 属性时出现 AccessViolationException
【发布时间】:2014-07-09 00:48:23
【问题描述】:

在 Revit 2013 中,我正在制作将尺寸从一个绘图视图复制到另一个绘图视图的工具。我已经可以正确创建一个新版本的维度,包括CurveDimensionTypeReferences,但我在使用AboveBelowPrefixSuffix。如果其中至少一个具有价值,它们就可以很好地复制。但是,如果它们都没有值,那么当我尝试访问它们时它会抛出一个AccessViolationException。我试图捕获该异常,但它冒泡并导致 Revit 崩溃(我假设它是由失败的本机代码引起的)。

当我在不触发AccessViolationException 的情况下进行复制时,如何检查这些属性是否有任何值?

Autodesk Discussion Group Question

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

【问题讨论】:

  • 这有点像在黑暗中拍摄 - 但我记得 API 中的某些代码片段,除非有未处理的事务,否则它们的行为不正确。当您执行上面显示的代码时,您是否有未结交易?

标签: c# revit revit-api


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    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 轻松确定参数

    希望对你有帮助。

    【讨论】:

    • BuiltInParameter.SPOT_SLOPE_PREFIXBuiltInParameter.SPOT_SLOPE_SUFFIX 参数与 Dimension 上的 PrefixSuffix 不对应,因此这不起作用。我尝试使用get_Parameter 检索它们,但即使PrefixSuffix 返回值,它也返回null。使用 BuiltInParameter Checker 也不起作用,因为这 4 个属性没有显示为参数。 :(
    • 我们的 ADN 订阅已过期,因此我们无法提交 ADN 支持票。
    • 有点奇怪。在发布我的建议之前,我已经检查了我的测试项目中的代码。如果你分享你的项目,我会尽力帮助你。
    • 你想要我的 Revit 项目还是我的 Visual Studio 项目?我检查了BuiltInParameter.SPOT_SLOPE_PREFIXBuiltInParameter.SPOT_SLOPE_SUFFIX,就像他们的名字一样,它们专门适用于 Spot Slope 尺寸,而不是一般尺寸。
    • 我在 Autodesk 论坛上收到了 saikat 的回复,他要求提供测试项目和测试 revit 文件。你可以下载the .zip file that I posted
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多