【发布时间】:2014-07-09 00:48:23
【问题描述】:
在 Revit 2013 中,我正在制作将尺寸从一个绘图视图复制到另一个绘图视图的工具。我已经可以正确创建一个新版本的维度,包括Curve、DimensionType 和References,但我在使用Above、Below、Prefix 和Suffix。如果其中至少一个具有价值,它们就可以很好地复制。但是,如果它们都没有值,那么当我尝试访问它们时它会抛出一个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 中的某些代码片段,除非有未处理的事务,否则它们的行为不正确。当您执行上面显示的代码时,您是否有未结交易?