ifctrano 0.9.0__tar.gz → 0.11.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ifctrano-0.9.0 → ifctrano-0.11.0}/PKG-INFO +17 -3
- {ifctrano-0.9.0 → ifctrano-0.11.0}/README.md +14 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/main.py +84 -36
- {ifctrano-0.9.0 → ifctrano-0.11.0}/pyproject.toml +3 -3
- {ifctrano-0.9.0 → ifctrano-0.11.0}/LICENSE +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/__init__.py +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/base.py +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/bounding_box.py +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/building.py +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/construction.py +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/example/verification.ifc +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/exceptions.py +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/space_boundary.py +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/types.py +0 -0
- {ifctrano-0.9.0 → ifctrano-0.11.0}/ifctrano/utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ifctrano
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.11.0
|
4
4
|
Summary: Package for generating building energy simulation model from IFC
|
5
5
|
License: GPL V3
|
6
6
|
License-File: LICENSE
|
@@ -16,8 +16,8 @@ Classifier: Programming Language :: Python :: 3.12
|
|
16
16
|
Requires-Dist: ifcopenshell (>=0.8.1.post1,<0.9.0)
|
17
17
|
Requires-Dist: open3d (>=0.19.0,<0.20.0)
|
18
18
|
Requires-Dist: shapely (>=2.0.7,<3.0.0)
|
19
|
-
Requires-Dist: trano (>=0.
|
20
|
-
Requires-Dist: typer (>=0.
|
19
|
+
Requires-Dist: trano (>=0.13.0,<0.14.0)
|
20
|
+
Requires-Dist: typer (>=0.19.2,<0.20.0)
|
21
21
|
Requires-Dist: vedo (>=2025.5.3,<2026.0.0)
|
22
22
|
Project-URL: Repository, https://github.com/andoludo/ifctrano
|
23
23
|
Description-Content-Type: text/markdown
|
@@ -134,7 +134,21 @@ ifctrano create /path/to/your.ifc IDEAS
|
|
134
134
|
```bash
|
135
135
|
ifctrano create /path/to/your.ifc reduced_order
|
136
136
|
```
|
137
|
+
---
|
138
|
+
|
139
|
+
### 📁 Generate yaml configuration from IFC
|
140
|
+
|
141
|
+
Instead of directly generating a Modelica model from an IFC file, this command creates a configuration .yaml file compatible with the Trano
|
142
|
+
Python package (https://github.com/andoludo/trano). This configuration file can be reviewed, adapted, and enriched before generating the final Modelica model, allowing for verification and customization of the translation process.
|
143
|
+
```bash
|
144
|
+
ifctrano config /path/to/your.ifc
|
145
|
+
```
|
146
|
+
|
147
|
+
Once the YAML configuration file has been generated and adapted, the following command can be used to generate and/or simulate the model.
|
137
148
|
|
149
|
+
```bash
|
150
|
+
ifctrano from-config /path/to/your.yaml
|
151
|
+
```
|
138
152
|
---
|
139
153
|
|
140
154
|
### 🧱 Show Space Boundaries
|
@@ -110,7 +110,21 @@ ifctrano create /path/to/your.ifc IDEAS
|
|
110
110
|
```bash
|
111
111
|
ifctrano create /path/to/your.ifc reduced_order
|
112
112
|
```
|
113
|
+
---
|
114
|
+
|
115
|
+
### 📁 Generate yaml configuration from IFC
|
116
|
+
|
117
|
+
Instead of directly generating a Modelica model from an IFC file, this command creates a configuration .yaml file compatible with the Trano
|
118
|
+
Python package (https://github.com/andoludo/trano). This configuration file can be reviewed, adapted, and enriched before generating the final Modelica model, allowing for verification and customization of the translation process.
|
119
|
+
```bash
|
120
|
+
ifctrano config /path/to/your.ifc
|
121
|
+
```
|
122
|
+
|
123
|
+
Once the YAML configuration file has been generated and adapted, the following command can be used to generate and/or simulate the model.
|
113
124
|
|
125
|
+
```bash
|
126
|
+
ifctrano from-config /path/to/your.yaml
|
127
|
+
```
|
114
128
|
---
|
115
129
|
|
116
130
|
### 🧱 Show Space Boundaries
|
@@ -2,14 +2,17 @@ import shutil
|
|
2
2
|
import webbrowser
|
3
3
|
from pathlib import Path
|
4
4
|
from tempfile import TemporaryDirectory
|
5
|
-
from typing import Annotated, get_args
|
5
|
+
from typing import Annotated, get_args, Callable
|
6
6
|
|
7
7
|
import typer
|
8
8
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
9
|
+
from trano.data_models.conversion import convert_network # type: ignore
|
10
|
+
from trano.elements.library.library import Library # type: ignore
|
9
11
|
from trano.reporting.html import to_html_reporting # type: ignore
|
10
12
|
from trano.reporting.reporting import ModelDocumentation # type: ignore
|
11
13
|
from trano.reporting.types import ResultFile # type: ignore
|
12
14
|
from trano.simulate.simulate import simulate # type: ignore
|
15
|
+
from trano.topology import Network # type: ignore
|
13
16
|
from trano.utils.utils import is_success # type: ignore
|
14
17
|
|
15
18
|
from ifctrano.base import Libraries
|
@@ -22,6 +25,45 @@ CHECKMARK = "[green]✔[/green]"
|
|
22
25
|
CROSS_MARK = "[red]✘[/red]"
|
23
26
|
|
24
27
|
|
28
|
+
def _create_network(model: str, library: str) -> Network:
|
29
|
+
library_ = Library.from_configuration(library)
|
30
|
+
model_ = Path(model).resolve()
|
31
|
+
return convert_network(str(model_.stem), model_, library=library_)
|
32
|
+
|
33
|
+
|
34
|
+
def _simulate(
|
35
|
+
modelica_model_path: Path, create_network_callable: Callable[[], Network]
|
36
|
+
) -> None:
|
37
|
+
print("Simulating...")
|
38
|
+
try:
|
39
|
+
results = simulate(modelica_model_path.parent, create_network_callable())
|
40
|
+
except Exception as e:
|
41
|
+
print(f"{CROSS_MARK} Simulation failed: {e}")
|
42
|
+
return
|
43
|
+
if not is_success(results):
|
44
|
+
print(f"{CROSS_MARK} Simulation failed. See logs for more information.")
|
45
|
+
return
|
46
|
+
|
47
|
+
result_path = (
|
48
|
+
Path(modelica_model_path.parent)
|
49
|
+
/ "results"
|
50
|
+
/ f"{modelica_model_path.stem.lower()}.building_res.mat"
|
51
|
+
)
|
52
|
+
if not result_path.exists():
|
53
|
+
print(
|
54
|
+
f"{CROSS_MARK} Simulation failed. Result file not found in {result_path}."
|
55
|
+
)
|
56
|
+
return
|
57
|
+
reporting = ModelDocumentation.from_network(
|
58
|
+
create_network_callable(),
|
59
|
+
result=ResultFile(path=result_path),
|
60
|
+
)
|
61
|
+
html = to_html_reporting(reporting)
|
62
|
+
report_path = Path(modelica_model_path.parent / f"{modelica_model_path.stem}.html")
|
63
|
+
report_path.write_text(html)
|
64
|
+
webbrowser.open(f"file://{report_path}")
|
65
|
+
|
66
|
+
|
25
67
|
@app.command()
|
26
68
|
def config(
|
27
69
|
model: Annotated[
|
@@ -54,6 +96,43 @@ def config(
|
|
54
96
|
print(f"{CHECKMARK} configuration file generated: {config_path}.")
|
55
97
|
|
56
98
|
|
99
|
+
@app.command()
|
100
|
+
def from_config(
|
101
|
+
model: Annotated[
|
102
|
+
str,
|
103
|
+
typer.Argument(help="Path to the configuration yaml file."),
|
104
|
+
],
|
105
|
+
library: Annotated[
|
106
|
+
str,
|
107
|
+
typer.Argument(help="Modelica library to be used for simulation."),
|
108
|
+
] = "Buildings",
|
109
|
+
simulate_model: Annotated[
|
110
|
+
bool,
|
111
|
+
typer.Option(help="Simulate the generated model."),
|
112
|
+
] = False,
|
113
|
+
) -> None:
|
114
|
+
with Progress(
|
115
|
+
SpinnerColumn(),
|
116
|
+
TextColumn("[progress.description]{task.description}"),
|
117
|
+
transient=True,
|
118
|
+
) as progress:
|
119
|
+
modelica_model_path = Path(model).resolve().with_suffix(".mo")
|
120
|
+
task = progress.add_task(
|
121
|
+
description=f"Generating model {modelica_model_path.name} with library {library}",
|
122
|
+
total=None,
|
123
|
+
)
|
124
|
+
network = _create_network(model, library)
|
125
|
+
modelica_model = network.model()
|
126
|
+
progress.update(task, completed=True)
|
127
|
+
task = progress.add_task(description="Writing model to file...", total=None)
|
128
|
+
modelica_model_path.write_text(modelica_model)
|
129
|
+
progress.remove_task(task)
|
130
|
+
print(f"{CHECKMARK} Model generated at {modelica_model_path}")
|
131
|
+
create_network_callable = lambda: _create_network(model, library) # noqa: E731
|
132
|
+
if simulate_model:
|
133
|
+
_simulate(modelica_model_path, create_network_callable)
|
134
|
+
|
135
|
+
|
57
136
|
@app.command()
|
58
137
|
def create(
|
59
138
|
model: Annotated[
|
@@ -97,42 +176,11 @@ def create(
|
|
97
176
|
modelica_model_path.write_text(modelica_network.model())
|
98
177
|
progress.remove_task(task)
|
99
178
|
print(f"{CHECKMARK} Model generated at {modelica_model_path}")
|
179
|
+
create_network_callable = lambda: building.create_network( # noqa: E731
|
180
|
+
library=library # type: ignore
|
181
|
+
)
|
100
182
|
if simulate_model:
|
101
|
-
|
102
|
-
try:
|
103
|
-
results = simulate(
|
104
|
-
modelica_model_path.parent,
|
105
|
-
building.create_network(
|
106
|
-
library=library # type: ignore
|
107
|
-
), # TODO: cannot use the network after creating he model
|
108
|
-
)
|
109
|
-
except Exception as e:
|
110
|
-
print(f"{CROSS_MARK} Simulation failed: {e}")
|
111
|
-
return
|
112
|
-
if not is_success(results):
|
113
|
-
print(f"{CROSS_MARK} Simulation failed. See logs for more information.")
|
114
|
-
return
|
115
|
-
|
116
|
-
result_path = (
|
117
|
-
Path(modelica_model_path.parent)
|
118
|
-
/ "results"
|
119
|
-
/ f"{modelica_model_path.stem.lower()}.building_res.mat"
|
120
|
-
)
|
121
|
-
if not result_path.exists():
|
122
|
-
print(
|
123
|
-
f"{CROSS_MARK} Simulation failed. Result file not found in {result_path}."
|
124
|
-
)
|
125
|
-
return
|
126
|
-
reporting = ModelDocumentation.from_network(
|
127
|
-
building.create_network(library=library), # type: ignore
|
128
|
-
result=ResultFile(path=result_path),
|
129
|
-
)
|
130
|
-
html = to_html_reporting(reporting)
|
131
|
-
report_path = Path(
|
132
|
-
modelica_model_path.parent / f"{modelica_model_path.stem}.html"
|
133
|
-
)
|
134
|
-
report_path.write_text(html)
|
135
|
-
webbrowser.open(f"file://{report_path}")
|
183
|
+
_simulate(modelica_model_path, create_network_callable)
|
136
184
|
|
137
185
|
|
138
186
|
@app.command()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "ifctrano"
|
3
|
-
version = "0.
|
3
|
+
version = "0.11.0"
|
4
4
|
description = "Package for generating building energy simulation model from IFC"
|
5
5
|
authors = ["Ando Andriamamonjy <andoludovic.andriamamonjy@gmail.com>"]
|
6
6
|
license = "GPL V3"
|
@@ -11,9 +11,9 @@ keywords = ["BIM","IFC","energy simulation", "modelica", "building energy simula
|
|
11
11
|
[tool.poetry.dependencies]
|
12
12
|
python = ">=3.10,<3.13"
|
13
13
|
ifcopenshell = "^0.8.1.post1"
|
14
|
-
trano = "^0.
|
14
|
+
trano = "^0.13.0"
|
15
15
|
shapely = "^2.0.7"
|
16
|
-
typer = "^0.
|
16
|
+
typer = "^0.19.2"
|
17
17
|
vedo = "^2025.5.3"
|
18
18
|
open3d = "^0.19.0"
|
19
19
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|