import Blender from Blender import * # Sortim d'editmode, si no la seleccio no va be in_editMode = Window.EditMode() if in_editMode: Window.EditMode(0,'Face subdivide (from script)') def Baricenter(vlist): px = py = pz = 0.0 for v in vlist: px = px+v[0] py = py+v[1] pz = pz+v[2] n = len(vlist) p = NMesh.Vert(px/n,py/n,pz/n) return p def copyFaceProps(f1, f2): f2.col = f1.col f2.mat = f1.mat f2.mode = f1.mode f2.smooth = f1.smooth f2.transp = f1.transp f2.uv = f1.uv # programa principal obj = Blender.Object.GetSelected()[0] if obj.getType()!="Mesh": Draw.PupMenu("ERROR: Object is not a mesh") else: me = obj.getData() # formem una llista amb totes les cares seleccionades lsf = [] for f in me.faces: sel_f = len(f.v)>2 for v in f.v: sel_f = sel_f and v.sel if sel_f: lsf.append(f) if len(lsf)==0: fact = None else: fact = Draw.PupFloatInput('Displacement',0,-100,100,10,2) if fact!=None: for f in lsf: # afegim el baricentre desplacat de la cara bari = Baricenter(f.v) bari.sel = 1 for i in range(3): bari.co[i] = bari.co[i]+f.normal[i]*fact me.verts.append(bari) # substitum cada cara per les noves cares (triangulars) numvx = len(f.v) # afegim les cares noves for idx in range(numvx): vx1 = f.v[idx] vx2 = f.v[(idx+1) % numvx] newf = NMesh.Face([vx1,vx2,bari]) copyFaceProps(f, newf) me.faces.append(newf) # esborrem la cara antiga me.faces.remove(f) me.update(1) # Tornem al mode original if in_editMode: Window.EditMode(1)