Ejemplo n.º 1
0
    def show_curve(self,
                   radius=0,
                   band_length=0,
                   segment_subdivisions=10,
                   circle_subdivisions=15):

        m = self.molecule
        if m is None:
            return

        import tube
        s, plist = tube.tube_through_atoms(m.atoms, radius, band_length,
                                           segment_subdivisions,
                                           circle_subdivisions)
        if s is None:
            return

        s.name = 'path tracer curve'
        self.curve_parameters = (radius, band_length, segment_subdivisions)
        self.curve_model = s
        from chimera import addModelClosedCallback
        addModelClosedCallback(s, self.curve_model_closed_cb)

        import SimpleSession
        SimpleSession.noAutoRestore(s)
Ejemplo n.º 2
0
    def make_model(self, length, thickness, rgb, label, xy_offset, label_rgb,
                   model_id):

        m = chimera.Molecule()
        m.name = 'scale bar'

        #
        # Need to create a residue because atom without residue causes
        # unknown C++ exceptions.
        #
        rid = chimera.MolResId(1)
        r = m.newResidue('sb', rid)

        atoms = []
        for name, pos in (('1', (-length / 2.0, 0, 0)), ('2', (length / 2.0, 0,
                                                               0)),
                          ('label', (xy_offset[0],
                                     xy_offset[1] + thickness / 2.0, 0))):
            a = m.newAtom(name, chimera.elements.H)
            r.addAtom(a)
            c = chimera.Coord()
            c.x, c.y, c.z = pos
            a.setCoord(c)  # a.coord = c does not work
            a.display = 0
            atoms.append(a)
        m.atom1, m.atom2, m.label_atom = atoms
        m.label_atom.color = background_color()
        m.label_atom.display = 1

        b = m.newBond(m.atom1, m.atom2)
        b.display = b.Always
        b.drawMode = b.Stick
        b.radius = thickness / 2.0
        b.color = chimera_color(rgb)
        b.halfbond = 0
        m.label_atom.label = label
        m.label_atom.labelColor = chimera_color(label_rgb)

        self.model = m

        if model_id == None:
            id, subid = (self.model_id(), chimera.openModels.Default)
        else:
            id, subid = model_id
        chimera.openModels.add([m], baseId=id, subid=subid)
        chimera.addModelClosedCallback(m, self.model_closed_cb)

        import SimpleSession
        SimpleSession.noAutoRestore(m)

        m.openState.active = False
        z_near, z_far = clip_plane_positions()
        self.set_depth(.5 * (z_near + z_far))
        self.set_screen_position(self.screen_position)
        self.orientation_cb()

        return m
Ejemplo n.º 3
0
  def make_model(self, length, thickness, rgb, label, xy_offset, label_rgb,
                 model_id):

    m = chimera.Molecule()
    m.name = 'scale bar'
    
    #
    # Need to create a residue because atom without residue causes
    # unknown C++ exceptions.
    #
    rid = chimera.MolResId(1)
    r = m.newResidue('sb', rid)

    atoms = []
    for name, pos in (('1', (-length/2.0, 0, 0)),
                      ('2', (length/2.0, 0, 0)),
                      ('label',
                       (xy_offset[0], xy_offset[1] + thickness/2.0, 0))):
      a = m.newAtom(name, chimera.elements.H)
      r.addAtom(a)
      c = chimera.Coord()
      c.x, c.y, c.z = pos
      a.setCoord(c)                               # a.coord = c does not work
      a.display = 0
      atoms.append(a)
    m.atom1, m.atom2, m.label_atom = atoms
    m.label_atom.color = background_color()
    m.label_atom.display = 1
    
    b = m.newBond(m.atom1, m.atom2)
    b.display = b.Always
    b.drawMode = b.Stick
    b.radius = thickness/2.0
    b.color = chimera_color(rgb)
    b.halfbond = 0
    m.label_atom.label = label
    m.label_atom.labelColor = chimera_color(label_rgb)

    self.model = m

    if model_id == None:
      id, subid = (self.model_id(), chimera.openModels.Default)
    else:
      id, subid = model_id
    chimera.openModels.add([m], baseId = id, subid = subid)
    chimera.addModelClosedCallback(m, self.model_closed_cb)

    import SimpleSession
    SimpleSession.noAutoRestore(m)

    m.openState.active = False
    z_near, z_far = clip_plane_positions()
    self.set_depth(.5 * (z_near + z_far))
    self.set_screen_position(self.screen_position)
    self.orientation_cb()

    return m
