1

私は FreeCAD で Python を使用しており、使用するオブジェクトにプロパティ (調整可能な変数) を追加しています。

obj.addProperty("App::PropertyFloat","variable","variable label","variable explanation").variable = 2

for ループを使用して、複数の変数名を持つ複数のプロパティを追加したいと考えています。文字列を変数に変換する方法を読みましたが、その変数名にアクセスする方法が見つかりませんでした。私の場合:上記のコードの .variable 位置で使用する方法。

コードがあるとします:

varName = []
for i in range(3):
    varName.append('variable%s' %i)
    exec("%s = %d" % (varName[i],2))

たとえば、print variable0 を使用して値 2 を取得できることを知っています。どのように variable0 の名前にアクセスして、それを.variableの位置に置くことができますか? 変数のリストまたは辞書の作成について読みましたが、変数の名前ではなく、変数の値にしかアクセスできませんよね?

リストをこのオブジェクトの入力にすることができ、その内容を変数名に割り当てる必要があります。出力は次のようになります (ただし、入力リストの任意の長さに適しています)。

obj.addProperty("App::PropertyFloat","variable0,"variable label","variable explanation").variable0 = input[0]
obj.addProperty("App::PropertyFloat","variable1,"variable label","variable explanation").variable1 = input[1]
etc.
4

3 に答える 3

0

答えてくれてありがとう!ただし、何らかの理由で、最初に示した例では、生成されたvariable0variable1およびに値が割り当てられませんvariable2。辞書を使うとうまくいきました!たとえば、オブジェクトのリストを に挿入する場合obj:

dict = {}
for i in range(len(objectList)):
    dict['object%d'%i] = objectList[i]
for name, value in dict.items():
    setattr(obj.addProperty("App::PropertyPythonObject", name, "object label", "object explanation"), name, value)

これは、ユーザーが指定した量の (2D) プロファイルで構成されるロフトなど、アセンブリを作成するのに役立つと思います。

于 2014-12-15T10:53:07.893 に答える
0

私は FreeCAD の専門家ではないので、これは推測にすぎませんが...、addProperty変数の名前、型、および説明を取り、デフォルト値で変数を作成するように見えます。例は、例のように、作成/更新を1つのステップで示しています。問題は、事前に変数の名前がわからない場合にどうするかです。Python では、「変数属性名」をgetattrと で処理しsetattrます。したがって、名前と値があれば、次のことができます。

name = 'some_name'
value = 1
setattr(obj.addProperty("App::PropertyFloat", name, "variable label",
    "variable explanation"), name, value)

変数名を生成するにはさまざまな方法があります。あなたの例では、

for i in range(3):
    setattr(obj.addProperty("App::PropertyFloat", "variable%d" % i, "variable label",
        "variable explanation"), name, i)

または、すでにどこかのdictにそれらを持っているかもしれません

for name, value in mydict.items():
    setattr(obj.addProperty("App::PropertyFloat", name, "variable label",
        "variable explanation"), name, value)

私は FreeCAD プロパティの実装に本当に困惑しています。プロパティ オブジェクトは、プロパティのトリッキーな名前ではなく、その値にアクセスするための単一の既知の名前を持つ必要があります。

于 2014-12-12T17:31:12.890 に答える
0

Python から追加された FreeCAD の動的プロパティは、標準の Python インスタンス属性として公開されます。したがって、通常の hasattr、getattr、setattr などを使用できます。したがって、ループは次のようになります。

varName = []
for i in range(3):
    varName = 'variable' + str(i)
    obj.addProperty("App::PropertyFloat", varName, "awesome label","best property ever")
    setattr(obj, varName, 1.234) 
    value = getattr(obj, varname)
于 2014-12-15T09:15:25.363 に答える