2017-01-12 3 views
0

なぜ次のコードはRevitPythonシェルでスクリプトとして動作しますが、モジュールに追加するとマクロとしてエラーを投げますか?アイデアは、ドアを収集し、火災評価とフレームの詳細のためのホストオブジェクトを照会し、それらをドアにasignすることです。revit pythonマクロ対スクリプト

エラーは「タイプに属性が設定されていません()」です。だから、このエラーを投げるドア要素でなければなりません。しかし、なぜ、非常に同じコード(docがどのように定義されているかだけを変更する)はスクリプトとして実行されますが、マクロでは実行されないのはなぜですか?

def updateDoors(self): 
    doc = self.Document 
    doors = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements() 

    t = Transaction(doc, 'Door Update') 
    t.Start() 

    for d in doors: 

     wallRating = "---" 
     doorRating = "---" 
     doorNumber = "---" 
     wallFr = "---" 
     wallH = "---" 
     wallJ = "---" 

     if d.Host is not None and d is not None: 

      wallTypeId = d.Host.GetTypeId() 
      wall = doc.GetElement(wallTypeId) 
      if wall.LookupParameter('Fire Rating') is not None: 
       wallFr = wall.LookupParameter('Fire Rating').AsString() 
      # Get Door Jamb from the wall 
      if wall.LookupParameter('Frame Jamb') is not None: 
       wallJ = wall.LookupParameter('Frame Jamb').AsString() 
      # Get Door Head from the wall 
      if wall.LookupParameter('Frame Head') is not None: 
       wallH = wall.LookupParameter('Frame Head').AsString() 

      if str(wallFr) == '': 
       d.LookupParameter('Fire Rating-Instance').Set('--') 
      if str(wallFr) == '0': 
       d.LookupParameter('Fire Rating-Instance').Set('--') 
      if str(wallFr) == '1': 
       d.LookupParameter('Fire Rating-Instance').Set('45') 
      if str(wallFr) == '2': 
       d.LookupParameter('Fire Rating-Instance').Set('90') 
      if str(wallFr) == '3': 
       d.LookupParameter('Fire Rating-Instance').Set('120') 

      if d.LookupParameter('Over ride wall assigned details').AsValueString() == 'No':  
       d.LookupParameter('Jamb').Set(wallJ) 
       d.LookupParameter('Head').Set(wallH) 

    t.Commit() 

答えて

1

SharpDevelopデバッガで実行すると、問題の原因となっているコード行がわかります。これにより、すべての変数の値を確認することができ、いずれの変数もNoneであるか調べることができます。

また、このラインは非常に奇妙である:それは、可変壁に壁タイプを割り当てるさ

wall = doc.GetElement(wallTypeId)

すべてのパラメータ値は壁面から読み取られています、壁面のインスタンスではありません。

それはあなたの意図ですか?

もしそうなら、あなた自身と他人を混乱させないように、に変数wallの名前を変更することをお勧めします。

+0

ありがとうございます。そうです、壁ファミリから「タイプ」パラメータを収集し、それらをドアの「インスタンス」パラメータに割り当てることが目的です。実行時にデバッガでエラーが発生するため、マシンを再起動しました。今、スクリプトは動作します...デバッグ101? –

+0

'jamb'と 'head'パラメータを設定する以外は、すべてうまく動作します。エラーは "複数のターゲットが一致する可能性があります"です。私は、ドアの家族やインスタンスの複数のパラメータがあると信じるように導く "ヘッド"と "jamb" - 要素を精練するが、私はそれであるとは思わない。私はデバッガをクラッシュさせることなく動かすのに苦労しています。病気はこれを調べる必要があります。 –

+1

おめでとうございます。はい、表示名でパラメータを選択すると(推奨しません!)、同じ名前の複数の値を取得できます。その詳細とその対処方法についてはこちらをご覧ください:http://thebuildingcoder.typepad.com/blog/2015/06/cnc-direct-export-wall-parts-to-dxf-and-sat.html#2015.2 –

関連する問題