2016-07-04 7 views
0

他のクラスの変数にアクセスしたいです。 他のクラスの静的変数は非常にアクセスが良好でした。 しかし、ダイナミック変数の変数値が変更されたため、アクセスできませんでした。他のユーザークラス(ブレンダーのpython)の変数にアクセスするには?

なぜ私は変更された変数値を取得できませんか?


bl_info = { 
    "name": "New Object", 
    "author": "Your Name Here", 
    "version": (1, 0), 
    "blender": (2, 75, 0), 
    "location": "View3D > Add > Mesh > New Object", 
    "description": "Adds a new Mesh Object", 
    "warning": "", 
    "wiki_url": "", 
    "category": "Add Mesh", 
} 

import bpy 

class SelectFace(bpy.types.Operator): 
    bl_idname = "object.d0" 
    bl_label = "Select Face" 

    selected_faces = 2 

    def __init__(self): 
     self.selected_faces = 3 

    def execute(self, context): 
     print("self.selected_faces: ", self.selected_faces) 
     self.selected_faces += 1 
     bpy.ops.object.d1('INVOKE_DEFAULT') 
     return {'FINISHED'} 

class OperationAboutSelectedFaces(bpy.types.Operator): 
    """ Test dialog. """ 
    bl_idname = "object.d1" 
    bl_label = "Test dialog" 

    F_num = bpy.props.IntProperty(name="be Selected face", default=1) 

    @classmethod 
    def poll(self, context): 
     obj = context.object 
     return(obj and obj.type == 'MESH' and context.mode == 'OBJECT') 

    def invoke(self, context, event):   

     # This block code is Not Work! --- TypeError: bpy_struct.__new__(type): expected a single argument. 
     testInstance = SelectFace() # why not work? 
     print("testInstance.selected_faces: ", testInstance.selected_faces) 
     self.F_num = testInstance.selected_faces 

     # This block code is nice Work! 
     testInstance = SelectFace.selected_faces 
     print("testInstance: ", testInstance) 
     self.F_num = testInstance 

     return context.window_manager.invoke_props_dialog(self) 

    def execute(self, context): 
     context.active_object.data.polygons [self.F_num].select = True 
     return {'FINISHED'} 

    def register(): 
     bpy.utils.register_class(SelectFace) 
     bpy.utils.register_class(OperationAboutSelectedFaces) 

    def unregister(): 
     bpy.utils.unregister_class(SelectFace) 
     bpy.utils.unregister_class(OperationAboutSelectedFaces) 

    if __name__ == "__main__": 
     register() 
     bpy.ops.object.d0() 
+0

うわー...空白の巨大なラインが見えます! – linusg

+0

あなたは何をしようとしているのかよく説明できますか?どちらの変数値を変更しようとしていますか? –

+0

Select_Face()クラスのselected_faces変数は、他のコマンドから "bpy.ops.object.d0()"によって変更できます。 selected_faces変数は+1を増やします。 "bpy.ops.object.d0()"のボタンをクリックしたとき。しかし、OperationAboutSelectedFaces()のdialogBoxはselected_faces変数の値を変更しませんでした。 – user3052391

答えて

0

私は動作しない理由を

testInstance = SelectFace()#と仮定?

は本当の質問です。

は、以下を参照してください。 https://www.blender.org/api/blender_python_api_2_60a_release/info_overview.html

は、あなたがbpy.types.Operatorのインスタンスを作成するコードを記述することが期待されていないようです。おそらく、Blenderは独自の方法でbpy.types.Operatorサブクラスの作成を処理します。定義されている場合のinit()とはデル()が呼び出されます、クラスのインスタンスの有効期間は実行のみにわたっている間

「。これらのクラスは、のinit(自己)関数を定義していません注意してください。だから、パネルインスタンスに変数を格納することはほとんどありませんが、ブレンダーを再起動すると状態を復元できるように、永続変数をBlenderデータに格納する必要があります。 " https://www.blender.org/api/blender_python_api_2_66a_release/bpy.props.html

+0

でより良い回答が期待できます。再描画するたびに新しいインスタンスがありますか?ちょっと無駄な、私は思う... – CodenameLambda

0

ブレンダーでオペレーターがアクションを実行するために使用されます。

も、プロパティの定義を参照します。そのアクションと関連するプロパティを定義するためにクラスを使用していますが、通常のPythonクラスとして扱うべきではありません。変数データを保持するのではなく、実行されるアクションを調整するために、演算子のプロパティを使用する必要があります。

オペレータのプロパティはオペレータの結果を制御するため、ブレンダがアンドゥ/リドゥステップを実行するために使用されます。これらのプロパティは、F6を押してオペレータプロパティパネルを使用してユーザーが調整することもでき、ツールバー領域の下部にも表示されます。

operator properties

は、ユーザーが自分の作業を調整することができるように、あなたのオペレータに bl_options = {'REGISTER', 'UNDO'}を追加します。オペレーターに draw(self,context)メソッドを与えることで、このパネル内の表示をカスタマイズすることもできます。あなたが使用できるパネルにオペレータボタンを追加する場合は

bpy.ops.object.d1(F_num=4, val2=3.6) 

- -

は、オペレータが、我々はオペレータコールにプロパティを追加することができ、それを直接呼び出すときに、それのタスクを実行する方法を制御するために、

をあなたが複数の値を設定する必要がある場合
row.operator('object.d1').F_num = 4 

またはあなたが使用することができます -

op = row.operator('object.d1') 
op.F_num = 4 
op.val2 = 3.6 

指定した例は、あるオブジェクトに対してのみ有効であるように見えるプロパティを使用します。ユーザーが別のオブジェクトを選択した場合、そのオブジェクトはもはや有効になりません。このプロパティは、あなたがさえできること例えば、あなたのアドオンでregister()それを追加し、unregister()

def register(): 
    bpy.types.Object.selected_faces = bpy.props.IntProperty() 

def unregister(): 
    del bpy.types.Object.selected_faces 

でそれを除去することにより、オブジェクトのクラス(またはsubclasses of IDとして記載されている他のいくつか)に、オブジェクトのプロパティとして、より良いadd a propertyをすることができます動作しますあなたが値を必要としたときに選択した顔を数えます -

selected_faces_count = len([f for f in obj.data.polygons if f.select]) 
関連する問題