我在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.
答案 0 :(得分:0)
我不是FreeCAD的专家所以这是一个猜测,但是......,看起来像addProperty
获取变量的名称,类型和描述,并为您创建一个默认值。这些示例在一个步骤中显示创建/更新,就像您的示例中一样。问题是如果您事先不知道变量的名称该怎么办。在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)
或许你已经把它们放在某个地方的词典中
for name, value in mydict.items():
setattr(obj.addProperty("App::PropertyFloat", name, "variable label",
"variable explanation"), name, value)
我对FreeCAD属性实现感到困惑。属性对象应该有一个众所周知的名称来访问它的值,而不是一些棘手的属性名称。
答案 1 :(得分: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)
答案 2 :(得分:0)
Thnx为你回答!但是,对于某些内容,您展示的第一个示例并未为生成的variable0
,variable1
和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)配置文件组成的放样。