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.vector3 import Vector3
10 from fabmetheus_utilities import euclidean
13 __author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
14 __credits__ = 'Art of Illusion <http://www.artofillusion.org/>'
15 __date__ = '$Date: 2008/02/05 $'
16 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
19 globalExecutionOrder = 20
22 def getBevelPath( begin, center, close, end, radius ):
24 beginComplex = begin.dropAxis()
25 centerComplex = center.dropAxis()
26 endComplex = end.dropAxis()
27 beginComplexSegmentLength = abs( centerComplex - beginComplex )
28 endComplexSegmentLength = abs( centerComplex - endComplex )
29 minimumRadius = lineation.getMinimumRadius( beginComplexSegmentLength, endComplexSegmentLength, radius )
30 if minimumRadius <= close:
32 beginBevel = center + minimumRadius / beginComplexSegmentLength * ( begin - center )
33 endBevel = center + minimumRadius / endComplexSegmentLength * ( end - center )
35 return [ beginBevel, endBevel ]
36 midpointComplex = 0.5 * ( beginBevel.dropAxis() + endBevel.dropAxis() )
37 spikeComplex = centerComplex + centerComplex - midpointComplex
38 return [ beginBevel, Vector3( spikeComplex.real, spikeComplex.imag, center.z ), endBevel ]
40 def getManipulatedPaths(close, elementNode, loop, prefix, sideLength):
44 derivation = BevelDerivation(elementNode, prefix, sideLength)
45 if derivation.radius == 0.0:
48 for pointIndex in xrange(len(loop)):
49 begin = loop[(pointIndex + len(loop) - 1) % len(loop)]
50 center = loop[pointIndex]
51 end = loop[(pointIndex + 1) % len(loop)]
52 bevelLoop += getBevelPath(begin, center, close, end, derivation.radius)
53 return [euclidean.getLoopWithoutCloseSequentialPoints(close, bevelLoop)]
55 def getNewDerivation(elementNode, prefix, sideLength):
57 return BevelDerivation(elementNode, prefix, sideLength)
59 def processElementNode(elementNode):
60 "Process the xml element."
61 lineation.processElementNodeByFunction(elementNode, getManipulatedPaths)
64 class BevelDerivation(object):
65 "Class to hold bevel variables."
66 def __init__(self, elementNode, prefix, sideLength):
68 self.radius = lineation.getFloatByPrefixSide(0.0, elementNode, prefix + 'radius', sideLength)