fcwv-flask/app.py
Morgan 'ARR\!' Allen 0dbe610d68 its a start
2023-03-21 16:42:22 -07:00

90 lines
2.2 KiB
Python

import sys
sys.path.append('/home/morgan/devel/FreeCAD-build/lib')
from flask import Flask, render_template, request, send_file
from hashlib import blake2b
import FreeCAD
import Part
import Import
import json
import time
from FreeCAD import Mesh
print(FreeCAD, Import, Part)
app = Flask(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = True
@app.route('/gltf/<name>.gltf')
def gen_gltf(name):
file = './models/{}.FCStd'.format(name)
doc = FreeCAD.openDocument(file)
body = doc.getObject('Body')
sheet = doc.getObject('Spreadsheet')
sheet.set('chole', request.args['count'])
doc.recompute()
out_file = u'static/{}x{}.gltf'.format(name, request.args['count'])
print('writing to {}'.format(out_file))
Import.export([ body ], out_file)
return send_file(out_file)
@app.route('/stl/<name>.stl')
def gen_stl(name):
file = './models/{}.FCStd'.format(name)
print('loading ', file)
doc = FreeCAD.openDocument(file)
print(doc)
#body = doc.getObject('Body')
# TODO support more types
bodies = [body for body in doc.findObjects('PartDesign::Body') if body.Visibility]
sheet = doc.getObject('Spreadsheet')
for k in request.args:
v = request.args[k]
print(k, v)
try:
sheet.set(k, v)
except Exception as e:
print(e)
doc.recompute()
arg_hash = blake2b(bytes(json.dumps(request.args), 'utf-8'), digest_size=10).hexdigest()
out_file = './stls/{}_{}.stl'.format(name, arg_hash)
Mesh.export(bodies, out_file)
return send_file(out_file)
@app.route('/upload', methods=['POST'])
def upload():
f = request.files['upload']
out_file = 'models/{}'.format(f.filename)
f.save(out_file)
doc = FreeCAD.openDocument(out_file)
sheet = doc.getObject('Spreadsheet')
cells = []
for cell in [cell for cell in sheet.getUsedCells() if sheet.getAlias(cell)]:
value = sheet.get(cell)
if hasattr(value, 'Value'): value = value.Value
cells.append({
'cell': cell,
'alias': sheet.getAlias(cell),
'value': value
})
return json.dumps(cells)
@app.route("/")
def hello_world():
return render_template('index.html')