This is a read-only mirror of pymolwiki.org
Difference between revisions of "Axes"
Jump to navigation
Jump to search
m (1 revision) |
|||
(11 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
+ | == Axes with text labels == | ||
+ | |||
<source lang="python"> | <source lang="python"> | ||
# axes.py | # axes.py | ||
Line 26: | Line 28: | ||
</source> | </source> | ||
− | [[Category: | + | == Axes with nice cones == |
+ | |||
+ | [[File:Axes_demo.png|300px|right]] | ||
+ | |||
+ | This script draws a simple cartesian coordinate system. | ||
+ | |||
+ | <source lang="python"> | ||
+ | from pymol.cgo import * | ||
+ | from pymol import cmd | ||
+ | |||
+ | w = 0.06 # cylinder width | ||
+ | l = 0.75 # cylinder length | ||
+ | h = 0.25 # cone hight | ||
+ | d = w * 1.618 # cone base diameter | ||
+ | |||
+ | obj = [CYLINDER, 0.0, 0.0, 0.0, l, 0.0, 0.0, w, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, | ||
+ | CYLINDER, 0.0, 0.0, 0.0, 0.0, l, 0.0, w, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, | ||
+ | CYLINDER, 0.0, 0.0, 0.0, 0.0, 0.0, l, w, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, | ||
+ | CONE, l, 0.0, 0.0, h+l, 0.0, 0.0, d, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, | ||
+ | CONE, 0.0, l, 0.0, 0.0, h+l, 0.0, d, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, | ||
+ | CONE, 0.0, 0.0, l, 0.0, 0.0, h+l, d, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0] | ||
+ | |||
+ | cmd.load_cgo(obj, 'axes') | ||
+ | </source> | ||
+ | |||
+ | == Axes which always stay in the lower left corner == | ||
+ | |||
+ | <source lang="python"> | ||
+ | from pymol import cmd | ||
+ | from chempy import cpv | ||
+ | |||
+ | class PutCenterCallback(object): | ||
+ | prev_v = None | ||
+ | |||
+ | def __init__(self, name, corner=0): | ||
+ | self.name = name | ||
+ | self.corner = corner | ||
+ | self.cb_name = cmd.get_unused_name('_cb') | ||
+ | |||
+ | def load(self): | ||
+ | cmd.load_callback(self, self.cb_name) | ||
+ | |||
+ | def __call__(self): | ||
+ | if self.name not in cmd.get_names('objects'): | ||
+ | import threading | ||
+ | threading.Thread(None, cmd.delete, args=(self.cb_name,)).start() | ||
+ | return | ||
+ | |||
+ | v = cmd.get_view() | ||
+ | if v == self.prev_v: | ||
+ | return | ||
+ | self.prev_v = v | ||
+ | |||
+ | t = v[12:15] | ||
+ | |||
+ | if self.corner: | ||
+ | vp = cmd.get_viewport() | ||
+ | R_mc = [v[0:3], v[3:6], v[6:9]] | ||
+ | off_c = [0.15 * v[11] * vp[0] / vp[1], 0.15 * v[11], 0.0] | ||
+ | if self.corner in [2,3]: | ||
+ | off_c[0] *= -1 | ||
+ | if self.corner in [3,4]: | ||
+ | off_c[1] *= -1 | ||
+ | off_m = cpv.transform(R_mc, off_c) | ||
+ | t = cpv.add(t, off_m) | ||
+ | |||
+ | z = -v[11] / 30.0 | ||
+ | m = [z, 0, 0, 0, 0, z, 0, 0, 0, 0, z, 0, t[0] / z, t[1] / z, t[2] / z, 1] | ||
+ | cmd.set_object_ttt(self.name, m) | ||
+ | |||
+ | def axes(name='axes'): | ||
+ | ''' | ||
+ | DESCRIPTION | ||
+ | |||
+ | Puts coordinate axes to the lower left corner of the viewport. | ||
+ | ''' | ||
+ | from pymol import cgo | ||
+ | |||
+ | cmd.set('auto_zoom', 0) | ||
+ | |||
+ | w = 0.06 # cylinder width | ||
+ | l = 0.75 # cylinder length | ||
+ | h = 0.25 # cone hight | ||
+ | d = w * 1.618 # cone base diameter | ||
+ | |||
+ | obj = [cgo.CYLINDER, 0.0, 0.0, 0.0, l, 0.0, 0.0, w, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, | ||
+ | cgo.CYLINDER, 0.0, 0.0, 0.0, 0.0, l, 0.0, w, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, | ||
+ | cgo.CYLINDER, 0.0, 0.0, 0.0, 0.0, 0.0, l, w, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, | ||
+ | cgo.CONE, l, 0.0, 0.0, h+l, 0.0, 0.0, d, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, | ||
+ | cgo.CONE, 0.0, l, 0.0, 0.0, h+l, 0.0, d, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, | ||
+ | cgo.CONE, 0.0, 0.0, l, 0.0, 0.0, h+l, d, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0] | ||
+ | |||
+ | PutCenterCallback(name, 1).load() | ||
+ | cmd.load_cgo(obj, name) | ||
+ | |||
+ | cmd.extend('axes', axes) | ||
+ | </source> | ||
+ | |||
+ | [[Category:Script_Library|Axes]] | ||
+ | [[Category:Math_Scripts|Axes]] | ||
+ | [[Category:CGO]] |
Latest revision as of 06:13, 6 March 2017
Axes with text labels
# axes.py
from pymol.cgo import *
from pymol import cmd
from pymol.vfont import plain
# create the axes object, draw axes with cylinders coloured red, green,
#blue for X, Y and Z
obj = [
CYLINDER, 0., 0., 0., 10., 0., 0., 0.2, 1.0, 1.0, 1.0, 1.0, 0.0, 0.,
CYLINDER, 0., 0., 0., 0., 10., 0., 0.2, 1.0, 1.0, 1.0, 0., 1.0, 0.,
CYLINDER, 0., 0., 0., 0., 0., 10., 0.2, 1.0, 1.0, 1.0, 0., 0.0, 1.0,
]
# add labels to axes object (requires pymol version 0.8 or greater, I
# believe
cyl_text(obj,plain,[-5.,-5.,-1],'Origin',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
cyl_text(obj,plain,[10.,0.,0.],'X',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
cyl_text(obj,plain,[0.,10.,0.],'Y',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
cyl_text(obj,plain,[0.,0.,10.],'Z',0.20,axes=[[3,0,0],[0,3,0],[0,0,3]])
# then we load it into PyMOL
cmd.load_cgo(obj,'axes')
Axes with nice cones
This script draws a simple cartesian coordinate system.
from pymol.cgo import *
from pymol import cmd
w = 0.06 # cylinder width
l = 0.75 # cylinder length
h = 0.25 # cone hight
d = w * 1.618 # cone base diameter
obj = [CYLINDER, 0.0, 0.0, 0.0, l, 0.0, 0.0, w, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
CYLINDER, 0.0, 0.0, 0.0, 0.0, l, 0.0, w, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
CYLINDER, 0.0, 0.0, 0.0, 0.0, 0.0, l, w, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,
CONE, l, 0.0, 0.0, h+l, 0.0, 0.0, d, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0,
CONE, 0.0, l, 0.0, 0.0, h+l, 0.0, d, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
CONE, 0.0, 0.0, l, 0.0, 0.0, h+l, d, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0]
cmd.load_cgo(obj, 'axes')
Axes which always stay in the lower left corner
from pymol import cmd
from chempy import cpv
class PutCenterCallback(object):
prev_v = None
def __init__(self, name, corner=0):
self.name = name
self.corner = corner
self.cb_name = cmd.get_unused_name('_cb')
def load(self):
cmd.load_callback(self, self.cb_name)
def __call__(self):
if self.name not in cmd.get_names('objects'):
import threading
threading.Thread(None, cmd.delete, args=(self.cb_name,)).start()
return
v = cmd.get_view()
if v == self.prev_v:
return
self.prev_v = v
t = v[12:15]
if self.corner:
vp = cmd.get_viewport()
R_mc = [v[0:3], v[3:6], v[6:9]]
off_c = [0.15 * v[11] * vp[0] / vp[1], 0.15 * v[11], 0.0]
if self.corner in [2,3]:
off_c[0] *= -1
if self.corner in [3,4]:
off_c[1] *= -1
off_m = cpv.transform(R_mc, off_c)
t = cpv.add(t, off_m)
z = -v[11] / 30.0
m = [z, 0, 0, 0, 0, z, 0, 0, 0, 0, z, 0, t[0] / z, t[1] / z, t[2] / z, 1]
cmd.set_object_ttt(self.name, m)
def axes(name='axes'):
'''
DESCRIPTION
Puts coordinate axes to the lower left corner of the viewport.
'''
from pymol import cgo
cmd.set('auto_zoom', 0)
w = 0.06 # cylinder width
l = 0.75 # cylinder length
h = 0.25 # cone hight
d = w * 1.618 # cone base diameter
obj = [cgo.CYLINDER, 0.0, 0.0, 0.0, l, 0.0, 0.0, w, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
cgo.CYLINDER, 0.0, 0.0, 0.0, 0.0, l, 0.0, w, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
cgo.CYLINDER, 0.0, 0.0, 0.0, 0.0, 0.0, l, w, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,
cgo.CONE, l, 0.0, 0.0, h+l, 0.0, 0.0, d, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0,
cgo.CONE, 0.0, l, 0.0, 0.0, h+l, 0.0, d, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
cgo.CONE, 0.0, 0.0, l, 0.0, 0.0, h+l, d, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0]
PutCenterCallback(name, 1).load()
cmd.load_cgo(obj, name)
cmd.extend('axes', axes)