1
$\begingroup$

Its possible to change that's median (global) value trough script?

enter image description here

$\endgroup$
2
  • 1
    $\begingroup$ The question is a bit unclear. Are you looking to transform the selected faces, so that their median global location will be some other xyz vector value? $\endgroup$
    – TLousky
    Commented Aug 4, 2021 at 12:48
  • $\begingroup$ yes that's right, i get confused due there are no tooltips if hover on their median value $\endgroup$ Commented Aug 4, 2021 at 12:54

2 Answers 2

4
+50
$\begingroup$

BMesh version.

For an edit mode script can also use an edit mode bmesh.

Test script, move selected verts such that their mean global location is (1, 0, 0)

import bpy
import bmesh
from mathutils import Vector

coord = Vector((1, 0, 0))
space = 'GLOBAL'

context = bpy.context


ob = context.edit_object
mw = ob.matrix_world
coord = coord if space == 'LOCAL' else mw.inverted() @ coord
me = ob.data

bm = bmesh.from_edit_mesh(me)
verts = [v for v in bm.verts if v.select]
# need at least one selected
o = sum((v.co for v in verts), Vector()) / len(verts)

bmesh.ops.translate(
        bm,
        verts=verts,
        vec= coord - o
        )
        
bmesh.update_edit_mesh(me)
$\endgroup$
1
$\begingroup$

You should calculate the midpoint manually, then the difference vector that moves vertices and finally move selected parts in local coordinates because blender stores vertex-locations in local coordinates.

this code does such work: (just enter your desired value into world_pos variable)

import bpy
from mathutils import Vector as vec, Matrix as mat

# this is your input world position for center
world_pos = vec((4,0,0))

def move_center(world_pos:vec):
    obj = bpy.context.object
    bpy.ops.object.mode_set(mode='OBJECT')
    selected_verts = [v for v in obj.data.vertices if v.select]
    print(selected_verts)
    if len(selected_verts) == 0:
        return
    center_local = vec((0,0,0))
    for v in selected_verts:
        center_local += v.co
    center_local /= len(selected_verts)
    local_pos = obj.matrix_world.inverted() @ world_pos
    dif = local_pos - center_local
    for v in selected_verts:
        v.co += dif
    bpy.ops.object.mode_set(mode='EDIT')

if __name__ == "__main__":
    move_center(world_pos)
$\endgroup$
3
  • $\begingroup$ thanks for your answer, i just run that's script in edit mode with selected face but get error, prnt.sc/1jcnv03 it seem the script doesn't work on mine could you please clarify or edit your answer? $\endgroup$ Commented Aug 5, 2021 at 8:02
  • $\begingroup$ @cheatPKL check this one out $\endgroup$ Commented Aug 5, 2021 at 8:48
  • $\begingroup$ thank you, now its work as i wanted $\endgroup$ Commented Aug 5, 2021 at 12:34

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .