Skip to content
Snippets Groups Projects
Commit dd829de7 authored by Campbell Barton's avatar Campbell Barton
Browse files

removing this PDB importer in preparation to replace with a re-written one...

removing this PDB importer in preparation to replace with a re-written one which supports more file types
parent 0d8f63f8
No related branches found
No related tags found
No related merge requests found
# ##### 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 #####
# <pep8-80 compliant>
bl_info = {
"name": "Import/Export: PDB format",
"author": "Mariusz Maximus & Jong89",
"version": (0, 9, 0),
"blender": (2, 6, 0),
"api": 35616,
"location": "File > Import/Export > PDB",
"description": "Import PDB files",
"warning": "",
"wiki_url": "http://blenderartists.org/forum/showthread.php?t=194336",
"tracker_url": "http://blenderartists.org/forum/showthread.php?t=194336",
"category": "Import-Export"}
# @todo write the wiki page
# To support reload properly, try to access a package var,
# if it's there, reload everything
if "bpy" in locals():
import imp
if "import_pdb" in locals():
imp.reload(import_pdb)
import bpy
from bpy.props import (StringProperty,
BoolProperty,
IntProperty,
FloatProperty,
)
from bpy_extras.io_utils import ImportHelper
class ImportPDB(bpy.types.Operator, ImportHelper):
"""Import from PDB file format (.pdb)"""
bl_idname = 'import_scene.pdb'
bl_label = 'Import PDB'
bl_options = {'REGISTER', 'UNDO'}
filename_ext = ".pdb"
filter_glob = StringProperty(default="*.pdb", options={'HIDDEN'})
filepath = StringProperty(
name="File Path",
description="Filepath used for importing the PDB file",
maxlen=1024,
)
multi_models = BoolProperty(
name="Import all models",
description="Import all alternative structures listed in file",
default=False,
)
multimers = BoolProperty(
name="Import Biomolecules",
description="Import all file-listed biomolecules and multimers, "
"disable to import default biomolecule with "
"all chains",
default=False,
)
retain_alts = BoolProperty(
name="Retain Alternative Atoms",
description="Select to retain alternative atoms. "
"Some PDB files label coordinates of entries "
"in multiple models as alternates",
default=False,
)
atom_subdivisions = IntProperty(
name="Atom Subdivisions",
description="Number of icosphere subdivisions for the atoms",
min=1, max=6,
default=3,
)
atom_size = FloatProperty(
name="Atom Size",
description="Multiplier for the van der Waals radius of the atoms",
min=0.0, max=5.0,
default=1.0,
)
scene_scale = FloatProperty(
name="Scene Scale Factor",
description="Number of Blender units equivalent to 1 angstrom",
min=0.0, max=10.0,
default=1.0,
)
def execute(self, context):
from . import import_pdb
keywords = self.as_keywords(ignore=("filter_glob", ))
import_pdb.load_pdb(context, **keywords)
return {'FINISHED'}
def invoke(self, context, event):
wm = context.window_manager
wm.fileselect_add(self)
return {'RUNNING_MODAL'}
def menu_func(self, context):
self.layout.operator(ImportPDB.bl_idname, text='Protein Databank (.pdb)')
def register():
bpy.utils.register_module(__name__)
bpy.types.INFO_MT_file_import.append(menu_func)
def unregister():
bpy.utils.unregister_module(__name__)
bpy.types.INFO_MT_file_import.remove(menu_func)
if __name__ == '__main__':
register()
# ##### 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 #####
# <pep8 compliant>
# TODO, currently imported names are assumed to make valid blender names
# this is _not_ assured, so we should use a reliable dict mapping.
import bpy
class Element:
"""Element class with properties ([R, G, B], cov_radius, vdw_radius, name)"""
def __init__(self, color, cov_radius, vdw_radius, name):
self.color = color
self.cov_radius = cov_radius
self.vdw_radius = vdw_radius
self.name = name
class Atom:
"""Atom class with properties (serial, name, altloc, resname,chainid,
resseq, icode, x, y, z, occupancy, tempfactor, element, charge)"""
def __init__(self, serial, name, altloc, resname, chainid, resseq, icode,
x, y, z, occupancy, tempfactor, element, charge):
self.serial = serial
self.name = name
self.altloc = altloc
self.resname = resname
self.chainid = chainid
self.resseq = resseq
self.icode = icode
self.x = x
self.y = y
self.z = z
self.occupancy = occupancy
self.tempfactor = tempfactor
self.element = element
self.charge = charge
# collection of biomolecules based on model
# all chains in model stored here
class Model:
'''Model class'''
def __init__(self, model_id):
self.model_id = model_id
self.atoms = {}
self.atom_count = 0
self.vert_list = []
# Dictionary of {vert index: [list of vertex groups it belongs to]}
# Now element only
self.vert_group_index = {}
# Dictionary of {vertex group: number of group members}
self.vert_group_counts = {}
self.chains = {}
# new object level class
class Biomolecule:
'''Biomolecule'''
def __init__(self, serial):
self.serial = serial
self.atom_count = 0
self.vert_list = []
self.vert_group_index = {}
self.vert_group_counts = {}
self.chain_transforms = {}
# Atom collection
class Chain:
'''Chain'''
def __init__(self, chain_id):
self.chain_id = chain_id
self.atoms = {}
# Atomic data from http://www.ccdc.cam.ac.uk/products/csd/radii/
# Color palatte adapted from Jmol
# "Element symbol":[[Red, Green, Blue], Covalent radius, van der Waals radius,
# Element name]
# Atomic radii are in angstroms (100 pm)
# Unknown covalent radii are assigned 1.5 A, unknown van der Waals radiii are
# assigned 2 A,
atom_data = {
"H" : Element((1.00000, 1.00000, 1.00000), 0.23, 1.09, "Hydrogen" ),
"HE": Element((0.85098, 1.00000, 1.00000), 1.5 , 1.4 , "Helium" ),
"LI": Element((0.80000, 0.50196, 1.00000), 1.28, 1.82, "Lithium" ),
"BE": Element((0.76078, 1.00000, 0.00000), 0.96, 2 , "Beryllium" ),
"B" : Element((1.00000, 0.70980, 0.70980), 0.83, 2 , "Boron" ),
"C" : Element((0.56471, 0.56471, 0.56471), 0.68, 1.7 , "Carbon" ),
"N" : Element((0.18824, 0.31373, 0.97255), 0.68, 1.55, "Nitrogen" ),
"O" : Element((1.00000, 0.05098, 0.05098), 0.68, 1.52, "Oxygen" ),
"F" : Element((0.56471, 0.87843, 0.31373), 0.64, 1.47, "Fluorine" ),
"NE": Element((0.70196, 0.89020, 0.96078), 1.5 , 1.54, "Neon" ),
"NA": Element((0.67059, 0.36078, 0.94902), 1.66, 2.27, "Sodium" ),
"MG": Element((0.54118, 1.00000, 0.00000), 1.41, 1.73, "Magnesium" ),
"AL": Element((0.74902, 0.65098, 0.65098), 1.21, 2 , "Aluminum" ),
"SI": Element((0.94118, 0.78431, 0.62745), 1.2 , 2.1 , "Silicon" ),
"P" : Element((1.00000, 0.50196, 0.00000), 1.05, 1.8 , "Phosphorus" ),
"S" : Element((1.00000, 1.00000, 0.18824), 1.02, 1.8 , "Sulfur" ),
"CL": Element((0.12157, 0.94118, 0.12157), 0.99, 1.75, "Chlorine" ),
"AR": Element((0.50196, 0.81961, 0.89020), 1.51, 1.88, "Argon" ),
"K" : Element((0.56078, 0.25098, 0.83137), 2.03, 2.75, "Potassium" ),
"CA": Element((0.23922, 1.00000, 0.00000), 1.76, 2 , "Calcium" ),
"SC": Element((0.90196, 0.90196, 0.90196), 1.7 , 2 , "Scandium" ),
"TI": Element((0.74902, 0.76078, 0.78039), 1.6 , 2 , "Titanium" ),
"V" : Element((0.65098, 0.65098, 0.67059), 1.53, 2 , "Vanadium" ),
"CR": Element((0.54118, 0.60000, 0.78039), 1.39, 2 , "Chromium" ),
"MN": Element((0.61176, 0.47843, 0.78039), 1.61, 2 , "Manganese" ),
"FE": Element((0.87843, 0.40000, 0.20000), 1.52, 2 , "Iron" ),
"CO": Element((0.94118, 0.56471, 0.62745), 1.26, 2 , "Cobalt" ),
"NI": Element((0.31373, 0.81569, 0.31373), 1.24, 1.63, "Nickel" ),
"CU": Element((0.78431, 0.50196, 0.20000), 1.32, 1.4 , "Copper" ),
"ZN": Element((0.49020, 0.50196, 0.69020), 1.22, 1.39, "Zinc" ),
"GA": Element((0.76078, 0.56078, 0.56078), 1.22, 1.87, "Gallium" ),
"GE": Element((0.40000, 0.56078, 0.56078), 1.17, 2 , "Germanium" ),
"AS": Element((0.74118, 0.50196, 0.89020), 1.21, 1.85, "Arsenic" ),
"SE": Element((1.00000, 0.63137, 0.00000), 1.22, 1.9 , "Selenium" ),
"BR": Element((0.65098, 0.16078, 0.16078), 1.21, 1.85, "Bromine" ),
"KR": Element((0.36078, 0.72157, 0.81961), 1.5 , 2.02, "Krypton" ),
"RB": Element((0.43922, 0.18039, 0.69020), 2.2 , 2 , "Rubidium" ),
"SR": Element((0.00000, 1.00000, 0.00000), 1.95, 2 , "Strontium" ),
"Y" : Element((0.58039, 1.00000, 1.00000), 1.9 , 2 , "Yttrium" ),
"ZR": Element((0.58039, 0.87843, 0.87843), 1.75, 2 , "Zirconium" ),
"NB": Element((0.45098, 0.76078, 0.78824), 1.64, 2 , "Niobium" ),
"MO": Element((0.32941, 0.70980, 0.70980), 1.54, 2 , "Molybdenum" ),
"TC": Element((0.23137, 0.61961, 0.61961), 1.47, 2 , "Technetium" ),
"RU": Element((0.14118, 0.56078, 0.56078), 1.46, 2 , "Ruthenium" ),
"RH": Element((0.03922, 0.49020, 0.54902), 1.45, 2 , "Rhodium" ),
"PD": Element((0.00000, 0.41176, 0.52157), 1.39, 1.63, "Palladium" ),
"AG": Element((0.75294, 0.75294, 0.75294), 1.45, 1.72, "Silver" ),
"CD": Element((1.00000, 0.85098, 0.56078), 1.44, 1.58, "Cadmium" ),
"IN": Element((0.65098, 0.45882, 0.45098), 1.42, 1.93, "Indium" ),
"SN": Element((0.40000, 0.50196, 0.50196), 1.39, 2.17, "Tin" ),
"SB": Element((0.61961, 0.38824, 0.70980), 1.39, 2 , "Antimony" ),
"TE": Element((0.83137, 0.47843, 0.00000), 1.47, 2.06, "Tellurium" ),
"I" : Element((0.58039, 0.00000, 0.58039), 1.4 , 1.98, "Iodine" ),
"XE": Element((0.25882, 0.61961, 0.69020), 1.5 , 2.16, "Xenon" ),
"CS": Element((0.34118, 0.09020, 0.56078), 2.44, 2 , "Cesium" ),
"BA": Element((0.00000, 0.78824, 0.00000), 2.15, 2 , "Barium" ),
"LA": Element((0.43922, 0.83137, 1.00000), 2.07, 2 , "Lanthanum" ),
"CE": Element((1.00000, 1.00000, 0.78039), 2.04, 2 , "Cerium" ),
"PR": Element((0.85098, 1.00000, 0.78039), 2.03, 2 , "Praseodymium" ),
"ND": Element((0.78039, 1.00000, 0.78039), 2.01, 2 , "Neodymium" ),
"PM": Element((0.63922, 1.00000, 0.78039), 1.99, 2 , "Promethium" ),
"SM": Element((0.56078, 1.00000, 0.78039), 1.98, 2 , "Samarium" ),
"EE": Element((0.38039, 1.00000, 0.78039), 1.98, 2 , "Europium" ),
"GD": Element((0.27059, 1.00000, 0.78039), 1.96, 2 , "Gadolinium" ),
"TB": Element((0.18824, 1.00000, 0.78039), 1.94, 2 , "Terbium" ),
"DY": Element((0.12157, 1.00000, 0.78039), 1.92, 2 , "Dysprosium" ),
"HO": Element((0.00000, 1.00000, 0.61176), 1.92, 2 , "Holmium" ),
"ER": Element((0.00000, 0.90196, 0.45882), 1.89, 2 , "Erbium" ),
"TM": Element((0.00000, 0.83137, 0.32157), 1.9 , 2 , "Thulium" ),
"YB": Element((0.00000, 0.74902, 0.21961), 1.87, 2 , "Ytterbium" ),
"LU": Element((0.00000, 0.67059, 0.14118), 1.87, 2 , "Lutetium" ),
"HF": Element((0.30196, 0.76078, 1.00000), 1.75, 2 , "Hafnium" ),
"TA": Element((0.30196, 0.65098, 1.00000), 1.7 , 2 , "Tantalum" ),
"W" : Element((0.12941, 0.58039, 0.83922), 1.62, 2 , "Tungsten" ),
"RE": Element((0.14902, 0.49020, 0.67059), 1.51, 2 , "Rhenium" ),
"OS": Element((0.14902, 0.40000, 0.58824), 1.44, 2 , "Osmium" ),
"IR": Element((0.09020, 0.32941, 0.52941), 1.41, 2 , "Iridium" ),
"PT": Element((0.81569, 0.81569, 0.87843), 1.36, 1.72, "Platinum" ),
"AU": Element((1.00000, 0.81961, 0.13725), 1.5 , 1.66, "Gold" ),
"HG": Element((0.72157, 0.72157, 0.81569), 1.32, 1.55, "Mercury" ),
"TL": Element((0.65098, 0.32941, 0.30196), 1.45, 1.96, "Thallium" ),
"PB": Element((0.34118, 0.34902, 0.38039), 1.46, 2.02, "Lead" ),
"BI": Element((0.61961, 0.30980, 0.70980), 1.48, 2 , "Bismuth" ),
"PO": Element((0.67059, 0.36078, 0.00000), 1.4 , 2 , "Polonium" ),
"AT": Element((0.45882, 0.30980, 0.27059), 1.21, 2 , "Astatine" ),
"RN": Element((0.25882, 0.50980, 0.58824), 1.5 , 2 , "Radon" ),
"FR": Element((0.25882, 0.00000, 0.40000), 2.6 , 2 , "Francium" ),
"RA": Element((0.00000, 0.49020, 0.00000), 2.21, 2 , "Radium" ),
"AC": Element((0.43922, 0.67059, 0.98039), 2.15, 2 , "Actinium" ),
"TH": Element((0.00000, 0.72941, 1.00000), 2.06, 2 , "Thorium" ),
"PA": Element((0.00000, 0.63137, 1.00000), 2 , 2 , "Protactinium" ),
"U" : Element((0.00000, 0.56078, 1.00000), 1.96, 1.86, "Uranium" ),
"NP": Element((0.00000, 0.50196, 1.00000), 1.9 , 2 , "Neptunium" ),
"PU": Element((0.00000, 0.41961, 1.00000), 1.87, 2 , "Plutonium" ),
"AM": Element((0.32941, 0.36078, 0.94902), 1.8 , 2 , "Americium" ),
"CM": Element((0.47059, 0.36078, 0.89020), 1.69, 2 , "Curium" ),
"BK": Element((0.54118, 0.30980, 0.89020), 1.54, 2 , "Berkelium" ),
"CF": Element((0.63137, 0.21176, 0.83137), 1.83, 2 , "Californium" ),
"ES": Element((0.70196, 0.12157, 0.83137), 1.5 , 2 , "Einsteinium" ),
"FM": Element((0.70196, 0.12157, 0.72941), 1.5 , 2 , "Fermium" ),
"MD": Element((0.70196, 0.05098, 0.65098), 1.5 , 2 , "Mendelevium" ),
"NO": Element((0.74118, 0.05098, 0.52941), 1.5 , 2 , "Nobelium" ),
"LR": Element((0.78039, 0.00000, 0.40000), 1.5 , 2 , "Lawrencium" ),
"RF": Element((0.80000, 0.00000, 0.34902), 1.5 , 2 , "Rutherfordium"),
"DB": Element((0.81961, 0.00000, 0.30980), 1.5 , 2 , "Dubnium" ),
"SG": Element((0.85098, 0.00000, 0.27059), 1.5 , 2 , "Seaborgium" ),
"BH": Element((0.87843, 0.00000, 0.21961), 1.5 , 2 , "Bohrium" ),
"HS": Element((0.90196, 0.00000, 0.18039), 1.5 , 2 , "Hassium" ),
"MT": Element((0.92157, 0.00000, 0.14902), 1.5 , 2 , "Meitnerium" ),
"DS": Element((0.93725, 0.00000, 0.12157), 1.5 , 2 , "Darmstadtium" )
}
def load_pdb(context,
filepath="",
atom_size=1.0,
scene_scale=1.0,
atom_subdivisions=3,
retain_alts=False,
multi_models=False,
multimers=False,
):
scene = context.scene
file = open(filepath, 'r')
model_list = {}
model_flag = False
biomolecule_flag = False
biomolecule_list = {}
chain_list = []
mat_list = []
# -------------------------------------------------------------------------
# Parse data
for line in file:
# print(line)
if line[:6] == 'COMPND':
if line[11:17] == 'CHAIN:':
s = 17
for i in range(1, (len(line[17:]) + 1)):
if line[16 + i:17 + i] == ',':
chain_id = line[s:16 + i].strip()
chain_list.append(chain_id)
s = 17 + i
elif line[16 + i:17 + i] == ';':
chain_id = line[s:16 + i].strip()
chain_list.append(chain_id)
break
elif i == len(line[17:]):
chain_id = line[s:].strip()
chain_list.append(chain_id)
elif line[:10] == 'REMARK 300':
if line[11:23] == 'BIOMOLECULE:':
biomolecule_flag = True
s = 23
for i in range(1, (len(line[23:]) + 1)):
if line[22 + i:23 + i] == ',':
bm_serial = int(line[s:22 + i])
biomolecule_list[bm_serial] = Biomolecule(bm_serial)
s = 23 + i
elif i == len(line[23:]):
bm_serial = int(line[s:])
biomolecule_list[bm_serial] = Biomolecule(bm_serial)
elif line[:10] == 'REMARK 350':
if line[11:23] == 'BIOMOLECULE:':
cur_biomolecule = biomolecule_list[int(line[23:].strip())]
elif line[11:41] == 'APPLY THE FOLLOWING TO CHAINS:':
s = 41
cur_chain_list = []
for i in range(1, (len(line[41:]) + 1)):
if line[40 + i:41 + i] == ',':
cur_chain_list.append(line[s:40 + i].strip())
s = 41 + i
elif i == len(line[41:]):
cur_chain_list.append(line[s:].strip())
cur_biomolecule.chain_transforms[tuple(cur_chain_list)] = []
elif line[13:18] == 'BIOMT':
if line[18:19] == '1':
row1 = [float(line[24:33]), float(line[34:43]),
float(line[44:53]), float(line[60:68])]
elif line[18:19] == '2':
row2 = [float(line[24:33]), float(line[34:43]),
float(line[44:53]), float(line[60:68])]
elif line[18:19] == '3':
row3 = [float(line[24:33]), float(line[34:43]),
float(line[44:53]), float(line[60:68])]
cur_biomolecule.chain_transforms[tuple(cur_chain_list)].append([row1, row2, row3])
elif line[:5] == 'MODEL':
model_id = int(line[10:14])
model_list[model_id] = Model(model_id)
cur_model = model_list[model_id]
model_flag = True
for chain in chain_list:
cur_model.chains[chain] = Chain(chain)
elif line[:6] == 'ENDMDL':
cur_model = None
elif line[:4] == 'ATOM':
if not model_flag:
model_list[1] = Model(1)
cur_model = model_list[1]
model_flag = True
for chain in chain_list:
cur_model.chains[chain] = Chain(chain)
serial = int(line[6:11])
name = line[12:16].strip()
altloc = line[16:17]
resname = line[17:20]
chainid = line[21:22]
resseq = int(line[22:26])
icode = line[26:28].strip()
x = float(line[30:38]) * scene_scale
y = float(line[38:46]) * scene_scale
z = float(line[46:54]) * scene_scale
occupancy = float(line[54:60])
tempfactor = float(line[60:66])
element = line[76:78].strip()
charge = line[78:80].strip()
'''
print('******')
print('serial : ' )
print(serial)
print('name : ' )
print(name)
print('altloc : ' )
print(altloc)
print('resname : ' )
print(resname)
print('chainid : ' )
print(chainid)
print('resseq : ' )
print(resseq)
print('icode : ' )
print(icode)
print('x : ' )
print(x)
print('y : ' )
print(y)
print('z : ' )
print(z)
print('occupancy : ' )
print(occupancy)
print('tempfactor : ' )
print(tempfactor)
print('element : ' )
print(element)
print('charge : ' )
print(charge)
print('******')
'''
cur_model.chains[chainid].atoms[serial] = Atom(serial, name, altloc,
resname, chainid,
resseq, icode,
x, y, z, occupancy,
tempfactor, element,
charge)
file.close()
if (not multimers) or (not biomolecule_flag):
# Create a default biomolecule w/ all chains and identity transform
# Overwrites original biomolecule_list
biomolecule_flag = True
bm_serial = 1
biomolecule = Biomolecule(bm_serial)
biomolecule.chain_transforms[tuple(chain_list)] = [(((1.0, 0.0, 0.0, 0.0),
(0.0, 1.0, 0.0, 0.0),
(0.0, 0.0, 1.0, 0.0)))]
biomolecule_list = {bm_serial: biomolecule}
# -------------------------------------------------------------------------
# Create atom mesh template
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=atom_subdivisions,
size=(atom_size * scene_scale))
bpy.ops.object.shade_smooth()
atom_obj = scene.objects.active
atom_mesh = atom_obj.data
atom_mesh.name = 'Atom_Template'
scene.objects.unlink(atom_obj)
bpy.data.objects.remove(atom_obj)
layers = scene.layers
# After parsing and preparing the templates, generate the output
for model_id, model in model_list.items():
if (not multi_models) and model_id != 1:
break
for bm_serial, biomolecule in biomolecule_list.items():
biom_mesh_name = "Biomolecule%d.%d" % (bm_serial, model_id)
biom_mesh = bpy.data.meshes.new(biom_mesh_name)
cur_biom = bpy.data.objects.new(biom_mesh_name, biom_mesh)
scene.objects.link(cur_biom)
for chain_clones, transforms in biomolecule.chain_transforms.items():
for chain in chain_clones:
for transform in transforms:
# rotations
row1 = transform[0][0:3]
row2 = transform[1][0:3]
row3 = transform[2][0:3]
# translations
dx = transform[0][3]
dy = transform[1][3]
dz = transform[2][3]
for serial, atom in model.chains[chain].atoms.items():
# Prunes alternative locations for the atoms
# (should pick the one with highest occupancy but doesn't)
if (atom.altloc == ' ' or atom.altloc == 'A') or retain_alts:
element = atom_data[atom.element].name
# Generate master element models
if element not in mat_list:
# Create a master atom
mesh = atom_mesh.copy()
mesh.name = element
mat = bpy.data.materials.new(element)
mat.diffuse_color = atom_data[atom.element].color
mesh.materials.append(mat)
master_atom = bpy.data.objects.new(element, mesh)
master_atom.scale = [atom_data[atom.element].vdw_radius] * 3
master_atom.layers = layers
master_atom.name = element # why set again?
scene.objects.link(master_atom)
mat_list.append(element)
else:
pass
# Generate element vertex groups
if element not in cur_biom.vertex_groups:
cur_vert_group = cur_biom.vertex_groups.new(element)
#Adds a key in the vert_group_count
biomolecule.vert_group_counts[cur_vert_group] = 0
else:
cur_vert_group = cur_biom.vertex_groups[element]
# Generate particle systems
# (can be merged with vertex group generator)
if element not in cur_biom.particle_systems:
scene.objects.active = cur_biom
bpy.ops.object.particle_system_add()
psys = cur_biom.particle_systems.active
part = psys.settings
psys.name = element
part.name = "%s.%d.%d" % (element, bm_serial, model_id)
part.frame_start = 0
part.frame_end = 0
part.lifetime = 10000
part.emit_from = 'VERT'
part.use_emit_random = False
part.normal_factor = 0
part.particle_size = 1
part.render_type = 'OBJECT'
part.dupli_object = bpy.data.objects[element]
part.effector_weights.gravity = 0
psys.vertex_group_density = element
biomolecule.vert_group_index[biomolecule.atom_count] = cur_vert_group
biomolecule.vert_group_counts[cur_vert_group] += 1
biomolecule.atom_count += 1
tx = atom.x * row1[0] + atom.y * row1[1] + atom.z * row1[2] + (dx * scene_scale)
ty = atom.x * row2[0] + atom.y * row2[1] + atom.z * row2[2] + (dy * scene_scale)
tz = atom.x * row3[0] + atom.y * row3[1] + atom.z * row3[2] + (dz * scene_scale)
biomolecule.vert_list.extend([tx, ty, tz])
else:
pass
biom_mesh.vertices.add(biomolecule.atom_count)
biom_mesh.vertices.foreach_set('co', biomolecule.vert_list)
for vert_index, vert_group in biomolecule.vert_group_index.items():
aa = [] # neeed array to vertex_groups.assign
aa.append(vert_index)
vert_group.add(aa, 1, "ADD")
for vert_group, count in biomolecule.vert_group_counts.items():
bpy.data.particles["%s.%d.%d" % (vert_group.name, bm_serial, model_id)].count = count
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment