Python
Un script de Python que usa la API con el paquete requests. Enumera las variables etiquetadas de una plantilla, mide el dibujo que genera con los valores dados y lo exporta como PDF.
Descárguelo: box.py.
# box.py: list a template's inputs, measure it and export it as a PDF with the PiQ SaaS API.
# Python 3.8 or later, with requests (pip install requests).
import os
import sys
import requests
key = os.environ.get("PIQ_API_KEY")
base = os.environ.get("PIQ_URL", "https://saas.parametriq.co.uk").rstrip("/")
storage = os.environ.get("PIQ_STORAGE") # optional: a registered storage's name
if not key:
sys.exit("Set PIQ_API_KEY to your API key.")
TEMPLATE = 'L=400,"Length"\nW=300,"Width"\nP1=[L,0]\nP2=[L,W]\nP3=[0,W]\nPOLYLINE @1,[P0,P1,P2,P3],TRUE,0'
# the template itself, or (optional) where it is kept in your storage
template = {"source": {"storage": storage, "key": "templates/box.piq"}} if storage else {"template": TEMPLATE}
values = {"L": 500, "W": 250}
session = requests.Session()
session.headers["X-API-KEY"] = key
def post(path, body):
response = session.post(base + path, json=body, timeout=60)
if not response.ok:
fail(response)
return response
def fail(response):
print(f"Error {response.status_code} {response.reason}", file=sys.stderr)
if response.content: # a 401 has no body
try:
problem = response.json()
except ValueError:
problem = {"detail": response.text}
for part in ("title", "detail"):
if problem.get(part):
print(problem[part], file=sys.stderr)
for field, messages in (problem.get("errors") or {}).items():
print(f" {field}: {' '.join(messages)}", file=sys.stderr)
sys.exit(1)
# 1. The template's labelled variables
for i in post("/inputs", template).json()["inputs"]:
print(f"{i['name']}: {i['label']} ({i['kind']}, {i['value']})")
# 2. The drawing measured, with the values given
m = post("/measure", {**template, "values": values}).json()
cut = next((layer["length"] for layer in m["layers"] if layer["layer"] == "Cut"), 0)
print(f"Size: {m['width']} x {m['height']}, cut length: {cut}")
# 3. The drawing as a PDF
pdf = post("/export/pdf", {**template, "values": values})
with open("box.pdf", "wb") as file:
file.write(pdf.content)
print(f"Saved box.pdf ({pdf.headers.get('X-PiQ-Warnings')} warnings)")
# 4. Optional: the PDF saved to your storage instead of downloaded
if storage:
destination = {"storage": storage, "key": "drawings/box.pdf"}
body = {**template, "values": values, "destination": destination, "overwrite": True}
saved = post("/save/pdf", body).json()
print(f"Saved {saved['key']} to {saved['storage']} ({saved['size']} bytes)")
Cómo funciona
- Configuración. La clave se toma de
PIQ_API_KEY, la dirección dePIQ_URL(el propio servicio si no está definida) y, opcionalmente, el nombre de un almacenamiento dePIQ_STORAGE. Sin clave, el script se detiene de inmediato. - La plantilla.
templatees el cuerpo del que parte cada solicitud: el texto de la plantilla comotemplateo, cuandoPIQ_STORAGEestá definida, dónde está guardada en su almacenamiento comosource.valuesdaLyWpor nombre. - La sesión lleva la clave en el encabezado
X-API-KEYde cada solicitud y reutiliza la conexión entre ellas. postenvía un cuerpo a una operación como JSON (json=establece también elContent-Type). Una respuesta que no es correcta pasa afail; cualquier otra se devuelve para leerla.failimprime el estado y después la descripción del problema: sutitle, sudetaily cada entrada deerrors, el campo y qué está mal en él. Un401no tiene cuerpo, así que el cuerpo solo se analiza cuando lo hay; un cuerpo que no es JSON se imprime tal cual. Después, el script termina con1.- Inputs.
POST /inputssolo necesita la plantilla. Cada uno de susinputstiene unname,label,kindyvalue. - Measure.
POST /measurecon los valores da elwidthy elheightdel dibujo, y las longitudes de sus líneas por capa enlayers; la longitud de corte es la longitud en la capaCut. - Export.
POST /export/pdfresponde con el propio PDF, no con JSON:response.contentson sus bytes, que se escriben enbox.pdf. El encabezadoX-PiQ-Warningsindica cuántas cosas no pudieron exportarse tal cual. - Save (opcional). Con un almacenamiento,
POST /save/pdfexporta el mismo dibujo y lo guarda en su almacenamiento endestination;"overwrite": Truereemplaza un archivo que ya exista. Responde con dónde lo ha guardado y su tamaño.
Cómo ejecutarlo
Guarde el script como box.py y, a continuación:
pip install requests
export PIQ_API_KEY=XXXX-XXXX-XXXX-XXXXX
python box.py
Imprime las variables etiquetadas de la plantilla, el tamaño del dibujo y su longitud de corte, y guarda box.pdf:
L: Length (Number, 400)
W: Width (Number, 300)
D: Depth (Number, 300)
Size: 500 x 250, cut length: 1500
Saved box.pdf (0 warnings)
Con un valor que la plantilla no puede usar (por ejemplo, "L": "long"), imprime el problema y se detiene:
Error 400 Bad Request
One or more validation errors occurred.
Some of the values given can't be used.
L: L is a number.
Con una clave incorrecta, solo imprime Error 401 Unauthorized: un 401 no tiene
descripción del problema.
Para probar la parte del almacenamiento, registre un almacenamiento (consulte
Registrar un almacenamiento), coloque en él una plantilla como templates/box.piq y
establezca PIQ_STORAGE con el nombre del almacenamiento. La plantilla se lee entonces desde su almacenamiento, y el
PDF también se guarda en él como drawings/box.pdf, reemplazando cualquier archivo que ya exista.
Consulte también: API, Inputs, Measure, Exportar un dibujo, Guardar en su almacenamiento, Registrar un almacenamiento, Clientes.