コード例 #1
0
ファイル: table.py プロジェクト: hephaestus9/python-brlcad
def create_primitive(type_id, db_internal, directory):
    # TODO: research if this method won't cause a memory leak
    # because python will not free the structures received here
    name = str(directory.d_namep)
    type_info = MAGIC_TO_PRIMITIVE_TYPE.get(type_id)
    if type_info:
        magic = type_info[2]
        struct_type = type_info[3]
        data = struct_type.from_address(db_internal.idb_ptr) if struct_type else None
        # the first int32 is always the magic:
        data_magic = librt.cast(db_internal.idb_ptr, librt.POINTER(librt.c_uint32)).contents.value
        if magic:
            if magic != data_magic:
                raise BRLCADException("Invalid magic value, expected {0} but got {1}".format(magic, data_magic))
        else:
            if type_info[2]:
                display_type_info = list(type_info)
                display_type_info[2] = hex(display_type_info[2])
            else:
                display_type_info = type_info
            warnings.warn("No magic for type: {0}, {1}, {2}".format(type_id, hex(data_magic), display_type_info))
        if type_info[1] == Primitive:
            return Primitive(name=name, primitive_type=type_info[0], data=data)
        else:
            return type_info[1].from_wdb(name=name, data=data)
    else:
        return Primitive(name=name, primitive_type="UNKNOWN")
コード例 #2
0
 def build_tree(self):
     node = cta.brlcad_new(librt.struct_tree_node)
     node.magic = librt.RT_TREE_MAGIC
     node.tb_op = librt.OP_NOT
     node.tb_regionp = None
     node.tb_left = self.left.build_tree()
     return librt.cast(librt.pointer(node), librt.POINTER(librt.union_tree))
コード例 #3
0
def create_primitive(type_id, db_internal, directory):
    # TODO: research if this method won't cause a memory leak
    # because python will not free the structures received here
    name = str(directory.d_namep)
    type_info = MAGIC_TO_PRIMITIVE_TYPE.get(type_id)
    if type_info:
        magic = type_info[2]
        struct_type = type_info[3]
        data = struct_type.from_address(db_internal.idb_ptr) if struct_type else None
        # the first int32 is always the magic:
        data_magic = librt.cast(db_internal.idb_ptr, librt.POINTER(librt.c_uint32)).contents.value
        if magic:
            if magic != data_magic:
                raise BRLCADException("Invalid magic value, expected {0} but got {1}".format(magic, data_magic))
        else:
            if type_info[2]:
                display_type_info = list(type_info)
                display_type_info[2] = hex(display_type_info[2])
            else:
                display_type_info = type_info
            warnings.warn("No magic for type: {0}, {1}, {2}".format(type_id, hex(data_magic), display_type_info))
        if type_info[1] == Primitive:
            return Primitive(name=name, primitive_type=type_info[0], data=data)
        else:
            return type_info[1].from_wdb(name=name, data=data)
    else:
        return Primitive(name=name, primitive_type="UNKNOWN")
コード例 #4
0
ファイル: sketch.py プロジェクト: hephaestus9/python-brlcad
 def from_wdb(sketch, data, reverse):
     data = librt.cast(data, librt.POINTER(librt.struct_bezier_seg)).contents
     return Bezier(
         sketch,
         points=[data.ctl_points[i] for i in xrange(0, data.degree + 1)],
         reverse=reverse
     )
コード例 #5
0
 def build_tree(self):
     node = cta.brlcad_new(librt.struct_tree_node)
     node.magic = librt.RT_TREE_MAGIC
     node.tb_op = librt.OP_NOT
     node.tb_regionp = None
     node.tb_left = self.left.build_tree()
     return librt.cast(librt.pointer(node), librt.POINTER(librt.union_tree))
コード例 #6
0
ファイル: sketch.py プロジェクト: Killthebug/python-brlcad
 def from_wdb(sketch, data, reverse):
     data = librt.cast(data, librt.POINTER(librt.struct_carc_seg)).contents
     return CircularArc(sketch, [data.start, data.end],
                        reverse=reverse,
                        radius=data.radius,
                        center_is_left=bool(data.center_is_left),
                        clock_wise=bool(data.orientation))
