Vertex Chamfer Addon

Hi All,

Here is a script I wrote, partially because it’s useful and partially to demonstrate some of the new BMesh Py API. This script will chamfer a vertex (basically like bevel for vertices), you can use it by running in the text editor or installing it through the addon user preferences. Once you’ve run the script or enabled it as an addon, you can chamfer a vertex by using the spacebar menu and typing ‘Chamfer Vertex’.

You can download the .py from the link below:
Download Py

# ##### BEGIN GPL LICENSE BLOCK #####
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software Foundation,
#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####

# <pep8 compliant>

bl_info = {
    "name": "Vertex Chamfer",
    "author": "Andrew Hale (TrumanBlending)",
    "version": (0, 1),
    "blender": (2, 6, 3),
    "location": "Spacebar Menu",
    "description": "Chamfer vertex",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Mesh"}


import bpy
import bmesh


class VertexChamfer(bpy.types.Operator):
    bl_idname = "mesh.vertex_chamfer"
    bl_label = "Chamfer Vertex"
    bl_options = {'REGISTER', 'UNDO'}

    factor = bpy.props.FloatProperty(name="Factor",
                                     default=0.1,
                                     min=0.0,
                                     soft_max=1.0)
    relative = bpy.props.BoolProperty(name="Relative", default=True)
    dissolve = bpy.props.BoolProperty(name="Remove", default=True)
    displace = bpy.props.FloatProperty(name="Displace",
                                       soft_min=-5.0,
                                       soft_max=5.0)

    @classmethod
    def poll(self, context):
        return (context.active_object.type == 'MESH' and
                context.mode == 'EDIT_MESH')

    def draw(self, context):
        layout = self.layout
        layout.prop(self, "factor", text="Fac" if self.relative else "Dist")
        sub = layout.row()
        sub.prop(self, "relative")
        sub.prop(self, "dissolve")
        if not self.dissolve:
            layout.prop(self, "displace")

    def execute(self, context):
        ob = context.active_object
        me = ob.data
        bm = bmesh.from_edit_mesh(me)

        bm.select_flush(True)

        fac = self.factor
        rel = self.relative
        dissolve = self.dissolve
        displace = self.displace

        for v in bm.verts:
            v.tag = False

        # Loop over edges to find those with both verts selected
        for e in bm.edges[:]:
            e.tag = e.select
            if not e.select:
                continue
            elen = e.calc_length()
            val = fac if rel else fac / elen
            val = min(val, 0.5)
            # Loop over the verts of the edge to split
            for v in e.verts:
                en, vn = bmesh.utils.edge_split(e, v, val)
                en.tag = vn.tag = True
                val = 1.0 if val == 1.0 else val / (1.0 - val)

        # Get all verts which are selected but not created previously
        verts = [v for v in bm.verts if v.select and not v.tag]

        # Loop over all verts to split their linked edges
        for v in verts:
            for e in v.link_edges[:]:
                if e.tag:
                    continue
                elen = e.calc_length()
                val = fac if rel else fac / elen
                bmesh.utils.edge_split(e, v, val)

            # Loop over all the loops of the vert
            for l in v.link_loops:
                # Split the face
                bmesh.utils.face_split(l.face,
                                       l.link_loop_next.vert,
                                       l.link_loop_prev.vert)

            # Remove the vert or displace otherwise
            if dissolve:
                bmesh.utils.vert_dissolve(v)
            else:
                v.co += displace * v.normal

        me.calc_tessface()

        return {'FINISHED'}


def register():
    bpy.utils.register_module(__name__)


def unregister():
    bpy.utils.unregister_module(__name__)


if __name__ == "__main__":
    register()


Here are two quick examples first just selecting the corner of a cube and chamfer, the second just selecting all verts, chamfering with a displace value.


Hope this inspires some cool BMesh scripts!

Cheers,
Truman

Attachments


useful, thanks for posting. Its nice to see BMESH already inspiring/allowing-for some useful PyScripts.

That’s great, gotta give a try! Damn if only you released this earlier :slight_smile: I made the same you did in the pic, but one vertex a time and with knife tool -__-

EDIT: I can’t make it working. I copied pasted the code into wordpad, saved as .py - In blender, “install addon” and click the .py file, but it doesn’t show in the addon list. If i try to re install it, console tells me there are multiple addons with same name.

??

I posted the link in Bmesh thread. Hope you don’t mind.

I think the vertex chamfer script made doubles when you cut a single edge with the knife on a face and then chamfer the 2 verts. The script looks good.

Worked, don’t know why didn’t before.

Thanks

Glad you got it working.

Thank you TrumanBlending, this is a really useful script :slight_smile:

Good to hear it’s working marcoG_ita! And thanks for posting in the BMesh thread, always glad to have more eyes on an addon.

Thanks for the support ParticleXY, glad to hear it’s useful!

Cheers,
Truman

@ParticleXY - Yes is super useful and thanks for the help!

@TrumanBlending - Such a small addon but a huge speed up in daily work, we need more of this kind of scripts! Thanks a lot

I’m doing a super fast tips on how using the script for furnish modeling. If only i had this for my WIP, lol.

Kind regards

looks really good, well done.

Moved from “Python Support” to “Released Scripts and Themes”

usufulllll script thanks !

So greate !! thank you for this script !!

@TrumanBlending Please maybe can you create a true Chamfer Edge and/or Extrude Face along Curve “in live” like Maya, 3ds Max…?

Thank you so much @TrumanBlending

Great!! :yes:

way awesome, i was looking for the same functionality with bevel over vertices, now adding it to my next builds if Allah wishes :slight_smile:

Works on Cylinder with fan style ends(triangles) oretty sweet !

Can this be added to the Vertex Specials menu? Ctrl+V ?
Similar to how “Vertex Slide for Bmesh” is implemented, so we don’t have to use the search function.

+1 for adding this to Ctrl+V menù.

Thanks for your work, Truman!

Hi All,

Updated the script and it should be more robust now. Looking into adding it to a proper menu now.

Cheers,
Truman

Thanks Truman, nice Script!

Kind regards
Alain

i like that you added an option where it removes the vertex in the middle or not.