MrDraw/SkeinPyPy/fabmetheus_utilities/geometry/manipulation_shapes/_bottom.py
daid 77d04ceab8 Removed patches for different skeinforge versions. Only SF48 now.
Updated build script to create win32/linux/macos versions.
Fixed the defaults to they work with PLA.
Fixed the temperature plugin default "ON" problem.
Removed all profiles except for PLA.
2012-02-10 17:20:03 +01:00

104 lines
3.9 KiB
Python

"""
Boolean geometry bottom.
"""
from __future__ import absolute_import
#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
import __init__
from fabmetheus_utilities.geometry.creation import solid
from fabmetheus_utilities.geometry.geometry_utilities.evaluate_elements import setting
from fabmetheus_utilities.geometry.geometry_utilities import boolean_geometry
from fabmetheus_utilities.geometry.geometry_utilities import evaluate
from fabmetheus_utilities.geometry.geometry_utilities import matrix
from fabmetheus_utilities import euclidean
__author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
__credits__ = 'Art of Illusion <http://www.artofillusion.org/>'
__date__ = '$Date: 2008/02/05 $'
__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
globalExecutionOrder = 400
def bottomElementNode(derivation, target):
"Bottom target."
xmlObject = target.xmlObject
if xmlObject == None:
print('Warning, bottomTarget in bottom could not get xmlObject for:')
print(target)
print(derivation.elementNode)
return
targetMatrix = matrix.getBranchMatrixSetElementNode(target)
lift = derivation.altitude
transformedPaths = xmlObject.getTransformedPaths()
if len(transformedPaths) > 0:
lift += derivation.getAdditionalPathLift() - euclidean.getBottomByPaths(transformedPaths)
else:
lift -= boolean_geometry.getMinimumZ(xmlObject)
targetMatrix.tetragrid = matrix.getIdentityTetragrid(targetMatrix.tetragrid)
targetMatrix.tetragrid[2][3] += lift
matrix.setElementNodeDictionaryMatrix(target, targetMatrix)
def getManipulatedGeometryOutput(elementNode, geometryOutput, prefix):
'Get bottomed geometryOutput.'
derivation = BottomDerivation(elementNode, prefix)
copyShallow = elementNode.getCopyShallow()
solid.processElementNodeByGeometry(copyShallow, geometryOutput)
targetMatrix = matrix.getBranchMatrixSetElementNode(elementNode)
matrix.setElementNodeDictionaryMatrix(copyShallow, targetMatrix)
minimumZ = boolean_geometry.getMinimumZ(copyShallow.xmlObject)
copyShallow.parentNode.xmlObject.archivableObjects.remove(copyShallow.xmlObject)
lift = derivation.altitude - minimumZ
vertexes = matrix.getVertexes(geometryOutput)
for vertex in vertexes:
vertex.z += lift
return geometryOutput
def getManipulatedPaths(close, elementNode, loop, prefix, sideLength):
'Get flipped paths.'
if len(loop) < 1:
return [[]]
derivation = BottomDerivation(elementNode, prefix)
targetMatrix = matrix.getBranchMatrixSetElementNode(elementNode)
transformedLoop = matrix.getTransformedVector3s(matrix.getIdentityTetragrid(targetMatrix.tetragrid), loop)
lift = derivation.altitude + derivation.getAdditionalPathLift() - euclidean.getBottomByPath(transformedLoop)
for point in loop:
point.z += lift
return [loop]
def getNewDerivation(elementNode, prefix, sideLength):
'Get new derivation.'
return BottomDerivation(elementNode, '')
def processElementNode(elementNode):
"Process the xml element."
processElementNodeByDerivation(None, elementNode)
def processElementNodeByDerivation(derivation, elementNode):
'Process the xml element by derivation.'
if derivation == None:
derivation = BottomDerivation(elementNode, '')
targets = evaluate.getElementNodesByKey(elementNode, 'target')
if len(targets) < 1:
print('Warning, processElementNode in bottom could not get targets for:')
print(elementNode)
return
for target in targets:
bottomElementNode(derivation, target)
class BottomDerivation:
"Class to hold bottom variables."
def __init__(self, elementNode, prefix):
'Set defaults.'
self.altitude = evaluate.getEvaluatedFloat(0.0, elementNode, prefix + 'altitude')
self.elementNode = elementNode
self.liftPath = evaluate.getEvaluatedBoolean(True, elementNode, prefix + 'liftPath')
def getAdditionalPathLift(self):
"Get path lift."
return 0.5 * setting.getLayerHeight(self.elementNode) * float(self.liftPath)