mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-25 17:57:02 +00:00
Schedule cells limit without print range to prevent system freeze
What I've found that sometimes you might get into situation (especially if .ods was created / processed in Excel) you might get a lot unnecessary columns and rows (in fact excel always seems to save 1048576x16384 table) and trying to print this kind of table results in investing a lot of RAM into it and possible system freeze.
Now there is a check if table has more than 10000 cells (number is completely made up 😁) then it would require user to define print range in the table to prevent the issue.
This commit is contained in:
@@ -154,7 +154,20 @@ class Scheduler:
|
|||||||
min_rc, max_rc = [a1_to_rc(cell.rsplit(".", 1)[1]) for cell in print_range.split(":")]
|
min_rc, max_rc = [a1_to_rc(cell.rsplit(".", 1)[1]) for cell in print_range.split(":")]
|
||||||
else:
|
else:
|
||||||
# fallback if print range is not defined
|
# fallback if print range is not defined
|
||||||
min_rc, max_rc = (0,0), (1048576, 16384)
|
n_rows = len(row_heights)
|
||||||
|
n_cols = len(column_widths)
|
||||||
|
n_cells = len(row_heights) * len(column_widths)
|
||||||
|
cells_limit = 10000
|
||||||
|
if n_cells >= cells_limit:
|
||||||
|
raise Exception(
|
||||||
|
f"You were about to build a very big table with number of cells more than {cells_limit}.\n"
|
||||||
|
f"In fact it is {n_rows} rows x {n_cols} cols = {n_cells} cells \n"
|
||||||
|
"and the operation was stopped to prevent system freeze.\n"
|
||||||
|
"Please define print range in .ods file to proceede\n"
|
||||||
|
"(needed to make sure printed table will have reasonable size)."
|
||||||
|
)
|
||||||
|
|
||||||
|
min_rc, max_rc = (0, 0), (1048576, 16384)
|
||||||
min_row, min_col = min_rc
|
min_row, min_col = min_rc
|
||||||
max_row, max_col = max_rc
|
max_row, max_col = max_rc
|
||||||
|
|
||||||
@@ -263,10 +276,11 @@ class Scheduler:
|
|||||||
tri += 1
|
tri += 1
|
||||||
y += height
|
y += height
|
||||||
|
|
||||||
total_width = sum(column_widths) + (self.margin * 2)
|
total_width = x + self.margin
|
||||||
|
total_height = y + self.margin
|
||||||
self.svg["width"] = "{}mm".format(total_width)
|
self.svg["width"] = "{}mm".format(total_width)
|
||||||
self.svg["height"] = "{}mm".format(y)
|
self.svg["height"] = "{}mm".format(total_height)
|
||||||
self.svg["viewBox"] = "0 0 {} {}".format(total_width, y)
|
self.svg["viewBox"] = "0 0 {} {}".format(total_width, total_height)
|
||||||
self.svg.save(pretty=True)
|
self.svg.save(pretty=True)
|
||||||
|
|
||||||
def get_style(self, style_name, styles):
|
def get_style(self, style_name, styles):
|
||||||
|
|||||||
Reference in New Issue
Block a user