def __init__(self, data, bHdr): self.pos = bHdr.blockPos + 4 self.key = data[bHdr.blockPos:self.pos] self.subName = data[self.pos:self.pos + 2] self.subKey, self.pos = getShort(data, self.pos + 2) self.size, self.pos = getInt(data, self.pos) self.version, self.pos = getInt(data, self.pos)
def getChunks(self, data, level, containerReader, primitiveReader): chunks = [] offset = 0 if (level == 0): t, o = getShort(data, 0) l, o = getInt(data, o) if (t == 0x8B1F): t, o = getInt(data, o) if (t == 0x0B000000): data = zlib.decompress(data, zlib.MAX_WBITS | 32) if (level == 0): progressbar = FreeCAD.Base.ProgressIndicator() progressbar.start(" reading '%s'..." % self.name, len(data)) while offset < len(data): old = offset offset, chunk = self.getNextChunk(data, offset, level, len(chunks), containerReader, primitiveReader) if (level == 0): for i in range(offset - old): progressbar.next() chunks.append(chunk) if (level == 0): progressbar.stop() return chunks
def calcPointNi3s(chunk): data = chunk.data cnt, o = getInt(data, 0) list = [] try: while (o < len(data)): p = PointNi3s() l, o = getInt(data, o) p.points, o = getInts(data, o, l) p.flags, o = getShort(data, o) if ((p.flags & 0x01) != 0): p.f1, o = getInt(data, o) if ((p.flags & 0x08) != 0): p.fH, o = getShort(data, o) if ((p.flags & 0x10) != 0): p.f2, o = getInt(data, o) if ((p.flags & 0x20) != 0): p.fA, o = getInts(data, o, 2 * (l - 3)) if (len(p.points) > 0): list.append(p) except Exception as e: FreeCAD.Console.PrintError(traceback.format_exc()) FreeCAD.Console.PrintError('\n') FreeCAD.Console.PrintError("%s: o = %d\n" % (e, o)) raise e return list
def readGsmBlockHeader(data, pos): bHdr = GsmBlockHeader() ofs = pos + 4 bHdr.key = data[pos:ofs].decode('utf8') bHdr.blockPos, ofs = getInt(data, ofs) bHdr.blockLength, ofs = getInt(data, ofs) bHdr.flags, ofs = getInt(data, ofs) return bHdr, pos + bHdr.length
def calcCoordinates(data): l, o = getInt(data, 0) cnt = len(data) / 16 p = numpy.zeros((cnt, 3), numpy.float32) i = 0 while (o < len(data)): w, o = getInt(data, o) f, o = getFloats(data, o, 3) p[i, ] = f i += 1 return p
def setLStr16(self, data): try: l, o = getInt(data, 0) self.data = data[o:o + l * 2].decode('utf-16-le') if (self.data[-1] == b'\0'): self.data = self.data[0:-1] self.format = "LStr16" self.unknown = False except: self.data = data
def getArrayPoint3f(values): v = [] if len(values) >= 4: count, offset = getInt(values, 0) while (count > 0): floats, offset = getFloats(values, offset, 3) v.append(floats) count -= 1 return v
def getNGonsInts(chunk): o = 0 list = [] data = chunk.data while (o < len(data)): cnt, o = getInt(data, o) points, o = getInts(data, o, cnt) list.append(points) return list
def getNGons5i(data): count, o = getInt(data, 0) ngons = [] while count > 0: p, o = getInts(data, o, 3) o += 8 ngons.append(p) count -= 1 return ngons
def getNGons6i(data): cnt, o = getInt(data, 0) list = [] while (o < len(data)): l, o = getInts(data, o, 6) i = 5 while ((i > 3) and (l[i] < 0)): i -= 1 if (i > 2): list.append(l[1:i]) return list
def getNodeParent(node): parent = None if (node): chunk = node.getFirst(0x0960) if (chunk is not None): idx, offset = getInt(chunk.data, 0) parent = getNode(idx) if (parent is None): FreeCAD.Console.PrintError("parent index %X < %X!\n" % (idx, len(SCENE_LIST))) return parent
def readGsmHeader(data): header = GsmHeader() header.blockCount, pos = getInt(data, 0x24) return header, header.length