mirror of
https://github.com/brunopostle/ifcurl.git
synced 2026-07-12 02:08:13 +00:00
service.py: use ifcopenshell.file.from_string() instead of temp file
ifcopenshell can parse IFC bytes in-memory via from_string(); no need to write a temp file, read it back, and unlink it. Simpler and faster. Update README library example to match. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
19ce25fdc0
commit
02d93e68e1
2 changed files with 2 additions and 20 deletions
11
README.md
11
README.md
|
|
@ -88,7 +88,6 @@ ifcurl render "ifc://..." -o output.png
|
||||||
Use as a library:
|
Use as a library:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
import os, tempfile
|
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
from ifcurl import IfcUrl, fetch_ifc
|
from ifcurl import IfcUrl, fetch_ifc
|
||||||
from ifcurl.render import render
|
from ifcurl.render import render
|
||||||
|
|
@ -98,15 +97,7 @@ url = IfcUrl.parse(
|
||||||
"?path=models/building.ifc&selector=IfcWall&visibility=ghost"
|
"?path=models/building.ifc&selector=IfcWall&visibility=ghost"
|
||||||
)
|
)
|
||||||
hexsha, ifc_bytes = fetch_ifc(url) # hexsha is stable even for mutable refs
|
hexsha, ifc_bytes = fetch_ifc(url) # hexsha is stable even for mutable refs
|
||||||
|
model = ifcopenshell.file.from_string(ifc_bytes.decode())
|
||||||
# ifcopenshell.open() requires a file path, not bytes
|
|
||||||
tmp_fd, tmp_path = tempfile.mkstemp(suffix=".ifc")
|
|
||||||
try:
|
|
||||||
os.write(tmp_fd, ifc_bytes)
|
|
||||||
os.close(tmp_fd)
|
|
||||||
model = ifcopenshell.open(tmp_path)
|
|
||||||
finally:
|
|
||||||
os.unlink(tmp_path)
|
|
||||||
|
|
||||||
png = render(model, selector=url.selector, clips=url.clips or None,
|
png = render(model, selector=url.selector, clips=url.clips or None,
|
||||||
camera=url.camera, fov=url.fov, visibility=url.visibility)
|
camera=url.camera, fov=url.fov, visibility=url.visibility)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,6 @@ from __future__ import annotations
|
||||||
import hashlib
|
import hashlib
|
||||||
import ipaddress
|
import ipaddress
|
||||||
import os
|
import os
|
||||||
import tempfile
|
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
|
@ -225,18 +224,10 @@ def _t4m_put(url: str, png: bytes) -> None:
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
def _load_model(ifc_bytes: bytes) -> ifcopenshell.file:
|
def _load_model(ifc_bytes: bytes) -> ifcopenshell.file:
|
||||||
tmp_fd, tmp_path = tempfile.mkstemp(suffix=".ifc")
|
|
||||||
try:
|
try:
|
||||||
os.write(tmp_fd, ifc_bytes)
|
return ifcopenshell.file.from_string(ifc_bytes.decode())
|
||||||
os.close(tmp_fd)
|
|
||||||
return ifcopenshell.open(tmp_path)
|
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise HTTPException(status_code=422, detail=f"Could not parse IFC file: {exc}") from exc
|
raise HTTPException(status_code=422, detail=f"Could not parse IFC file: {exc}") from exc
|
||||||
finally:
|
|
||||||
try:
|
|
||||||
os.unlink(tmp_path)
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue