Example #1
0
def points_frm_occface(occface):
    """
    This function fetches a list of points from the OCCface. The face is constructed based on the list of points.
 
    Parameters
    ----------
    occface : OCCface
        The OCCface to be examined.
        
    Returns
    -------
    list of points : pyptlist
        The list of points extracted from the OCCface.
    """
    wire_list = wires_frm_face(occface)
    pt_list = []
    for wire in wire_list:
        pypts = points_frm_wire(wire)
        pt_list.extend(pypts)
    
    normal = calculate.face_normal(occface)
    anticlockwise = calculate.is_anticlockwise(pt_list, normal)
    if anticlockwise:
        pt_list.reverse()
        return pt_list
    else:
        return pt_list
Example #2
0
def pyptlist_frm_occface(occ_face):
    wire_list = wires_frm_face(occ_face)
    occpt_list = []
    pt_list = []
    for wire in wire_list:
        occpts = points_frm_wire(wire)
        occpt_list.extend(occpts)

    for occpt in occpt_list:
        pt = (occpt.X(), occpt.Y(), occpt.Z())
        pt_list.append(pt)

    normal = calculate.face_normal(occ_face)
    anticlockwise = calculate.is_anticlockwise(pt_list, normal)
    if anticlockwise:
        pt_list.reverse()
        return pt_list
    else:
        return pt_list