Ejemplo n.º 4
0
def restoreSession_RibbonStyleEditor():
	import SimpleSession
	import RibbonStyleEditor
	userScalings = []
	userXSections = []
	userResidueClasses = []
	residueData = [(6, 'Chimera default', 'rounded', 'unknown'), (7, 'Chimera default', 'rounded', 'unknown'), (8, 'Chimera default', 'rounded', 'unknown'), (9, 'Chimera default', 'rounded', 'unknown'), (10, 'Chimera default', 'rounded', 'unknown'), (11, 'Chimera default', 'rounded', 'unknown'), (12, 'Chimera default', 'rounded', 'unknown'), (13, 'Chimera default', 'rounded', 'unknown'), (14, 'Chimera default', 'rounded', 'unknown'), (15, 'Chimera default', 'rounded', 'unknown'), (16, 'Chimera default', 'rounded', 'unknown'), (17, 'Chimera default', 'rounded', 'unknown')]
	flags = RibbonStyleEditor.NucleicDefault1
	SimpleSession.registerAfterModelsCB(RibbonStyleEditor.restoreState,
				(userScalings, userXSections,
				userResidueClasses, residueData, flags))
Ejemplo n.º 5
0
def restoreSession_RibbonStyleEditor():
	import SimpleSession
	import RibbonStyleEditor
	userScalings = [('licorice', [[0.35, 0.35], [0.35, 0.35], [0.35, 0.35], [0.35, 0.35, 0.35, 0.35], [0.35, 0.35]])]
	userXSections = []
	userResidueClasses = []
	residueData = [(6, 'Chimera default', 'rounded', u'unknown'), (7, 'Chimera default', 'rounded', u'unknown'), (8, 'Chimera default', 'rounded', u'unknown'), (9, 'Chimera default', 'rounded', u'unknown'), (10, 'Chimera default', 'rounded', u'unknown'), (11, 'Chimera default', 'rounded', u'unknown')]
	flags = RibbonStyleEditor.NucleicDefault1
	SimpleSession.registerAfterModelsCB(RibbonStyleEditor.restoreState,
				(userScalings, userXSections,
				userResidueClasses, residueData, flags))
Ejemplo n.º 6
0
def restoreSession_RibbonStyleEditor():
    import SimpleSession
    import RibbonStyleEditor
    userScalings = []
    userXSections = []
    userResidueClasses = []
    residueData = []
    flags = RibbonStyleEditor.NucleicDefault1
    SimpleSession.registerAfterModelsCB(
        RibbonStyleEditor.restoreState,
        (userScalings, userXSections, userResidueClasses, residueData, flags))
Ejemplo n.º 7
0
def restoreSession_RibbonStyleEditor():
	import SimpleSession
	import RibbonStyleEditor
	userScalings = []
	userXSections = []
	userResidueClasses = []
	residueData = [(13, 'Chimera default', 'rounded', 'unknown'), (14, 'Chimera default', 'rounded', 'unknown'), (15, 'Chimera default', 'rounded', 'unknown'), (16, 'Chimera default', 'rounded', 'unknown'), (17, 'Chimera default', 'rounded', 'unknown'), (18, 'Chimera default', 'rounded', 'unknown'), (19, 'Chimera default', 'rounded', 'unknown'), (20, 'Chimera default', 'rounded', 'unknown'), (21, 'Chimera default', 'rounded', 'unknown'), (22, 'Chimera default', 'rounded', 'unknown'), (23, 'Chimera default', 'rounded', 'unknown'), (24, 'Chimera default', 'rounded', 'unknown'), (25, 'Chimera default', 'rounded', 'unknown'), (26, 'Chimera default', 'rounded', 'unknown'), (27, 'Chimera default', 'rounded', 'unknown'), (28, 'Chimera default', 'rounded', 'unknown'), (29, 'Chimera default', 'rounded', 'unknown'), (30, 'Chimera default', 'rounded', 'unknown'), (31, 'Chimera default', 'rounded', 'unknown'), (32, 'Chimera default', 'rounded', 'unknown'), (33, 'Chimera default', 'rounded', 'unknown'), (34, 'Chimera default', 'rounded', 'unknown'), (35, 'Chimera default', 'rounded', 'unknown'),
(36, 'Chimera default', 'rounded', 'unknown'), (37, 'Chimera default', 'rounded', 'unknown'), (38, 'Chimera default', 'rounded', 'unknown')]
	flags = RibbonStyleEditor.NucleicDefault1
	SimpleSession.registerAfterModelsCB(RibbonStyleEditor.restoreState,
				(userScalings, userXSections,
				userResidueClasses, residueData, flags))
