# ##### 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 ##### bl_info = { "name": "Add PolySphere", "author": "Andy Davies (metalliandy)", "version": (0,1,5), "blender": (2, 5, 8), "api": 37702, "location": "View3D > Add > Mesh > PolySphere", "description": "Adds a PolySphere (all quads) for sculpting", "warning": "", "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"\ "Scripts/Add_Mesh/Add_PolySphere", "tracker_url": "", "category": "Add Mesh"} """ About this script:- This script enables the creation of a "PolySphere": an all quad sphere for use in sculpting and is intended to be used in place of a standard UVSphere, where the poles on would cause pinching and other unwanted artefacts. Apart from being all quads, the advantages are that the topology is distributed evenly across the surface and that they also use only around 80% of the geometry of a comparable resolution UV sphere. Usage:- Activate the script via the "Add-Ons" tab under the user preferences. The PolySphere can then be accessed via Add Mesh> PolySphere. Related Links:- http://blenderartists.org/forum/showthread.php?t=205444 http://www.metalliandy.com Thanks to:- Dealga McArdle (zeffii) - http://www.digitalaphasia.com Version history:- v0.1.5 - Ammended script for compatibility with recent API changes. v0.1.4 - Ammended script and changed bl_info for compatibility with recent API changes. v0.1.3 - Ammended script for compatibility with recent API changes. v0.1.2 - Ammended script meta information for compatibility with recent API changes. v0.1.1 - Cleaned code up a little and incresed the scale of the final PolySphere to 2 units. v0.1 - Initial revision. """ import bpy def Add_PolySphere(): #Add Cube to scene bpy.ops.mesh.primitive_cube_add() #Changes name of Cube to PolySphere adds the variable cube cube = bpy.context.object cube.name = "PolySphere" #Positions Cube primitive to scene centre bpy.context.active_object.location = [0, 0, 0] #Adds Subsurf Modifier bpy.ops.object.modifier_add(type='SUBSURF') #Selects Subsurf Modifier for editing subsurf = cube.modifiers['Subsurf'] #Changes Subsurf levels subsurf.levels = 3 #Applys Subsurf Modifier bpy.ops.object.modifier_apply(apply_as='DATA', modifier="Subsurf") #Adds smooth shading bpy.ops.object.shade_smooth() #Change to Editmode bpy.ops.object.editmode_toggle() #Selects cube in Editmode bpy.ops.mesh.select_all(action='TOGGLE') #Adds transform "To Sphere" bpy.ops.transform.tosphere(value=1) #Change to Objectmode bpy.ops.object.editmode_toggle() #Scales Object to 2.0 Units bpy.ops.transform.resize(value=(1.15525, 1.15525, 1.15525), constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1, snap=False, snap_target='CLOSEST', snap_point=(0, 0, 0), snap_align=False, snap_normal=(0, 0, 0), release_confirm=False) #Applys location, rotation and scale data bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) #makes PolySphere an operator class AddPolySphere(bpy.types.Operator): bl_idname = "mesh.primitive_polysphere_add" bl_label = "Add PolySphere" bl_options = {'REGISTER', 'UNDO'} def execute(self, context): Add_PolySphere() return {'FINISHED'} # Register the operator def menu_func(self, context): self.layout.operator(AddPolySphere.bl_idname, text="PolySphere", icon='PLUGIN') def register(): bpy.utils.register_module(__name__) bpy.types.INFO_MT_mesh_add.append(menu_func) def unregister(): bpy.utils.unregister_module(__name__) bpy.types.INFO_MT_mesh_add.remove(menu_func) if __name__ == "__main__": register()