Example #3
0
def occtopo_2_collada(dae_filepath,
                      occface_list=None,
                      face_rgb_colour_list=None,
                      occedge_list=None):
    """
    This function converts OCCtopologies into a pycollada Collada class. The units are in meter.
 
    Parameters
    ----------
    occface_list : list of OCCfaces
        The geometries to be visualised with the results. The list of geometries must correspond to the list of results. Other OCCtopologies
        are also accepted, but the OCCtopology must contain OCCfaces. OCCtopology includes: OCCshape, OCCcompound, OCCcompsolid, 
        OCCsolid, OCCshell, OCCface. 
        
    dae_filepath : str
        The file path of the DAE (Collada) file.
    
    face_rgb_colour_list : list of tuple of floats, optional
        Each tuple is a r,g,b that is specifying the colour of the face. The number of colours must correspond to the number of OCCfaces.
        
    occedge_list : list of OCCedges, optional
        OCCedges to be visualised together, Default = None.
        
    Returns
    -------
    mesh : pycollada Collada class object
        The collada object from pycollada library.
    """
    import collada
    from collada import asset, material, source, geometry, scene
    import numpy
    mesh = collada.Collada()
    mesh.assetInfo.upaxis = asset.UP_AXIS.Z_UP
    mesh.assetInfo.unitmeter = 1.0
    mesh.assetInfo.unitname = "meter"

    if face_rgb_colour_list != None:
        mat_list = []
        colour_cnt = 0
        for rgb_colour in face_rgb_colour_list:
            effect = material.Effect("effect" + str(colour_cnt), [],
                                     "phong",
                                     diffuse=rgb_colour,
                                     specular=rgb_colour,
                                     double_sided=True)
            mat = material.Material("material" + str(colour_cnt),
                                    "mymaterial" + str(colour_cnt), effect)
            mesh.effects.append(effect)
            mesh.materials.append(mat)
            mat_list.append(mat)
            colour_cnt += 1

    else:
        effect = material.Effect("effect0", [],
                                 "phong",
                                 diffuse=(1, 1, 1),
                                 specular=(1, 1, 1))
        mat = material.Material("material0", "mymaterial", effect)
        mesh.effects.append(effect)
        mesh.materials.append(mat)

    edgeeffect = material.Effect("edgeeffect0", [],
                                 "phong",
                                 diffuse=(1, 1, 1),
                                 specular=(1, 1, 1),
                                 double_sided=True)
    edgemat = material.Material("edgematerial0", "myedgematerial", effect)
    mesh.effects.append(edgeeffect)
    mesh.materials.append(edgemat)

    geomnode_list = []
    shell_cnt = 0
    if occface_list:
        for occshell in occface_list:
            vert_floats = []
            normal_floats = []
            vcnt = []
            indices = []

            face_list = fetch.topo_explorer(occshell, "face")
            vert_cnt = 0
            for face in face_list:
                wire_list = fetch.topo_explorer(face, "wire")
                nwire = len(wire_list)
                if nwire == 1:
                    pyptlist = fetch.points_frm_occface(face)
                    vcnt.append(len(pyptlist))
                    face_nrml = calculate.face_normal(face)
                    pyptlist.reverse()
                    for pypt in pyptlist:
                        vert_floats.append(pypt[0])
                        vert_floats.append(pypt[1])
                        vert_floats.append(pypt[2])

                        normal_floats.append(face_nrml[0])
                        normal_floats.append(face_nrml[1])
                        normal_floats.append(face_nrml[2])

                        indices.append(vert_cnt)
                        vert_cnt += 1

                if nwire > 1:
                    tri_face_list = construct.simple_mesh(face)
                    for tface in tri_face_list:
                        pyptlist = fetch.points_frm_occface(tface)
                        vcnt.append(len(pyptlist))
                        face_nrml = calculate.face_normal(tface)
                        pyptlist.reverse()
                        for pypt in pyptlist:
                            vert_floats.append(pypt[0])
                            vert_floats.append(pypt[1])
                            vert_floats.append(pypt[2])

                            normal_floats.append(face_nrml[0])
                            normal_floats.append(face_nrml[1])
                            normal_floats.append(face_nrml[2])

                            indices.append(vert_cnt)
                            vert_cnt += 1

            vert_id = "ID" + str(shell_cnt) + "1"
            vert_src = source.FloatSource(vert_id, numpy.array(vert_floats),
                                          ('X', 'Y', 'Z'))
            normal_id = "ID" + str(shell_cnt) + "2"
            normal_src = source.FloatSource(normal_id,
                                            numpy.array(normal_floats),
                                            ('X', 'Y', 'Z'))
            geom = geometry.Geometry(mesh, "geometry" + str(shell_cnt),
                                     "geometry" + str(shell_cnt),
                                     [vert_src, normal_src])
            input_list = source.InputList()
            input_list.addInput(0, 'VERTEX', "#" + vert_id)
            #input_list.addInput(1, 'NORMAL', "#"+normal_id)

            vcnt = numpy.array(vcnt)
            indices = numpy.array(indices)

            if face_rgb_colour_list != None:
                mat_name = "materialref" + str(shell_cnt)
                polylist = geom.createPolylist(indices, vcnt, input_list,
                                               mat_name)
                geom.primitives.append(polylist)
                mesh.geometries.append(geom)

                matnode = scene.MaterialNode(mat_name,
                                             mat_list[shell_cnt],
                                             inputs=[])
                geomnode = scene.GeometryNode(geom, [matnode])
                geomnode_list.append(geomnode)
            else:
                mat_name = "materialref"
                polylist = geom.createPolylist(indices, vcnt, input_list,
                                               mat_name)
                geom.primitives.append(polylist)
                mesh.geometries.append(geom)

                matnode = scene.MaterialNode(mat_name, mat, inputs=[])
                geomnode = scene.GeometryNode(geom, [matnode])
                geomnode_list.append(geomnode)

            shell_cnt += 1

    if occedge_list:
        edge_cnt = 0
        for occedge in occedge_list:
            vert_floats = []
            indices = []
            pypt_list = fetch.points_frm_edge(occedge)
            if len(pypt_list) == 2:
                vert_cnt = 0
                for pypt in pypt_list:
                    vert_floats.append(pypt[0])
                    vert_floats.append(pypt[1])
                    vert_floats.append(pypt[2])

                    indices.append(vert_cnt)
                    vert_cnt += 1

                vert_id = "ID" + str(edge_cnt + shell_cnt) + "1"
                vert_src = source.FloatSource(vert_id,
                                              numpy.array(vert_floats),
                                              ('X', 'Y', 'Z'))
                geom = geometry.Geometry(
                    mesh, "geometry" + str(edge_cnt + shell_cnt),
                    "geometry" + str(edge_cnt + shell_cnt), [vert_src])
                input_list = source.InputList()
                input_list.addInput(0, 'VERTEX', "#" + vert_id)
                indices = numpy.array(indices)

                mat_name = "edgematerialref"
                linelist = geom.createLineSet(indices, input_list, mat_name)
                geom.primitives.append(linelist)
                mesh.geometries.append(geom)

                matnode = scene.MaterialNode(mat_name, edgemat, inputs=[])
                geomnode = scene.GeometryNode(geom, [matnode])
                geomnode_list.append(geomnode)
                edge_cnt += 1

    vis_node = scene.Node("node0", children=geomnode_list)
    myscene = scene.Scene("myscene", [vis_node])
    mesh.scenes.append(myscene)
    mesh.scene = myscene
    return mesh