3
3
4
4
"""Run script to convert an HBJSON file over to WUFI XML format."""
5
5
6
- from os import mkdir
7
- from typing import Tuple , List
8
- import sys
6
+ from datetime import datetime
7
+ import logging
8
+ import os
9
9
import pathlib
10
+ import sys
11
+ from typing import Tuple , List , Union
10
12
11
13
from PHX .from_HBJSON import read_HBJSON_file , create_project
12
14
from PHX .to_WUFI_XML import xml_builder , xml_txt_to_file
@@ -64,38 +66,129 @@ def group_components(_args: List[str]) -> bool:
64
66
return _args [4 ].lower () == "true"
65
67
66
68
67
- def merge_faces (_args : List [str ]) -> bool :
68
- """Return the merge_faces boolean from the sys.args Tuple.
69
+ def merge_faces (_args : List [str ]) -> Union [bool , float ]:
70
+ """Return the merge_faces as bool | float from the sys.args Tuple.
71
+
72
+ Arguments:
73
+ ----------
74
+ * _args (Tuple): sys.args Tuple of inputs.
75
+ - [5] (str): "True", "False", or float value as a string.
76
+
77
+ Returns:
78
+ --------
79
+ * bool | float: True, False, or a float value for the tolerance.
80
+ """
81
+ if _args [5 ].lower () == "true" :
82
+ return True
83
+ elif _args [5 ].lower () == "false" :
84
+ return False
85
+ else :
86
+ return float (_args [5 ])
87
+
88
+
89
+ def log_level (_args : List [str ]) -> int :
90
+ """Return the log_level from the sys.args Tuple.
69
91
70
92
Arguments:
71
93
----------
72
94
* _args (Tuple): sys.args Tuple of inputs.
73
- - [5 ] (str): "True" or "False" string .
95
+ - [6 ] (str): "0", "10", "22", "30" .... .
74
96
75
97
Returns:
76
98
--------
77
- * bool: True if the user wants to merge faces .
99
+ * int: The logging level .
78
100
"""
79
- return _args [5 ].lower () == "true"
101
+ try :
102
+ return int (_args [6 ])
103
+ except Exception :
104
+ return 0
80
105
81
106
107
+ def setup_logging_dir (_source_file_path : pathlib .Path ) -> pathlib .Path :
108
+ """Return logging directory. Create it if needed.
109
+
110
+ Arguments:
111
+ ----------
112
+ * _source_file_path (pathlib.Path): The base directory to create the logging directory in.
113
+
114
+ Returns:
115
+ --------
116
+ * pathlib.Path: The logging directory.
117
+ """
118
+ log_dir = _source_file_path .parent / "PHX_Logs"
119
+
120
+ if not log_dir .exists ():
121
+ os .mkdir (log_dir )
122
+
123
+ return log_dir
124
+
125
+
126
+ def startup_logging (_log_level : int ) -> logging .Logger :
127
+ """Setup the logging. Create a new dir if needed..
128
+
129
+ Arguments:
130
+ ----------
131
+ * _log_level (int): The logging level.
132
+
133
+ Returns:
134
+ --------
135
+ * logging.Logger: The root logger.
136
+ """
137
+
138
+ logger = logging .getLogger () # Root Logger
139
+ logger .setLevel (_log_level )
140
+
141
+ # -- Set Format
142
+ current_time = datetime .now ().strftime ("%Y-%m-%d_%H-%M-%S" )
143
+ formatter = logging .Formatter ('%(asctime)s - %(levelname)s - %(funcName)s - %(message)s' )
144
+
145
+ # -- Setup the STDERR log stream-handler for any WARNING and above
146
+ stream_handler = logging .StreamHandler (stream = sys .stderr )
147
+ stream_handler .setLevel (logging .WARNING )
148
+ stream_handler .setFormatter (formatter )
149
+ logger .addHandler (stream_handler )
150
+
151
+ # -- Setup the STDOUT log stream-handler for any INFO and above
152
+ stream_handler = logging .StreamHandler (stream = sys .stdout )
153
+ stream_handler .setLevel (logging .INFO )
154
+ stream_handler .setFormatter (formatter )
155
+ logger .addHandler (stream_handler )
156
+
157
+ if _log_level > 0 :
158
+ # -- Find the right path, create if needed
159
+ log_path = setup_logging_dir (SOURCE_FILE )
160
+
161
+ # -- Setup the log file-handler for DEBUG and above
162
+ file_handler = logging .FileHandler (log_path / f'PHX_{ current_time } .log' )
163
+ file_handler .setLevel (logging .DEBUG )
164
+ file_handler .setFormatter (formatter )
165
+ logger .addHandler (file_handler )
166
+
167
+ logger .info (f"> LOGGING TO: { log_path / 'PHX.log' } " )
168
+
169
+ return logger
170
+
82
171
if __name__ == "__main__" :
83
172
print ("- " * 50 )
84
173
85
174
# --- Input / Output file Path
86
- # -----------------------------------------------------------------------------
175
+ # -------------------------------------------------------------------------
87
176
SOURCE_FILE , TARGET_FILE_XML = resolve_paths (sys .argv )
88
177
GROUP_COMPONENTS = group_components (sys .argv )
89
178
MERGE_FACES = merge_faces (sys .argv )
179
+ LOG_LEVEL = log_level (sys .argv )
180
+
181
+ ## -- Setup the logging
182
+ logger = startup_logging (LOG_LEVEL )
90
183
91
184
# --- Read in the existing HB_JSON and re-build the HB Objects
92
- # -----------------------------------------------------------------------------
93
- print (f"> Reading in the HBJSON file: ./{ SOURCE_FILE } " )
185
+ # -------------------------------------------------------------------------
186
+ logger . info (f"> Reading in the HBJSON file: ./{ SOURCE_FILE } " )
94
187
hb_json_dict = read_HBJSON_file .read_hb_json_from_file (SOURCE_FILE )
95
188
hb_model = read_HBJSON_file .convert_hbjson_dict_to_hb_model (hb_json_dict )
96
189
97
190
# --- Generate the WUFI Project file.
98
- print (f'> Generating the PHX-Project from the Honeybee-Model: "{ hb_model } "' )
191
+ logger . info (f'> Generating the PHX-Project from the Honeybee-Model: "{ hb_model } "' )
99
192
phx_Project = create_project .convert_hb_model_to_PhxProject (
100
193
hb_model ,
101
194
_group_components = GROUP_COMPONENTS ,
@@ -104,8 +197,8 @@ def merge_faces(_args: List[str]) -> bool:
104
197
105
198
# --- Output the WUFI Project as an XML Text File
106
199
# ---------------------------------------------------------------------------
107
- print (f'> Generating XML Text for the PHX-Project: "{ phx_Project } "' )
200
+ logger . info (f'> Generating XML Text for the PHX-Project: "{ phx_Project } "' )
108
201
xml_txt = xml_builder .generate_WUFI_XML_from_object (phx_Project )
109
202
110
- print (f"> Saving the XML file to: ./{ TARGET_FILE_XML } " )
203
+ logger . info (f"> Saving the XML file to: ./{ TARGET_FILE_XML } " )
111
204
xml_txt_to_file .write_XML_text_file (TARGET_FILE_XML , xml_txt )
0 commit comments