2 Add material to support overhang or remove material at the overhang angle.
6 from __future__ import absolute_import
8 from fabmetheus_utilities.geometry.creation import lineation
9 from fabmetheus_utilities.geometry.geometry_utilities import evaluate
10 from fabmetheus_utilities.vector3 import Vector3
11 from fabmetheus_utilities import euclidean
15 __author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
16 __credits__ = 'Art of Illusion <http://www.artofillusion.org/>'
17 __date__ = '$Date: 2008/02/05 $'
18 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
21 globalExecutionOrder = 40
24 def getManipulatedPaths(close, elementNode, loop, prefix, sideLength):
28 derivation = RoundDerivation(elementNode, prefix, sideLength)
29 if derivation.radius == 0.0:
32 sidesPerRadian = 0.5 / math.pi * evaluate.getSidesMinimumThreeBasedOnPrecision(elementNode, sideLength)
33 for pointIndex in xrange(len(loop)):
34 begin = loop[(pointIndex + len(loop) - 1) % len(loop)]
35 center = loop[pointIndex]
36 end = loop[(pointIndex + 1) % len(loop)]
37 roundLoop += getRoundPath(begin, center, close, end, derivation.radius, sidesPerRadian)
38 return [euclidean.getLoopWithoutCloseSequentialPoints(close, roundLoop)]
40 def getNewDerivation(elementNode, prefix, sideLength):
42 return RoundDerivation(elementNode, prefix, sideLength)
44 def getRoundPath( begin, center, close, end, radius, sidesPerRadian ):
46 beginComplex = begin.dropAxis()
47 centerComplex = center.dropAxis()
48 endComplex = end.dropAxis()
49 beginComplexSegmentLength = abs( centerComplex - beginComplex )
50 endComplexSegmentLength = abs( centerComplex - endComplex )
51 minimumRadius = lineation.getMinimumRadius( beginComplexSegmentLength, endComplexSegmentLength, radius )
52 if minimumRadius <= close:
54 beginBevel = center + minimumRadius / beginComplexSegmentLength * ( begin - center )
55 endBevel = center + minimumRadius / endComplexSegmentLength * ( end - center )
56 beginBevelComplex = beginBevel.dropAxis()
57 endBevelComplex = endBevel.dropAxis()
58 midpointComplex = 0.5 * ( beginBevelComplex + endBevelComplex )
60 centerComplex = midpointComplex + midpointComplex - centerComplex
61 midpointMinusCenterComplex = midpointComplex - centerComplex
62 midpointCenterLength = abs( midpointMinusCenterComplex )
63 midpointEndLength = abs( midpointComplex - endBevelComplex )
64 midpointCircleCenterLength = midpointEndLength * midpointEndLength / midpointCenterLength
65 circleRadius = math.sqrt( midpointCircleCenterLength * midpointCircleCenterLength + midpointEndLength * midpointEndLength )
66 circleCenterComplex = midpointComplex + midpointMinusCenterComplex * midpointCircleCenterLength / midpointCenterLength
67 circleCenter = Vector3( circleCenterComplex.real, circleCenterComplex.imag, center.z )
68 endMinusCircleCenterComplex = endBevelComplex - circleCenterComplex
69 beginMinusCircleCenter = beginBevel - circleCenter
70 beginMinusCircleCenterComplex = beginMinusCircleCenter.dropAxis()
71 angleDifference = euclidean.getAngleDifferenceByComplex( endMinusCircleCenterComplex, beginMinusCircleCenterComplex )
72 steps = int( math.ceil( abs( angleDifference ) * sidesPerRadian ) )
73 stepPlaneAngle = euclidean.getWiddershinsUnitPolar( angleDifference / float( steps ) )
74 deltaZStep = ( end.z - begin.z ) / float( steps )
75 roundPath = [ beginBevel ]
76 for step in xrange( 1, steps ):
77 beginMinusCircleCenterComplex = beginMinusCircleCenterComplex * stepPlaneAngle
78 arcPointComplex = circleCenterComplex + beginMinusCircleCenterComplex
79 arcPoint = Vector3( arcPointComplex.real, arcPointComplex.imag, begin.z + deltaZStep * step )
80 roundPath.append( arcPoint )
81 return roundPath + [ endBevel ]
83 def processElementNode(elementNode):
84 "Process the xml element."
85 lineation.processElementNodeByFunction(elementNode, getManipulatedPaths)
88 class RoundDerivation(object):
89 "Class to hold round variables."
90 def __init__(self, elementNode, prefix, sideLength):
92 self.radius = lineation.getFloatByPrefixSide(0.0, elementNode, prefix + 'radius', sideLength)