Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClemens Barth <barth@root-1.de>2012-11-03 23:38:28 +0400
committerClemens Barth <barth@root-1.de>2012-11-03 23:38:28 +0400
commit4a26b71a377679c0f5ff0ed7e5ee01db71446454 (patch)
treede2ce18003995a7db8667bf4973eae5d63061b08 /io_mesh_pdb/import_pdb.py
parent6b85cf59a853fdcd35e374e8b6e5a78249242ac9 (diff)
As discussed a couple of times in the IRC chat, we decided to separate the
panel from the import/export addons. This means that the panel has had to be removed also from the PDB importer/exporter. This is what I have done. Attention, this is a major change of the Atomic Blender PDB importer/exporter! A lot of test today have shown, that the new version of the PDB importer/exporter has not lost its stability. In the next days, I will perform other stability tests. Blendphys
Diffstat (limited to 'io_mesh_pdb/import_pdb.py')
-rw-r--r--io_mesh_pdb/import_pdb.py718
1 files changed, 211 insertions, 507 deletions
diff --git a/io_mesh_pdb/import_pdb.py b/io_mesh_pdb/import_pdb.py
index 70795f6c..f033b531 100644
--- a/io_mesh_pdb/import_pdb.py
+++ b/io_mesh_pdb/import_pdb.py
@@ -25,17 +25,6 @@ from math import pi, cos, sin
from mathutils import Vector, Matrix
from copy import copy
-# This variable contains the path of the PDB file.
-# It is used almost everywhere, which explains why it
-# should stay global. First, it is empty and gets 'filled' directly
-# after having chosen the PDB file (see 'class LoadPDB' further below).
-
-ATOM_PDB_FILEPATH = ""
-
-# Some string stuff for the console.
-ATOM_PDB_STRING = "Atomic Blender\n==================="
-
-
# -----------------------------------------------------------------------------
# Atom, stick and element data
@@ -200,393 +189,11 @@ class CLASS_atom_pdb_stick(object):
self.number = number
self.dist = dist
-# -----------------------------------------------------------------------------
-# Some small routines
-
-# Routine which produces a cylinder. All is somewhat easy to undertsand.
-def DEF_atom_pdb_build_stick(radius, length, sectors):
-
- dphi = 2.0 * pi/(float(sectors)-1)
-
- # Vertices
- vertices_top = [Vector((0,0,length / 2.0))]
- vertices_bottom = [Vector((0,0,-length / 2.0))]
- vertices = []
- for i in range(sectors-1):
- x = radius * cos( dphi * i )
- y = radius * sin( dphi * i )
- z = length / 2.0
- vertex = Vector((x,y,z))
- vertices_top.append(vertex)
- z = -length / 2.0
- vertex = Vector((x,y,z))
- vertices_bottom.append(vertex)
- vertices = vertices_top + vertices_bottom
-
- # Side facets (Cylinder)
- faces1 = []
- for i in range(sectors-1):
- if i == sectors-2:
- faces1.append( [i+1, 1, 1+sectors, i+1+sectors] )
- else:
- faces1.append( [i+1, i+2, i+2+sectors, i+1+sectors] )
-
- # Top facets
- faces2 = []
- for i in range(sectors-1):
- if i == sectors-2:
- face_top = [0,sectors-1,1]
- face_bottom = [sectors,2*sectors-1,sectors+1]
- else:
- face_top = [0]
- face_bottom = [sectors]
- for j in range(2):
- face_top.append(i+j+1)
- face_bottom.append(i+j+1+sectors)
- faces2.append(face_top)
- faces2.append(face_bottom)
-
- # Build the mesh, Cylinder
- cylinder = bpy.data.meshes.new("Sticks_Cylinder")
- cylinder.from_pydata(vertices, [], faces1)
- cylinder.update()
- new_cylinder = bpy.data.objects.new("Sticks_Cylinder", cylinder)
- bpy.context.scene.objects.link(new_cylinder)
-
- # Build the mesh, Cups
- cups = bpy.data.meshes.new("Sticks_Cups")
- cups.from_pydata(vertices, [], faces2)
- cups.update()
- new_cups = bpy.data.objects.new("Sticks_Cups", cups)
- bpy.context.scene.objects.link(new_cups)
-
- return (new_cylinder, new_cups)
-
-
-# This function measures the distance between two active objects (atoms).
-def DEF_atom_pdb_distance():
-
- if len(bpy.context.selected_bases) > 1:
- object_1 = bpy.context.selected_objects[0]
- object_2 = bpy.context.selected_objects[1]
- else:
- return "N.A."
-
- dv = object_2.location - object_1.location
- return str(dv.length)
-
-
-# Routine to modify the radii via the type: predefined, atomic or van der Waals
-# Explanations here are also valid for the next 3 DEFs.
-def DEF_atom_pdb_radius_type(rtype,how):
-
- if how == "ALL_IN_LAYER":
-
- # Note all layers that are active.
- layers = []
- for i in range(20):
- if bpy.context.scene.layers[i] == True:
- layers.append(i)
-
- # Put all objects, which are in the layers, into a list.
- change_objects = []
- for obj in bpy.context.scene.objects:
- for layer in layers:
- if obj.layers[layer] == True:
- change_objects.append(obj)
-
- # Consider all objects, which are in the list 'change_objects'.
- for obj in change_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- for element in ATOM_PDB_ELEMENTS:
- if element.name in obj.name:
- obj.children[0].scale = (element.radii[int(rtype)],) * 3
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- for element in ATOM_PDB_ELEMENTS:
- if element.name in obj.name:
- obj.scale = (element.radii[int(rtype)],) * 3
-
- if how == "ALL_ACTIVE":
- for obj in bpy.context.selected_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- for element in ATOM_PDB_ELEMENTS:
- if element.name in obj.name:
- obj.children[0].scale = (element.radii[int(rtype)],) * 3
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- for element in ATOM_PDB_ELEMENTS:
- if element.name in obj.name:
- obj.scale = (element.radii[int(rtype)],) * 3
-
-
-# Routine to modify the radii in picometer of a specific type of atom
-def DEF_atom_pdb_radius_pm(atomname, radius_pm, how):
-
- if how == "ALL_IN_LAYER":
-
- layers = []
- for i in range(20):
- if bpy.context.scene.layers[i] == True:
- layers.append(i)
-
- change_objects = []
- for obj in bpy.context.scene.objects:
- for layer in layers:
- if obj.layers[layer] == True:
- change_objects.append(obj)
-
- for obj in change_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- if atomname in obj.name:
- if "Stick" not in obj.name:
- obj.children[0].scale = (radius_pm/100,) * 3
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- if atomname in obj.name:
- if "Stick" not in obj.name:
- obj.scale = (radius_pm/100,) * 3
-
- if how == "ALL_ACTIVE":
- for obj in bpy.context.selected_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- if atomname in obj.name:
- if "Stick" not in obj.name:
- obj.children[0].scale = (radius_pm/100,) * 3
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- if atomname in obj.name:
- if "Stick" not in obj.name:
- obj.scale = (radius_pm/100,) * 3
-
-
-# Routine to scale the radii of all atoms
-def DEF_atom_pdb_radius_all(scale, how):
-
- if how == "ALL_IN_LAYER":
-
- layers = []
- for i in range(20):
- if bpy.context.scene.layers[i] == True:
- layers.append(i)
-
- change_objects = []
- for obj in bpy.context.scene.objects:
- for layer in layers:
- if obj.layers[layer] == True:
- change_objects.append(obj)
-
-
- for obj in change_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- if "Stick" not in obj.name:
- obj.children[0].scale *= scale
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- if "Stick" not in obj.name:
- obj.scale *= scale
-
- if how == "ALL_ACTIVE":
- for obj in bpy.context.selected_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- if "Stick" not in obj.name:
- obj.children[0].scale *= scale
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- if "Stick" not in obj.name:
- obj.scale *= scale
-
-
-# This routine downscales all atom radii onto the value of the stick radius
-# for showing the sticks.
-def DEF_atom_pdb_radius_sticks(radius, how):
-
- # Are there any sticks?
- Found = False
- if how == "ALL_IN_LAYER":
-
- layers = []
- for i in range(20):
- if bpy.context.scene.layers[i] == True:
- layers.append(i)
-
- change_objects = []
- for obj in bpy.context.scene.objects:
- for layer in layers:
- if obj.layers[layer] == True:
- change_objects.append(obj)
-
- for obj in change_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- if "Stick" in obj.name:
- Found = True
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- if "Stick" in obj.name:
- Found = True
-
- if how == "ALL_ACTIVE":
- for obj in bpy.context.selected_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- if "Stick" in obj.name:
- Found = True
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- if "Stick" in obj.name:
- Found = True
-
- if Found == False:
- return False
-
- if how == "ALL_IN_LAYER":
-
- layers = []
- for i in range(20):
- if bpy.context.scene.layers[i] == True:
- layers.append(i)
-
- change_objects = []
- for obj in bpy.context.scene.objects:
- for layer in layers:
- if obj.layers[layer] == True:
- change_objects.append(obj)
-
-
- for obj in change_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- if "Stick" not in obj.name:
- obj.children[0].scale = (radius,) * 3
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- if "Stick" not in obj.name:
- obj.scale = (radius,) * 3
-
- if how == "ALL_ACTIVE":
- for obj in bpy.context.selected_objects:
- if len(obj.children) != 0:
- if obj.children[0].type == "SURFACE" or obj.children[0].type == "MESH":
- if "Stick" not in obj.name:
- obj.children[0].scale = (radius,) * 3
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- if "Stick" not in obj.name:
- obj.scale = (radius,) * 3
-
- return True
-
-# -----------------------------------------------------------------------------
-# The custom data file
-
-def DEF_atom_pdb_custom_datafile(path_datafile):
-
- if path_datafile == "":
- return False
-
- path_datafile = bpy.path.abspath(path_datafile)
-
- if os.path.isfile(path_datafile) == False:
- return False
-
- # The whole list gets deleted! We build it new.
- ATOM_PDB_ELEMENTS[:] = []
-
- # Read the data file, which contains all data
- # (atom name, radii, colors, etc.)
- data_file_p = io.open(path_datafile, "r")
-
- for line in data_file_p:
-
- if "Atom" in line:
-
- line = data_file_p.readline()
-
- # Number
- line = data_file_p.readline()
- number = line[19:-1]
- # Name
- line = data_file_p.readline()
- name = line[19:-1]
- # Short name
- line = data_file_p.readline()
- short_name = line[19:-1]
- # Color
- line = data_file_p.readline()
- color_value = line[19:-1].split(',')
- color = [float(color_value[0]),
- float(color_value[1]),
- float(color_value[2])]
- # Used radius
- line = data_file_p.readline()
- radius_used = float(line[19:-1])
- # Atomic radius
- line = data_file_p.readline()
- radius_atomic = float(line[19:-1])
- # Van der Waals radius
- line = data_file_p.readline()
- radius_vdW = float(line[19:-1])
-
- radii = [radius_used,radius_atomic,radius_vdW]
- radii_ionic = []
-
- element = CLASS_atom_pdb_Elements(number,name,short_name,color,
- radii, radii_ionic)
-
- ATOM_PDB_ELEMENTS.append(element)
-
- data_file_p.close()
-
- for obj in bpy.context.selected_objects:
- if len(obj.children) != 0:
- child = obj.children[0]
- if child.type == "SURFACE" or child.type == "MESH":
- for element in ATOM_PDB_ELEMENTS:
- if element.name in obj.name:
- child.scale = (element.radii[0],) * 3
- child.active_material.diffuse_color = element.color
- else:
- if obj.type == "SURFACE" or obj.type == "MESH":
- for element in ATOM_PDB_ELEMENTS:
- if element.name in obj.name:
- obj.scale = (element.radii[0],) * 3
- obj.active_material.diffuse_color = element.color
-
- return True
# -----------------------------------------------------------------------------
-# The main routine
-
-def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
- Ball_radius_factor,radiustype,Ball_distance_factor,
- use_sticks,use_sticks_color,use_sticks_smooth,
- use_sticks_bonds, Stick_unit, Stick_dist,
- Stick_sectors,Stick_diameter,put_to_center,
- use_camera,use_lamp,path_datafile):
-
- # The list of all atoms as read from the PDB file.
- all_atoms = []
-
- # The list of all sticks.
- all_sticks = []
-
- # List of materials
- atom_material_list = []
+# Some basic routines
- # A list of ALL objects which are loaded (needed for selecting the loaded
- # structure.
- atom_object_list = []
-
-
- # ------------------------------------------------------------------------
- # INITIALIZE THE ELEMENT LIST
+def DEF_atom_pdb_read_elements():
ATOM_PDB_ELEMENTS[:] = []
@@ -602,17 +209,21 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
radii,radii_ionic)
ATOM_PDB_ELEMENTS.append(li)
- # ------------------------------------------------------------------------
- # READING DATA OF ATOMS
- if DEF_atom_pdb_custom_datafile(path_datafile):
- print("Custom data file is loaded.")
+# filepath_pdb: path to pdb file
+# radiustype : '0' default
+# '1' atomic radii
+# '2' van der Waals
+def DEF_atom_pdb_read_pdb_file(filepath_pdb,radiustype):
+
+ # The list of all atoms as read from the PDB file.
+ all_atoms = []
- # Open the file ...
- ATOM_PDB_FILEPATH_p = io.open(ATOM_PDB_FILEPATH, "r")
+ # Open the pdb file ...
+ filepath_pdb_p = io.open(filepath_pdb, "r")
#Go to the line, in which "ATOM" or "HETATM" appears.
- for line in ATOM_PDB_FILEPATH_p:
+ for line in filepath_pdb_p:
split_list = line.split(' ')
if "ATOM" in split_list[0]:
break
@@ -729,80 +340,31 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
radius,
color,[]))
- line = ATOM_PDB_FILEPATH_p.readline()
+ line = filepath_pdb_p.readline()
line = line[:-1]
- ATOM_PDB_FILEPATH_p.close()
+ filepath_pdb_p.close()
# From above it can be clearly seen that j is now the number of all atoms.
Number_of_total_atoms = j
- # ------------------------------------------------------------------------
- # MATERIAL PROPERTIES FOR ATOMS
-
- # The list that contains info about all types of atoms is created
- # here. It is used for building the material properties for
- # instance (see below).
- atom_all_types_list = []
-
- for atom in all_atoms:
- FLAG_FOUND = False
- for atom_type in atom_all_types_list:
- # If the atom name is already in the list, FLAG on 'True'.
- if atom_type[0] == atom.name:
- FLAG_FOUND = True
- break
- # No name in the current list has been found? => New entry.
- if FLAG_FOUND == False:
- # Stored are: Atom label (e.g. 'Na'), the corresponding atom
- # name (e.g. 'Sodium') and its color.
- atom_all_types_list.append([atom.name, atom.element, atom.color])
-
- # The list of materials is built.
- # Note that all atoms of one type (e.g. all hydrogens) get only ONE
- # material! This is good because then, by activating one atom in the
- # Blender scene and changing the color of this atom, one changes the color
- # of ALL atoms of the same type at the same time.
-
- # Create first a new list of materials for each type of atom
- # (e.g. hydrogen)
- for atom_type in atom_all_types_list:
- material = bpy.data.materials.new(atom_type[1])
- material.name = atom_type[0]
- material.diffuse_color = atom_type[2]
- atom_material_list.append(material)
+ return (Number_of_total_atoms, all_atoms)
+
- # Now, we go through all atoms and give them a material. For all atoms ...
- for atom in all_atoms:
- # ... and all materials ...
- for material in atom_material_list:
- # ... select the correct material for the current atom via
- # comparison of names ...
- if atom.name in material.name:
- # ... and give the atom its material properties.
- # However, before we check, if it is a vacancy, because then it
- # gets some additional preparation. The vacancy is represented
- # by a transparent cube.
- if atom.name == "Vacancy":
- material.transparency_method = 'Z_TRANSPARENCY'
- material.alpha = 1.3
- material.raytrace_transparency.fresnel = 1.6
- material.raytrace_transparency.fresnel_factor = 1.6
- material.use_transparency = True
- # The atom gets its properties.
- atom.material = material
+def DEF_atom_pdb_read_pdb_file_sticks(filepath_pdb,
+ use_sticks_bonds):
- # ------------------------------------------------------------------------
- # READING DATA OF STICKS
+ # The list of all sticks.
+ all_sticks = []
- # Open the PDB file again such that the file pointer is in the first
- # line ... . Stupid, I know ... ;-)
- ATOM_PDB_FILEPATH_p = io.open(ATOM_PDB_FILEPATH, "r")
+ # Open the PDB file again.
+ filepath_pdb_p = io.open(filepath_pdb, "r")
+ line = filepath_pdb_p.readline()
split_list = line.split(' ')
# Go to the first entry
if "CONECT" not in split_list[0]:
- for line in ATOM_PDB_FILEPATH_p:
+ for line in filepath_pdb_p:
split_list = line.split(' ')
if "CONECT" in split_list[0]:
break
@@ -902,11 +464,178 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
Number_of_sticks += 1
j += 1
- line = ATOM_PDB_FILEPATH_p.readline()
+ line = filepath_pdb_p.readline()
line = line.rstrip()
- ATOM_PDB_FILEPATH_p.close()
- # So far, all atoms and sticks have been registered.
+ filepath_pdb_p.close()
+
+ return all_sticks
+
+
+# Routine which produces a cylinder. All is somewhat easy to undertsand.
+def DEF_atom_pdb_build_stick(radius, length, sectors):
+
+ dphi = 2.0 * pi/(float(sectors)-1)
+
+ # Vertices
+ vertices_top = [Vector((0,0,length / 2.0))]
+ vertices_bottom = [Vector((0,0,-length / 2.0))]
+ vertices = []
+ for i in range(sectors-1):
+ x = radius * cos( dphi * i )
+ y = radius * sin( dphi * i )
+ z = length / 2.0
+ vertex = Vector((x,y,z))
+ vertices_top.append(vertex)
+ z = -length / 2.0
+ vertex = Vector((x,y,z))
+ vertices_bottom.append(vertex)
+ vertices = vertices_top + vertices_bottom
+
+ # Side facets (Cylinder)
+ faces1 = []
+ for i in range(sectors-1):
+ if i == sectors-2:
+ faces1.append( [i+1, 1, 1+sectors, i+1+sectors] )
+ else:
+ faces1.append( [i+1, i+2, i+2+sectors, i+1+sectors] )
+
+ # Top facets
+ faces2 = []
+ for i in range(sectors-1):
+ if i == sectors-2:
+ face_top = [0,sectors-1,1]
+ face_bottom = [sectors,2*sectors-1,sectors+1]
+ else:
+ face_top = [0]
+ face_bottom = [sectors]
+ for j in range(2):
+ face_top.append(i+j+1)
+ face_bottom.append(i+j+1+sectors)
+ faces2.append(face_top)
+ faces2.append(face_bottom)
+
+ # Build the mesh, Cylinder
+ cylinder = bpy.data.meshes.new("Sticks_Cylinder")
+ cylinder.from_pydata(vertices, [], faces1)
+ cylinder.update()
+ new_cylinder = bpy.data.objects.new("Sticks_Cylinder", cylinder)
+ bpy.context.scene.objects.link(new_cylinder)
+
+ # Build the mesh, Cups
+ cups = bpy.data.meshes.new("Sticks_Cups")
+ cups.from_pydata(vertices, [], faces2)
+ cups.update()
+ new_cups = bpy.data.objects.new("Sticks_Cups", cups)
+ bpy.context.scene.objects.link(new_cups)
+
+ return (new_cylinder, new_cups)
+
+
+# -----------------------------------------------------------------------------
+# The main routine
+
+def DEF_atom_pdb_main(use_mesh,
+ Ball_azimuth,
+ Ball_zenith,
+ Ball_radius_factor,
+ radiustype,
+ Ball_distance_factor,
+ use_sticks,
+ use_sticks_color,
+ use_sticks_smooth,
+ use_sticks_bonds,
+ Stick_unit, Stick_dist,
+ Stick_sectors,
+ Stick_diameter,
+ put_to_center,
+ use_camera,
+ use_lamp,
+ filepath_pdb):
+
+
+ # List of materials
+ atom_material_list = []
+
+ # A list of ALL objects which are loaded (needed for selecting the loaded
+ # structure.
+ atom_object_list = []
+
+
+ # ------------------------------------------------------------------------
+ # INITIALIZE THE ELEMENT LIST
+
+ DEF_atom_pdb_read_elements()
+
+ # ------------------------------------------------------------------------
+ # READING DATA OF ATOMS
+
+ (Number_of_total_atoms, all_atoms) = DEF_atom_pdb_read_pdb_file(filepath_pdb,
+ radiustype)
+
+ # ------------------------------------------------------------------------
+ # MATERIAL PROPERTIES FOR ATOMS
+
+ # The list that contains info about all types of atoms is created
+ # here. It is used for building the material properties for
+ # instance (see below).
+ atom_all_types_list = []
+
+ for atom in all_atoms:
+ FLAG_FOUND = False
+ for atom_type in atom_all_types_list:
+ # If the atom name is already in the list, FLAG on 'True'.
+ if atom_type[0] == atom.name:
+ FLAG_FOUND = True
+ break
+ # No name in the current list has been found? => New entry.
+ if FLAG_FOUND == False:
+ # Stored are: Atom label (e.g. 'Na'), the corresponding atom
+ # name (e.g. 'Sodium') and its color.
+ atom_all_types_list.append([atom.name, atom.element, atom.color])
+
+ # The list of materials is built.
+ # Note that all atoms of one type (e.g. all hydrogens) get only ONE
+ # material! This is good because then, by activating one atom in the
+ # Blender scene and changing the color of this atom, one changes the color
+ # of ALL atoms of the same type at the same time.
+
+ # Create first a new list of materials for each type of atom
+ # (e.g. hydrogen)
+ for atom_type in atom_all_types_list:
+ material = bpy.data.materials.new(atom_type[1])
+ material.name = atom_type[0]
+ material.diffuse_color = atom_type[2]
+ atom_material_list.append(material)
+
+ # Now, we go through all atoms and give them a material. For all atoms ...
+ for atom in all_atoms:
+ # ... and all materials ...
+ for material in atom_material_list:
+ # ... select the correct material for the current atom via
+ # comparison of names ...
+ if atom.name in material.name:
+ # ... and give the atom its material properties.
+ # However, before we check, if it is a vacancy, because then it
+ # gets some additional preparation. The vacancy is represented
+ # by a transparent cube.
+ if atom.name == "Vacancy":
+ material.transparency_method = 'Z_TRANSPARENCY'
+ material.alpha = 1.3
+ material.raytrace_transparency.fresnel = 1.6
+ material.raytrace_transparency.fresnel_factor = 1.6
+ material.use_transparency = True
+ # The atom gets its properties.
+ atom.material = material
+
+ # ------------------------------------------------------------------------
+ # READING DATA OF STICKS
+
+ all_sticks = DEF_atom_pdb_read_pdb_file_sticks(filepath_pdb,
+ use_sticks_bonds)
+
+
+ # So far, all atoms, sticks and materials have been registered.
# ------------------------------------------------------------------------
# TRANSLATION OF THE STRUCTURE TO THE ORIGIN
@@ -975,16 +704,14 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
camera_xyz_vec = object_center_vec + object_camera_vec
# Create the camera
- current_layers=bpy.context.scene.layers
- bpy.ops.object.camera_add(view_align=False, enter_editmode=False,
- location=camera_xyz_vec,
- rotation=(0.0, 0.0, 0.0), layers=current_layers)
- # Some properties of the camera are changed.
- camera = bpy.context.scene.objects.active
- camera.name = "A_camera"
- camera.data.name = "A_camera"
- camera.data.lens = 45
- camera.data.clip_end = 500.0
+ current_layers=bpy.context.scene.layers
+ camera_data = bpy.data.cameras.new("A_camera")
+ camera_data.lens = 45
+ camera_data.clip_end = 500.0
+ camera = bpy.data.objects.new("A_camera", camera_data)
+ camera.location = camera_xyz_vec
+ camera.layers = current_layers
+ bpy.context.scene.objects.link(camera)
# Here the camera is rotated such it looks towards the center of
# the object. The [0.0, 0.0, 1.0] vector along the z axis
@@ -1027,36 +754,19 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
# Create the lamp
current_layers=bpy.context.scene.layers
- bpy.ops.object.lamp_add (type = 'POINT', view_align=False,
- location=lamp_xyz_vec,
- rotation=(0.0, 0.0, 0.0),
- layers=current_layers)
- # Some properties of the lamp are changed.
- lamp = bpy.context.scene.objects.active
- lamp.data.name = "A_lamp"
- lamp.name = "A_lamp"
- lamp.data.distance = 500.0
- lamp.data.energy = 3.0
- lamp.data.shadow_method = 'RAY_SHADOW'
+ lamp_data = bpy.data.lamps.new(name="A_lamp", type="POINT")
+ lamp_data.distance = 500.0
+ lamp_data.energy = 3.0
+ lamp_data.shadow_method = 'RAY_SHADOW'
+ lamp = bpy.data.objects.new("A_lamp", lamp_data)
+ lamp.location = lamp_xyz_vec
+ lamp.layers = current_layers
+ bpy.context.scene.objects.link(lamp)
bpy.context.scene.world.light_settings.use_ambient_occlusion = True
bpy.context.scene.world.light_settings.ao_factor = 0.2
# ------------------------------------------------------------------------
- # SOME OUTPUT ON THE CONSOLE
-
- print()
- print()
- print()
- print(ATOM_PDB_STRING)
- print()
- print("Total number of atoms : " + str(Number_of_total_atoms))
- print("Total number of sticks : " + str(Number_of_sticks))
- print("Center of object (Angstrom) : ", object_center_vec)
- print("Size of object (Angstrom) : ", object_size)
- print()
-
- # ------------------------------------------------------------------------
# SORTING THE ATOMS
# Lists of atoms of one type are created. Example:
@@ -1154,8 +864,6 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
new_atom_mesh.location = object_center_vec
atom_object_list.append(new_atom_mesh)
- print()
-
# ------------------------------------------------------------------------
# DRAWING THE STICKS
@@ -1323,7 +1031,3 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
if obj:
bpy.context.scene.objects.active = obj
- print("\n\nAll atoms (%d) and sticks (%d) have been drawn - finished.\n\n"
- % (Number_of_total_atoms,Number_of_sticks))
-
- return Number_of_total_atoms