Ejemplo n.º 8
0
def restoreSession_RibbonStyleEditor():
    import SimpleSession
    import RibbonStyleEditor
    userScalings = []
    userXSections = []
    userResidueClasses = []
    residueData = [(2, 'Chimera default', 'rounded', u'unknown'),
                   (3, 'Chimera default', 'rounded', u'unknown')]
    flags = RibbonStyleEditor.NucleicDefault1
    SimpleSession.registerAfterModelsCB(
        RibbonStyleEditor.restoreState,
        (userScalings, userXSections, userResidueClasses, residueData, flags))
Ejemplo n.º 9
0
def restoreSession_RibbonStyleEditor():
    import SimpleSession
    import RibbonStyleEditor
    userScalings = [('licorice', [[0.35, 0.35], [0.35, 0.35], [0.35, 0.35],
                                  [0.35, 0.35, 0.35, 0.35], [0.35, 0.35]])]
    userXSections = []
    userResidueClasses = []
    residueData = [(1, 'licorice', 'rounded', u'amino acid'),
                   (2, 'licorice', 'rounded', u'amino acid'),
                   (3, 'licorice', 'rounded', u'amino acid'),
                   (4, 'licorice', 'rounded', u'amino acid'),
                   (5, 'licorice', 'rounded', u'amino acid'),
                   (6, 'licorice', 'rounded', u'amino acid'),
                   (7, 'licorice', 'rounded', u'amino acid'),
                   (8, 'licorice', 'rounded', u'amino acid'),
                   (9, 'licorice', 'rounded', u'amino acid'),
                   (10, 'licorice', 'rounded', u'amino acid'),
                   (11, 'licorice', 'rounded', u'amino acid'),
                   (12, 'licorice', 'rounded', u'amino acid'),
                   (13, 'licorice', 'rounded', u'amino acid'),
                   (14, 'licorice', 'rounded', u'amino acid'),
                   (15, 'licorice', 'rounded', u'amino acid'),
                   (16, 'licorice', 'rounded', u'amino acid'),
                   (17, 'licorice', 'rounded', u'amino acid'),
                   (18, 'licorice', 'rounded', u'amino acid'),
                   (19, 'licorice', 'rounded', u'amino acid'),
                   (20, 'licorice', 'rounded', u'amino acid'),
                   (21, 'licorice', 'rounded', u'amino acid'),
                   (22, 'licorice', 'rounded', u'amino acid'),
                   (23, 'licorice', 'rounded', u'amino acid'),
                   (24, 'licorice', 'rounded', u'amino acid'),
                   (25, 'licorice', 'rounded', u'amino acid'),
                   (26, 'licorice', 'rounded', u'amino acid'),
                   (27, 'licorice', 'rounded', u'amino acid'),
                   (28, 'licorice', 'rounded', u'amino acid'),
                   (29, 'licorice', 'rounded', u'amino acid'),
                   (30, 'licorice', 'rounded', u'amino acid'),
                   (31, 'licorice', 'rounded', u'amino acid'),
                   (32, 'licorice', 'rounded', u'amino acid'),
                   (33, 'licorice', 'rounded', u'amino acid'),
                   (34, 'licorice', 'rounded', u'amino acid'),
                   (35, 'licorice', 'rounded', u'amino acid'),
                   (36, 'licorice', 'rounded', u'amino acid'),
                   (37, 'licorice', 'rounded', u'amino acid'),
                   (38, 'licorice', 'rounded', u'amino acid'),
                   (39, 'licorice', 'rounded', u'amino acid'),
                   (40, 'licorice', 'rounded', u'amino acid'),
                   (41, 'licorice', 'rounded', u'unknown')]
    flags = RibbonStyleEditor.NucleicDefault1
    SimpleSession.registerAfterModelsCB(
        RibbonStyleEditor.restoreState,
        (userScalings, userXSections, userResidueClasses, residueData, flags))
