Inheritance

From GeoMod

Jump to: navigation, search

You can use inheritance to create a derived class from a class that alread exists. This is done to give the new class extra or different properties for the original class, but to be able to use all the properties and function (methods) in the old class.

This example constructs a frame for a bed using different types of wood. A 2x4 piece of wood is about 2 inches thick and 4 inches wide (actually about 1.5in x 3.5 in).

  • The basic class wood_2x4 creates a 2x4 piece of wood of a user defined length and orients it in space (depending on if you want the wood to be vertical or horizontal etc).
  • The derived classes (such as wood_1x8) use all the properties of the wood_2x4 class but redimentions the piece to be 1 inch thick and 8 inches wide.


from visual import *

class axes:
    '''x,y,z axes'''
    def __init__(self, length=1):
        xaxis = cylinder(axis=(length,0,0),color=color.red,radius=length/25)
        yaxis = cylinder(axis=(0,length,0),color=color.green,radius=length/25)
        zaxis = cylinder(axis=(0,0,length),color=color.blue,radius=length/25)

class wood_2x4:
    ''' a 2x4 piece of wood
        can be oriented "flat", "side" or "vertical"'''
    
    def __init__(self, length=1, orientation="side",
                 width=1.5, height=3.5,
                 move=vector(0,0,0), color=vector(0,1,0)):
        self.piece = box()
        self.piece.pos=vector(0,0,0)
        self.orientation = orientation
        self.rotate = rotate
        self.piece.length = length
        self.piece.width = width
        self.piece.height = height
        self.piece.color = color
        self.reorient()
        self.piece.pos = self.piece.pos + move
    def reorient(self):
        if self.orientation == "side":
            self.piece.pos = vector(self.piece.pos.x + 0.5*self.piece.length,
                                    self.piece.pos.y + 0.5*self.piece.height,
                                    self.piece.pos.z + 0.5*self.piece.width)
        if self.orientation == "side90":
            self.piece.rotate(origin=self.piece.pos, axis=(0,1,0), angle=pi/2.0)
            self.piece.pos = vector(self.piece.pos.x + 0.5*self.piece.width,
                                    self.piece.pos.y + 0.5*self.piece.height,
                                    self.piece.pos.z + 0.5*self.piece.length)
        if self.orientation == "flat":
            self.piece.rotate(origin=self.piece.pos, axis=(1,0,0), angle=pi/2.0)
            self.piece.pos = vector(self.piece.pos.x + 0.5*self.piece.length,
                                    self.piece.pos.y + 0.5*self.piece.width,
                                    self.piece.pos.z + 0.5*self.piece.height)
        if self.orientation == "flat90":
            self.piece.rotate(origin=self.piece.pos, axis=(1,0,0), angle=pi/2.0)
            self.piece.rotate(origin=self.piece.pos, axis=(0,1,0), angle=pi/2.0)
            self.piece.pos = vector(self.piece.pos.x + 0.5*self.piece.height,
                                    self.piece.pos.y + 0.5*self.piece.width,
                                    self.piece.pos.z + 0.5*self.piece.length)
        if self.orientation == "vertical":
            self.piece.rotate(origin=self.piece.pos, axis=(0,0,1), angle=pi/2.0)
            self.piece.pos = vector(self.piece.pos.x + 0.5*self.piece.height,
                                    self.piece.pos.y + 0.5*self.piece.length,
                                    self.piece.pos.z + 0.5*self.piece.width)
        if self.orientation == "vertical90":
            self.piece.rotate(origin=self.piece.pos, axis=(0,0,1), angle=pi/2.0)
            self.piece.rotate(origin=self.piece.pos, axis=(0,1,0), angle=pi/2.0)
            self.piece.pos = vector(self.piece.pos.x + 0.5*self.piece.width,
                                    self.piece.pos.y + 0.5*self.piece.length,
                                    self.piece.pos.z + 0.5*self.piece.height)
        
class wood_2x8(wood_2x4):
    def __init__(self, length=1, orientation="side", move=vector(0,0,0),
                 color=vector(1,1,1)):
        wood_2x4.__init__(self, length, height=7.5,
                          orientation=orientation,move=move,color=color)

class wood_1x8(wood_2x4):
    def __init__(self, length=1, orientation="side",
                 move=vector(0,0,0), color=vector(1,0,0)):
        wood_2x4.__init__(self, length, height=7.5, width=.75, orientation=orientation,move=move,color=color)

class wood_2x2(wood_2x4):
    def __init__(self, length=1, orientation="side", move=vector(0,0,0),
                 color=vector(0,1,0)):
        wood_2x4.__init__(self, length, height=1.5, width=1.5, orientation=orientation,move=move,color=color)

class trundle:
    def __init__(self):
        self.bits = []
        self.bits.append(wood_1x8(73,"side",move=vector(0,0,0)) )#1. front
        self.bits.append(wood_1x8(73,"side",
                                  move=vector(0,0,self.bits[0].piece.width+39)
                                  ,color=color.red)) #2. middle

        self.bits.append(wood_2x4(39,
                                  orientation="flat90",
                                  move=vector(0,0,self.bits[0].piece.width))) #3. bottom support
        self.bits.append(wood_2x4(39,
                                  orientation="flat90",
                                  move=vector(0,0,self.bits[0].piece.width))) #4. bottom support
        self.bits[-1].piece.pos.x += self.bits[0].piece.length - self.bits[-1].piece.height        

        self.bits.append(wood_2x2(66, color=color.blue,
                                  move=vector(self.bits[2].piece.height,0,
                                              self.bits[0].piece.width)))  #5. slat support
        self.bits.append(wood_2x2(66, color=color.blue,
                                  move=vector(self.bits[2].piece.height,0,
                                              self.bits[0].piece.width)))  #6. slat support
        self.bits[-1].piece.pos.z += self.bits[2].piece.length - self.bits[-1].piece.height        

        #7. headboard
        self.bits.append(wood_1x8(self.bits[0].piece.width * 2 + self.bits[2].piece.length,
                                  orientation="side90"))
        self.bits[-1].piece.pos.x += - self.bits[-1].piece.width
        print "headboard length = ", self.bits[-1].piece.length

        #8. footboard
        self.bits.append(wood_1x8(self.bits[0].piece.width * 2 + self.bits[2].piece.length,
                                  orientation="side90"))
        self.bits[-1].piece.pos.x += self.bits[0].piece.length
                 
        self.bits.append(wood_1x8(73,"side",move=vector(0,0,57-self.bits[0].piece.width))) #9. back

        #for fullsize headboard and footboard
        self.bits[6].piece.length = 57
        self.bits[7].piece.length = 57
        self.bits[6].piece.pos.z = 57/2.0
        self.bits[7].piece.pos.z = 57/2.0

#ax = axes(40)


scene.background = color.white

trundle_bed = trundle()


This model should create something that looks like this, where all the 2x4's are green and the 1x8's are red.

Image:trundle.jpg

Personal tools