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

我不是 FreeCAD 方面的专家,所以这只是一种猜测,但是......,它看起来addProperty需要一个变量的名称、类型和描述,并为您创建一个具有默认值的变量。这些示例显示了一步创建/更新,就像在您的示例中一样。问题是当你事先不知道变量的名称时该怎么办。getattr在 python 中,您使用和处理“变量属性名称” 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)

或者,也许您已经将它们放在某个地方的字典中

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

谢谢你的回答!但是,出于某种原因,您展示的第一个示例没有为生成的variable0,variable1variable2. 使用字典有效!例如,当我将对象列表插入到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 中,从 python 添加的动态属性作为标准 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 回答