Ejemplo n.º 10
0
def restoreSession_RibbonStyleEditor():
    import RibbonStyleEditor
    import SimpleSession

    userScalings = []
    userXSections = []
    userResidueClasses = []
    residueData = [
        (1, "Chimera default", "rounded", u"unknown"),
        (2, "Chimera default", "rounded", u"unknown"),
    ]
    flags = RibbonStyleEditor.NucleicDefault1
    SimpleSession.registerAfterModelsCB(
        RibbonStyleEditor.restoreState,
        (userScalings, userXSections, userResidueClasses, residueData, flags),
    )
Ejemplo n.º 11
0
def restoreState(mdata, sdata={}):
	for name, info in sdata.items():
		addStyle(name, info)
	for mid in mdata:
		m = SimpleSession.idLookup(mid)
		md = _molDict(m)
		smd = mdata[mid]
		for k in smd:
			if k.endswith('params'):
				md[k] = smd[k]
		rds = md[RESIDUES]
		srds = smd[RESIDUES]
		for rid in srds:
			r = SimpleSession.idLookup(rid)
			rd = rds[r] = srds[rid]
			rd[SUGAR] = []
			rd[BASE] = []
		_needRebuild[m] = None
Ejemplo n.º 12
0
def restoreSession_RibbonStyleEditor():
    import SimpleSession
    import RibbonStyleEditor

    userScalings = []
    userXSections = []
    userResidueClasses = []
    residueData = [
        (3, "Chimera default", "rounded", "unknown"),
        (4, "Chimera default", "rounded", "unknown"),
        (5, "Chimera default", "rounded", "unknown"),
        (6, "Chimera default", "rounded", "unknown"),
        (7, "Chimera default", "rounded", "unknown"),
        (8, "Chimera default", "rounded", "unknown"),
    ]
    flags = RibbonStyleEditor.NucleicDefault1
    SimpleSession.registerAfterModelsCB(
        RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags)
    )
Ejemplo n.º 13
0
	def _sessionCB(self, trigger, myData, sesFile):
		import SimpleSession
		if self.reference:
			if isinstance(self.reference, StructureSequence):
				mid = None
				ss = self.reference.saveInfo()
			elif isinstance(self.reference, Molecule):
				mid = SimpleSession.sessionID(self.reference)
				ss = None
			else:
				mid = None
				ss = None
		else:
			mid = None
			ss = None
		if self.parser:
			parserData = self.parser.sessionData()
		else:
			parserData = None
		if self.service:
			serviceData = self.service.sessionData()
		else:
			serviceData = None
		data = (3,					# version
			mid,					# molecule
			ss,					# StructureSeq
			self.sequence,				# input seq
			self.program,				# program
			self.basename,				# name
			self.showOne,				# one hit per PDB
			parserData,				# parser
			serviceData,				# service
			self.blastTable.getRestoreInfo())	# GUI
		print >> sesFile, """
try:
	from blastpdb.gui import sessionRestore
	sessionRestore(%s)
except:
	reportRestoreError("Error restoring Blast dialog")
""" % SimpleSession.sesRepr(data)
Ejemplo n.º 14
0
def save_session(trigger, closure, file):
	"""convert data to session data"""
	if not _data:
		return
	# molecular data
	mdata = {}
	for m in _data:
		md = _data[m]
		mid = SimpleSession.sessionID(m)
		smd = mdata[mid] = {}
		for k in md:
			if k.endswith('params'):
				smd[k] = md[k]
		rds = md[RESIDUES]
		srds = smd[RESIDUES] = {}
		for r in rds:
			rid = SimpleSession.sessionID(r)
			rd = rds[r]
			srd = srds[rid] = {}
			for k in rd:
				if k.endswith('params'):
					srd[k] = rd[k]
			srd['side'] = rd['side']
	# save restoring code in session
	restoring_code = (
"""
def restoreNucleotides():
	import NucleicAcids as NA
	NA.restoreState(%s, %s)
try:
	restoreNucleotides()
except:
	reportRestoreError('Error restoring Nucleotides')
""")
	file.write(restoring_code % (
		SimpleSession.sesRepr(mdata),
		SimpleSession.sesRepr(userStyles)
	))
