-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexport_data_script.py
More file actions
67 lines (52 loc) · 1.83 KB
/
Copy pathexport_data_script.py
File metadata and controls
67 lines (52 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# /// script
# dependencies = [
# "polars",
# "openpyxl",
# ]
# ///
from typing import Any
import polars as pl
from RevitDevTool.Core import RevitContext
from System.Windows.Forms import SaveFileDialog, DialogResult
from Autodesk.Revit import DB
def collect_elements(doc: DB.Document) -> list[DB.Element]:
return list(DB.FilteredElementCollector(doc, doc.ActiveView.Id).ToElements())
def get_element_data(element: DB.Element) -> dict[str, Any]:
data: dict[str, Any] = {
"id": element.Id.Value,
"typeId": element.GetTypeId().Value,
"category": element.Category.Name if element.Category else "Unknown",
}
params_map = element.ParametersMap
it = params_map.ForwardIterator()
while it.MoveNext():
param : DB.Parameter = it.Current
data[param.Definition.Name] = param.AsValueString()
it.MoveNext()
it.Dispose()
return data
def export_data(data: list[dict[str, Any]], output_path: str) -> None:
df = pl.DataFrame(data)
df.write_excel(output_path)
def _ask_save_path(default_name: str) -> str | None:
"""Open a Windows Save File dialog and return the chosen path, or None if cancelled."""
dialog = SaveFileDialog()
dialog.Title = "Export Dashboard Data"
dialog.Filter = "Excel Files (*.xlsx)|*.xlsx|All Files (*.*)|*.*"
dialog.FileName = default_name
dialog.DefaultExt = ".xlsx"
dialog.AddExtension = True
if dialog.ShowDialog() == DialogResult.OK:
return dialog.FileName
return None
def main():
doc = RevitContext.ActiveDocument
elements = collect_elements(doc)
data = [get_element_data(element) for element in elements]
save_path = _ask_save_path("export.xlsx")
if save_path:
export_data(data, save_path)
else:
print("No save path selected")
if __name__ == "__main__":
main()