| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- # ##### 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 #####
-
- # --------------------------------- UV to MESH ------------------------------- #
- # -------------------------------- version 0.1.1 ----------------------------- #
- # #
- # Create a new Mesh based on active UV #
- # #
- # (c) Alessandro Zomparelli #
- # (2017) #
- # #
- # http://www.co-de-it.com/ #
- # #
- # ############################################################################ #
-
- import bpy
- import math
- from bpy.types import Operator
- from bpy.props import BoolProperty
- from mathutils import Vector
- from .utils import *
-
-
- class uv_to_mesh(Operator):
- bl_idname = "object.uv_to_mesh"
- bl_label = "UV to Mesh"
- bl_description = ("Create a new Mesh based on active UV")
- bl_options = {'REGISTER', 'UNDO'}
-
- apply_modifiers : BoolProperty(
- name="Apply Modifiers",
- default=True,
- description="Apply object's modifiers"
- )
- vertex_groups : BoolProperty(
- name="Keep Vertex Groups",
- default=True,
- description="Transfer all the Vertex Groups"
- )
- materials : BoolProperty(
- name="Keep Materials",
- default=True,
- description="Transfer all the Materials"
- )
- auto_scale : BoolProperty(
- name="Resize",
- default=True,
- description="Scale the new object in order to preserve the average surface area"
- )
-
- def execute(self, context):
- bpy.ops.object.mode_set(mode='OBJECT')
- ob0 = bpy.context.object
- for o in bpy.context.view_layer.objects: o.select_set(False)
- ob0.select_set(True)
-
- #if self.apply_modifiers:
- # bpy.ops.object.duplicate_move()
- # bpy.ops.object.convert(target='MESH')
-
- # me0 = ob0.to_mesh(bpy.context.depsgraph, apply_modifiers=self.apply_modifiers)
- #if self.apply_modifiers: me0 = simple_to_mesh(ob0)
- #else: me0 = ob0.data.copy()
- name0 = ob0.name
- ob0 = convert_object_to_mesh(ob0, apply_modifiers=self.apply_modifiers, preserve_status=False)
- me0 = ob0.data
- area = 0
-
- verts = []
- faces = []
- face_materials = []
- for face in me0.polygons:
- area += face.area
- uv_face = []
- store = False
- try:
- for loop in face.loop_indices:
- uv = me0.uv_layers.active.data[loop].uv
- if uv.x != 0 and uv.y != 0:
- store = True
- new_vert = Vector((uv.x, uv.y, 0))
- verts.append(new_vert)
- uv_face.append(loop)
- if store:
- faces.append(uv_face)
- face_materials.append(face.material_index)
- except:
- self.report({'ERROR'}, "Missing UV Map")
-
- return {'CANCELLED'}
-
- name = name0 + '_UV'
- # Create mesh and object
- me = bpy.data.meshes.new(name + 'Mesh')
- ob = bpy.data.objects.new(name, me)
-
- # Link object to scene and make active
- scn = bpy.context.scene
- bpy.context.collection.objects.link(ob)
- bpy.context.view_layer.objects.active = ob
- ob.select_set(True)
-
- # Create mesh from given verts, faces.
- me.from_pydata(verts, [], faces)
- # Update mesh with new data
- me.update()
- if self.auto_scale:
- new_area = 0
- for p in me.polygons:
- new_area += p.area
- if new_area == 0:
- self.report({'ERROR'}, "Impossible to generate mesh from UV")
- bpy.data.objects.remove(ob0)
-
- return {'CANCELLED'}
-
- # VERTEX GROUPS
- if self.vertex_groups:
- for group in ob0.vertex_groups:
- index = group.index
- ob.vertex_groups.new(name=group.name)
- for p in me0.polygons:
- for vert, loop in zip(p.vertices, p.loop_indices):
- try:
- ob.vertex_groups[index].add([loop], group.weight(vert), 'REPLACE')
- except:
- pass
-
- ob0.select_set(False)
- if self.auto_scale:
- scaleFactor = math.pow(area / new_area, 1 / 2)
- ob.scale = Vector((scaleFactor, scaleFactor, scaleFactor))
-
- bpy.ops.object.mode_set(mode='EDIT', toggle=False)
- bpy.ops.mesh.remove_doubles(threshold=1e-06)
- bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
- bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
-
- # MATERIALS
- if self.materials:
- try:
- # assign old material
- uv_materials = [slot.material for slot in ob0.material_slots]
- for i in range(len(uv_materials)):
- bpy.ops.object.material_slot_add()
- bpy.context.object.material_slots[i].material = uv_materials[i]
- for i in range(len(ob.data.polygons)):
- ob.data.polygons[i].material_index = face_materials[i]
- except:
- pass
- '''
- if self.apply_modifiers:
- bpy.ops.object.mode_set(mode='OBJECT')
- ob.select_set(False)
- ob0.select_set(True)
- bpy.ops.object.delete(use_global=False)
- ob.select_set(True)
- bpy.context.view_layer.objects.active = ob
- '''
-
- bpy.data.objects.remove(ob0)
- bpy.data.meshes.remove(me0)
- return {'FINISHED'}
|