宏忽略参数更改
Macro ignores parameter change
给定一个 FreeCAD model 包含
- 电子表格“参数”,单元格别名为“半径”,值为 50
- 二十面体(来自金字塔和多面体宏),半径=parameters.radius
- 一些对于这个问题的目的来说并不重要的facebinders,
下面的python脚本打开这个模型,将电子表格中的半径单元格更改为15,在电子表格上调用recompute(),在二十面体上调用touch(),在文档上调用recompute() ,最后镶嵌二十面体。细分网格中索引 11 处顶点的 z 坐标恰好等于二十面体的半径。根据参数的变化,我原以为它会变成 15。但它仍然保持原来的值 50。我做错了什么?
据我了解,宏的 execute method 应该在重新计算文档期间被调用。
当我用 pudb 跟踪 Document.recompute() 时,我只看到它在执行 Facebinder.execute() 而不是 Icosahedron.execute()。它从 Document.recompute() 到 Facebinder.execute() 方法所采用的路径在 pudb 中是不可见的;它立即停止在 Facebinder.execute().
FREECADPATH = '/usr/local/lib' # path to your FreeCAD.so or FreeCAD.dll POLYHEDRONS_PATH = '/home/user/.FreeCAD/Mod/Pyramids-and-Polyhedrons'
import sys
sys.path.append(FREECADPATH)
sys.path.append(POLYHEDRONS_PATH)
import FreeCAD
filename = 'icosahedron.FCStd'
newRadius = 15
doc = FreeCAD.open(filename)
sheet = doc.Spreadsheet
sheet.set('radius', str(newRadius))
sheet.recompute()
print('radius = ' + str(sheet.get('radius')))
icosahedron = doc.getObjectsByLabel('Icosahedron')[0]
print('icosahedron.Radius = '+str(icosahedron.Radius))
icosahedron.touch()
doc.recompute()
print('icosahedron.Radius = '+str(icosahedron.Radius))
(vertices, faces) = icosahedron.Shape.tessellate(1)
z11 = vertices[11][2]
print('z11 = ' + str(z11))
FreeCAD.closeDocument(doc.Name)
我明白了。原因是 Pyramids-and-Polyhedrons
毕竟没有被导入。
第一个问题是 Pyramids-and-Polyhedrons
导入 FreeCADGui
(为了安装它的 workbench),这取决于需要在 [=35] 之前添加到 LD_LIBRARY_PATH
的某些原生库=]编写脚本:
export LD_LIBRARY_PATH=$(echo $(find /usr/local/lib/python3.7/site-packages -maxdepth 2 -mindepth 2 -type f -name *.so* | sed -r 's|/[^/]+$||' | sort -u) | sed -E 's/ /:/g')
现在可以导入 FreeCADGui
,但缺少 Pyramids-and-Polyhedrons
调用的必需 addCommand
方法。我发现 FreeCADGui
只有在 FreeCADGui.showMainWindow()
被调用后才会被完全初始化。但是,这需要显示,我想 运行 将脚本作为 Docker 容器中无头工具链的一部分。因此,我在图像中添加了 Xvfb
。我在 运行 更新脚本之前在后台启动它,DISPLAY
指向 Xvfb
:
FREECADPATH = '/usr/local/lib' # path to your FreeCAD.so or FreeCAD.dll file
POLYHEDRONS_PATH = '/home/user/.FreeCAD/Mod/Pyramids-and-Polyhedrons'
import sys
sys.path.append(FREECADPATH)
sys.path.append(POLYHEDRONS_PATH)
import FreeCAD
import FreeCADGui
FreeCADGui.showMainWindow()
import polyhedrons
filename = 'icosahedron.FCStd'
newRadius = 15
doc = FreeCAD.open(filename)
sheet = doc.Spreadsheet
sheet.set('radius', str(newRadius))
sheet.recompute()
print('radius = ' + str(sheet.get('radius')))
icosahedron = doc.getObjectsByLabel('Icosahedron')[0]
print('icosahedron.Radius = '+str(icosahedron.Radius))
breakpoint()
icosahedron.touch()
doc.recompute()
print('icosahedron.Radius = '+str(icosahedron.Radius))
(vertices, faces) = icosahedron.Shape.tessellate(1)
z11 = vertices[11][2]
print('z11 = ' + str(z11))
FreeCAD.closeDocument(doc.Name)
现在输出是
...
z11 = 15.0
符合预期。
给定一个 FreeCAD model 包含
- 电子表格“参数”,单元格别名为“半径”,值为 50
- 二十面体(来自金字塔和多面体宏),半径=parameters.radius
- 一些对于这个问题的目的来说并不重要的facebinders,
下面的python脚本打开这个模型,将电子表格中的半径单元格更改为15,在电子表格上调用recompute(),在二十面体上调用touch(),在文档上调用recompute() ,最后镶嵌二十面体。细分网格中索引 11 处顶点的 z 坐标恰好等于二十面体的半径。根据参数的变化,我原以为它会变成 15。但它仍然保持原来的值 50。我做错了什么?
据我了解,宏的 execute method 应该在重新计算文档期间被调用。
当我用 pudb 跟踪 Document.recompute() 时,我只看到它在执行 Facebinder.execute() 而不是 Icosahedron.execute()。它从 Document.recompute() 到 Facebinder.execute() 方法所采用的路径在 pudb 中是不可见的;它立即停止在 Facebinder.execute().
FREECADPATH = '/usr/local/lib' # path to your FreeCAD.so or FreeCAD.dll POLYHEDRONS_PATH = '/home/user/.FreeCAD/Mod/Pyramids-and-Polyhedrons'
import sys
sys.path.append(FREECADPATH)
sys.path.append(POLYHEDRONS_PATH)
import FreeCAD
filename = 'icosahedron.FCStd'
newRadius = 15
doc = FreeCAD.open(filename)
sheet = doc.Spreadsheet
sheet.set('radius', str(newRadius))
sheet.recompute()
print('radius = ' + str(sheet.get('radius')))
icosahedron = doc.getObjectsByLabel('Icosahedron')[0]
print('icosahedron.Radius = '+str(icosahedron.Radius))
icosahedron.touch()
doc.recompute()
print('icosahedron.Radius = '+str(icosahedron.Radius))
(vertices, faces) = icosahedron.Shape.tessellate(1)
z11 = vertices[11][2]
print('z11 = ' + str(z11))
FreeCAD.closeDocument(doc.Name)
我明白了。原因是 Pyramids-and-Polyhedrons
毕竟没有被导入。
第一个问题是 Pyramids-and-Polyhedrons
导入 FreeCADGui
(为了安装它的 workbench),这取决于需要在 [=35] 之前添加到 LD_LIBRARY_PATH
的某些原生库=]编写脚本:
export LD_LIBRARY_PATH=$(echo $(find /usr/local/lib/python3.7/site-packages -maxdepth 2 -mindepth 2 -type f -name *.so* | sed -r 's|/[^/]+$||' | sort -u) | sed -E 's/ /:/g')
现在可以导入 FreeCADGui
,但缺少 Pyramids-and-Polyhedrons
调用的必需 addCommand
方法。我发现 FreeCADGui
只有在 FreeCADGui.showMainWindow()
被调用后才会被完全初始化。但是,这需要显示,我想 运行 将脚本作为 Docker 容器中无头工具链的一部分。因此,我在图像中添加了 Xvfb
。我在 运行 更新脚本之前在后台启动它,DISPLAY
指向 Xvfb
:
FREECADPATH = '/usr/local/lib' # path to your FreeCAD.so or FreeCAD.dll file
POLYHEDRONS_PATH = '/home/user/.FreeCAD/Mod/Pyramids-and-Polyhedrons'
import sys
sys.path.append(FREECADPATH)
sys.path.append(POLYHEDRONS_PATH)
import FreeCAD
import FreeCADGui
FreeCADGui.showMainWindow()
import polyhedrons
filename = 'icosahedron.FCStd'
newRadius = 15
doc = FreeCAD.open(filename)
sheet = doc.Spreadsheet
sheet.set('radius', str(newRadius))
sheet.recompute()
print('radius = ' + str(sheet.get('radius')))
icosahedron = doc.getObjectsByLabel('Icosahedron')[0]
print('icosahedron.Radius = '+str(icosahedron.Radius))
breakpoint()
icosahedron.touch()
doc.recompute()
print('icosahedron.Radius = '+str(icosahedron.Radius))
(vertices, faces) = icosahedron.Shape.tessellate(1)
z11 = vertices[11][2]
print('z11 = ' + str(z11))
FreeCAD.closeDocument(doc.Name)
现在输出是
...
z11 = 15.0
符合预期。