62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
from pymol.cgo import *
|
|
from pymol import cmd
|
|
from chempy.cpv import normalize, cross_product, add, scale
|
|
from math import sqrt
|
|
|
|
# hole in a plane
|
|
|
|
radius = 2.0
|
|
edge = 10.0
|
|
sampling = 4
|
|
|
|
|
|
obj = []
|
|
|
|
for basis in [ [ [ 1.0, 0.0, 0.0], [ 0.0, 1.0, 0.0], 0],
|
|
[ [ 0.0, 1.0, 0.0], [ -1.0, 0.0, 0.0], 0],
|
|
[ [-1.0, 0.0, 0.0], [ 0.0, -1.0, 0.0], 0],
|
|
[ [ 0.0, -1.0, 0.0], [ 1.0, 0.0, 0.0], 0],
|
|
[ [ 1.0, 0.0, 0.0], [ 0.0, 1.0, 0.0], 1],
|
|
[ [ 0.0, 1.0, 0.0], [ -1.0, 0.0, 0.0], 1],
|
|
[ [-1.0, 0.0, 0.0], [ 0.0, -1.0, 0.0], 1],
|
|
[ [ 0.0, -1.0, 0.0], [ 1.0, 0.0, 0.0], 1] ]:
|
|
|
|
hand = basis[2]
|
|
if hand:
|
|
(x,y) = basis[0:2]
|
|
normal = normalize(cross_product(x,y))
|
|
else:
|
|
(y,x) = basis[0:2]
|
|
normal = normalize(cross_product(y,x))
|
|
|
|
obj.extend( [BEGIN, TRIANGLE_STRIP] +
|
|
[COLOR, 1.0, 1.0, 1.0] +
|
|
[NORMAL] + normal )
|
|
|
|
for i in range(sampling+1):
|
|
x1 = edge
|
|
y1 = edge*i/sampling
|
|
vlen = sqrt(x1*x1+y1*y1)
|
|
x0 = radius*x1/vlen
|
|
y0 = radius*y1/vlen
|
|
v0 = add( scale(x, x0 ), scale(y,y0) )
|
|
v1 = add( scale(x, x1 ), scale(y,y1) )
|
|
|
|
if hand:
|
|
obj.extend( [ VERTEX ] + v0 + [ VERTEX ] + v1 )
|
|
else:
|
|
obj.extend( [ VERTEX ] + v1 + [ VERTEX ] + v0 )
|
|
|
|
obj.extend( [END] )
|
|
|
|
# then we load it into PyMOL
|
|
|
|
cmd.load_cgo(obj,'cgo05')
|
|
|
|
# move the read clipping plane back a bit to that that is it brighter
|
|
|
|
cmd.clip('far',-5)
|
|
|
|
#cmd.set("two_sided_lighting")
|
|
|