From 0b4e923d8baeb7a6bab326e3dfe8fcb7a45ae7b0 Mon Sep 17 00:00:00 2001
From: Clemens Barth <barth@root-1.de>
Date: Sat, 10 Nov 2012 16:36:31 +0000
Subject: [PATCH] 1. New: NURBS, mesh and meta balls can now be chosen as
 atoms.    I also updated the Wiki page. 2. There was a small mistake
 introduced by the last commits. This has been    fixed. 3. Code cleaning

Blendphys
---
 io_mesh_pdb/__init__.py   | 23 ++++++++++++++---------
 io_mesh_pdb/export_pdb.py |  2 +-
 io_mesh_pdb/import_pdb.py | 29 ++++++++++++++++++-----------
 3 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/io_mesh_pdb/__init__.py b/io_mesh_pdb/__init__.py
index 62c7ca67a..15d664261 100644
--- a/io_mesh_pdb/__init__.py
+++ b/io_mesh_pdb/__init__.py
@@ -50,7 +50,7 @@ bl_info = {
 }
 
 import bpy
-from bpy.types import Operator, Panel
+from bpy.types import Operator
 from bpy_extras.io_utils import ImportHelper, ExportHelper
 from bpy.props import (StringProperty,
                        BoolProperty,
@@ -79,9 +79,13 @@ class ImportPDB(Operator, ImportHelper):
     use_lamp = BoolProperty(
         name="Lamp", default=False,
         description = "Do you need a lamp?")
-    use_mesh = BoolProperty(
-        name = "Mesh balls", default=False,
-        description = "Use mesh balls instead of NURBS")
+    ball = EnumProperty(
+        name="Type of ball",
+        description="Choose ball",
+        items=(('0', "NURBS", "NURBS balls"),
+               ('1', "Mesh" , "Mesh balls"),
+               ('2', "Meta" , "Metaballs")),
+               default='0',) 
     mesh_azimuth = IntProperty(
         name = "Azimuth", default=32, min=1,
         description = "Number of sectors (azimuth)")
@@ -139,9 +143,10 @@ class ImportPDB(Operator, ImportHelper):
         row.prop(self, "use_lamp")
         row = layout.row()
         col = row.column()
-        col.prop(self, "use_mesh")
-        col = row.column(align=True)
-        col.active = self.use_mesh
+        col.prop(self, "ball")
+        row = layout.row()
+        row.active = (self.ball == "1")
+        col = row.column(align=True)             
         col.prop(self, "mesh_azimuth")
         col.prop(self, "mesh_zenith")
         row = layout.row()
@@ -179,8 +184,8 @@ class ImportPDB(Operator, ImportHelper):
         filepath_pdb = bpy.path.abspath(self.filepath)
 
         # Execute main routine                
-        atom_number = import_pdb.import_pdb(
-                      self.use_mesh,
+        import_pdb.import_pdb(
+                      self.ball,
                       self.mesh_azimuth,
                       self.mesh_zenith,
                       self.scale_ballradius,
diff --git a/io_mesh_pdb/export_pdb.py b/io_mesh_pdb/export_pdb.py
index 515f9482b..81b60cb90 100644
--- a/io_mesh_pdb/export_pdb.py
+++ b/io_mesh_pdb/export_pdb.py
@@ -35,7 +35,7 @@ def export_pdb(obj_type, filepath_pdb):
         if "Stick" in obj.name:
             continue
             
-        if obj.type != "SURFACE" and obj.type != "MESH":
+        if obj.type not in {'MESH', 'SURFACE', 'META'}:
             continue 
        
         name = ""
diff --git a/io_mesh_pdb/import_pdb.py b/io_mesh_pdb/import_pdb.py
index fec026b44..95a83ae34 100644
--- a/io_mesh_pdb/import_pdb.py
+++ b/io_mesh_pdb/import_pdb.py
@@ -17,7 +17,6 @@
 # ##### END GPL LICENSE BLOCK #####
 
 import bpy
-import os
 from math import pi, cos, sin, sqrt, ceil
 from mathutils import Vector, Matrix
 from copy import copy
@@ -245,11 +244,12 @@ def read_pdb_file(filepath_pdb, radiustype):
             color = [0,0,0]
             location = Vector((0,0,0))
             # Append the TER into the list. Material remains empty so far.
-            all_atoms.append(AtomProp(short_name,
-                                                 name,
-                                                 location,
-                                                 radius,
-                                                 color,[]))
+            all_atoms.append(AtomProp(short_name, 
+                                      name, 
+                                      location, 
+                                      radius,
+                                      color,[]))
+                                      
         # If 'ATOM or 'HETATM' appears in the line then do ...
         elif "ATOM" in line or "HETATM" in line:
 
@@ -345,7 +345,7 @@ def read_pdb_file(filepath_pdb, radiustype):
     return (Number_of_total_atoms, all_atoms)
     
 
-def read_pdb_file_sticks(filepath_pdb, use_sticks_bonds):
+def read_pdb_file_sticks(filepath_pdb, use_sticks_bonds, all_atoms):
 
     # The list of all sticks.
     all_sticks = []
@@ -529,7 +529,7 @@ def build_stick(radius, length, sectors):
 # -----------------------------------------------------------------------------
 #                                                            The main routine
 
-def import_pdb(use_mesh,
+def import_pdb(Ball_type,
                Ball_azimuth,
                Ball_zenith,
                Ball_radius_factor,
@@ -623,7 +623,9 @@ def import_pdb(use_mesh,
     # ------------------------------------------------------------------------
     # READING DATA OF STICKS
 
-    all_sticks = read_pdb_file_sticks(filepath_pdb, use_sticks_bonds)
+    all_sticks = read_pdb_file_sticks(filepath_pdb, 
+                                      use_sticks_bonds, 
+                                      all_atoms)
 
     # So far, all atoms, sticks and materials have been registered.
 
@@ -828,18 +830,23 @@ def import_pdb(use_mesh,
                             layers=current_layers)
         else:
             # NURBS balls
-            if use_mesh == False:
+            if Ball_type == "0":
                 bpy.ops.surface.primitive_nurbs_surface_sphere_add(
                             view_align=False, enter_editmode=False,
                             location=(0,0,0), rotation=(0.0, 0.0, 0.0),
                             layers=current_layers)
             # UV balls
-            else:
+            elif Ball_type == "1":
                 bpy.ops.mesh.primitive_uv_sphere_add(
                             segments=Ball_azimuth, ring_count=Ball_zenith,
                             size=1, view_align=False, enter_editmode=False,
                             location=(0,0,0), rotation=(0, 0, 0),
                             layers=current_layers)
+            # Meta balls
+            elif Ball_type == "2":
+                bpy.ops.object.metaball_add(type='BALL', view_align=False, 
+                            enter_editmode=False, location=(0, 0, 0), 
+                            rotation=(0, 0, 0), layers=current_layers)
 
         ball = bpy.context.scene.objects.active
         ball.scale  = (atom[3]*Ball_radius_factor,) * 3
-- 
GitLab