Hi there,
I would like to make this script I use to detect all kind of overlaps in FL to work also in Glyphs. Can you help me to make it work on Glyphs?
Thanks in advance.
f = Font(fl.font)
for glyphIndex in range(len(f.glyphs)):
g = f[glyphIndex]
if (len(g.components) > 1) or (len(g) > 0 and len(g.components) > 0):
# only decompose composites made up of more than one component
g.Decompose()
if len(g) > 0:
# glyph has outlines
g2 = Glyph(g)
g2.RemoveOverlap()
if len(g) != len(g2):
# different number of nodes
fl.font[glyphIndex].mark = 10
else:
# check nodes
for nodeIndex in range(len(g.nodes)):
n = g.nodes[nodeIndex]
n2 = g2.nodes[nodeIndex]
if len(n) != len(n2):
# nodes don't have the same number of points
fl.font[glyphIndex].mark = 20
break
else:
# check points
for pointIndex in range(len(n.points)):
if n[pointIndex].x != n2[pointIndex].x or n[pointIndex].y != n2[pointIndex].y:
fl.font[glyphIndex].mark = 30
break
fl.UpdateFont()
What do you need the script for? Why decompose components?
I only decompose overlapping components. It’s because I like to check for tiny problems in the contours, like cusps and superfluous points. This script check for all kind of overlaps: components / components, contour / contour and components / contour.
I think people who works with Glyphs frequently trust too much on automated interpolated weights and remove overlaps on font export. I prefer to generate instances and then carefully check the contours and correct mistakes when necessary. I like it this way.
You decompose all glyphs that have more than one component. There is no check if they are overlapping.
If I where you, I would export as TrueType and open the .ttf and do the checking there.
No thanks, I prefer to decompose overlapping composites and then improve the contours manually. Can be the script be adapted or not?
It can be adapted, of course. I just like to check that it is doing what you actually need. I’ll have a look.
This script does not necessarily help you with that. It decomposes all glyphs that have two components or a path and a component. The script proceeds to remove all overlaps and then checks if the node count has changed. I believe this says not much about overlapping components. In most setups it will create a lot of false positives.
#MenuTitle: Find Overlaps
# -*- coding: utf-8 -*-
__doc__="""
Find Overlaps.
"""
master = Font.masters[Font.masterIndex]
def findOverlaps(layer):
AllPaths = []
for component in layer.components:
AllPaths.append(component.bezierPath)
for path in layer.paths:
AllPaths.append(path.bezierPath)
for path in AllPaths:
for otherPath in AllPaths:
if path != otherPath:
if path.intersectWithPath_(otherPath):
layer.color = 2
return
for glyph in Font.glyphs:
layer = glyph.layers[master.id]
findOverlaps(layer)
This script will not decompose anything. I just marks all glyphs where it found an overlap.
The FL script only highlight the slots when there is any kind of overlap. Then I decompose them and improve the contours when necessary.
The Glyphs version works very well, many thanks!