In [12]:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.ion()

In [13]:
class Body(object):
    def __init__(self):
        self.pts = {}

    def add_path(self, name, pts):
        self.pts[name] = pts

In [14]:
class TSat(Body):

    def __init__(self, radius):
        super(TSat, self).__init__()
        self.radius = radius
        self.setup_body()
        self.add_booms()

    def add_booms(self):
        boom_len = 1
        count = 10
        dx = boom_len / float(count)

        zeros = np.empty(count + 1)
        zeros.fill(0)

        dots = []
        for pos in xrange(count + 1):
            dots.append(self.radius + dx * pos)

        self.add_path('+x boom', [np.array(dots), zeros.copy(), zeros.copy()])
        self.add_path('+y boom', [zeros.copy(), np.array(dots), zeros.copy()])
        self.add_path('+z boom', [zeros.copy(), zeros.copy(), np.array(dots)])
        self.add_path('-x boom', [-np.array(dots), zeros.copy(), zeros.copy()])
        self.add_path('-y boom', [zeros.copy(), -np.array(dots), zeros.copy()])
        self.add_path('-z boom', [zeros.copy(), zeros.copy(), -np.array(dots)])

    def setup_body(self):


        phi = np.linspace(0, 2 * np.pi, 100)
        r = np.linspace(0, 1, 100)

        x = 0.5 * np.outer(np.cos(phi), r)
        y = 0.5 * np.outer(np.sin(phi), r)
        z = np.zeros([100,100])

        self.add_path('body', [x, y, z])

In [19]:
class Model(object):
    def __init__(self, data_model):
        self.fig = plt.figure(figsize=(12, 8), dpi=80, facecolor='w', edgecolor='k')
        self.ax = self.fig.add_subplot(111, projection='3d')

        self.data_model = data_model
        self.series = {}

        for name, data in self.data_model.pts.iteritems():
            if name == 'body':
                self.series[name] = self.ax.plot_surface(*data, rstride=10, cstride=50, linewidth=1, alpha=1)
            else:
                self.series[name], = self.ax.plot(*data, color='blue', linewidth=3)

        plt.draw()

In [24]:
tsat = TSat(0.5)
model = Model(tsat)
plt.show()

In [23]:
a = model.series['+x boom']
a.set_data(np.random.rand(10),np.random.rand(10))

In [ ]: