#!BPY __author__="Matthew Baynham" __date__ ="$08-May-2009 12:34:49$" __name__ ="WallWithDoors" __module__ = "WallWithDoors" __version__ = "0.1" __bpydoc__ = """ To Do ===== 1) Doors i) insert the atributes of a doorway width, hieght, type ii) create vertexes iii)create faces """ from Blender import NMesh, Mathutils import math from modBasics import ClsBasics from modDataObjects import ClsFeature, ClsVertex, ClsFace, ClsFeatureVariable import operator class ClsWall(ClsBasics): #some code just to see if I can write a class global lstFeatures, lstFeatureVariables def __init__(self, pfDefaultHieght, pfThickness, pfLength): """Documentation""" self.initialiseBasicsClass() self.sClassName = "ClsWall" self.fDefaultHieght = pfDefaultHieght self.fThinkness = pfThickness self.fLength = pfLength self._vOffset = Mathutils.Vector(0.0, 0.0, 0.0) self.fRotationalVertical = 0 cFeatureFirst = ClsFeature("bow", "divider", "end of wall", 0, 0, pfDefaultHieght, 0) cFeatureFirst.iId = 1 cFeatureLast = ClsFeature("eow", "divider", "end of wall", pfLength, 0, pfDefaultHieght, 0) cFeatureLast.iId = 2 self.lstFeatures = [cFeatureFirst, cFeatureLast] self.lstFeatureVariables = [] def getOffset(self): return self._vOffset def setOffset(self, value): self._vOffset = value vOffset = property(getOffset, setOffset) def getDefaultHieght(self): return self._fDefaultHieght def setDefaultHieght(self, value): self._fDefaultHieght = float(value) fDefaultHieght = property(getDefaultHieght, setDefaultHieght) def getThinkness(self): return self._fThinkness def setThinkness(self, value): self._fThinkness = float(value) fThinkness = property(getThinkness, setThinkness) def getLength(self): return self._fLength def setLength(self, value): self._fLength = float(value) self.featureMove("eow", value) fLength = property(getLength, setLength) def getRotationVertical(self): return self._fRotationVertical def setRotationVertical(self, value): self._fRotationVertical = value fRotationalVertical = property(getRotationVertical, setRotationVertical) def nextUnusedId(self): try: bIsFound = 'false' iId = 0 while bIsFound == 'true' or iId == 0: iId = iId + 1 bIsFound = 'false' for tempFeature in self.lstFeatures: if tempFeature.iId == iId: bIsFound = 'true' return iId except: self.errorCode() def addFeature(self, psName, psType, psSubType, pfPosHor, pfPosVert, pfHieght, pfWidth): try: nextId = self.nextUnusedId() tempFeature = ClsFeature(psName, psType, psSubType, pfPosHor, pfPosVert, pfHieght, pfWidth) tempFeature.iId = nextId self.lstFeatures.append(tempFeature) return nextId except: self.errorCode() def getMaxVariableId(self): try: iMax = 0 for cTemp in self.lstFeatureVariables: if cTemp.iId > iMax: iMax = cTemp.iId return iMax except: self.errorCode() def isInFeatureVariablesLst(self, iFeatureId, iVariableId = None, sVariableName = None, sVariableType = None): try: bIsFound = False for cTempVariable in self.lstFeatureVariables: if cTempVariable.iFeatureId == iFeatureId and (cTempVariable.iId == iVariableId or iVariableId is None) and (cTempVariable.sName == sVariableName or sVariableName is None) and (cTempVariable.sType == sVariableType or sVariableType is None): bIsFound = True return bIsFound except: self.errorCode() return False def isInFeatureLst(self, iFeatureId): try: bIsFound = False for cTempFeature in self.lstFeatures: if cTempFeature.iId == iFeatureId : bIsFound = True return bIsFound except: self.errorCode() return False def addFeatureVariables(self, iFeatureId, sVariableName, sVariableType, VariableAmount): __doc__ = """ 1st returned variable = is error 2nd returned variable = variable ID """ try: if self.isInFeatureLst(iFeatureId) == True: if self.isInFeatureVariablesLst(iFeatureId, sVariableName, sVariableType) == True: self.addWarning("We already have this variable") return True, -1 else: iIdMax = self.getMaxVariableId() # cTempVariable = ClsFeatureVariable(iFeatureId, sVariableName, sVariableType, VariableAmount) cTempVariable = ClsFeatureVariable cTempVariable.iFeatureId = iFeatureId cTempVariable.sName = sVariableName cTempVariable.sType = sVariableType cTempVariable.Amount = VariableAmount cTempVariable.iId = iIdMax + 1 self.lstFeatureVariables.append(cTempVariable) return False, cTempVariable.iId else: self.addWarning("Feature ID not Found " + str(iFeatureId)) return True, -1 except: self.errorCode() return True, -1 def editFeatureVariables(self, iFeatureId, VariableAmount, iVariableId = None, sVariableName = None, sVariableType = None): try: bIsFound = False for cTempVariable in self.lstFeatureVariables: if cTempVariable.iFeatureId == iFeatureId and (cTempVariable.sName == sVariableName or sVariableName is None) and (cTempVariable.sType == sVariableType or sVariableType is None): cTempVariable.Amount = VariableAmount bIsFound = True if bIsFound == False: self.addWarning("Couldn't find variable when trying to edit it") except: self.errorCode() def getFeatureVariables(self, iFeatureId, iVariableId = None, sVariableName = None, sVariableType = None): try: bIsFound = False print "Feature ID " + str(iFeatureId) print "Type " + sVariableType for cTempVariable in self.lstFeatureVariables: print " Id " + str(cTempVariable.iId) print " Feature Id " + str(cTempVariable.iFeatureId) print " Name " + str(cTempVariable.sName) print " Type " + cTempVariable.sType print " Amount " + str(cTempVariable.Amount) if cTempVariable.iFeatureId == iFeatureId and (cTempVariable.iId == iVariableId or iVariableId is None) and (cTempVariable.sName == sVariableName or sVariableName is None) and (cTempVariable.sType == sVariableType or sVariableType is None): bIsFound = True return False, cTempVariable.Amount if bIsFound == False: print "Couldn't find variable when trying to get the amount" self.addWarning("Couldn't find variable when trying to get the amount") return True, None except: self.errorCode() # try: # for cTempFeature in lstFeatures: # if cTempFeature.iId == iFeatureId: # cTempFeature.varSetAmount(iVariableId, VariableAmount, iVariableId, sVariableName) # except: # self.errorCode() def featureMoveHor(self, psName, pfNewPosHor): try: for tempFeature in self.lstFeatures: if tempFeature.Name == psName: tempFeature.fPosHor = pfNewPosHor except: self.errorCode() def featureMoveVert(self, psName, pfNewPosVert): try: for tempFeature in self.lstFeatures: if tempFeature.Name == psName: tempFeature.fPosVert = pfNewPosVert except: self.errorCode() def featureMove(self, psName, pfNewPosHor, pfNewPosVert): try: for tempFeature in self.lstFeatures: if tempFeature.Name == psName: tempFeature.fPosHor = pfNewPosHor tempFeature.fPosVert = pfNewPosVert except: self.errorCode() def featureDelete(self, iId): try: for tempFeature in self.lstFeatures: if tempFeature.iId == iId: self.lstFeatures.remove(tempFeature) except: self.errorCode() def checkDividers(self): __doc__ = """ at least every other feature has to be a "divider" or a "end of wall" you can have consecutive dividers but you can not have any other consecutive feature all other features will be mapped to dividers """ try: sortFeatures() previousFeature = self.lstFeatures(0) for tempFeature in self.lstFeatures: if not (previousFeature.sType == "divider" and tempFeature.sType == "divider"): #problem: there are two features next to eachother where neither one is a divider or a end of wall #we need to add a divider half way between then and then sort the lstFeatures and recheck addFeature(self, "", "divider", ((previousFeature.fPosHor + nextFeature.fPosHor) / 2), 0, 0, 0) except: self.errorCode() def sortFeatures(self): __doc__ = """ the sort method will not owrk on this list because there is no way of defining the key to be a property of the class that is stored in the list """ try: self.lstFeatures.sort(key=operator.attrgetter('fPosHor')) except: self.errorCode() def getFeatureHieght(self, cFeature): try: #if the feature has a none zero hieght then return that #if the feature has a zero hieght loop though the list of features # to find the lossest feature in each direction which has a none zero hieght # calculate to hieght that the current feature needs to line up with the hieghts of the other features self.sClassStep = "getFeatureHieght" fLowerHieght = 0 fLowerPos = 0 fUpperHieght = 0 fUpperPos = 0 if cFeature.fHieght == 0: for cTempFeature in self.lstFeatures: if not cTempFeature.fHieght == 0: if cTempFeature.fPosHor < cFeature.fPosHor: if cTempFeature.fPosHor > fLowerPos: fLowerPos = cTempFeature.fPosHor fLowerHieght = cTempFeature.fHieght elif cTempFeature.fPosHor > cFeature.fPosHor: if cTempFeature.fPosHor < fLowerPos or fLowerPos == 0: fUpperPos = cTempFeature.fPosHor fUpperHieght = cTempFeature.fHieght if fLowerPos == fUpperPos: self.sClassMessage = "getFeaturePosition just went wrong the lower and upper features which have specified hieghts are the same position in the wall" return 0 else: return fLowerHieght + (cFeature.fPosHor - fLowerPos) * (fLowerHieght - fUpperHieght) / (fLowerPos - fUpperPos) else: return cFeature.fHieght except: self.errorCode() def lowestVertexInList(self, lst, fMinHieght, sSide): __doc__ = """ returns boolean true = vertex is found returns the actual vertex """ try: #find any vertex above min hieght #find lowest vertex bIsFoundVertexAboveMin = False for cVertex in lst: if cVertex.sSide == sSide and cVertex.fZ >= fMinHieght: cTempVertex = cVertex bIsFoundVertexAboveMin = True if bIsFoundVertexAboveMin == True: for cVertex in lst: if cVertex.sSide == sSide and cVertex.fZ >= fMinHieght and cVertex.fZ < cTempVertex.fZ: cTempVertex = cVertex return True, cTempVertex else: cNoneVertex = ClsVertex(0, 0, 0) return False, cNoneVertex except: self.errorCode() def lowestVertexInTwoLists(self, lstOne, lstTwo, fMinHieght, lstExceptions, sSide): __doc__ = """ returns boolean true = vertex is found returns the actual vertex """ try: #find any vertex above min hieght #find lowest vertex bIsFoundVertexAboveMin = False for cVertex in lstOne: if cVertex.sSide == sSide and cVertex.fZ >= fMinHieght and not self.isInVertexLst(lstExceptions, cVertex.iId): cTempVertex = cVertex bIsFoundVertexAboveMin = True for cVertex in lstTwo: if cVertex.sSide == sSide and cVertex.fZ >= fMinHieght and not self.isInVertexLst(lstExceptions, cVertex.iId): cTempVertex = cVertex bIsFoundVertexAboveMin = True if bIsFoundVertexAboveMin == True: for cVertex in lstOne: if cVertex.sSide == sSide and cVertex.fZ >= fMinHieght and cVertex.fZ < cTempVertex.fZ and not self.isInVertexLst(lstExceptions, cVertex.iId): cTempVertex = cVertex for cVertex in lstTwo: if cVertex.sSide == sSide and cVertex.fZ >= fMinHieght and cVertex.fZ < cTempVertex.fZ and not self.isInVertexLst(lstExceptions, cVertex.iId): cTempVertex = cVertex return True, cTempVertex else: cNoneVertex = ClsVertex(0, 0, 0) return False, cNoneVertex except: self.errorCode() def isInVertexLst(self, lstVertex, iId): __doc__ = """ Checks to see a vertex is in the list of vertexes from the ID """ try: bIsFound = False for cVert in lstVertex: if cVert.iId == iId: bIsFound = True return bIsFound except: self.errorCode() def addVertexesDivider(self, cFeature, iVertexCounter, lstVert, lstClsVert): try: self.sClassSubStep = "Divider" self.sClassUsefulValue = "Feature ID " + str(cFeature.iId) self.sClassMessage = "bottom of the divider, side a" #bottom of the divider, side a cTempVertex = ClsVertex(self.vOffset.x + cFeature.fPosHor * math.sin(self.fRotationalVertical) + self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + cFeature.fPosHor * math.cos(self.fRotationalVertical) + self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "middle" cTempVertex.sSide = "a" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "top of the divider, side a" #top of the divider, side a cTempVertex = ClsVertex(self.vOffset.x + cFeature.fPosHor * math.sin(self.fRotationalVertical) + self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + cFeature.fPosHor * math.cos(self.fRotationalVertical) + self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + cFeature.fHieght) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "middle" cTempVertex.sSide = "a" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "bottom of the divider, side b" #bottom of the divider, side b cTempVertex = ClsVertex(self.vOffset.x + cFeature.fPosHor * math.sin(self.fRotationalVertical) - self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + cFeature.fPosHor * math.cos(self.fRotationalVertical) - self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "middle" cTempVertex.sSide = "b" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "top of the divider, side b" #top of the divider, side b cTempVertex = ClsVertex(self.vOffset.x + cFeature.fPosHor * math.sin(self.fRotationalVertical) - self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + cFeature.fPosHor * math.cos(self.fRotationalVertical) - self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + cFeature.fHieght) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "middle" cTempVertex.sSide = "b" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) # bIsFound, iVertexNo = cFeature.varGetAmount(iVariableId = None, sName = None, sType = "extra vertexes") bIsFound, iVertexNo = self.getFeatureVariables(cFeature.iId, iVariableId = None, sVariableName = None, sVariableType = "extra vertexes") iCounter = 0 if bIsFound == True: while iCounter < iVertexNo: iCounter = iCounter + 1 self.sClassMessage = "Extra vertex, side a" #top of the divider, side a cTempVertex = ClsVertex(self.vOffset.x + cFeature.fPosHor * math.sin(self.fRotationalVertical) + self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + cFeature.fPosHor * math.cos(self.fRotationalVertical) + self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + cFeature.fHieght * iCounter / (iVertexNo + 1)) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "middle" cTempVertex.sSide = "a" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "Extra Vertex, side b" #top of the divider, side b cTempVertex = ClsVertex(self.vOffset.x + cFeature.fPosHor * math.sin(self.fRotationalVertical) - self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + cFeature.fPosHor * math.cos(self.fRotationalVertical) - self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + cFeature.fHieght* iCounter / (iVertexNo + 1)) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "middle" cTempVertex.sSide = "b" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) return iVertexCounter except: self.errorCode() return iVertexCounter def addVertexesDoor(self, cFeature, iVertexCounter, lstVert, lstClsVert): try: self.sClassSubStep = "Door" if cFeature.sSubType == "square": #Note: "top of the feature" means the top of the wall and NOT the top of the doorway self.sClassMessage = "top of the feature, side a" #top of the feature, side a cTempVertex = ClsVertex(self.vOffset.x + cFeature.fPosHor * math.sin(self.fRotationalVertical) + self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + cFeature.fPosHor * math.cos(self.fRotationalVertical) + self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + cFeature.fHieght) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "middle" cTempVertex.sSide = "a" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "top of the feature, side b" #top of the feature, side b cTempVertex = ClsVertex(self.vOffset.x + cFeature.fPosHor * math.sin(self.fRotationalVertical) - self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + cFeature.fPosHor * math.cos(self.fRotationalVertical) - self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + cFeature.fHieght) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "middle" cTempVertex.sSide = "b" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) # bIsFoundDoorwayWidth, fDoorwayWidth = cFeature.varGetAmount(iVariableId = None, sName = None, sType = "doorway width") # bIsFoundDoorwayHieght, fDoorwayHieght = cFeature.varGetAmount(iVariableId = None, sName = None, sType = "doorway hieght") bIsFoundDoorwayWidth, fDoorwayWidth = self.getFeatureVariables(cFeature.iId, iVariableId = None, sVariableName = None, sVariableType = "doorway width") bIsFoundDoorwayHieght, fDoorwayHieght = self.getFeatureVariables(cFeature.iId, iVariableId = None, sVariableName = None, sVariableType = "doorway hieght") if bIsFoundDoorwayWidth == True and bIsFoundDoorwayHieght == True: print "doorway width " + str(fDoorwayWidth) print "doorway hieght " + str(fDoorwayHieght) self.sClassMessage = "bottom of the doorway, side 'a' of wall, 'start' side of doorway" cTempVertex = ClsVertex(self.vOffset.x + (cFeature.fPosHor - fDoorwayWidth / 2) * math.sin(self.fRotationalVertical) + self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + (cFeature.fPosHor - fDoorwayWidth / 2) * math.cos(self.fRotationalVertical) + self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "start" cTempVertex.sSide = "a" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "bottom of the doorway, side 'a' of wall, 'end' side of doorway" cTempVertex = ClsVertex(self.vOffset.x + (cFeature.fPosHor + fDoorwayWidth / 2) * math.sin(self.fRotationalVertical) + self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + (cFeature.fPosHor + fDoorwayWidth / 2) * math.cos(self.fRotationalVertical) + self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "end" cTempVertex.sSide = "a" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "bottom of the doorway, side 'b' of wall, 'start' side of doorway" cTempVertex = ClsVertex(self.vOffset.x + (cFeature.fPosHor - fDoorwayWidth / 2) * math.sin(self.fRotationalVertical) - self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + (cFeature.fPosHor - fDoorwayWidth / 2) * math.cos(self.fRotationalVertical) - self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "start" cTempVertex.sSide = "b" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "bottom of the doorway, side 'b' of wall, 'end' side of doorway" cTempVertex = ClsVertex(self.vOffset.x + (cFeature.fPosHor + fDoorwayWidth / 2) * math.sin(self.fRotationalVertical) - self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + (cFeature.fPosHor + fDoorwayWidth / 2) * math.cos(self.fRotationalVertical) - self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "end" cTempVertex.sSide = "b" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "top of the doorway, side 'a' of wall, 'start' side of doorway" cTempVertex = ClsVertex(self.vOffset.x + (cFeature.fPosHor - fDoorwayWidth / 2) * math.sin(self.fRotationalVertical) + self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + (cFeature.fPosHor - fDoorwayWidth / 2) * math.cos(self.fRotationalVertical) + self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + fDoorwayHieght) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "start" cTempVertex.sSide = "a" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "top of the doorway, side 'a' of wall, 'end' side of doorway" cTempVertex = ClsVertex(self.vOffset.x + (cFeature.fPosHor + fDoorwayWidth / 2) * math.sin(self.fRotationalVertical) + self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + (cFeature.fPosHor + fDoorwayWidth / 2) * math.cos(self.fRotationalVertical) + self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + fDoorwayHieght) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "end" cTempVertex.sSide = "a" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "top of the doorway, side 'b' of wall, 'start' side of doorway" cTempVertex = ClsVertex(self.vOffset.x + (cFeature.fPosHor - fDoorwayWidth / 2) * math.sin(self.fRotationalVertical) - self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + (cFeature.fPosHor - fDoorwayWidth / 2) * math.cos(self.fRotationalVertical) - self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + fDoorwayHieght) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "start" cTempVertex.sSide = "b" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) self.sClassMessage = "top of the doorway, side 'b' of wall, 'end' side of doorway" cTempVertex = ClsVertex(self.vOffset.x + (cFeature.fPosHor + fDoorwayWidth / 2) * math.sin(self.fRotationalVertical) - self.fThinkness * math.cos(self.fRotationalVertical) / 2.0, self.vOffset.y + (cFeature.fPosHor + fDoorwayWidth / 2) * math.cos(self.fRotationalVertical) - self.fThinkness * math.sin(self.fRotationalVertical) / 2.0, self.vOffset.z + fDoorwayHieght) cTempVertex.iFeatureId = cFeature.iId cTempVertex.sOrientation = "end" cTempVertex.sSide = "b" cTempVertex.iId = iVertexCounter iVertexCounter = iVertexCounter + 1 lstClsVert.append(cTempVertex) objVert = NMesh.Vert(cTempVertex.fX, cTempVertex.fY, cTempVertex.fZ) lstVert.verts.append(objVert) else: print "doorway missing variables" print " door name " + cFeature.sName self.sClassMessage = "doorway missing variables" self.sClassUsefulValue = " door name " + cFeature.sName return iVertexCounter except: self.errorCode() return iVertexCounter def joinDividerToDivider(self, cFeatureM, cFeatureN, lstVert, lstClsVert): try: print " divider meets divider" self.sClassStep = "create the faces: divider meets divider" #1) loop through both sides of the wall (a and b) #2) create 2 lists of vertexes (one for each feature) #3) pick the bottom two vertexes (one from each list) #4) Find the next vertex up (could be on either list) #5) Using the 3 vertexes (from (3) and (4)) create a face and add it to the faces list #6) which ever vertex was found on point (4) now has to replace the lowest vertex processed on that feature self.sClassSubStep = "(1) loop through both sides of the wall (a and b)" for sSide in ["a", "b"]: self.sClassSubStep = "(2) create 2 lists of vertexes (one for each feature)" lstMVertexes = [] lstNVertexes = [] iCounter = 0 for cTempVertex in lstClsVert: if cTempVertex.iFeatureId == cFeatureM.iId: lstMVertexes.append(cTempVertex) iCounter = iCounter + 1 if cTempVertex.iFeatureId == cFeatureN.iId: lstNVertexes.append(cTempVertex) iCounter = iCounter + 1 self.sClassSubStep = "(3) Pick the bottom two vertexes (one from each list)" bIsFoundLowestM, lowestMVertex = self.lowestVertexInList(lstMVertexes, 0, sSide) bIsFoundLowestN, lowestNVertex = self.lowestVertexInList(lstNVertexes, 0, sSide) self.sClassUsefulValue = "No. Vertexes in lists " + str(iCounter) self.sClassSubStep = "(4) Find the next vertex up (could be on either list): First time" lstExceptions = [lowestMVertex, lowestNVertex] if lstMVertexes is None: self.sClassMessage = "lstMVertexes == None" if lstNVertexes is None: self.sClassMessage = "lstNVertexes == None" if lstExceptions is None: self.sClassMessage = "lstExceptions == None" bIsFoundNextVertex, nextVertex = self.lowestVertexInTwoLists(lstMVertexes, lstNVertexes, 0, lstExceptions, sSide) self.sClassSubStep = "(5) Using the 3 vertexes (from (3) and (4)) create a face and add it to the faces list: First time" objFaceRight = NMesh.Face() objFaceRight.v.append(lstVert.verts[lowestMVertex.iId]) objFaceRight.v.append(lstVert.verts[lowestNVertex.iId]) objFaceRight.v.append(lstVert.verts[nextVertex.iId]) lstVert.faces.append(objFaceRight) lstExceptions.append(nextVertex) while bIsFoundLowestM == True and bIsFoundLowestN == True and bIsFoundNextVertex == True: self.sClassSubStep = "(6) which ever vertex was found on point (4) now has to replace the lowest vertex processed on that feature" if nextVertex.iFeatureId == lowestMVertex.iFeatureId: lowestMVertex = nextVertex elif nextVertex.iFeatureId == lowestNVertex.iFeatureId: lowestNVertex = nextVertex else: self.sClassMessage = "the next vertex is not on the same feature as either of the two other vertexes" self.sClassSubStep = "(4) Find the next vertex up (could be on either list): Second time" bIsFoundNextVertex, nextVertex = self.lowestVertexInTwoLists(lstMVertexes, lstNVertexes, 0, lstExceptions, sSide) if bIsFoundNextVertex == True: lstExceptions.append(nextVertex) self.sClassSubStep = "(5) Using the 3 vertexes (from (3) and (4)) create a face and add it to the faces list: Second time" objFaceRight = NMesh.Face() objFaceRight.v.append(lstVert.verts[lowestMVertex.iId]) objFaceRight.v.append(lstVert.verts[lowestNVertex.iId]) objFaceRight.v.append(lstVert.verts[nextVertex.iId]) lstVert.faces.append(objFaceRight) except: self.errorCode() def build(self): __doc__ = """ The plan -------- 1)Loop through all the features and for each feature create a series of vertexes 2)put the vertexes in both the lstClsVert and lstVert 3)loop through the features depending on the combination of which features are appearing next to eachother join the vertexes together (by populating cFaces with face class) in different combinations 4)loop though the cFaces list of class instances and create face object in the mesh, using the lstClsVert and cFaces to look up the ID values """ try: self.sortFeatures() self.sClassStep = "Create containers (lists)" #Create the mesh object this is a list of vertexes lstVert = NMesh.GetRaw() lstClsVert = [] cFaces = [] #Create a mapping object to keep track of which vertexes are going to be mapped to which #once all the vertexes are created we can then follow the map and create the faces #Z = Hieght #X = Width #Y = Depth #add the vertexs self.sClassStep = "create the vertexes" #create the vertexes iVertexCounter = 0 print "Started Building Wall" print " Length " + str(self.fLength) print " Thickness " + str(self.fThinkness) print " Hieght " + str(self.fDefaultHieght) print " Rotational angle " + str(self.fRotationalVertical) print " iVertexCounter " + str(iVertexCounter) for cFeatureCurrent in self.lstFeatures: if cFeatureCurrent.sType == "divider": print "adding vertexes for divider" iVertexCounter = self.addVertexesDivider(cFeatureCurrent, iVertexCounter, lstVert, lstClsVert) elif cFeatureCurrent.sType == "door": print "adding vertexes for door" iVertexCounter = self.addVertexesDoor(cFeatureCurrent, iVertexCounter, lstVert, lstClsVert) self.sClassStep = "create the faces" print "Create the faces" #add the faces to the existing vertexes cFeaturePrevious = self.lstFeatures[0] for cFeatureCurrent in self.lstFeatures: if not (cFeatureCurrent.iId == cFeaturePrevious.iId): if cFeatureCurrent.sType == "divider" and cFeaturePrevious.sType == "divider": self.joinDividerToDivider(cFeatureCurrent, cFeaturePrevious, lstVert, lstClsVert) elif (cFeatureCurrent.sType == "divider" and cFeaturePrevious.sType == "door") or (cFeatureCurrent.sType == "door" and cFeaturePrevious.sType == "divider"): print " Features divider and door" self.sClassSubStep = "(1) loop through both sides of the wall (a and b)" # for sSide in ["a", "b"]: # lstCurrentVertexes = [] # lstPreviousVertexes = [] else: print " Features of unknown types are meeting" print " Features Current = " + cFeatureCurrent.sType print " Features Previous = " + cFeaturePrevious.sType cFeaturePrevious = cFeatureCurrent #Don't understand yet objMyBox = NMesh.PutRaw(lstVert) except: self.errorCode()