コード例 #1
0
def save_design(coarse_pseudo_quad_mesh, layer):
    """Save one of the meshes based on the coarse quad mesh.

    Parameters
    ----------
    mesh : CoarsePseudoQuadMesh
            The coarse quad mesh from which to save data.

    """

    mesh_to_save = rs.GetString('mesh to save?',
                                strings=[
                                    'coarse_pseudo_quad_mesh',
                                    'pseudo_quad_mesh', 'polygonal_mesh'
                                ])

    guid = None
    if mesh_to_save == 'coarse_pseudo_quad_mesh':
        artist = rhino_artist.MeshArtist(coarse_pseudo_quad_mesh)
        guid = artist.draw_mesh(coarse_pseudo_quad_mesh)
    elif mesh_to_save == 'pseudo_quad_mesh':
        artist = rhino_artist.MeshArtist(
            coarse_pseudo_quad_mesh.get_quad_mesh())
        guid = artist.draw_mesh()
    elif mesh_to_save == 'polygonal_mesh':
        artist = rhino_artist.MeshArtist(
            coarse_pseudo_quad_mesh.get_polygonal_mesh())
        guid = artist.draw_mesh()

    if guid is not None:
        layer = rs.GetLayer(layer=layer)
        rs.ObjectLayer(guid, layer)
コード例 #2
0
def editing_geometry_moving(coarse_pseudo_quad_mesh):
    """Edit the geometry of a pattern with moving.

    Parameters
    ----------
    coarse_pseudo_quad_mesh : CoarsePseudoQuadMesh
            The pattern to edit.

    """

    mesh_to_modify = rs.GetString('mesh to modify?',
                                  strings=[
                                      'coarse_pseudo_quad_mesh',
                                      'pseudo_quad_mesh', 'polygonal_mesh'
                                  ])
    if mesh_to_modify == 'coarse_pseudo_quad_mesh':
        mesh = coarse_pseudo_quad_mesh
    elif mesh_to_modify == 'pseudo_quad_mesh':
        mesh = coarse_pseudo_quad_mesh.get_quad_mesh()
    elif mesh_to_modify == 'polygonal_mesh':
        mesh = coarse_pseudo_quad_mesh.get_polygonal_mesh()
    else:
        return 0

    while True:

        rs.EnableRedraw(False)
        artist = rhino_artist.MeshArtist(mesh)
        guid = artist.draw_mesh()
        rs.EnableRedraw(True)

        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()
        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.vertices()})
        artist.redraw()
        vkeys = rhino_helper.mesh_select_vertices(mesh,
                                                  message='vertices to move')
        artist.clear_layer()
        artist.redraw()
        rs.DeleteLayer('mesh_artist')

        if vkeys == []:
            rs.DeleteObject(guid)
            break

        rhino_helper.mesh_move_vertices(mesh, vkeys)
        rs.DeleteObject(guid)

    if mesh_to_modify == 'coarse_pseudo_quad_mesh':
        coarse_pseudo_quad_mesh = mesh
    elif mesh_to_modify == 'pseudo_quad_mesh':
        coarse_pseudo_quad_mesh.set_quad_mesh(mesh)
        coarse_pseudo_quad_mesh.set_polygonal_mesh(mesh.copy())
    elif mesh_to_modify == 'polygonal_mesh':
        coarse_pseudo_quad_mesh.set_polygonal_mesh(mesh)
コード例 #3
0
def add_handle_artist(mesh):
    """Select two mesh faces and add handle.

	Parameters
	----------
	mesh : Mesh
		The mesh.

	Returns
	-------
	fkeys
		The new face keys from the handle.

	"""

    artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
    artist.clear_layer()

    artist.draw_facelabels()
    artist.redraw()
    fkey_1 = rhino_helper.mesh_select_face(mesh, message='fkey_1')
    if fkey_1 is not None:
        fkey_2 = rhino_helper.mesh_select_face(mesh, message='fkey_2')
        if fkey_2 is not None:
            fkeys = add_handle(mesh, fkey_1, fkey_2)

        else:
            fkeys = []
    else:
        fkeys = []

    artist.clear()
    rs.DeleteLayer('mesh_artist')

    return fkeys
コード例 #4
0
def select_quad_mesh_polyedge(mesh):
    """Select quad mesh polyedge. Selecting one edge is equivalent to selecting one polyedge.

	Parameters
	----------
	mesh : QuadMesh
		The quad mesh.

	Returns
	-------
	list
		The list of polyedge vertices.
	"""

    artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
    artist.clear_layer()
    artist.draw_edgelabels()
    artist.redraw()

    edge = rhino_helper.mesh_select_edge(mesh)

    artist.clear_layer()
    artist.redraw()
    rs.DeleteLayer('mesh_artist')

    return mesh.polyedge(*edge)
コード例 #5
0
def select_mesh_polyedge(mesh):
    """Select mesh polyedge.

	Parameters
	----------
	mesh : Mesh
		The mesh.

	Returns
	-------
	polyedge : list
		The list of polyedge vertices.
	"""

    # add layer
    artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
    artist.clear_layer()

    # collect polyedge vertices
    polyedge = []
    lines = []
    while True:

        # define candidate vertices for polyedge
        if len(polyedge) == 0:
            vkey_candidates = mesh.vertices()
        else:
            vkey_candidates = mesh.vertex_neighbors(polyedge[-1])

        # get vertex among candidates
        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in vkey_candidates})
        artist.redraw()

        vkey = rhino_helper.mesh_select_vertex(mesh, message='vertex')

        artist.clear_layer()
        artist.redraw()

        # stop if no vertex is added
        if vkey is None:
            break

        # add vertex to polyedge
        polyedge.append(vkey)

        if len(polyedge) > 1:
            u = mesh.vertex_coordinates(polyedge[-2])
            v = mesh.vertex_coordinates(polyedge[-1])
            guid = rs.AddLine(u, v)
            rs.ObjectColor(guid, [255, 255, 0])
            lines.append(guid)

    rs.DeleteLayer('mesh_artist')
    rs.DeleteObjects(lines)

    return polyedge
コード例 #6
0
def editing_topology(coarse_pseudo_quad_mesh):
    """Edit the topology of a pattern, i.e. its singularities, via its strips.

    Parameters
    ----------
    coarse_pseudo_quad_mesh : CoarsePseudoQuadMesh
            The pattern to edit.

    """

    while True:

        # update drawing
        rs.EnableRedraw(False)
        artist = rhino_artist.MeshArtist(coarse_pseudo_quad_mesh)
        guid = artist.draw_mesh()
        rs.EnableRedraw(True)

        # choose operation
        operation = rs.GetString('edit strip topology?',
                                 strings=['add', 'delete', 'split', 'exit'])

        # stop if asked
        if operation is None or operation == 'exit':
            rs.DeleteObject(guid)
            break

        # apply operation
        if operation == 'add':
            skey = add_strip(coarse_pseudo_quad_mesh,
                             select_mesh_polyedge(coarse_pseudo_quad_mesh))[0]
            coarse_pseudo_quad_mesh.set_strip_density(skey, 1)

        elif operation == 'delete':
            skeys = set(select_quad_mesh_strips(coarse_pseudo_quad_mesh))
            skey_to_skeys = delete_strips(coarse_pseudo_quad_mesh, skeys)
            if skey_to_skeys is not None:
                for skey_0, skeys in skey_to_skeys.items():
                    d = int(
                        ceil(
                            float(
                                coarse_pseudo_quad_mesh.get_strip_density(
                                    skey_0)) / 2.))
                    coarse_pseudo_quad_mesh.set_strips_density(d, skeys)

        elif operation == 'split':
            skey = select_quad_mesh_strip(coarse_pseudo_quad_mesh)
            n = rs.GetInteger('number of splits', number=2, minimum=2)
            skeys = split_strip(coarse_pseudo_quad_mesh, skey, n=n)
            # update data
            d = int(
                ceil(
                    float(coarse_pseudo_quad_mesh.get_strip_density(skey)) /
                    float(n)))
            coarse_pseudo_quad_mesh.set_strips_density(d, skeys)

        # delete drawing
        rs.DeleteObject(guid)
コード例 #7
0
def select_mesh_polyedge(mesh):
    """Select polyedge vertices via artist.

	Parameters
	----------
	mesh : Mesh
		The mesh.

	Returns
	-------
	polyedge : list
		The list of polyedge vertices.
	"""

    # add layer
    artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
    artist.clear_layer()

    # collect polyedge vertices
    polyedge = []
    count = mesh.number_of_vertices() + 1
    while count > 0:
        count -= 1

        # define candidate vertices ofr polyedge
        if len(polyedge) == 0:
            vkey_candidates = mesh.vertices()
        else:
            vkey_candidates = mesh.vertex_neighbors(polyedge[-1])

        # get vertex among candidates
        artist.draw_vertexlabels(text={
            key: str(key)
            for key in vkey_candidates if key not in polyedge[1:]
        })
        artist.redraw()
        vkey = rhino_helper.mesh_select_vertex(mesh, message='vertex')

        artist.clear_layer()
        artist.redraw()

        # stop if no vertex is added
        if vkey is None:
            break

        # add vertex to polyedge
        polyedge.append(vkey)

        # stop if polyedge is closed
        if len(polyedge) != 1 and vkey == polyedge[0]:
            break

    rs.DeleteLayer('mesh_artist')

    return polyedge
コード例 #8
0
def editing_symmetry(coarse_pseudo_quad_mesh):
    """Edit the symmetry of a pattern via Conway operators.

    Parameters
    ----------
    coarse_pseudo_quad_mesh : CoarsePseudoQuadMesh
            The pattern to edit.

    """

    conway_operators = {
        'conway_seed', 'conway_dual', 'conway_join', 'conway_ambo',
        'conway_kis', 'conway_needle', 'conway_zip', 'conway_truncate',
        'conway_ortho', 'conway_expand', 'conway_gyro', 'conway_snub',
        'conway_meta', 'conway_bevel'
    }

    conway = {operator[7:]: operator for operator in conway_operators}

    while True:

        rs.EnableRedraw(False)
        artist = rhino_artist.MeshArtist(
            coarse_pseudo_quad_mesh.get_polygonal_mesh())
        guid = artist.draw_mesh()
        rs.EnableRedraw(True)

        operator = rs.GetString('Conway operator?',
                                strings=conway.keys() + ['exit'])

        if operator is None or operator == 'exit':
            if type(guid) == list:
                rs.DeleteObjects(guid)
            else:
                rs.DeleteObject(guid)
            return coarse_pseudo_quad_mesh.get_polygonal_mesh()

        elif operator == 'seed':
            coarse_pseudo_quad_mesh.set_polygonal_mesh(
                coarse_pseudo_quad_mesh.get_quad_mesh().copy())

        elif operator in conway and conway[operator] in globals() and str(
                conway[operator])[:6] == 'conway':
            coarse_pseudo_quad_mesh.set_polygonal_mesh(
                globals()[conway[operator]](
                    coarse_pseudo_quad_mesh.get_polygonal_mesh()))

        if type(guid) == list:
            rs.DeleteObjects(guid)
        else:
            rs.DeleteObject(guid)
コード例 #9
0
def custom_constraints(mesh, surface):
    from compas_pattern.cad.rhino.utilities import surface_borders

    #surface_boundaries = surface_borders(surface, border_type = 0)

    rs.EnableRedraw(True)
    surface_boundaries = rs.GetObjects('surface boundaries', filter=4)
    rs.EnableRedraw(False)

    constraints = {}

    artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
    artist.clear_layer()

    vertex_points = {
        rs.AddPoint(mesh.vertex_coordinates(vkey)): vkey
        for vkey in mesh.vertices()
    }
    rs.EnableRedraw(True)
    fixed_vertices = rs.GetObjects('fixed vertices', filter=1)
    if fixed_vertices is None:
        fixed_vertices = []
    vkeys = [vertex_points[vkey] for vkey in fixed_vertices]
    rs.DeleteObjects(vertex_points)
    rs.EnableRedraw(False)
    #artist.draw_vertexlabels()
    #artist.redraw()
    #vkeys = rhino.mesh_select_vertices(mesh, message = 'fixed vertices')
    #artist.clear_layer()
    #artist.redraw()

    for vkey in vkeys:
        if vkey not in constraints:
            constraints[vkey] = ('fixed', mesh.vertex_coordinates(vkey))

    # collect boundayr polylines with splits
    from compas_pattern.topology.polyline_extraction import mesh_boundaries
    mesh_boundaries = mesh_boundaries(mesh)
    split_vertices = [
        vkey for vkey, constraint in constraints.items()
        if constraint[0] == 'fixed'
    ]

    # add one vertex per mesh boundary element that has no split vertices yet, i.e. that has no corner vertices (2-valency)
    for boundary in mesh_boundaries:
        to_add = True
        for vkey in boundary:
            if vkey in split_vertices:
                to_add = False
                break
        if to_add:
            split_vertices.append(boundary[0])

    split_mesh_boundaries = []
    while len(split_vertices) > 0:
        start = split_vertices.pop()
        # exception if split vertex corresponds to a non-boundary point feature
        if not mesh.is_vertex_on_boundary(start):
            continue
        polyline = [start]

        while 1:
            for nbr, fkey in iter(mesh.halfedge[polyline[-1]].items()):
                if fkey is None:
                    polyline.append(nbr)
                    break

            # end of boundary element
            if start == polyline[-1]:
                split_mesh_boundaries.append(polyline)
                break
            # end of boundary subelement
            elif polyline[-1] in split_vertices:
                split_mesh_boundaries.append(polyline)
                split_vertices.remove(polyline[-1])
                polyline = polyline[-1:]

    srf_dots = {
        rs.AddTextDot('srf_boundary', rs.CurveMidPoint(srf_bdry)): srf_bdry
        for srf_bdry in surface_boundaries
    }

    for mesh_bdry in split_mesh_boundaries:
        if len(mesh_bdry) == 2:
            xyz = mesh.edge_midpoint(mesh_bdry[0], mesh_bdry[1])
        else:
            idx = int(math.floor(len(mesh_bdry) / 2))
            xyz = mesh.vertex_coordinates(mesh_bdry[idx])
        mesh_dot = rs.AddTextDot('?', xyz)

        rs.EnableRedraw(True)
        crv_cstr = srf_dots[rs.GetObject('boundary constraint', filter=8192)]
        rs.EnableRedraw(False)

        for vkey in mesh_bdry:
            if vkey not in constraints:
                constraints[vkey] = ('curve', crv_cstr)

        rs.DeleteObject(mesh_dot)

    rs.EnableRedraw(True)
    rs.DeleteObjects(srf_dots)
    rs.EnableRedraw(False)

    for vkey in mesh.vertices():
        if vkey not in constraints:
            constraints[vkey] = ('surface', surface)

    return constraints, surface_boundaries
コード例 #10
0
def singular():
    """Explore a pattern, its topology (singularities, densities and symmetries) and its geoemtry (via smoothing).

    """

    layer = rs.CurrentLayer()

    pattern_from = rs.GetString('start pattern from?',
                                strings=[
                                    'coarse_pseudo_quad_mesh',
                                    'pseudo_quad_mesh', 'surface_and_features'
                                ])

    if pattern_from == 'coarse_pseudo_quad_mesh':
        guid = rs.GetObject('get coarse quad mesh', filter=32)
        vertices, faces = RhinoMesh.from_guid(guid).get_vertices_and_faces()
        clean_faces(faces)
        poles = []
        #print(faces)
        for face in faces:
            if len(face) != 4:
                poles = [
                    rs.PointCoordinates(point)
                    for point in rs.GetObjects('get pole points', filter=1)
                ]
                break
        coarse_pseudo_quad_mesh = CoarsePseudoQuadMesh.from_vertices_and_faces_with_poles(
            vertices, faces, poles)
        coarse_pseudo_quad_mesh.collect_strips()
        print(coarse_pseudo_quad_mesh.data['attributes']['strips'])
        coarse_pseudo_quad_mesh.set_strips_density(1)
        coarse_pseudo_quad_mesh.set_quad_mesh(coarse_pseudo_quad_mesh.copy())
        coarse_pseudo_quad_mesh.set_polygonal_mesh(
            coarse_pseudo_quad_mesh.copy())
        print(coarse_pseudo_quad_mesh.data['attributes']['strips'])
    elif pattern_from == 'pseudo_quad_mesh':
        guid = rs.GetObject('get quad mesh', filter=32)
        vertices, faces = RhinoMesh.from_guid(guid).get_vertices_and_faces()
        clean_faces(faces)
        poles = []
        for face in faces:
            if len(face) != 4:
                poles = [
                    rs.PointCoordinates(point)
                    for point in rs.GetObjects('get pole points', filter=1)
                ]
                break
        coarse_pseudo_quad_mesh = CoarsePseudoQuadMesh.from_quad_mesh(
            PseudoQuadMesh.from_vertices_and_faces_with_poles(
                vertices, faces, poles))
    elif pattern_from == 'surface_and_features':
        srf_guid = rs.GetObject('get surface', filter=8)
        crv_guids = rs.GetObjects('get optional curve features', filter=4)
        if crv_guids is None:
            crv_guids = []
        pt_guids = rs.GetObjects('get optional point features', filter=1)
        if pt_guids is None:
            pt_guids = []
        coarse_pseudo_quad_mesh = surface_decomposition(
            srf_guid,
            rs.GetReal('precision', number=1.),
            crv_guids=crv_guids,
            pt_guids=pt_guids,
            output_skeleton=False)[0]
        coarse_pseudo_quad_mesh.collect_strips()
        coarse_pseudo_quad_mesh.set_strips_density(1)
        coarse_pseudo_quad_mesh.set_quad_mesh(coarse_pseudo_quad_mesh.copy())
        coarse_pseudo_quad_mesh.set_polygonal_mesh(
            coarse_pseudo_quad_mesh.copy())
        artist = rhino_artist.MeshArtist(coarse_pseudo_quad_mesh)
        guid = artist.draw_mesh()
    else:
        return 0

    while True:

        #edit = rs.GetString('edit pattern?', strings = ['topology', 'density', 'symmetry', 'geometry', 'evaluate', 'exit'])
        edit = rs.GetString('edit pattern?',
                            strings=[
                                'topology', 'density', 'symmetry', 'geometry',
                                'save', 'exit'
                            ])

        if type(guid) == list:
            rs.DeleteObjects(guid)
        else:
            rs.DeleteObject(guid)

        if edit is None or edit == 'exit':
            rs.EnableRedraw(False)
            artist = rhino_artist.MeshArtist(
                coarse_pseudo_quad_mesh.get_polygonal_mesh())
            return artist.draw_mesh()

        if edit == 'topology':
            editing_topology(coarse_pseudo_quad_mesh)
            coarse_pseudo_quad_mesh.densification()
            coarse_pseudo_quad_mesh.set_polygonal_mesh(
                coarse_pseudo_quad_mesh.get_quad_mesh().copy())

        elif edit == 'density':
            editing_density(coarse_pseudo_quad_mesh)
            coarse_pseudo_quad_mesh.set_polygonal_mesh(
                coarse_pseudo_quad_mesh.get_quad_mesh().copy())

        elif edit == 'symmetry':
            editing_symmetry(coarse_pseudo_quad_mesh)

        elif edit == 'geometry':
            editing_geometry(coarse_pseudo_quad_mesh)

        rs.EnableRedraw(False)
        artist = rhino_artist.MeshArtist(
            coarse_pseudo_quad_mesh.get_polygonal_mesh())
        guid = artist.draw_mesh()
        rs.EnableRedraw(True)

        if edit == 'save':
            save_design(coarse_pseudo_quad_mesh, layer)

        if edit == 'evaluate':
            evaluate_pattern(coarse_pseudo_quad_mesh.get_polygonal_mesh())
コード例 #11
0
def editing_geometry_smoothing(coarse_pseudo_quad_mesh):
    """Edit the geometry of a pattern with smoothing.

    Parameters
    ----------
    coarse_pseudo_quad_mesh : CoarsePseudoQuadMesh
            The pattern to edit.

    """

    mesh_to_smooth = rs.GetString('mesh to smooth?',
                                  strings=[
                                      'coarse_pseudo_quad_mesh',
                                      'pseudo_quad_mesh', 'polygonal_mesh'
                                  ])
    if mesh_to_smooth == 'coarse_pseudo_quad_mesh':
        mesh = coarse_pseudo_quad_mesh
    elif mesh_to_smooth == 'pseudo_quad_mesh':
        mesh = coarse_pseudo_quad_mesh.get_quad_mesh
    elif mesh_to_smooth == 'polygonal_mesh':
        mesh = coarse_pseudo_quad_mesh.get_polygonal_mesh()
    else:
        return 0

    settings = {'iterations': 50, 'damping': .5, 'constraints': {}}

    while True:

        rs.EnableRedraw(False)
        artist = rhino_artist.MeshArtist(mesh)
        guid = artist.draw_mesh()
        rs.EnableRedraw(True)

        operation = rs.GetString(
            'edit smoothing settings?',
            strings=['smooth', 'iterations', 'damping', 'constraints', 'exit'])

        if operation is None or operation == 'exit':
            if type(guid) == list:
                rs.DeleteObjects(guid)
            else:
                rs.DeleteObject(guid)
            break

        elif operation == 'iterations':
            settings[operation] = rs.GetInteger('iterations',
                                                number=settings[operation],
                                                minimum=0)

        elif operation == 'damping':
            settings[operation] = rs.GetReal('damping',
                                             number=settings[operation],
                                             minimum=0.,
                                             maximum=1.)

        elif operation == 'constraints':
            count = 100
            while count:
                count -= 1
                guids = display_smoothing_constraints(mesh,
                                                      settings[operation])
                constraint_type = rs.GetString('type of constraints?',
                                               strings=[
                                                   'automated_from_surface',
                                                   'automated_from_objects',
                                                   'customised', 'reset',
                                                   'exit'
                                               ])
                rs.DeleteObjects(guids)
                if constraint_type == 'automated_from_surface':
                    settings[
                        operation] = automated_smoothing_surface_constraints(
                            mesh,
                            RhinoSurface(
                                rs.GetObject('surface constraints', filter=8)))
                elif constraint_type == 'automated_from_objects':
                    object_constraints = rs.GetObjects('object constraints')
                    point_constraints = [
                        obj for obj in object_constraints
                        if rs.ObjectType(obj) == 1
                    ]
                    curve_constraints = [
                        obj for obj in object_constraints
                        if rs.ObjectType(obj) == 4
                    ]
                    surface_constraint = [
                        obj for obj in object_constraints
                        if rs.ObjectType(obj) == 8
                    ]
                    if len(surface_constraint) > 1:
                        print(
                            'More than one surface constraint! Only the first one is taken into account.'
                        )
                    if len(surface_constraint) == 0:
                        surface_constraint = None
                    else:
                        surface_constraint = surface_constraint[0]
                    settings[operation] = automated_smoothing_constraints(
                        mesh, point_constraints, curve_constraints,
                        surface_constraint)
                elif constraint_type == 'customised':
                    settings[operation] = customized_smoothing_constraints(
                        mesh, settings[operation])
                elif constraint_type == 'reset':
                    artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
                    artist.clear_layer()
                    artist.draw_vertices()
                    artist.redraw()
                    vkeys = rhino_helper.mesh_select_vertices(
                        mesh, message='vertices')
                    if vkeys is None:
                        vkeys = list(mesh.vertices())
                    artist.clear_layer()
                    artist.redraw()
                    rs.DeleteLayer('mesh_artist')
                    for vkey in vkeys:
                        if vkey in settings[operation]:
                            del settings[operation][vkey]
                else:
                    break

        elif operation == 'smooth':
            constrained_smoothing(mesh,
                                  kmax=settings['iterations'],
                                  damping=settings['damping'],
                                  constraints=settings['constraints'],
                                  algorithm='area')

        if type(guid) == list:
            rs.DeleteObjects(guid)
        else:
            rs.DeleteObject(guid)

    if mesh_to_smooth == 'coarse_pseudo_quad_mesh':
        coarse_pseudo_quad_mesh = mesh
    elif mesh_to_smooth == 'pseudo_quad_mesh':
        coarse_pseudo_quad_mesh.set_quad_mesh(mesh)
        coarse_pseudo_quad_mesh.set_polygonal_mesh(mesh.copy())
    elif mesh_to_smooth == 'polygonal_mesh':
        coarse_pseudo_quad_mesh.set_polygonal_mesh(mesh)
