|
| 1 | +import string |
| 2 | +import functools |
| 3 | +import ifc_wrapper |
| 4 | + |
| 5 | +if hasattr(functools, 'reduce'): reduce = functools.reduce |
| 6 | + |
| 7 | +class entity_instance: |
| 8 | + def __init__(self, e): |
| 9 | + super().__setattr__('wrapped_data', e) |
| 10 | + def __getattr__(self, name): |
| 11 | + try: return self.wrapped_data.get_argument(self.wrapped_data.get_argument_index(name)) |
| 12 | + except: |
| 13 | + try: return self.wrapped_data.get_inverse(name) |
| 14 | + except: raise AttributeError("entity instance of type '%s' has no attribute '%s'"%(self.wrapped_data.is_a(), name)) |
| 15 | + @staticmethod |
| 16 | + def map_value(v): |
| 17 | + if isinstance(v, entity_instance): return v.wrapped_data |
| 18 | + elif isinstance(v, (tuple, list)) and len(v): |
| 19 | + classes = list(map(type, v)) |
| 20 | + if float in classes: return ifc_wrapper.doubles(v) |
| 21 | + elif int in classes: return ifc_wrapper.ints(v) |
| 22 | + elif str in classes: return ifc_wrapper.strings(v) |
| 23 | + elif entity_instance in classes: return list(map(lambda e: e.wrapped_data, v)) |
| 24 | + return v |
| 25 | + def __setattr__(self, key, value): |
| 26 | + self[self.wrapped_data.get_argument_index(key)] = value |
| 27 | + def __getitem__(self, key): |
| 28 | + return self.wrapped_data.get_argument(self.wrapped_data.get_argument_index(name)) |
| 29 | + def __setitem__(self, idx, value): |
| 30 | + self.wrapped_data.set_argument(idx, entity_instance.map_value(value)) |
| 31 | + def __len__(self): return len(self.wrapped_data) |
| 32 | + def __repr__(self): return repr(self.wrapped_data) |
| 33 | + |
| 34 | + |
| 35 | +class file: |
| 36 | + instances = [] |
| 37 | + def __init__(self, f): |
| 38 | + self.wrapped_data = f |
| 39 | + def create_entity(self,type,*args,**kwargs): |
| 40 | + e = entity_instance(ifc_wrapper.entity_instance(type)) |
| 41 | + attrs = list(enumerate(args)) + \ |
| 42 | + [(e.wrapped_data.get_argument_index(name), arg) for name, arg in kwargs.items()] |
| 43 | + for idx, arg in attrs: e[idx] = arg |
| 44 | + self.wrapped_data.add(e.wrapped_data) |
| 45 | + self.instances.append(e) |
| 46 | + return e |
| 47 | + def __getattr__(self,attr): |
| 48 | + if attr[0:6] == 'create': return functools.partial(self.create_entity,attr[6:]) |
| 49 | + def __getitem__(self, key): |
| 50 | + if isinstance(key, int): |
| 51 | + return entity_instance(self.wrapped_data.by_id(key)) |
| 52 | + elif isinstance(key, str): |
| 53 | + return entity_instance(self.wrapped_data.by_guid(key)) |
| 54 | + def by_type(self, type): |
| 55 | + return [entity_instance(e) for e in self.wrapped_data.by_type(type)] |
| 56 | + def write(self, fn): |
| 57 | + self.wrapped_data.write(fn) |
| 58 | + |
| 59 | + |
| 60 | +class guid: |
| 61 | + chars = string.digits + string.ascii_uppercase + string.ascii_lowercase + '_$' |
| 62 | + @staticmethod |
| 63 | + def compress(g): |
| 64 | + bs = [int(g[i:i+2], 16) for i in range(0, len(g), 2)] |
| 65 | + def b64(v, l=4): |
| 66 | + return ''.join([guid.chars[(v // (64**i))%64] for i in range(l)][::-1]) |
| 67 | + return ''.join([b64(bs[0], 2)] + [b64((bs[i] << 16) + (bs[i+1] << 8) + bs[i+2]) for i in range(1,16,3)]) |
| 68 | + @staticmethod |
| 69 | + def expand(g): |
| 70 | + def b64(v): |
| 71 | + return reduce(lambda a, b: a * 64 + b, map(lambda c: guid.chars.index(c), v)) |
| 72 | + bs = [b64(g[0:2])] |
| 73 | + for i in range(5): |
| 74 | + d = b64(g[2+4*i:6+4*i]) |
| 75 | + bs += [(d >> (8*(2-j)))%256 for j in range(3)] |
| 76 | + return ''.join(['%02x'%b for b in bs]) |
| 77 | + @staticmethod |
| 78 | + def split(g): |
| 79 | + return '{%s-%s-%s-%s-%s}'%(g[:8], g[8:12], g[12:16], g[16:20], g[20:]) |
| 80 | + |
| 81 | + |
| 82 | +def open(fn): |
| 83 | + return file(ifc_wrapper.open(fn)) |
| 84 | + |
| 85 | +def create_shape(inst, settings): return ifc_wrapper.create_shape(inst.wrapped_data, settings) |
| 86 | + |
| 87 | +def clean(): return ifc_wrapper.clean() |
| 88 | + |
| 89 | +DISABLE_OPENING_SUBTRACTIONS = ifc_wrapper.DISABLE_OPENING_SUBTRACTIONS |
| 90 | +DISABLE_OBJECT_PLACEMENT = ifc_wrapper.DISABLE_OBJECT_PLACEMENT |
| 91 | +SEW_SHELLS = ifc_wrapper.SEW_SHELLS |
0 commit comments