#2685 Recompile rule

This commit is contained in:
Thomas Krijnen
2023-03-11 20:44:11 +01:00
parent c71a5a4d65
commit 42d7c7d32c
11 changed files with 339 additions and 97 deletions
@@ -11,9 +11,29 @@ def exists(v):
def nvl(v, default):
return v if v is not None else default
sizeof = len
hiindex = len
blength = len
def is_entity(inst):
if isinstance(inst, ifcopenshell.entity_instance):
schema_name = inst.is_a(True).split('.')[0].lower()
decl = ifcopenshell.ifcopenshell_wrapper.schema_by_name(schema_name).declaration_by_name(inst.is_a())
return isinstance(decl, ifcopenshell.ifcopenshell_wrapper.entity)
return False
def express_len(v):
if isinstance(v, ifcopenshell.entity_instance) and (not is_entity(v)):
v = v[0]
elif v is None or v is INDETERMINATE:
return INDETERMINATE
return len(v)
old_range = range
def range(*args):
if INDETERMINATE in args:
return
yield from old_range(*args)
sizeof = express_len
hiindex = express_len
blength = express_len
loindex = lambda x: 1
from math import *
unknown = 'UNKNOWN'
@@ -54,6 +74,8 @@ class express_set(set):
def express_getitem(aggr, idx, default):
if aggr is None:
return default
if isinstance(aggr, ifcopenshell.entity_instance) and (not is_entity(aggr)):
aggr = aggr[0]
try:
return aggr[idx]
except IndexError as e:
@@ -13110,7 +13132,7 @@ def IfcBuildAxes(axis, refdirection):
def IfcConsecutiveSegments(segments):
result = True
for i in range(1, hiindex(segments) - 1 + 1):
if express_getitem(express_getitem(segments, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), hiindex(segments[i - EXPRESS_ONE_BASED_INDEXING]) - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE) != express_getitem(express_getitem(segments, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 1 - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE):
if express_getitem(express_getitem(segments, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), hiindex(segments[i - EXPRESS_ONE_BASED_INDEXING]) - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE) != express_getitem(express_getitem(segments, i + 1 - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 1 - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE):
result = False
break
return result
@@ -13128,7 +13150,7 @@ def IfcConstraintsParamBSpline(degree, upknots, upcp, knotmult, knots):
result = False
return result
for i in range(2, upknots + 1):
if express_getitem(knotmult, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE) < 1 or express_getitem(knots, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE) <= express_getitem(knots, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE):
if express_getitem(knotmult, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE) < 1 or express_getitem(knots, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE) <= express_getitem(knots, i - 1 - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE):
result = False
return result
k = express_getitem(knotmult, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE)
@@ -13577,7 +13599,7 @@ def IfcListToArray(lis, low, u):
res = [express_getitem(lis, 1 - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE)] * n
for i in range(2, n + 1):
temp = list(res)
temp[low - EXPRESS_ONE_BASED_INDEXING] = express_getitem(lis, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE)
temp[low + i - 1 - EXPRESS_ONE_BASED_INDEXING] = express_getitem(lis, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE)
res = temp
return res
@@ -13585,7 +13607,7 @@ def IfcLoopHeadToTail(aloop):
p = True
n = sizeof(getattr(aloop, 'EdgeList', INDETERMINATE))
for i in range(2, n + 1):
p = p and getattr(express_getitem(getattr(aloop, 'EdgeList', INDETERMINATE), i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 'EdgeEnd', INDETERMINATE) == getattr(express_getitem(getattr(aloop, 'EdgeList', INDETERMINATE), i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 'EdgeStart', INDETERMINATE)
p = p and getattr(express_getitem(getattr(aloop, 'EdgeList', INDETERMINATE), i - 1 - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 'EdgeEnd', INDETERMINATE) == getattr(express_getitem(getattr(aloop, 'EdgeList', INDETERMINATE), i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 'EdgeStart', INDETERMINATE)
return p
def IfcMakeArrayOfArray(lis, low1, u1, low2, u2):
@@ -13598,7 +13620,7 @@ def IfcMakeArrayOfArray(lis, low1, u1, low2, u2):
if u2 - low2 + 1 != sizeof(express_getitem(lis, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE)):
return None
temp = list(res)
temp[low1 - EXPRESS_ONE_BASED_INDEXING] = IfcListToArray(express_getitem(lis, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), low2, u2)
temp[low1 + i - 1 - EXPRESS_ONE_BASED_INDEXING] = IfcListToArray(express_getitem(lis, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), low2, u2)
res = temp
return res
@@ -13658,7 +13680,7 @@ def IfcPathHeadToTail(apath):
p = unknown
n = sizeof(getattr(apath, 'EdgeList', INDETERMINATE))
for i in range(2, n + 1):
p = p and getattr(express_getitem(getattr(apath, 'EdgeList', INDETERMINATE), i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 'EdgeEnd', INDETERMINATE) == getattr(express_getitem(getattr(apath, 'EdgeList', INDETERMINATE), i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 'EdgeStart', INDETERMINATE)
p = p and getattr(express_getitem(getattr(apath, 'EdgeList', INDETERMINATE), i - 1 - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 'EdgeEnd', INDETERMINATE) == getattr(express_getitem(getattr(apath, 'EdgeList', INDETERMINATE), i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE), 'EdgeStart', INDETERMINATE)
return p
def IfcPointListDim(pointlist):