1

Revit 2013 では、ある製図ビューから別の製図ビューに寸法をコピーするツールを作成しています。CurveDimensionType、およびを含むディメンションの新しいバージョンを適切に作成することができましたがReferences、プロパティAboveBelowPrefix、およびに問題がありSuffixます。それらの少なくとも 1 つに値があれば、問題なくコピーされます。ただし、それらのいずれにも値がない場合は、それらAccessViolationExceptionにアクセスしようとすると がスローされます。その例外をキャッチしようとしましたが、バブルアップして Revit がクラッシュします (失敗したネイティブ コードが原因であると想定しています)。

これをトリガーせずにコピーを行うときに、これらのプロパティに値があるかどうかを確認するにはどうすればよいAccessViolationExceptionですか?

オートデスク ディスカッション グループの質問

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

たとえば、次のコードで取得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を取得する方法については説明しません。ただし、 BuiltInParameter CheckerBelowを使用してパラメーターを簡単に決定できます。

それが役に立てば幸い。

于 2013-01-31T06:17:03.887 に答える