Inheritance
From GeoMod
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.


