diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC2X3.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC2X3.py index d9a3ba817e..20d8d3cc8a 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC2X3.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC2X3.py @@ -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: @@ -7360,7 +7382,7 @@ def IfcAddToBeginOfList(ascalar, alist): if hiindex(alist) >= 1: for i in range(1, hiindex(alist) + 1): temp = list(result) - temp[i - EXPRESS_ONE_BASED_INDEXING] = express_getitem(alist, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE) + temp[i + 1 - EXPRESS_ONE_BASED_INDEXING] = express_getitem(alist, i - EXPRESS_ONE_BASED_INDEXING, INDETERMINATE) result = temp return result @@ -7799,7 +7821,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 @@ -7807,7 +7829,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 IfcMlsTotalThickness(layerset): @@ -7865,7 +7887,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 IfcSameAxis2Placement(ap1, ap2, epsilon): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4.py index 9057a4bddd..7a52a036d4 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4.py @@ -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: @@ -11361,7 +11383,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 @@ -11379,7 +11401,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) @@ -11813,7 +11835,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 @@ -11821,7 +11843,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): @@ -11834,7 +11856,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 @@ -11894,7 +11916,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): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X1.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X1.py index 2072169cb9..3f55d11b1a 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X1.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X1.py @@ -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: @@ -11512,7 +11534,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 @@ -11530,7 +11552,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) @@ -11970,7 +11992,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 @@ -11978,7 +12000,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): @@ -11991,7 +12013,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 @@ -12051,7 +12073,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): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X2.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X2.py index 5ed9c65e79..b676c21cfb 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X2.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X2.py @@ -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: @@ -11804,7 +11826,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 @@ -11822,7 +11844,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) @@ -12262,7 +12284,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 @@ -12270,7 +12292,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): @@ -12283,7 +12305,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 @@ -12343,7 +12365,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): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3.py index a73dc931c7..46af263cad 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3.py @@ -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: @@ -13228,7 +13250,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 @@ -13246,7 +13268,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) @@ -13695,7 +13717,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 @@ -13703,7 +13725,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): @@ -13716,7 +13738,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 @@ -13776,7 +13798,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): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD1.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD1.py index de318e4c40..6efc55b614 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD1.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_ADD1.py @@ -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: @@ -13158,7 +13180,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 @@ -13176,7 +13198,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) @@ -13598,7 +13620,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 @@ -13606,7 +13628,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): @@ -13619,7 +13641,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 @@ -13679,7 +13701,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 IfcPointDim(point): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC1.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC1.py index 0b66184f6a..ead551f82c 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC1.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC1.py @@ -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: @@ -12823,7 +12845,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 @@ -12841,7 +12863,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) @@ -13281,7 +13303,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 @@ -13289,7 +13311,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): @@ -13302,7 +13324,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 @@ -13362,7 +13384,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): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC2.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC2.py index 874aca09c4..7cb03faf7f 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC2.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC2.py @@ -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: @@ -12918,7 +12940,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 @@ -12936,7 +12958,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) @@ -13383,7 +13405,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 @@ -13391,7 +13413,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): @@ -13404,7 +13426,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 @@ -13464,7 +13486,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): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC3.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC3.py index b72836ecba..dbd6e0cf57 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC3.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC3.py @@ -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: @@ -13094,7 +13116,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 @@ -13112,7 +13134,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) @@ -13561,7 +13583,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 @@ -13569,7 +13591,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): @@ -13582,7 +13604,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 @@ -13642,7 +13664,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): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC4.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC4.py index 15d6ab1058..73a893e372 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC4.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_RC4.py @@ -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): diff --git a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_TC1.py b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_TC1.py index 23b40fc06f..01a6930dde 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_TC1.py +++ b/src/ifcopenshell-python/ifcopenshell/express/rules/IFC4X3_TC1.py @@ -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: @@ -13114,7 +13136,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 @@ -13132,7 +13154,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) @@ -13554,7 +13576,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 @@ -13562,7 +13584,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): @@ -13575,7 +13597,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 @@ -13635,7 +13657,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 IfcPointDim(point):