Ejemplo n.º 15
0
def restoreAnimation():
    "A method to unpickle and restore animation objects"
    # Scenes must be unpickled after restoring transitions, because each
    # scene links to a 'scene' transition. Likewise, keyframes must be
    # unpickled after restoring scenes, because each keyframe links to a scene.
    # The unpickle process is left to the restore* functions, it's
    # important that it doesn't happen prior to calling those functions.
    import SimpleSession
    from Animate.Session import restoreKeyframes, restoreScenes, restoreTransitions

    SimpleSession.registerAfterModelsCB(restoreTransitions, trPickle)
    SimpleSession.registerAfterModelsCB(restoreScenes, scPickle)
    SimpleSession.registerAfterModelsCB(restoreKeyframes, kfPickle)
Ejemplo n.º 16
0
def restoreState(args):
	if len(args) == 4:
		userScalings, userXSections, userResidueClasses, residueData = args
		flags = 0
	else:
		userScalings, userXSections, userResidueClasses, residueData, flags = args

	import scaling, xsection, atoms
	import chimera, SimpleSession
	for m in chimera.openModels.list(modelTypes=[chimera.Molecule]):
		m.updateRibbonData()
	scData = scaling.sessionRestoreUsed(userScalings)
	xsData = xsection.sessionRestoreUsed(userXSections)
	rcData = atoms.sessionRestoreUsed(userResidueClasses)
	for rId, sc, xs, rc in residueData:
		r = SimpleSession.idLookup(rId)
		atoms.sessionRestoreResidue(r, rc, rcData, flags)
		scaling.sessionRestoreResidue(r, sc, scData)
		xsection.sessionRestoreResidue(r, xs, xsData)
Ejemplo n.º 17
0
def restoreAnimation():
	'A method to unpickle and restore animation objects'
	# Scenes must be unpickled after restoring transitions, because each
	# scene links to a 'scene' transition. Likewise, keyframes must be 
	# unpickled after restoring scenes, because each keyframe links to a scene.
	# The unpickle process is left to the restore* functions, it's 
	# important that it doesn't happen prior to calling those functions.
	import SimpleSession
	from Animate.Session import restoreTransitions
	from Animate.Session import restoreScenes
	from Animate.Session import restoreKeyframes
	SimpleSession.registerAfterModelsCB(restoreTransitions, trPickle)
	SimpleSession.registerAfterModelsCB(restoreScenes, scPickle)
	SimpleSession.registerAfterModelsCB(restoreKeyframes, kfPickle)
Ejemplo n.º 18
0
	for name, fpos in formattedPositions.items():
		positions[name] = deformatPosition(fpos)
	import Midas
	if modelOffset == 0:
		Midas.positions.clear()
	Midas.positions.update(positions)
	positionStack = []
	Midas._positionStack = map(deformatPosition, positionStack)

def delayedMidasBase():
	try:
		restoreMidasBase()
	except:
		reportRestoreError('Error restoring Midas base state')
import SimpleSession
SimpleSession.registerAfterModelsCB(delayedMidasBase)


try:
	import StructMeasure
	from StructMeasure.DistMonitor import restoreDistances
	registerAfterModelsCB(restoreDistances, 1)
except:
	reportRestoreError("Error restoring distances in session")


def restoreRemainder():
	from SimpleSession.versions.v45 import restoreWindowSize, \
	     restoreOpenStates, restoreSelections, restoreFontInfo, \
	     restoreOpenModelsAttrs, restoreModelClip
Ejemplo n.º 19
0
except:
	reportRestoreError("Error restoring color key")



def restore2DLabelDialog(info):
	from chimera.dialogs import find
	from Ilabel.gui import IlabelDialog
	dlg = find(IlabelDialog.name)
	if dlg is not None:
		dlg.destroy()
	dlg = find(IlabelDialog.name, create=True)
	dlg._restoreSession(info)

import SimpleSession
SimpleSession.registerAfterModelsCB(restore2DLabelDialog, {'mouse func': 'labeling', 'sel ranges': (), 'dialog shown': 1})