コード例 #7
0
 def from_wdb(sketch, data, reverse):
     data = librt.cast(data, librt.POINTER(librt.struct_bezier_seg)).contents
     return Bezier(
         sketch,
         points=[data.ctl_points[i] for i in range(0, data.degree + 1)],
         reverse=reverse
     )
コード例 #8
0
 def build_tree(self):
     node = cta.brlcad_new(librt.struct_tree_db_leaf)
     node.magic = librt.RT_TREE_MAGIC
     node.tl_op = librt.OP_DB_LEAF
     node.tl_mat = None if self.matrix is None else cta.transform(self.matrix, use_brlcad_malloc=True)
     node.tl_name = librt.bu_strdupm(self.name, "tree_db_leaf.tl_name")
     return librt.cast(librt.pointer(node), librt.POINTER(librt.union_tree))
コード例 #9
0
 def build_tree(self):
     node = cta.brlcad_new(librt.struct_tree_db_leaf)
     node.magic = librt.RT_TREE_MAGIC
     node.tl_op = librt.OP_DB_LEAF
     node.tl_mat = None if self.matrix is None else cta.transform(
         self.matrix, use_brlcad_malloc=True)
     node.tl_name = librt.bu_strdupm(self.name, "tree_db_leaf.tl_name")
     return librt.cast(librt.pointer(node), librt.POINTER(librt.union_tree))
コード例 #10
0
ファイル: sketch.py プロジェクト: hephaestus9/python-brlcad
 def from_wdb(sketch, data, reverse):
     data = librt.cast(data, librt.POINTER(librt.struct_carc_seg)).contents
     return CircularArc(
         sketch,
         [data.start, data.end],
         reverse=reverse,
         radius=data.radius,
         center_is_left=bool(data.center_is_left),
         clock_wise=bool(data.orientation)
     )
コード例 #11
0
 def build_tree(self, subset=None):
     if subset and len(subset) == 1:
         return subset[0].build_tree()
     if not subset:
         subset = self.children
     node = cta.brlcad_new(librt.struct_tree_node)
     node.magic = librt.RT_TREE_MAGIC
     node.tb_op = self.op_code
     node.tb_regionp = None
     index = len(subset) / 2
     node.tb_left = self.build_tree(subset[:index])
     node.tb_right = self.build_tree(subset[index:])
     return librt.cast(librt.pointer(node), librt.POINTER(librt.union_tree))
コード例 #12
0
 def build_tree(self, subset=None):
     if subset and len(subset) == 1:
         return subset[0].build_tree()
     if not subset:
         subset = self.children
     node = cta.brlcad_new(librt.struct_tree_node)
     node.magic = librt.RT_TREE_MAGIC
     node.tb_op = self.op_code
     node.tb_regionp = None
     index = len(subset) / 2
     node.tb_left = self.build_tree(subset[:index])
     node.tb_right = self.build_tree(subset[index:])
     return librt.cast(librt.pointer(node), librt.POINTER(librt.union_tree))
コード例 #13
0
ファイル: sketch.py プロジェクト: hephaestus9/python-brlcad
 def from_wdb(name, data):
     vertices = []
     for i in xrange(0, data.vert_count):
         vertices.append(Vector(data.verts[i]))
     result = Sketch(
         name=name, base=Vector(data.V), u_vec=Vector(data.u_vec), v_vec=Vector(data.v_vec), vertices=vertices
     )
     curves = data.curve
     for i in xrange(0, curves.count):
         curve = curves.segment[i]
         magic = librt.cast(curve, librt.POINTER(librt.struct_line_seg)).contents.magic
         reverse = bool(curves.reverse[i])
         result.add_curve_segment(magic, curve, reverse=reverse)
     return result
コード例 #14
0
ファイル: sketch.py プロジェクト: hephaestus9/python-brlcad
 def build_curves(self):
     ci = librt.struct_rt_curve()
     ci.count = len(self.curves)
     if ci.count:
         ci.reverse = (librt.c_int * ci.count)()
         ci.segment = (librt.genptr_t * ci.count)()
     else:
         ci.reverse = None
         ci.segment = None
     for i in xrange(0, ci.count):
         curve = self.curves[i]
         ci.reverse[i] = bool(curve.reverse)
         ci.segment[i] = librt.cast(librt.pointer(curve.build_segment()), librt.c_void_p)
     return ci, self.vertices
コード例 #15
0
 def from_wdb(name, data):
     vertices = []
     for i in range(0, data.vert_count):
         vertices.append(Vector(data.verts[i]))
     result = Sketch(
         name=name, base=Vector(data.V), u_vec=Vector(data.u_vec), v_vec=Vector(data.v_vec), vertices=vertices
     )
     curves = data.curve
     for i in range(0, curves.count):
         curve = curves.segment[i]
         magic = librt.cast(curve, librt.POINTER(librt.struct_line_seg)).contents.magic
         reverse = bool(curves.reverse[i])
         result.add_curve_segment(magic, curve, reverse=reverse)
     return result
コード例 #16
0
 def build_curves(self):
     ci = librt.struct_rt_curve()
     ci.count = len(self.curves)
     if ci.count:
         ci.reverse = (librt.c_int * ci.count)()
         ci.segment = (librt.genptr_t * ci.count)()
     else:
         ci.reverse = None
         ci.segment = None
     for i in range(0, ci.count):
         curve = self.curves[i]
         ci.reverse[i] = bool(curve.reverse)
         ci.segment[i] = librt.cast(librt.pointer(curve.build_segment()), librt.c_void_p)
     return ci, self.vertices
コード例 #17
0
ファイル: sketch.py プロジェクト: Killthebug/python-brlcad
 def build_curves(self):
     ci = librt.struct_rt_curve()
     ci.count = len(self.curves)
     if ci.count:
         ci.reverse = (librt.c_int * ci.count)()
         ci.segment = (librt.c_void_p * ci.count)()
     else:
         ci.reverse = None
         ci.segment = None
     for i in xrange(0, ci.count):
         xx = Line(self, self.curves[i][1])
         ci.reverse[i] = bool(xx.reverse)
         ci.segment[i] = librt.cast(librt.pointer(xx.build_segment()),
                                    librt.c_void_p)
     return ci, self.vertices
コード例 #18
0
ファイル: sketch.py プロジェクト: Killthebug/python-brlcad
 def from_wdb(sketch, data, reverse):
     data = librt.cast(data, librt.POINTER(librt.struct_nurb_seg)).contents
     point_type = (data.pt_type >> 1) & 0x0f
     if bool(data.pt_type & 1):
         weights = [data.weights[i] for i in xrange(0, data.c_size)]
         coordinate_count = 3
     else:
         weights = None
         coordinate_count = 2
     if coordinate_count != data.pt_type >> 5:
         raise ValueError(
             "Expected {} NURB coordinates for sketch, but got {}".format(
                 coordinate_count, data.pt_type >> 5))
     result = NURB(
         sketch,
         points=[data.ctl_points[i] for i in xrange(0, data.c_size)],
         reverse=reverse,
         order=data.order,
         point_type=point_type,
         knot_vector=[data.k.knots[i] for i in xrange(0, data.k.k_size)],
         weights=weights)
     return result
コード例 #19
0
ファイル: sketch.py プロジェクト: hephaestus9/python-brlcad
 def from_wdb(sketch, data, reverse):
     data = librt.cast(data, librt.POINTER(librt.struct_nurb_seg)).contents
     point_type = (data.pt_type >> 1) & 0x0f
     if bool(data.pt_type & 1):
         weights = [data.weights[i] for i in xrange(0, data.c_size)]
         coordinate_count = 3
     else:
         weights = None
         coordinate_count = 2
     if coordinate_count != data.pt_type >> 5:
         raise ValueError(
             "Expected {} NURB coordinates for sketch, but got {}".format(coordinate_count, data.pt_type >> 5)
         )
     result = NURB(
         sketch,
         points=[data.ctl_points[i] for i in xrange(0, data.c_size)],
         reverse=reverse,
         order=data.order,
         point_type=point_type,
         knot_vector=[data.k.knots[i] for i in xrange(0, data.k.k_size)],
         weights=weights
     )
     return result
コード例 #20
0
ファイル: sketch.py プロジェクト: hephaestus9/python-brlcad
 def from_wdb(sketch, data, reverse):
     data = librt.cast(data, librt.POINTER(librt.struct_line_seg)).contents
     return Line(sketch, [data.start, data.end], reverse=reverse)
コード例 #21
0
 def from_wdb(sketch, data, reverse):
     data = librt.cast(data, librt.POINTER(librt.struct_line_seg)).contents
     return Line(sketch, [data.start, data.end], reverse=reverse)