How to call “Show all glyphs that use this as a component” via script?
Probably there is a way shorter approach, but I once wrote a work around in this script (Nevermind the old methods for opening tabs and so )
Ha! thanks I was hoping there would be something in the API.
I am curious as well about that. And for an information
if a glyph is reused at all. It got to be somewhere. Wanted to use it for a reporter, but my loop slowed down everything like hell
This is all implemented in the select tool. it is not really useable to access it from a script. I could refactor it a bit to improve on it but this would go pretty low in the list.
Sounds nice. No rush at all. Put it at the very bottom if at all. I was just curious, since there is so much stuff accessible already. And the script does what it shall do : )
Is something like
glyph is reused accessible as a property already? I still need this pretty often in certain scripts and find that checking each glyph agains each other glyph in a font manually is incredibly slow.
Here a simple sketch as example (run with a font that has Cyrillic and/or Greek):
import time thisFont = Glyphs.font allGlyphsInFont = [g.name for g in thisFont.glyphs] start_time = time.time() def glyphIsReusedInAnotherScipt(glyphName, masterIDX): reusedGlyphs =  for thisGlyphName in allGlyphsInFont: thisGlyph = thisFont.glyphs[thisGlyphName] try: masterLayer = thisGlyph.layers[masterIDX] layerComponents = masterLayer.components if len(layerComponents) == 1: if layerComponents.componentName == glyphName: reusedGlyphs.append(thisGlyphName) except: pass if len(reusedGlyphs) > 0: reusedGlyphs.insert(0, glyphName) return reusedGlyphs return None for gName in allGlyphsInFont: isReused = glyphIsReusedInAnotherScipt(gName, 0) if isReused: print isReused print("--- %s seconds ---" % (time.time() - start_time))
Apparently there must be a method built in to Glyphs that runs lightning fast when clicking
Show all glyphs that use this glyph as a component
Here is a slightly optimized version of the script:
thisFont = Glyphs.font def glyphIsReusedInAnotherScipt(glyphName, masterID): reusedGlyphs =  for thisGlyph in thisFont.glyphs: try: masterLayer = thisGlyph.layers[masterID] layerComponents = masterLayer.componentNames if glyphName in layerComponents: reusedGlyphs.append(thisGlyphName) except: pass if len(reusedGlyphs) > 0: reusedGlyphs.insert(0, glyphName) return reusedGlyphs return None def tunTest(): for g in thisFont.glyphs: isReused = glyphIsReusedInAnotherScipt(g.name, thisFont.masters.id) import cProfile cProfile.run('tunTest()')
but this is indeed much faster:
thisFont = Glyphs.font def tunTest(): for g in thisFont.glyphs: isReused = thisFont.glyphsContainingComponentWithName_masterID_(g.name, thisFont.masters.id) import cProfile cProfile.run('tunTest()')
The native method does almost exactly the same thing but is still 10 times faster.
This looks very promising. Thank you so much, Georg! First test is going down from about 30 sec to 0.35 sec. After rewriting the function to my exact need, it executes in a blink of an eye now – Implemented in Kernkraft.