def restoreRemainder():
	from SimpleSession.versions.v65 import restoreWindowSize, \
	     restoreOpenStates, restoreSelections, restoreFontInfo, \
	     restoreOpenModelsAttrs, restoreModelClip, restoreSilhouettes

	curSelIds =  []
	savedSels = []
	openModelsAttrs = { 'cofrMethod': 2 }
	windowSize = (1024, 781)
	xformMap = {0: (((-0.34821455627968, 0.82726846257295, 0.44087811652103), 9.9995089373332), (0.0076537672682732, 0.0083331466146478, -0.0095913043915013), False), 1: (((-0.99040907112338, 0.13815836179107, 0.0014624991412663), 109.62935189875), (8.9189222591104, -0.045770457294621, -0.032931556893357), False), 2: (((-0.20080631594196, -0.92498261478313, 0.32262049815036), 18.985788096111), (17.497129733092, -0.68455407611151, -0.47980035902674), False), 3: (((0.99205523056863, 0.020289399059421, -0.12415619109504), 170.88474103051), (-0.1169711633136, -8.6869766220186, 0.11207397706245), True), 4: (((0.23529125830917, 0.94204993508282, 0.23912328112031), 96.859237242746), (8.9195514371968, -9.2219927891895, -0.28512231169757), False), 5: (((0.73008849334292, 0.68289739957367, 0.024938595465521), 170.41609346508), (18.067194686271, -9.1650094893277, -1.4626137937459), False)}
	fontInfo = {'face': (u'Sans Serif', 'Bold', 12)}
	clipPlaneInfo = {}
Ejemplo n.º 20
0
def _rebuild(triggerName, closure, changes):
	"""'monitor changes' trigger handler""" 
	global _rebuilding
	if _block or not _needRebuild or _rebuilding:
		return
	_rebuilding = True
	for mol in _needRebuild:
		md = _molDict(mol)
		try:
			if md[VRML]:
				v = md[VRML]
				md[VRML] = None
				chimera.openModels.close(v)
		except (KeyError, chimera.error):
			# Either there's no previous VRML
			# model to close or it has already
			# been closed.
			pass
		# figure out which residues are of which type because
		# ladder needs knowledge about the whole molecule
		rds = md[RESIDUES]
		sides = {}
		for k in SideOptions:
			sides[k] = []
		for r in rds.keys():
			if r.__destroyed__:
				# Sometimes the residues are gone,
				# but there's a still reference to them.
				del rds[r]
				continue
			sides[rds[r]['side']].append(r)
		if not rds:
			# no residues to track in molecule
			v = md[VRML]
			if v:
				chimera.openModels.close(v)
			del _data[mol]
			continue
		allResidues = set(rds.keys())
		# make new VRML nodes
		hideSugars = set()
		hideBases = set()
		residues = sides['ladder']
		if not residues:
			md.pop('ladder params', None)
		else:
			# redo all ladder nodes
			hideSugars.update(residues)
			hideBases.update(residues)
			make_ladder(mol, residues, rds, **md['ladder params'])
		residues = sides['fill/slab']
		if residues:
			hideBases.update(make_slab(mol, residues, rds))
		residues = sides['tube/slab']
		if residues:
			hideSugars.update(residues)
			make_tube(mol, residues, rds)
			hideBases.update(make_slab(mol, residues, rds))
		residues = sides['orient']
		if residues:
			make_orient(mol, residues, rds)
		# make sure sugar/base atoms are hidden/shown
		showSugars = allResidues - hideSugars
		showBases = allResidues - hideBases
		showResidues = showSugars - hideBases
		showSugars.difference_update(showResidues)
		showBases.difference_update(showResidues)
		setHideAtoms(False, AlwaysRE, NeverRE, showResidues)
		setHideAtoms(False, BackboneSugarRE, NeverRE, showSugars)
		nonRibbonSugars = [r for r in hideSugars
				if not r.ribbonDisplay or not r.hasRibbon()]
		setHideAtoms(False, BackboneRE, NeverRE, nonRibbonSugars)
		setHideAtoms(False, BaseAtomsRE, BaseExceptRE, showBases)

		# open VRML model
		nodes = sum((rds[r][SUGAR] + rds[r][BASE] for r in rds), [])
		if nodes:
			vrml = nodesToVRML(nodes)
			vList = chimera.openModels.open(vrml, type='VRML',
				sameAs=mol, hidden=True,
				identifyAs='%s - Nucleotides' % mol.name)
			assert(len(vList) == 1)
			v = vList[0]
			mol.addAssociatedModel(v)
			md[VRML] = v
			SimpleSession.noAutoRestore(v)
	_needRebuild.clear()
	# Since changing hide bits doesn't cause a rebuilding
	# of the molecule's display list, rebuild them all!
	chimera.viewer.invalidateCache()
	_rebuilding = False