FreeCAD / src /Tools /make_snapshot.py
AbdulElahGwaith's picture
Upload folder using huggingface_hub
985c397 verified
# SPDX-License-Identifier: LGPL-2.1-or-later
# (c) 2022 Werner Mayer LGPL
"""
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
# use the first listed module
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]
# add light and camera so that the rendered geometry is visible
root = coin.SoSeparator()
light = coin.SoDirectionalLight()
cam = coin.SoOrthographicCamera()
root.addChild(cam)
root.addChild(light)
for node in nodes:
root.addChild(node)
# do the rendering now
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()
# A QGuiApplication is needed to create an OpenGL context
if QtGui.QGuiApplication.instance() is None:
app = QtGui.QGuiApplication(sys.argv)
off.render(root)
off.writeToImage(output_file)
root.unref()