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>2011-12-31 00:30:01 +0400
committerClemens Barth <barth@root-1.de>2011-12-31 00:30:01 +0400
commitd3bcfd681c12fa23b9c143adfb8cd6af4909133a (patch)
tree3e15d5e1cd56301f9fc67644fae60a9f4e770aa4 /io_mesh_pdb/import_pdb.py
parent70de5e77feb19acd49d552b83e440dc90f08e081 (diff)
Dear all.
Here comes version 1.2 ! New === 1. Double and tripple bonds can now be displayed. The option 'bonds' needs to be checked. One can also choose the distance between the sticks. 2. If the bool 'smooth' is checked the shape of the sticks is more round. Changes ======= - Buttons, which depend on other buttons, are grayed out as soon as the 'master button' is deactivated. - Other small bug fixes With this version 1.2 I consider the PDB project as 'accomplished' so far. Of course, I will keep an eye on any critics, changes, bug fixes and so on. Please, let me know if you find any bugs. Thanks. Happy New Year! Blendphys
Diffstat (limited to 'io_mesh_pdb/import_pdb.py')
-rw-r--r--io_mesh_pdb/import_pdb.py144
1 files changed, 116 insertions, 28 deletions
diff --git a/io_mesh_pdb/import_pdb.py b/io_mesh_pdb/import_pdb.py
index d007603f..cf559d91 100644
--- a/io_mesh_pdb/import_pdb.py
+++ b/io_mesh_pdb/import_pdb.py
@@ -25,7 +25,7 @@
#
# Start of project : 2011-08-31 by Clemens Barth
# First publication in Blender : 2011-11-11
-# Last modified : 2011-12-26
+# Last modified : 2011-12-30
#
# Acknowledgements: Thanks to ideasman, meta_androcto, truman, kilon,
# dairin0d, PKHG, Valter, etc
@@ -35,8 +35,10 @@ import bpy
import io
import math
import os
+import copy
from math import pi, cos, sin
from mathutils import Vector, Matrix
+from copy import copy
# These are variables, which contain the name of the PDB file and
# the path of the PDB file.
@@ -207,10 +209,12 @@ class CLASS_atom_pdb_atom(object):
# This is the class, which stores the two atoms of one stick.
class CLASS_atom_pdb_stick(object):
- __slots__ = ('atom1', 'atom2')
- def __init__(self, atom1, atom2):
+ __slots__ = ('atom1', 'atom2', 'number', 'dist')
+ def __init__(self, atom1, atom2, number, dist):
self.atom1 = atom1
self.atom2 = atom2
+ self.number = number
+ self.dist = dist
# -----------------------------------------------------------------------------
@@ -492,7 +496,9 @@ def DEF_atom_pdb_radius_sticks(radius, how):
return True
-# This reads a custom data file.
+# -----------------------------------------------------------------------------
+# The custom data file
+
def DEF_atom_pdb_custom_datafile(path_datafile):
if path_datafile == "":
@@ -560,7 +566,9 @@ def DEF_atom_pdb_custom_datafile(path_datafile):
def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
Ball_radius_factor,radiustype,Ball_distance_factor,
- use_sticks,use_sticks_color,Stick_sectors,Stick_diameter,put_to_center,
+ use_sticks,use_sticks_color,use_sticks_smooth,
+ use_sticks_bonds,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.
@@ -849,10 +857,34 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
atom1 = atom_list[0]
# For all the other atoms in the list do:
- for each_atom in atom_list[1:]:
-
- # The second, third, ... partner atom
- atom2 = each_atom
+ for atom2 in atom_list[1:]:
+
+ if use_sticks_bonds == True:
+ number = atom_list[1:].count(atom2)
+ if number == 2 or number == 3:
+ basis_list = list(set(atom_list[1:]))
+
+ if len(basis_list) > 1:
+ basis1 = (all_atoms[atom1-1].location
+ - all_atoms[basis_list[0]-1].location)
+ basis2 = (all_atoms[atom1-1].location
+ - all_atoms[basis_list[1]-1].location)
+ plane_n = basis1.cross(basis2)
+
+ dist_n = (all_atoms[atom1-1].location
+ - all_atoms[atom2-1].location)
+ dist_n = dist_n.cross(plane_n)
+ dist_n = dist_n / dist_n.length
+ else:
+ dist_n = Vector((0,0,0))
+ elif number > 3:
+ number = 1
+ dist_n = None
+ else:
+ dist_n = None
+ else:
+ number = 1
+ dist_n = None
# Note that in a PDB file, sticks of one atom pair can appear a
# couple of times. (Only god knows why ...)
@@ -869,7 +901,7 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
# If the stick is not yet registered (FLAG_BAR == False), then
# register it!
if FLAG_BAR == False:
- all_sticks.append(CLASS_atom_pdb_stick(atom1,atom2))
+ all_sticks.append(CLASS_atom_pdb_stick(atom1,atom2,number,dist_n))
Number_of_sticks += 1
j += 1
@@ -1169,27 +1201,79 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
continue
sticks_list = []
for stick in all_sticks:
- dv = all_atoms[stick.atom1-1].location - all_atoms[stick.atom2-1].location
- n = dv / dv.length
- if atom_type[0] == all_atoms[stick.atom1-1].name:
- location = all_atoms[stick.atom1-1].location
- name = "_" + all_atoms[stick.atom1-1].name
- material = all_atoms[stick.atom1-1].material
- sticks_list.append([name, location, dv, material])
- if atom_type[0] == all_atoms[stick.atom2-1].name:
- location = all_atoms[stick.atom1-1].location - n * dl * int(math.ceil(dv.length / (2.0 * dl)))
- name = "_" + all_atoms[stick.atom2-1].name
- material = all_atoms[stick.atom2-1].material
- sticks_list.append([name, location, dv, material])
+
+ for repeat in range(stick.number):
+
+ atom1 = copy(all_atoms[stick.atom1-1].location)
+ atom2 = copy(all_atoms[stick.atom2-1].location)
+
+ dist = Stick_diameter * Stick_dist
+
+ if stick.number == 2:
+ if repeat == 0:
+ atom1 += (stick.dist * dist)
+ atom2 += (stick.dist * dist)
+ if repeat == 1:
+ atom1 -= (stick.dist * dist)
+ atom2 -= (stick.dist * dist)
+
+ if stick.number == 3:
+ if repeat == 0:
+ atom1 += (stick.dist * dist)
+ atom2 += (stick.dist * dist)
+ if repeat == 2:
+ atom1 -= (stick.dist * dist)
+ atom2 -= (stick.dist * dist)
+
+ dv = atom1 - atom2
+ n = dv / dv.length
+ if atom_type[0] == all_atoms[stick.atom1-1].name:
+ location = atom1
+ name = "_" + all_atoms[stick.atom1-1].name
+ material = all_atoms[stick.atom1-1].material
+ sticks_list.append([name, location, dv, material])
+ if atom_type[0] == all_atoms[stick.atom2-1].name:
+ location = atom1 - n * dl * int(math.ceil(dv.length / (2.0 * dl)))
+ name = "_" + all_atoms[stick.atom2-1].name
+ material = all_atoms[stick.atom2-1].material
+ sticks_list.append([name, location, dv, material])
+
sticks_all_lists.append(sticks_list)
else:
sticks_list = []
for stick in all_sticks:
- dv = all_atoms[stick.atom1-1].location - all_atoms[stick.atom2-1].location
- n = dv / dv.length
- location = all_atoms[stick.atom1-1].location
- material = stick_material
- sticks_list.append(["", location, dv, material])
+
+ if stick.number > 3:
+ stick.number = 1
+
+ for repeat in range(stick.number):
+
+ atom1 = copy(all_atoms[stick.atom1-1].location)
+ atom2 = copy(all_atoms[stick.atom2-1].location)
+
+ dist = Stick_diameter * Stick_dist
+
+ if stick.number == 2:
+ if repeat == 0:
+ atom1 += (stick.dist * dist)
+ atom2 += (stick.dist * dist)
+ if repeat == 1:
+ atom1 -= (stick.dist * dist)
+ atom2 -= (stick.dist * dist)
+ if stick.number == 3:
+ if repeat == 0:
+ atom1 += (stick.dist * dist)
+ atom2 += (stick.dist * dist)
+ if repeat == 2:
+ atom1 -= (stick.dist * dist)
+ atom2 -= (stick.dist * dist)
+
+ dv = atom1 - atom2
+ n = dv / dv.length
+ location = atom1
+ material = stick_material
+ sticks_list.append(["", location, dv, material])
+
sticks_all_lists.append(sticks_list)
@@ -1238,8 +1322,12 @@ def DEF_atom_pdb_main(use_mesh,Ball_azimuth,Ball_zenith,
current_layers = bpy.context.scene.layers
stick_cylinder = DEF_atom_pdb_build_stick(Stick_diameter, dl, Stick_sectors)
stick_cylinder.active_material = stick[3]
- stick_cylinder.parent = new_mesh
+
+ if use_sticks_smooth == True:
+ for face in stick_cylinder.data.faces:
+ face.use_smooth = True
+ stick_cylinder.parent = new_mesh
new_mesh.dupli_type = 'FACES'
atom_object_list.append(new_mesh)