コード例 #12
0
def editing_density(coarse_pseudo_quad_mesh):
    """Edit the density of a pattern via its strip densities.

    Parameters
    ----------
    coarse_pseudo_quad_mesh : CoarsePseudoQuadMesh
            The pattern to edit.

    """

    while True:

        # update drawing
        rs.EnableRedraw(False)
        artist = rhino_artist.MeshArtist(
            coarse_pseudo_quad_mesh.get_quad_mesh())
        guid = artist.draw_mesh()
        rs.EnableRedraw(True)

        # choose operation
        operation = rs.GetString(
            'edit strip density?',
            strings=[
                'global_density_value', 'global_subdivision_target_length',
                'strip_density_value', 'strip_subdivision_target_length',
                'global_uniform_target_number_faces', 'exit'
            ])

        # stop if asked
        if operation is None or operation == 'exit':
            rs.DeleteObjects(guid)
            break

        # get operation parameters
        if 'strip' in operation:
            skey = select_quad_mesh_strip(coarse_pseudo_quad_mesh,
                                          text='density')
            print(skey)
            print(coarse_pseudo_quad_mesh.data['attributes']['strips'])
        if 'value' in operation:
            d = rs.GetInteger('density value', number=3, minimum=1)
        elif 'length' in operation:
            t = rs.GetReal('density target', number=1.)
        elif 'faces' in operation:
            nb_faces = rs.GetInteger('density value', number=100, minimum=1)

        # apply operation
        if operation == 'strip_density_value':
            coarse_pseudo_quad_mesh.set_strip_density(skey, d)

        elif operation == 'global_density_value':
            coarse_pseudo_quad_mesh.set_strips_density(d)

        elif operation == 'strip_subdivision_target_length':
            coarse_pseudo_quad_mesh.set_strip_density_target(skey, t)

        elif operation == 'global_subdivision_target_length':
            coarse_pseudo_quad_mesh.set_strips_density_target(t)

        elif operation == 'global_uniform_target_number_faces':

            coarse_pseudo_quad_mesh.set_strips_density_equal_face_target(
                nb_faces)

        # update data
        coarse_pseudo_quad_mesh.densification()

        # delete drawing
        rs.DeleteObjects(guid)
コード例 #13
0
def apply_rule(mesh, rule):

    if rule == 'face_pole':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        face_pole(mesh, fkey)

    elif rule == 'edge_pole':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_edgelabels(text={(u, v): "{}-{}".format(u, v)
                                     for u, v in mesh.face_halfedges(fkey)})
        artist.redraw()
        edge = rhino_helper.mesh_select_edge(mesh, message='edge')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        edge_pole(mesh, fkey, edge)

    elif rule == 'vertex_pole':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.face_vertices(fkey)})
        artist.redraw()
        pole = rhino_helper.mesh_select_vertex(mesh, message='pole')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        vertex_pole(mesh, fkey, pole)

    elif rule == 'add_opening':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        face_opening(mesh, fkey)

    elif rule == 'close_opening':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        boundaries = mesh_boundaries(mesh)
        artist.draw_vertexlabels(
            text={
                key: str(key)
                for key in
                [vkey for boundary in boundaries for vkey in boundary]
            })
        artist.redraw()
        vkey = rhino_helper.mesh_select_vertex(
            mesh, message='vertex on the opening to close')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        for boundary in boundaries:
            if vkey in boundary:
                vkeys = boundary
                break

        close_opening(mesh, vkeys)

    elif rule == 'flat_corner_2':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.face_vertices(fkey)})
        artist.redraw()
        corner = rhino_helper.mesh_select_vertex(mesh, message='corner')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        flat_corner_2(mesh, fkey, corner)

    elif rule == 'flat_corner_3':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.face_vertices(fkey)})
        artist.redraw()
        corner = rhino_helper.mesh_select_vertex(mesh, message='corner')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        flat_corner_3(mesh, fkey, corner)

    elif rule == 'flat_corner_33':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.face_vertices(fkey)})
        artist.redraw()
        corner = rhino_helper.mesh_select_vertex(mesh, message='corner')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        flat_corner_33(mesh, fkey, corner)

    elif rule == 'split_35':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_edgelabels(text={(u, v): "{}-{}".format(u, v)
                                     for u, v in mesh.face_halfedges(fkey)})
        artist.redraw()
        edge = rhino_helper.mesh_select_edge(mesh, message='edge')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        split_35(mesh, fkey, edge)

    elif rule == 'split_35_diag':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.face_vertices(fkey)})
        artist.redraw()
        corner = rhino_helper.mesh_select_vertex(mesh, message='corner')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        split_35_diag(mesh, fkey, corner)

    elif rule == 'split_26':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_edgelabels(text={(u, v): "{}-{}".format(u, v)
                                     for u, v in mesh.face_halfedges(fkey)})
        artist.redraw()
        edge = rhino_helper.mesh_select_edge(mesh, message='edge')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        split_26(mesh, fkey, edge)

    elif rule == 'simple_split':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_edgelabels(text={(u, v): "{}-{}".format(u, v)
                                     for u, v in mesh.face_halfedges(fkey)})
        artist.redraw()
        edge = rhino_helper.mesh_select_edge(mesh, message='edge')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        simple_split(mesh, fkey, edge)

    elif rule == 'double_split':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        double_split(mesh, fkey)

    elif rule == 'insert_pole':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.face_vertices(fkey)})
        artist.redraw()
        pole = rhino_helper.mesh_select_vertex(mesh, message='pole')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        insert_pole(mesh, fkey, pole)

    elif rule == 'insert_partial_pole':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.face_vertices(fkey)})
        artist.redraw()
        pole = rhino_helper.mesh_select_vertex(mesh, message='pole')
        artist.clear_layer()
        artist.redraw()

        artist.draw_edgelabels({(u, v): "{}-{}".format(u, v)
                                for u, v in mesh.face_halfedges(fkey)
                                if u != pole and v != pole})
        artist.redraw()
        edge = rhino_helper.mesh_select_edge(mesh, message='edge')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        insert_partial_pole(mesh, fkey, pole, edge)

    elif rule == 'singular_boundary_1':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_edgelabels(text={(u, v): "{}-{}".format(u, v)
                                     for u, v in mesh.edges()})
        artist.redraw()
        edge = rhino_helper.mesh_select_edge(mesh, message='edge')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(text={key: str(key) for key in edge})
        artist.redraw()
        vkey = rhino_helper.mesh_select_vertex(mesh, message='vkey')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        singular_boundary_1(mesh, edge, vkey)

    elif rule == 'singular_boundary_2':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_edgelabels(text={(u, v): "{}-{}".format(u, v)
                                     for u, v in mesh.edges()})
        artist.redraw()
        edge = rhino_helper.mesh_select_edge(mesh, message='edge')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(text={key: str(key) for key in edge})
        artist.redraw()
        vkey = rhino_helper.mesh_select_vertex(mesh, message='vkey')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        singular_boundary_2(mesh, edge, vkey)

    elif rule == 'singular_boundary_minus_1':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey = rhino_helper.mesh_select_face(mesh, message='fkey')
        artist.clear_layer()
        artist.redraw()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.face_vertices(fkey)})
        artist.redraw()
        vkey = rhino_helper.mesh_select_vertex(mesh, message='vkey')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        singular_boundary_minus_1(mesh, fkey, vkey)

    elif rule == 'face_strip_collapse':
        edge_groups, max_group = dual_edge_polylines(mesh)

        groups = {}

        for edge, group in edge_groups.items():
            u, v = edge
            if group in groups:
                if (v, u) not in groups[group]:
                    groups[group].append((u, v))
            else:
                groups[group] = [(u, v)]

        rs.EnableRedraw(False)
        dots = {}
        for group, edges in groups.items():
            k = float(group) / float(max_group) * 255
            RGB = [k] * 3
            rs.AddGroup(group)
            for u, v in edges:
                dot = rs.AddTextDot(group, mesh.edge_midpoint(u, v))
                dots[dot] = (u, v)
                rs.ObjectColor(dot, RGB)
                rs.AddObjectToGroup(dot, group)
        rs.EnableRedraw(True)

        dot = rs.GetObject('dual polyedge to collapse', filter=8192)
        u, v = dots[dot]
        rs.DeleteObjects(dots)

        face_strip_collapse(PseudoQuadMesh, mesh, u, v)

    elif rule == 'face_strip_insert':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        count = mesh.number_of_vertices() * 1.5
        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.vertices_on_boundary()})
        artist.redraw()
        vertex_path = [rhino_helper.mesh_select_vertex(mesh, message='vertex')]
        artist.clear_layer()
        count = mesh.number_of_vertices() * 1.5
        while count > 0:
            count -= 1
            artist.draw_vertexlabels(text={
                key: str(key)
                for key in mesh.vertex_neighbors(vertex_path[-1])
            })
            artist.redraw()
            vkey = rhino_helper.mesh_select_vertex(mesh, message='vertex')
            artist.clear_layer()
            artist.redraw()
            if vkey is None:
                break
            else:
                vertex_path.append(vkey)

        rs.DeleteLayer('mesh_artist')

        #start_pole = rs.GetInteger(message='pole at the start?', number=0, minimum=0, maximum=1)
        #end_pole = rs.GetInteger(message='pole at the end?', number=0, minimum=0, maximum=1)
        start_pole = 0
        end_pole = 0

        mesh = face_strip_insert(PseudoQuadMesh,
                                 mesh,
                                 vertex_path,
                                 pole_extremities=[start_pole, end_pole])

    elif rule == 'rotate_vertex':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.vertices()})
        artist.redraw()
        vkey = rhino_helper.mesh_select_vertex(mesh, message='vkey')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        rotate_vertex(mesh, vkey)

    elif rule == 'clear_faces':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkeys = rhino_helper.mesh_select_faces(mesh, message='fkeys')
        artist.clear_layer()
        artist.redraw()

        vertices = [mesh.vertex_coordinates(vkey) for vkey in mesh.vertices()]
        face_vertices = [mesh.face_vertices(fkey) for fkey in fkeys]

        faces_mesh = PseudoQuadMesh.from_vertices_and_faces(
            vertices, face_vertices)
        faces_boundary_vertices = mesh_boundaries(faces_mesh)[0]

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in faces_boundary_vertices})
        artist.redraw()
        vkeys = rhino_helper.mesh_select_vertices(mesh, message='vkeys')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        clear_faces(mesh, fkeys, vkeys)

    elif rule == 'add_handle':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey_1 = rhino_helper.mesh_select_face(mesh, message='fkey_1')
        artist.clear_layer()
        artist.redraw()

        artist.draw_facelabels()
        artist.redraw()
        fkey_2 = rhino_helper.mesh_select_face(mesh, message='fkey_2')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        add_handle(mesh, fkey_1, fkey_2)

    elif rule == 'close_handle':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_facelabels()
        artist.redraw()
        fkey_1 = rhino_helper.mesh_select_face(mesh, message='fkey_1')
        artist.clear_layer()
        artist.redraw()

        artist.draw_facelabels(
            text={key: str(key)
                  for key in mesh.face_neighbors(fkey_1)})
        artist.redraw()
        fkey_2 = rhino_helper.mesh_select_face(mesh, message='fkey_2')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        count = mesh.number_of_faces()
        fkeys = [fkey_1, fkey_2]
        while count > 0:
            count -= 1
            u, v = mesh.face_adjacency_halfedge(fkeys[-2], fkeys[-1])
            w = mesh.face_vertex_ancestor(fkeys[-1], v)
            x = mesh.face_vertex_ancestor(fkeys[-1], w)
            if x in mesh.halfedge[w] and mesh.halfedge[w][x] is not None:
                fkey_3 = mesh.halfedge[w][x]
                fkeys.append(fkey_3)
                if fkeys[-1] == fkeys[0]:
                    break

        close_handle(mesh, fkeys)

    elif rule == 'close_handle_2':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        edge_paths = []
        for i in range(2):

            vertex_path = []

            artist.draw_vertexlabels(
                text={key: str(key)
                      for key in mesh.vertices()})
            artist.redraw()
            vertex_path.append(
                rhino_helper.mesh_select_vertex(mesh, message='vertex'))
            artist.clear_layer()
            artist.redraw()

            count = mesh.number_of_vertices()
            while count > 0:
                count -= 1
                artist.draw_vertexlabels(
                    text={
                        key: str(key)
                        for key in mesh.vertex_neighbors(vertex_path[-1])
                    })
                artist.redraw()
                vkey = rhino_helper.mesh_select_vertex(mesh, message='vertex')
                if vkey is None:
                    break
                artist.clear_layer()
                artist.redraw()
                if vkey in list(mesh.vertices()):
                    vertex_path.append(vkey)
                else:
                    break
                if vkey == vertex_path[0]:
                    break
            del vertex_path[-1]
            edge_paths.append([[vertex_path[i - 1], vertex_path[i]]
                               for i in range(len(vertex_path))])

        rs.DeleteLayer('mesh_artist')

        edge_path_1, edge_path_2 = edge_paths

        mesh = close_handle_2(mesh, edge_path_1, edge_path_2)

    elif rule == 'move_vertices':
        artist = rhino_artist.MeshArtist(mesh, layer='mesh_artist')
        artist.clear_layer()

        artist.draw_vertexlabels(
            text={key: str(key)
                  for key in mesh.vertices()})
        artist.redraw()
        vkeys = rhino_helper.mesh_select_vertices(mesh, message='vkeys')
        artist.clear_layer()
        artist.redraw()

        rs.DeleteLayer('mesh_artist')

        x1, y1, z1 = rs.GetPoint(message='from...')
        x2, y2, z2 = rs.GetPoint(message='...to')

        for vkey in vkeys:
            attr = mesh.vertex[vkey]
            attr['x'] += x2 - x1
            attr['y'] += y2 - y1
            attr['z'] += z2 - z1

    elif rule == 'project_on_surface':
        srf = rs.GetObject('surface for projection', filter=8)
        for vkey in mesh.vertices():
            u, v = rs.SurfaceClosestPoint(srf, mesh.vertex_coordinates(vkey))
            x, y, z = rs.EvaluateSurface(srf, u, v)
            attr = mesh.vertex[vkey]
            attr['x'] = x
            attr['y'] = y
            attr['z'] = z

    return 0