| |
|
|
| |
|
|
| """ |
| The module can be used from another module with: |
| |
| from make_snapshot import make_snapshot |
| make_snapshot("file.stl", "image.png") |
| |
| This other module then can be used with: |
| |
| FreeCAD -c make_snapshot_from_file.py |
| |
| or |
| |
| FreeCADCmd make_snapshot_from_file.py |
| """ |
|
|
| import FreeCAD |
| import FreeCADGui |
| import os |
| import importlib |
| import sys |
| from PySide2 import QtGui |
|
|
|
|
| def init_gui(): |
| try: |
| FreeCADGui.setupWithoutGUI() |
| except Exception as e: |
| pass |
|
|
|
|
| def make_snapshot(input_file, output_file, size=48): |
| from pivy import coin |
|
|
| ext = os.path.splitext(input_file)[1][1:] |
| mod = FreeCAD.getImportType(ext) |
| if len(mod) == 0: |
| print("Cannot load file {}".format(input_file)) |
| return |
|
|
| |
| module = importlib.import_module(mod[0]) |
| module.open(input_file) |
|
|
| doc = FreeCAD.ActiveDocument |
| if doc is None: |
| print("No active document") |
| return |
|
|
| init_gui() |
| nodes = [FreeCADGui.subgraphFromObject(obj) for obj in doc.Objects] |
|
|
| |
| root = coin.SoSeparator() |
| light = coin.SoDirectionalLight() |
| cam = coin.SoOrthographicCamera() |
| root.addChild(cam) |
| root.addChild(light) |
| for node in nodes: |
| root.addChild(node) |
|
|
| |
| axo = coin.SbRotation(-0.353553, -0.146447, -0.353553, -0.853553) |
| width = size |
| height = size |
| viewport = coin.SbViewportRegion(width, height) |
| cam.orientation.setValue(axo) |
| cam.viewAll(root, viewport) |
| off = FreeCADGui.SoQtOffscreenRenderer(width, height) |
| off.setBackgroundColor(1, 1, 1) |
| root.ref() |
|
|
| |
| if QtGui.QGuiApplication.instance() is None: |
| app = QtGui.QGuiApplication(sys.argv) |
|
|
| off.render(root) |
| off.writeToImage(output_file) |
| root.unref() |
|
|