Beispiel #1
0
    def realignLayer(self,
                     thisLayer,
                     shouldRealign=False,
                     shouldReport=False,
                     shouldVerbose=False):
        moveForward = NSPoint(1, 0)
        moveBackward = NSPoint(-1, 0)
        noModifier = NSNumber.numberWithUnsignedInteger_(0)
        layerCount = 0

        if thisLayer:
            for thisPath in thisLayer.paths:
                oldPathCoordinates = [n.position for n in thisPath.nodes]
                for thisNode in thisPath.nodes:
                    if thisNode.type == GSOFFCURVE:
                        oldPosition = NSPoint(thisNode.position.x,
                                              thisNode.position.y)
                        selectedNode = NSMutableArray.arrayWithObject_(
                            thisNode)
                        thisLayer.setSelection_(selectedNode)
                        self.Tool.moveSelectionLayer_shadowLayer_withPoint_withModifier_(
                            thisLayer, thisLayer, moveForward, noModifier)
                        self.Tool.moveSelectionLayer_shadowLayer_withPoint_withModifier_(
                            thisLayer, thisLayer, moveBackward, noModifier)

                for i, coordinate in enumerate(oldPathCoordinates):
                    if thisPath.nodes[i].position != coordinate:
                        layerCount += 1

                        # put handle back if not desired by user:
                        if not shouldRealign:
                            thisPath.nodes[i].position = coordinate
        thisLayer.setSelection_(())

        if shouldVerbose:
            if layerCount:
                if shouldRealign:
                    print(u"   ⚠️ Realigned %i handle%s." %
                          (layerCount, "" if layerCount == 1 else "s"))
                else:
                    print(u"   ❌ %i handle%s are unaligned." %
                          (layerCount, "" if layerCount == 1 else "s"))
            else:
                print(u"   ✅ All BCPs OK.")

        return layerCount
#MenuTitle: Realign BCPs
# -*- coding: utf-8 -*-
from __future__ import division, print_function, unicode_literals
__doc__ = """
Realigns handles (BCPs) in current layers of selected glyphs. Useful for resetting out-of-sync handles, e.g., after a transform operation, after interpolation or after switching to a different grid. Hold down Option to process ALL layers of the glyph.
"""

from Foundation import NSPoint, NSEvent, NSNumber, NSMutableArray

optionKeyFlag = 524288
optionKeyPressed = NSEvent.modifierFlags() & optionKeyFlag == optionKeyFlag

thisFont = Glyphs.font
moveForward = NSPoint(1, 1)
moveBackward = NSPoint(-1, -1)
noModifier = NSNumber.numberWithUnsignedInteger_(0)
Tool = GlyphsPathPlugin.alloc().init()


def realignLayer(thisLayer):
    countOfHandlesOnLayer = 0
    for thisPath in thisLayer.paths:
        for thisNode in thisPath.nodes:
            if thisNode.type == GSOFFCURVE:
                countOfHandlesOnLayer += 1
                selectedNode = NSMutableArray.arrayWithObject_(thisNode)
                thisLayer.setSelection_(selectedNode)
                Tool.moveSelectionLayer_shadowLayer_withPoint_withModifier_(
                    thisLayer, thisLayer, moveForward, noModifier)
                Tool.moveSelectionLayer_shadowLayer_withPoint_withModifier_(
                    thisLayer, thisLayer, moveBackward, noModifier)
    def realignLayer(self,
                     thisLayer,
                     shouldRealign=False,
                     shouldReport=False,
                     shouldVerbose=False):
        moveForward = NSPoint(1, 0)
        moveBackward = NSPoint(-1, 0)
        noModifier = NSNumber.numberWithUnsignedInteger_(0)
        layerCount = 0

        if thisLayer:
            for thisPath in thisLayer.paths:
                oldPathCoordinates = [n.position for n in thisPath.nodes]
                for i, thisNode in enumerate(thisPath.nodes):
                    if thisNode.type == GSOFFCURVE:
                        # oldPosition = NSPoint(thisNode.position.x, thisNode.position.y)
                        oncurve = None
                        if thisNode.prevNode.type != GSOFFCURVE:
                            oncurve = thisNode.prevNode
                            opposingPoint = oncurve.prevNode
                        elif thisNode.nextNode.type != GSOFFCURVE:
                            oncurve = thisNode.nextNode
                            opposingPoint = oncurve.nextNode

                        handleStraight = (oncurve.x - thisNode.x) * (
                            oncurve.y - thisNode.y) == 0.0
                        if oncurve and oncurve.smooth and not handleStraight:
                            # thisNode = angled handle, straighten it
                            thisPath.setSmooth_withCenterPoint_oppositePoint_(
                                thisNode,
                                oncurve.position,
                                opposingPoint.position,
                            )
                        elif oncurve and opposingPoint and oncurve.smooth and handleStraight and opposingPoint.type == GSOFFCURVE:
                            # thisNode = straight handle: align opposite handle
                            thisPath.setSmooth_withCenterPoint_oppositePoint_(
                                opposingPoint,
                                oncurve.position,
                                thisNode.position,
                            )
                        else:
                            selectedNode = NSMutableArray.arrayWithObject_(
                                thisNode)
                            thisLayer.setSelection_(selectedNode)
                            self.Tool.moveSelectionLayer_shadowLayer_withPoint_withModifier_(
                                thisLayer, thisLayer, moveForward, noModifier)
                            self.Tool.moveSelectionLayer_shadowLayer_withPoint_withModifier_(
                                thisLayer, thisLayer, moveBackward, noModifier)
                            # TODO:
                            # recode with GSPath.setSmooth_withCenterNode_oppositeNode_()

                for i, coordinate in enumerate(oldPathCoordinates):
                    if thisPath.nodes[i].position != coordinate:
                        layerCount += 1

                        # put handle back if not desired by user:
                        if not shouldRealign:
                            thisPath.nodes[i].position = coordinate
        thisLayer.setSelection_(())

        if shouldReport and shouldVerbose:
            if layerCount:
                if shouldRealign:
                    print(u"   ⚠️ Realigned %i handle%s." %
                          (layerCount, "" if layerCount == 1 else "s"))
                else:
                    print(u"   ❌ %i handle%s are unaligned." %
                          (layerCount, "" if layerCount == 1 else "s"))
            else:
                print(u"   ✅ All BCPs OK.")

        return layerCount