Glyphs.app Python Scripting API Documentation

This is the documentation for the Python Scripting API for Glyphs.app (glyphsapp.com)

_images/objectmodel.png

About this Document

This document covers all methods that are implemented in the Python wrapper. There are many more functions and objects available via the PyObjC bridge. For more details, please have a look at the Core part of the documentation.

Changes in the API

These changes could possibly break your code, so you need to keep track of them. Please see GSApplication.versionNumber for how to check for the app version in your code. Really, read it. There’s a catch.

GSApplication

The mothership. Everything starts here.

print(Glyphs)
<Glyphs.app>
class GSApplication

Properties

currentDocument

documents

font

fonts

reporters

activeReporters

filters

defaults

scriptAbbreviations

scriptSuffixes

languageScripts

languageData

unicodeRanges

editViewWidth

handleSize

versionString

versionNumber

buildNumber

menu

Functions

open()

showMacroWindow()

clearLog()

showGlyphInfoPanelWithSearchString()

glyphInfoForName()

glyphInfoForUnicode()

niceGlyphName()

productionGlyphName()

ligatureComponents()

addCallback()

removeCallback()

redraw()

showNotification()

localize()

activateReporter()

deactivateReporter()

Properties

currentDocument

The active GSDocument object or None.

Type:

GSDocument

# topmost open document
document = Glyphs.currentDocument
documents

An array of open GSDocument objects.

Type:

list

font

The active GSFont object or None.

Type:

GSFont

fonts

Be aware that the order is defined by last used font. Append and extend generally don’t insert at the end of the list.

Type:

list

# access all open fonts
for font in Glyphs.fonts:
    print(font.familyName)
# add a font
font = GSFont()
font.familyName = "My New Font"
Glyphs.fonts.append(font)
reporters

List of available reporter plug-ins (same as bottom section in the ‘View’ menu). These are the actual objects. You can get hold of their names using object.__class__.__name__.

Also see GSApplication.activateReporter() and GSApplication.deactivateReporter() methods below to activate/deactivate them.

Type:

list

# List of all reporter plug-ins
print(Glyphs.reporters)
# Individual plug-in class names
for reporter in Glyphs.reporters:
    print(reporter.__class__.__name__)
# Activate a plugin
Glyphs.activateReporter(Glyphs.reporters[0]) # by object
Glyphs.activateReporter('GlyphsMasterCompatibility') # by class name
activeReporters

List of activated reporter plug-ins.

Type:

list

# Activate a plugin
Glyphs.activateReporter(Glyphs.reporters[0])
# list of currently active reporter plug-ins
activeReporters = Glyphs.activeReporters
filters

List of available filters (same as ‘Filter’ menu). These are the actual objects.

Below sample code shows how to get hold of a particular filter and use it. You invoke it using the processFont_withArguments_() function for old plugins, or the filter() function for newer plugins. As arguments you use the list obtained by clicking on ‘Copy Custom Parameter’ button in the filter’s dialog (gear icon) and convert it to a list. In the include option you can supply a comma-separated list of glyph names.

Type:

list

# Helper function to get filter by its class name
def filterForName(name):
    for filter in Glyphs.filters:
        if filter.__class__.__name__ == name:
            return filter
# Get the filter
offsetCurveFilter = filterForName('GlyphsFilterOffsetCurve')
# Run the filter (old plugins)
# The arguments came from the 'Copy Custom Parameter' as:
# Filter = "GlyphsFilterOffsetCurve;10;10;1;0.5;"
offsetCurveFilter.processFont_withArguments_(font, ['GlyphsFilterOffsetCurve', '10', '10', '1', '0.5', 'include:%s' % glyph.name])
# If the plugin were a new filter, the same call would look like this:
# (run on a specific layer, not the first layer glyphs in the include-list)
# The arguments list is a dictionary with either incrementing integers as keys or names (as per 'Copy Custom Parameter' list)
offsetCurveFilter.filter(layer, False, {0: 10, 1: 10, 2: 1, 3: 0.5})

New in version After: 2.4.2

defaults

A dict like object for storing preferences. You can get and set key-value pairs.

Please be careful with your keys. Use a prefix that uses the reverse domain name. e.g. com.MyName.foo.bar.

Type:

dict

# Check for whether or not a preference exists
if "com.MyName.foo.bar" in Glyphs.defaults:
    # do stuff
# Get and set values
value = Glyphs.defaults["com.MyName.foo.bar"]
Glyphs.defaults["com.MyName.foo.bar"] = newValue
# Remove value
# This will restore the default value
del Glyphs.defaults["com.MyName.foo.bar"]
boolDefaults

Access to default settings cast to a bool.

Type:

bool

if Glyphs.boolDefaults["com.MyName.foo.bar"]:
    print('"com.MyName.foo.bar" is set')
scriptAbbreviations

A dictionary with script name to tag mapping, e.g., ‘arabic’: ‘arab’ or ‘devanagari’: ‘dev2’

Type:

dict

scriptSuffixes

A dictionary with glyphs name suffixes for scripts and their respective script names, e.g., ‘cy’: ‘cyrillic’

Type:

dict

languageScripts

A dictionary with language tag to script tag mapping, e.g., ‘ENG’: ‘latn’

Type:

dict

languageData

A list of dictionaries with more detailed language informations.

Type:

list

unicodeRanges

Names of unicode ranges.

Type:

list

editViewWidth

Width of glyph Edit view. Corresponds to the “Width of editor” setting from the Preferences.

Type:

int

handleSize

Size of Bezier handles in Glyph Edit view. Possible value are 0–2. Corresponds to the ‘Handle size’ setting from the Preferences.

To use the handle size for drawing in reporter plugins, you need to convert the handle size to a point size, and divide by the view’s scale factor. See example below.

Type:

int

# Calculate handle size
handSizeInPoints = 5 + Glyphs.handleSize * 2.5 # (= 5.0 or 7.5 or 10.0)
scaleCorrectedHandleSize = handSizeInPoints / Glyphs.font.currentTab.scale
# Draw point in size of handles
point = NSPoint(100, 100)
NSColor.redColor.set()
rect = NSRect((point.x - scaleCorrectedHandleSize * 0.5, point.y - scaleCorrectedHandleSize * 0.5), (scaleCorrectedHandleSize, scaleCorrectedHandleSize))
bezierPath = NSBezierPath.bezierPathWithOvalInRect_(rect)
bezierPath.fill()
versionString

String containing Glyph.app’s version number. May contain letters also, like ‘2.3b’. To check for a specific version, use Glyphs.versionNumber below.

Type:

string

versionNumber

Glyph.app’s version number. Use this to check for version in your code.

Type:

float

buildNumber

Glyph.app’s build number.

Especially if you’re using preview builds, this number may be more important to you than the version number. The build number increases with every released build and is the most significant evidence of new Glyphs versions, while the version number is set arbitrarily and stays the same until the next stable release.

Type:

float

menu

Add menu items to Glyphs’ main menus.

Following constants for accessing the menus are defined: APP_MENU, FILE_MENU, EDIT_MENU, GLYPH_MENU, PATH_MENU, FILTER_MENU, VIEW_MENU, SCRIPT_MENU, WINDOW_MENU, HELP_MENU

def doStuff(sender):
    # do stuff
newMenuItem = NSMenuItem('My menu title', doStuff)
Glyphs.menu[EDIT_MENU].append(newMenuItem)

Functions

open(Path[, showInterface=True])

Opens a document

Parameters:
  • Path (str) – The path where the document is located.

  • showInterface (bool) – If a document window should be opened. Default: True

Returns:

The opened document object or None.

Return type:

GSFont

showMacroWindow()

Opens the macro window

clearLog()

Deletes the content of the console in the macro window

showGlyphInfoPanelWithSearchString(String)

Shows the Glyph Info window with a preset search string

Parameters:

String – The search term

glyphInfoForName(name[, font=None])

Generates GSGlyphInfo object for a given glyph name.

Parameters:
  • name – Glyph name

  • font – if you add a font, and the font has a local glyph info, it will be used instead of the global info data.

Returns:

GSGlyphInfo

glyphInfoForUnicode(Unicode[, font=None])

Generates GSGlyphInfo object for a given hex unicode.

Parameters:
  • Unicode – Hex unicode

  • font – if you add a font, and the font has a local glyph info, it will be used instead of the global info data.

Returns:

GSGlyphInfo

niceGlyphName(name[, font=None])

Converts glyph name to nice, human-readable glyph name (e.g. afii10017 or uni0410 to A-cy)

Parameters:
  • name – glyph name

  • font – if you add a font, and the font has a local glyph info, it will be used instead of the global info data.

Returns:

string

productionGlyphName(name[, font=None])

Converts glyph name to production glyph name (e.g. afii10017 or A-cy to uni0410)

Parameters:
  • name – glyph name

  • font – if you add a font, and the font has a local glyph info, it will be used instead of the global info data.

Returns:

string

ligatureComponents(String[, font=None])

If defined as a ligature in the glyph database, this function returns a list of glyph names that this ligature could be composed of.

Parameters:
  • string – glyph name

  • font – if you add a font, and the font has a local glyph info, it will be used instead of the global info data.

Return type:

list

print(Glyphs.ligatureComponents('allah-ar'))
>> (
    "alef-ar",
    "lam-ar.init",
    "lam-ar.medi",
    "heh-ar.fina"
)
addCallback(function, hook)

Add a user-defined function to the glyph window’s drawing operations, in the foreground and background for the active glyph as well as in the inactive glyphs.

The function names are used to add/remove the functions to the hooks, so make sure to use unique function names.

Your function needs to accept two values: layer which will contain the respective GSLayer object of the layer we’re dealing with and info which is a dictionary and contains the value Scale (for the moment).

For the hooks these constants are defined: DRAWFOREGROUND, DRAWBACKGROUND, DRAWINACTIVE, DOCUMENTWASSAVED, DOCUMENTOPENED, TABDIDOPEN, TABWILLCLOSE, UPDATEINTERFACE, MOUSEMOVED. For more information check the constants section.

def drawGlyphIntoBackground(layer, info):
    # Due to internal Glyphs.app structure, we need to catch and print exceptions
    # of these callback functions with try/except like so:
    try:
        # Your drawing code here
        NSColor.redColor().set()
        layer.bezierPath.fill()
    # Error. Print exception.
    except:
        import traceback
        print(traceback.format_exc())
# add your function to the hook
Glyphs.addCallback(drawGlyphIntoBackground, DRAWBACKGROUND)
removeCallback(function)

Remove the function you’ve previously added.

# remove your function from the hook
Glyphs.removeCallback(drawGlyphIntoBackground)
redraw()

Redraws all Edit views and Preview views.

showNotification(title, message)

Shows the user a notification in Mac’s Notification Center.

Glyphs.showNotification('Export fonts', 'The export of the fonts was successful.')
localize(localization)

Return a string in the language of Glyphs.app’s UI locale, which must be supplied as a dictionary using language codes as keys.

The argument is a dictionary in the languageCode: translatedString format.

You don’t need to supply strings in all languages that the Glyphs.app UI supports. A subset will do. Just make sure that you add at least an English string to default to next to all your other translated strings. Also don’t forget to mark strings as unicode strings ('öäüß') when they contain non-ASCII content for proper encoding, and add a # encoding: utf-8 to the top of all your .py files.

Tip: You can find Glyphs’ localized languages here Glyphs.defaults["AppleLanguages"].

print(Glyphs.localize({
    'en': 'Hello World',
    'de': 'Hallöle Welt',
    'fr': 'Bonjour tout le monde',
    'es': 'Hola Mundo',
}))
# Given that your Mac’s system language is set to German
# and Glyphs.app UI is set to use localization (change in app settings),
# it will print:
>> Hallöle Welt
activateReporter(reporter)

Activate a reporter plug-in by its object (see Glyphs.reporters) or class name.

Glyphs.activateReporter('GlyphsMasterCompatibility')
deactivateReporter(reporter)

Deactivate a reporter plug-in by its object (see Glyphs.reporters) or class name.

Glyphs.deactivateReporter('GlyphsMasterCompatibility')

GSDocument

The document class

class GSDocument

Properties

font

filePath

Properties

font

The active GSFont

Type:

GSFont

filePath

The last save location

Type:

str

GSFont

Implementation of the font object. This object is host to the masters used for interpolation. Even when no interpolation is involved, for the sake of object model consistency there will still be one master and one instance representing a single font.

Also, the glyphs are attached to the Font object right here, not one level down to the masters. The different masters’ glyphs are available as layers attached to the glyph objects which are attached here.

class GSFont

Properties

parent

masters

axes

properties

stems

instances

glyphs

classes

features

featurePrefixes

copyright

copyrights

license

licenses

designer

designers

designerURL

manufacturer

manufacturers

manufacturerURL

familyNames

trademark

trademarks

sampleText

sampleTexts

description

descriptions

compatibleFullName

compatibleFullNames

versionMajor

versionMinor

date

familyName

upm

note

kerning

userData

grid

gridSubDivision

gridLength

keyboardIncrement

keyboardIncrementBig

keyboardIncrementHuge

snapToObjects

disablesNiceNames

customParameters

selection

selectedLayers

selectedFontMaster

masterIndex

currentText

tabs

fontView

currentTab

filepath

tool

tools

appVersion

Functions

save()

close()

show()

disableUpdateInterface()

enableUpdateInterface()

kerningForPair()

setKerningForPair()

removeKerningForPair()

newTab()

updateFeatures()

compileFeatures()

Properties

parent

Returns the internal NSDocument document. Read-only.

Type:

NSDocument

masters

Collection of GSFontMaster objects.

Type:

list

instances

Collection of GSInstance objects.

for instance in font.instances:
    print(instance)
# to add a new instance
instance = GSInstance()
instance.name = "Some Instance"
font.instances.append(instance)
# to delete an instances
del font.instances[0]
font.instances.remove(someInstance)
Type:

list

axes

Collection of GSAxis:

for axis in font.axes:
    print(axis)
# to add a new axis
axis = GSAxis()
axis.name = "Some custom Axis"
axis.axisTag = "SCAX"
font.axes.append(axis)
# to delete an axis
del font.axes[0]
font.axes.remove(someAxis)
Type:

list

New in version 2.5.

Changed in version 3.

properties

Holds the fonts info properties. Can be instances of GSFontInfoValueSingle and GSFontInfoValueLocalized.

The localized values use language tags defined in the middle column of Language System Tags table: <https://docs.microsoft.com/en-us/typography/opentype/spec/languagetags>.

The names are listed in the constants: Info Property Keys

# To find specific values:
font.propertyForName_(name)
# or
font.propertyForName_languageTag_(name, languageTag).
# To add an entry:
font.setProperty_value_languageTag_(GSPropertyNameFamilyNamesKey, "SomeName", None)
Type:

list

New in version 3.

metrics

a list of all GSMetric objects.

Type:

list

# to add a new metric
metric = GSMetric(GSMetricsTypexHeight)
font.metrics.append(metric)
metricValue = master.metricValues[metric.id]
metricValue.position = 543
metricValue.overshoot = 17
stems

The stems. A list of GSMetric objects. For each metric, there is a metricsValue in the masters, linked by the id.

Type:

list, dict

font.stems[0].horizontal = False
# add a stem
stem = GSMetric()
stem.horizontal = False # or True
stem.name = "Some Name"
font.stems.append(stem)
master.stems[stem.name] = 123
numbers

The numbers. A list of GSMetric objects. For each number, there is a metricsValue in the masters, linked by the id.

Type:

list, dict

print(font.numbers[0].name)
# add a number
number = GSMetric()
number.horizontal = False # or True
number.name = "Some Name"
font.numbers.append(number)
master.numbers[number.name] = 123
glyphs

Collection of GSGlyph objects. Returns a list, but you may also call glyphs using index or glyph name or character as key.

Type:

list, dict

# Access all glyphs
for glyph in font.glyphs:
    print(glyph)
>> <GSGlyph "A" with 4 layers>
>> <GSGlyph "B" with 4 layers>
>> <GSGlyph "C" with 4 layers>
...
# Access one glyph
print(font.glyphs['A'])
>> <GSGlyph "A" with 4 layers>
# Access a glyph by character (new in v2.4.1)
print(font.glyphs['Ư'])
>> <GSGlyph "Uhorn" with 4 layers>
# Access a glyph by unicode (new in v2.4.1)
print(font.glyphs['01AF'])
>> <GSGlyph "Uhorn" with 4 layers>
# Access a glyph by index
print(font.glyphs[145])
>> <GSGlyph "Uhorn" with 4 layers>
# Add a glyph
font.glyphs.append(GSGlyph('adieresis'))
# Duplicate a glyph under a different name
newGlyph = font.glyphs['A'].copy()
newGlyph.name = 'A.alt'
font.glyphs.append(newGlyph)
# Delete a glyph
del font.glyphs['A.alt']
characterForGlyph(glyph)

The (internal) character that is used in the edit view. It the glyph has a unicode, that is used, otherwiese a temporary code is assined. That can change over time, so don’t rely on it. This is mostly useful for constructing a string for see tab.text

New in version 3.1.

classes

Collection of GSClass objects, representing OpenType glyph classes.

Type:

list

# add a class
font.classes.append(GSClass('uppercaseLetters', 'A B C D E'))
# access all classes
for class in font.classes:
    print(class.name)
# access one class
print(font.classes['uppercaseLetters'].code)
# delete a class
del font.classes['uppercaseLetters']
features

Collection of GSFeature objects, representing OpenType features.

Type:

list

# add a feature
font.features.append(GSFeature('liga', 'sub f i by fi;'))
# access all features
for feature in font.features:
    print(feature.code)
# access one feature
print(font.features['liga'].code)
# delete a feature
del font.features['liga']
featurePrefixes

Collection of GSFeaturePrefix objects, containing stuff that needs to be outside of the OpenType features.

Type:

list

# add a prefix
font.featurePrefixes.append(GSFeaturePrefix('LanguageSystems', 'languagesystem DFLT dflt;'))
# access all prefixes
for prefix in font.featurePrefixes:
    print(prefix.code)
# access one prefix
print(font.featurePrefixes['LanguageSystems'].code)
# delete
del font.featurePrefixes['LanguageSystems']
copyright

This accesses the default value only. The localisations can be accessed by GSFont.properties

Type:

str

copyrights

This accesses all localized copyright values. For details GSFont.properties

Type:

dict

font.copyrights["ENG"] = "All rights reserved"

New in version 3.0.3.

license

This accesses the default value only. The localisations can be accessed by GSFont.properties

Type:

str

New in version 3.0.3.

licenses

This accesses all localized license values. For details GSFont.properties

Type:

dict

font.licenses["ENG"] = "This font may be installed on all of your machines and printers, but you may not sell or give these fonts to anyone else."

New in version 3.0.3.

compatibleFullName

This accesses the default value only. The localisations can be accessed by GSFont.properties

Type:

str

New in version 3.0.3.

compatibleFullNames

This accesses all localized designer values. For details GSFont.properties

Type:

dict

font.compatibleFullNames["ENG"] = "MyFont Condensed Bold"

New in version 3.0.3.

sampleText

This accesses the default value only. The localisations can be accessed by GSFont.properties

Type:

str

New in version 3.0.3.

sampleTexts

This accesses all localized designer values. For details GSFont.properties

Type:

dict

font.sampleTexts["ENG"] = "This is my sample text"

New in version 3.0.3.

description

This accesses the default value only. The localisations can be accessed by GSFont.properties

Type:

str

New in version 3.0.3.

descriptions

This accesses all localized designer values. For details GSFont.properties

Type:

dict

font.descriptions["ENG"] = "This is my description"

New in version 3.0.3.

designer

This accesses the default value only. The localisations can be accessed by GSFont.properties

Type:

str

designers

This accesses all localized designer values. For details GSFont.properties

Type:

dict

font.designers["ENG"] = "John Smith"

New in version 3.0.3.

trademark

This accesses the default value only. The localisations can be accessed by GSFont.properties

Type:

str

New in version 3.0.3.

trademarks

This accesses all localized trademark values. For details GSFont.properties

Type:

dict

font.trademarks["ENG"] = "ThisFont is a trademark by MyFoundry.com"

New in version 3.0.3.

designerURL
Type:

str

manufacturer

This accesses the default value only. The localisations can be accessed by GSFont.properties

Type:

str

manufacturers

This accesses all localized manufacturer values. For details GSFont.properties

Type:

dict

font.manufacturers["ENG"] = "My English Corporation"

New in version 3.0.3.

manufacturerURL
Type:

str

versionMajor
Type:

int

versionMinor
Type:

int

date
Type:

datetime.datetime

print(font.date)
>> 2015-06-08 09:39:05
# set date to now
font.date = datetime.datetime.now()
# using NSDate
font.date = NSDate.date()
# or in seconds since Epoch
font.date = time.time()
familyName

Family name of the typeface.

Type:

str

familyNames

This accesses all localized family name values. For details GSFont.properties

Type:

dict

font.familyNames["ENG"] = "MyFamilyName"

New in version 3.0.3.

upm

Units per Em

Type:

int

note
Type:

str

kerning

Kerning for LTR writing A multi-level dictionary. The first level’s key is the GSFontMaster.id (each master has its own kerning), the second level’s key is the GSGlyph.id or class id (@MMK_L_XX) of the first glyph, the third level’s key is a glyph id or class id (@MMK_R_XX) for the second glyph. The values are the actual kerning values.

To set a value, it is better to use the method GSFont.setKerningForPair(). This ensures a better data integrity (and is faster).

Type:

dict

kerningRTL

Kerning for RTL writing A multi-level dictionary. The first level’s key is the GSFontMaster.id (each master has its own kerning), the second level’s key is the GSGlyph.id or class id (@MMK_L_XX) of the first glyph, the third level’s key is a glyph id or class id (@MMK_R_XX) for the second glyph. The values are the actual kerning values.

To set a value, it is better to use the method GSFont.setKerningForPair(). This ensures a better data integrity (and is faster).

Type:

dict

kerningVertical

Kerning for vertical writing A multi-level dictionary. The first level’s key is the GSFontMaster.id (each master has its own kerning), the second level’s key is the GSGlyph.id or class id (@MMK_L_XX) of the first glyph, the third level’s key is a glyph id or class id (@MMK_R_XX) for the second glyph. The values are the actual kerning values.

To set a value, it is better to use the method GSFont.setKerningForPair(). This ensures a better data integrity (and is faster).

Type:

dict

userData

A dictionary to store user data. Use a unique key and only use objects that can be stored in a property list (string, list, dict, numbers, NSData) otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
font.userData['rememberToMakeCoffee'] = True
# delete value
del font.userData['rememberToMakeCoffee']
tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. If you need the data persistent, use layer.userData

Type:

dict

# set value
layer.tempData['rememberToMakeCoffee'] = True
# delete value
del layer.tempData['rememberToMakeCoffee']
disablesNiceNames

Corresponds to the “Don’t use nice names” setting from the Font Info dialog.

Type:

bool

customParameters

The custom parameters. List of GSCustomParameter objects. You can access them by name or by index.

Type:

list, dict

# access all parameters
for parameter in font.customParameters:
    print(parameter)
# set a parameter
font.customParameters['glyphOrder'] = ["a", "b", "c"]
# add multiple parameters:
parameter = GSCustomParameter("Name Table Entry", "1 1;"font name")
font.customParameters.append(parameter)
parameter = GSCustomParameter("Name Table Entry", "2 1;"style name")
font.customParameters.append(parameter)
# delete a parameter
del font.customParameters['glyphOrder']
grid

Corresponds to the “Grid spacing” setting from the Info dialog.

Type:

int

gridSubDivision

Corresponds to the “Grid sub divisions” setting from the Info dialog.

Type:

int

gridLength

Ready calculated size of grid for rounding purposes. Result of division of grid with gridSubDivisions.

Type:

float

disablesAutomaticAlignment
Type:

bool

keyboardIncrement

Distance of movement by arrow keys. Default:1

Type:

float

keyboardIncrementBig

Distance of movement by arrow plus Shift key. Default:10

Type:

float

New in version 3.0.

keyboardIncrementHuge

Distance of movement by arrow plus Command key. Default:100

Type:

float

New in version 3.0.

snapToObjects

disable snapping to nodes and background

Type:

bool

New in version 3.0.1.

previewRemoveOverlap

disable preview remove overlap

Type:

bool

New in version 3.0.1.

selection

Returns a list of all selected glyphs in the Font View.

Type:

list

selectedLayers

Returns a list of all selected layers in the active tab.

If a glyph is being edited, it will be the only glyph returned in this list. Otherwise the list will contain all glyphs selected with the Text tool.

Type:

list

selectedFontMaster

Returns the active master (selected in the toolbar).

Type:

GSFontMaster

masterIndex

Returns the index of the active master (selected in the toolbar).

Type:

int

currentText

The text of the current Edit view.

Unencoded and none ASCII glyphs will use a slash and the glyph name. (e.g: /a.sc). Setting unicode strings works.

Type:

str

tabs

List of open Edit view tabs in UI, as list of GSEditViewController objects.

Type:

list

# open new tab with text
font.newTab('hello')
# access all tabs
for tab in font.tabs:
    print(tab)
# close last tab
font.tabs[-1].close()
fontView
Type:

GSFontViewController

currentTab

Active Edit view tab.

Type:

GSEditViewController

filepath

On-disk location of GSFont object.

Type:

str

tool

Name of tool selected in toolbar.

For available names including third-party plug-ins that come in the form of selectable tools, see GSFont.tools below.

Type:

string

font.tool = 'SelectTool' # Built-in tool
font.tool = 'GlyphsAppSpeedPunkTool' # Third party plug-in
tools

Returns a list of available tool names, including third-party plug-ins.

Type:

list, string

appVersion

Returns the version that the file was last saved

New in version 2.5.

formatVersion

The file-format the font should be written. possible values are ‘2’ and ‘3’

Type:

int

New in version 3.

Functions

save([path=None, formatVersion=3, makeCopy=False])

Saves the font.

If no path is given, it saves to the existing location.

Parameters:
  • path (str) – Optional file path. When the font is loaded directly (GSFont(path)), the path argument is required.

  • formatVersion (int) – the format of the file

  • makeCopy (bool) – saves a new file without changeing the documents file paths. So it always need a path argument

close([ignoreChanges=True])

Closes the font.

Parameters:

ignoreChanges (bool) – Optional. Ignore changes to the font upon closing

disableUpdateInterface()

Disables interface updates and thus speeds up glyph processing. Call this before you do big changes to the font, or to its glyphs. Make sure that you call font.enableUpdateInterface() when you are done.

enableUpdateInterface()

This re-enables the interface update. Only makes sense to call if you have disabled it earlier.

show()

Makes font visible in the application, either by bringing an already open font window to the front or by appending a formerly invisible font object (such as the result of a copy() operation) as a window to the application.

New in version 2.4.1.

kerningForPair(fontMasterId, leftKey, rightKey[, direction=LTR])

This returns the kerning value for the two specified glyphs (leftKey or rightKey is the glyph name) or a kerning group key (@MMK_X_XX).

Parameters:
  • fontMasterId (str) – The id of the FontMaster

  • leftKey (str) – either a glyph name or a class name

  • rightKey (str) – either a glyph name or a class name

  • direction (int) – optional writing direction (see Constants; ‘LTR’ (0) or ‘RTLTTB’). Default is LTR.

Returns:

The kerning value

Return type:

float

# print(kerning between w and e for currently selected master)
font.kerningForPair(font.selectedFontMaster.id, 'w', 'e')
>> -15.0
# print(kerning between group T and group A for currently selected master)
# ('L' = left side of the pair and 'R' = left side of the pair)
font.kerningForPair(font.selectedFontMaster.id, '@MMK_L_T', '@MMK_R_A')
>> -75.0
# in the same font, kerning between T and A would be zero, because they use group kerning instead.
font.kerningForPair(font.selectedFontMaster.id, 'T', 'A')
>> None
setKerningForPair(fontMasterId, leftKey, rightKey, value[, direction=GSLTR])

This sets the kerning for the two specified glyphs (leftKey or rightKey is the glyphname) or a kerning group key (@MMK_X_XX).

Parameters:
  • fontMasterId (str) – The id of the FontMaster

  • leftKey (str) – either a glyph name or a class name

  • rightKey (str) – either a glyph name or a class name

  • value (float) – kerning value

  • direction (str) – optional writing direction (see Constants). Default is GSLTR.

# set kerning for group T and group A for currently selected master
# ('L' = left side of the pair and 'R' = left side of the pair)
font.setKerningForPair(font.selectedFontMaster.id, '@MMK_L_T', '@MMK_R_A', -75)
removeKerningForPair(fontMasterId, leftKey, rightKey, direction=GSLTR)

Removes the kerning for the two specified glyphs (LeftKey or RightKey is the glyphname) or a kerning group key (@MMK_X_XX).

Parameters:
  • FontMasterId (str) – The id of the FontMaster

  • leftKey (str) – either a glyph name or a class name

  • rightKey (str) – either a glyph name or a class name

  • direction (int) – optional writing direction (see Constants; ‘GSLTR’ (0) or ‘GSVertical’). Default is GSLTR. (added in 2.6.6)

# remove kerning for group T and group A for all masters
# ('L' = left side of the pair and 'R' = left side of the pair)
for master in font.masters:
    font.removeKerningForPair(master.id, '@MMK_L_T', '@MMK_R_A')
newTab([tabText])

Opens a new tab in the current document window, optionally with text, and return that tab object

Parameters:

tabText – Text or glyph names escaped with ‘/’ OR list of layers

# open new tab
tab = font.newTab('abcdef')
print(tab)
# or
tab = font.newTab([layer1, layer2])
print(tab)
updateFeatures()

Updates all OpenType features and classes at once, including generating necessary new features and classes. Equivalent to the “Update” button in the features panel. This already includes the compilation of the features (see font.compileFeatures()).

New in version 2.4.

compileFeatures()

Compiles the features, thus making the new feature code functionally available in the editor. Equivalent to the “Compile” button in the features panel.

New in version 2.5.

GSAxis

Implementation of the axis object.

class GSAxis

Properties

name

axisTag

id

hidden

font

Properties

font

Reference to the GSFont object that contains the axis. Normally that is set by the app.

Type:

GSFont

name

The name of the axis

Type:

str

axisTag

The axisTag. this is a four letter string. see OpenType Design-Variation Axis Tag Registry.

Type:

str

id

The id to link the values in the masters

Type:

str

hidden

If the axis should be shown to the user

Type:

bool

GSMetric

Implementation of the metric object. It is used to link the metrics and stems in the masters.

class GSMetric

Properties

font

name

id

title

filter

type

horizontal

Properties

font

Reference to the GSFont object that contains the metric. Normally that is set by the app.

Type:

GSFont

name

The name of the metric or stem

Type:

str

id

The id to link the values in the masters

Type:

str

title

The title as shown in the UI. It is readonly as it is computed by the name, type and filter.

Type:

str

type

The metrics type

Type:

int

filter

A filter to limit the scope of the metric.

Type:

NSPredicate

horizontal

This is used for stem metrics. so only use this for font.stems

Type:

bool

GSFontMaster

Implementation of the master object. This corresponds with the “Masters” pane in the Font Info. In Glyphs.app, the glyphs of each master are reachable not here, but as layers attached to the glyphs attached to the font object. See the infographic on top for better understanding.

class GSFontMaster

id

name

internalAxesValues

externalAxesValues

properties

metrics

ascender

capHeight

xHeight

descender

italicAngle

alignmentZones

blueValues

otherBlues

guides

stems

numbers

userData

customParameters

font

iconName

Properties

id

Used to identify Layers in the Glyph

see GSGlyph.layers

Type:

str

# ID of first master
print(font.masters[0].id)
>> 3B85FBE0-2D2B-4203-8F3D-7112D42D745E
# use this master to access the glyph’s corresponding layer
print(glyph.layers[font.masters[0].id])
>> <GSLayer "Light" (A)>
font

Reference to the GSFont object that contains the master. Normally that is set by the app, only if the instance is not actually added to the font, then set this manually.

Type:

GSFont

New in version 2.5.2.

name

The human-readable identification of the master, e.g., “Bold Condensed”.

Type:

string

iconName

The name of the icon

Type:

string

axes

List of floats specifying the positions for each axis

Type:

list

# setting a value for a specific axis
master.axes[2] = 12
# setting all values at once
master.axes = [100, 12, 3.5]

New in version 2.5.2.

Deprecated since version 3.2.

internalAxesValues

List of floats specifying the positions for each axis

Type:

list

# setting a value for a specific axis
master.internalAxesValues[2] = 12
# or more precisely
master.internalAxesValues[axis.axisId] = 12
# setting all values at once
master.internalAxesValues = [100, 12, 3.5]

New in version 3.2.

externalAxesValues

List of floats specifying the positions for each axis for the user facing values

Type:

list

# setting a value for a specific axis
master.externalAxesValues[2] = 12
# or more precisely
master.externalAxesValues[axis.axisId] = 12
# setting all values at once
master.externalAxesValues = [100, 12, 3.5]

New in version 3.2.

properties

Holds the fonts info properties. Can be instances of GSFontInfoValueSingle and GSFontInfoValueLocalized

The localized values use language tags defined in the middle column of Language System Tags table: <https://docs.microsoft.com/en-us/typography/opentype/spec/languagetags>.

To find specific values, use master.propertyForName_(name) or master.propertyForName_languageTag_(name, languageTag).

Type:

list

New in version 3.

metrics

a dict of all GSMetricValue objects. Keys are font.metrics[].id

Type:

dict

for metric in Font.metrics:
    if metric.type == GSMetricsTypexHeight and metric.filter is None:
        metricValue = master.metricValues[metric.id]
        metricValue.position = 543
        metricValue.overshoot = 17

New in version 3.

ascender

This is the default ascender of the master. There might be other values that are for specific glyphs. See master.metrics and layer.metrics

Type:

float

capHeight

This is the default capHeight of the master. There might be other values that are for specific glyphs. See master.metrics and layer.metrics

Type:

float

xHeight

This is the default xHeight of the master. There might be other values that are for specific glyphs. See master.metrics and layer.metrics

Type:

float

descender

This is the default descender of the master. There might be other values that are for specific glyphs. See master.metrics and layer.metrics

Type:

float

italicAngle
Type:

float

stems

The stems. This is a list of numbers.

Type:

list

font.masters[0].stems = [10, 11, 20]
print(master.stems[0])
master.stems[0] = 12
master.stems["stemName"] = 12
numbers

The numbers. This is a list of numbers.

Type:

list

font.masters[0].numbers = [10, 11, 20]
print(master.numbers[0])
master.numbers[0] = 12
master.numbers["numberName"] = 12

New in version 3.1.

alignmentZones

Collection of GSAlignmentZone objects. Read-only.

Type:

list

blueValues

PS hinting Blue Values calculated from the master’s alignment zones. Read-only.

Type:

list

otherBlues

PS hinting Other Blues calculated from the master’s alignment zones. Read-only.

Type:

list

guides

Collection of GSGuide objects. These are the font-wide (actually master-wide) red guidelines. For glyph-level guidelines (attached to the layers) see GSLayer.guides

Type:

list

userData

A dictionary to store user data. Use a unique key, and only use objects that can be stored in a property list (bool, string, list, dict, numbers, NSData), otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
font.masters[0].userData['rememberToMakeTea'] = True
# delete value
del font.masters[0].userData['rememberToMakeTea']
customParameters

The custom parameters. List of GSCustomParameter objects. You can access them by name or by index.

Type:

list, dict

# access all parameters
for parameter in font.masters[0].customParameters:
    print(parameter)
# set a parameter
font.masters[0].customParameters['underlinePosition'] = -135
# add multiple parameters:
parameter = GSCustomParameter("CJK Guide", 10)
font.customParameters.append(parameter)
parameter = GSCustomParameter("CJK Guide", 20)
font.customParameters.append(parameter)
# delete a parameter
del font.masters[0].customParameters['underlinePosition']

GSAlignmentZone

Implementation of the alignmentZone object.

There is no distinction between Blue Zones and Other Zones. All negative zones (except the one with position 0) will be exported as Other Zones.

The zone for the baseline should have position 0 (zero) and a negative width.

class GSAlignmentZone([pos, size])
Parameters:
  • pos – The position of the zone

  • size – The size of the zone

Properties

position

size

Properties

position
Type:

float

size
Type:

float

GSInstance

Implementation of the instance object. This corresponds with the “Instances” pane in the Font Info.

class GSInstance

Properties

active

name

type

visible

weightClass

widthClass

axes

properties

isItalic

isBold

linkStyle

preferredFamily

preferredSubfamilyName

windowsFamily

windowsStyle

windowsLinkedToStyle

fontName

fullName

compatibleFullName

compatibleFullNames

copyright

copyrights

description

descriptions

designer

designers

designerURL

familyName

familyNames

license

licenses

manufacturer

manufacturers

manufacturerURL

preferredFamilyName

preferredFamilyNames

preferredSubfamilyName

preferredSubfamilyNames

sampleText

sampleTexts

styleMapFamilyName

styleMapFamilyNames

styleMapStyleName

styleMapStyleNames

styleName

styleNames

trademark

trademarks

variableStyleName

variableStyleNames

font

customParameters

instanceInterpolations

manualInterpolation

interpolatedFontProxy

interpolatedFont

lastExportedFilePath

Functions

generate()

addAsMaster()

Properties

exports
Type:

bool

visible

if visible in the preview in edit view

Type:

bool

name

Name of instance. Corresponds to the “Style Name” field in the font info. This is used for naming the exported fonts.

Type:

string

type

the type of the instance. Can be either INSTANCETYPESINGLE or INSTANCETYPEVARIABLE.

Type:

int

weightClass

Weight class, as set in Font Info, as an integer. Values from 1 to 1000 are supported but 100–900 is recommended.

For actual position in interpolation design space, use GSInstance.axes.

Type:

int

weightClassName

Human readable name corresponding to the value of GSInstance.weightClass. This attribute is read-only.

Can be None if GSInstance.weightClass is not a multiple of 100.

Type:

string

widthClass

Width class, as set in Font Info, as an integer. Values from 1 to 9 are supported.

For actual position in interpolation design space, use GSInstance.axes.

Type:

int

widthClassName

Human readable name corresponding to the value of GSInstance.widthClass. This attribute is read-only.

Type:

string

axes

List of floats specifying the positions for each axis

Type:

list

# setting a value for a specific axis
instance.axes[2] = 12
# setting all values at once
instance.axes = [100, 12, 3.5] # make sure that the count of numbers matches the count of axes

New in version 2.5.2.

Deprecated since version 3.2.

internalAxesValues

List of floats specifying the positions for each axis

Type:

list

# setting a value for a specific axis
instance.internalAxesValues[2] = 12
# or more precisely
instance.internalAxesValues[axis.axisId] = 12
# setting all values at once
instance.internalAxesValues = [100, 12, 3.5]

New in version 3.2.

externalAxesValues

List of floats specifying the positions for each axis for the user facing values

Type:

list

# setting a value for a specific axis
instance.externalAxesValues[2] = 12
# or more precisely
instance.externalAxesValues[axis.axisId] = 12
# setting all values at once
instance.externalAxesValues = [100, 12, 3.5]

New in version 3.2.

properties

Holds the fonts info properties. Can be instances of GSFontInfoValueSingle and GSFontInfoValueLocalized

The localized values use language tags defined in the middle column of Language System Tags table: <https://docs.microsoft.com/en-us/typography/opentype/spec/languagetags>.

The names are listed in the constants: Info Property Keys

# To find specific values:
instance.propertyForName_(name)
# or
instance.propertyForName_languageTag_(name, languageTag).
# To add an entry:
instance.setProperty_value_languageTag_(GSPropertyNameFamilyNamesKey, "SomeName", None)
Type:

list

New in version 3.

isItalic

Italic flag for style linking

Type:

bool

isBold

Bold flag for style linking

Type:

bool

linkStyle

Linked style

Type:

string

preferredFamily

preferredFamily

Type:

string

windowsFamily

windowsFamily

Type:

string

windowsStyle

This is computed from “isBold” and “isItalic”. Read-only.

Type:

string

windowsLinkedToStyle

windowsLinkedToStyle. Read-only.

Type:

string

fontName

fontName (postscriptFontName)

Type:

string

fullName

fullName (postscriptFullName)

Type:

string

compatibleFullName

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

compatibleFullNames

This accesses all localized compatibleFullNames values. For details GSInstance.properties

Type:

dict

instance.compatibleFullNames["ENG"] = "MyFont Condensed Bold"

New in version 3.0.3.

copyright

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.2.

copyrights

This accesses all localized copyright values. For details GSInstance.properties

Type:

dict

instance.copyrights["ENG"] = "All rights reserved"

New in version 3.0.3.

description

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

descriptions

This accesses all localized description values. For details GSInstance.properties

Type:

dict

instance.descriptions["ENG"] = "This is my description"

New in version 3.0.3.

designer

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.2.

designerURL
Type:

str

New in version 3.0.2.

designers

This accesses all localized designer values. For details GSInstance.properties

Type:

dict

instance.designers["ENG"] = "John Smith"

New in version 3.0.3.

familyName

familyName

Type:

string

familyNames

This accesses all localized family name values. For details GSInstance.properties

Type:

dict

instance.familyNames["ENG"] = "MyFamilyName"

New in version 3.0.3.

license

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

licenses

This accesses all localized family name values. For details GSInstance.properties

Type:

dict

instance.licenses["ENG"] = "This font may be installed on all of your machines and printers, but you may not sell or give these fonts to anyone else."

New in version 3.0.3.

manufacturer

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.2.

manufacturers

This accesses all localized family name values. For details GSInstance.properties

Type:

dict

instance.manufacturers["ENG"] = "My English Corporation"

New in version 3.0.3.

preferredFamilyName

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

preferredFamilyNames

This accesses all localized designer values. For details GSInstance.properties

Type:

dict

instance.preferredFamilyNames["ENG"] = "MyFamilyName"

New in version 3.0.3.

preferredSubfamilyName

preferredSubfamilyName

Type:

string

preferredSubfamilyNames

This accesses all localized designer values. For details GSInstance.properties

Type:

dict

instance.preferredSubfamilyNames["ENG"] = "Regular"

New in version 3.0.3.

sampleText

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

sampleTexts

This accesses all localized designer values. For details GSInstance.properties

Type:

dict

instance.sampleTexts["ENG"] = "This is my sample text"

New in version 3.0.3.

styleMapFamilyName

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

styleMapFamilyNames

This accesses all localized designer values. For details GSInstance.properties

Type:

dict

instance.styleMapFamilyNames["ENG"] = "MyFamily Bold"

New in version 3.0.3.

styleMapStyleName

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

styleMapStyleNames

This accesses all localized designer values. For details GSInstance.properties

Type:

dict

instance.styleMapStyleNames["ENG"] = "Bold"

New in version 3.0.3.

styleName

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

styleNames

This accesses all localized styleName values. For details GSInstance.properties

Type:

dict

instance.styleNames["ENG"] = "Regular"

New in version 3.0.3.

trademark

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

trademarks

This accesses all localized trademark values. For details GSInstance.properties

Type:

dict

instance.trademarks["ENG"] = "ThisFont is a trademark by MyFoundry.com"

New in version 3.0.3.

variableStyleName

This accesses the default value only. The localisations can be accessed by GSInstance.properties

Type:

str

New in version 3.0.3.

variableStyleNames

This accesses all localized variableStyleName values. For details GSInstance.properties

Type:

dict

instance.variableStyleNames["ENG"] = "Roman"

New in version 3.0.3.

manufacturerURL
Type:

str

New in version 3.0.2.

font

Reference to the GSFont object that contains the instance. Normally that is set by the app, only if the instance is not actually added to the font, then set this manually.

Type:

GSFont

New in version 2.5.1.

customParameters

The custom parameters. List of GSCustomParameter objects. You can access them by name or by index.

Type:

list, dict

# access all parameters
for parameter in font.instances[0].customParameters:
    print(parameter)
# set a parameter
font.instances[0].customParameters['hheaLineGap'] = 10
# add multiple parameters:
parameter = GSCustomParameter("Name Table Entry", "1 1;"font name")
font.customParameters.append(parameter)
parameter = GSCustomParameter("Name Table Entry", "2 1;"style name")
font.customParameters.append(parameter)
# delete a parameter
del font.instances[0].customParameters['hheaLineGap']
userData

A dictionary to store user data. Use a unique key and only use objects that can be stored in a property list (string, list, dict, numbers, NSData) otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
instance.userData['rememberToMakeCoffee'] = True
# delete value
del instance.userData['rememberToMakeCoffee']
tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. If you need the data persistent, use instance.userData

Type:

dict

# set value
instance.tempData['rememberToMakeCoffee'] = True
# delete value
del instance.tempData['rememberToMakeCoffee']
instanceInterpolations

A dict that contains the interpolation coefficients for each master. This is automatically updated if you change interpolationWeight, interpolationWidth, interpolationCustom. It contains FontMaster IDs as keys and coefficients for that master as values. Or, you can set it manually if you set manualInterpolation to True. There is no UI for this, so you need to do that with a script.

Type:

dict

manualInterpolation

Disables automatic calculation of instanceInterpolations This allows manual setting of instanceInterpolations.

Type:

bool

interpolatedFontProxy

a proxy font that acts similar to a normal font object but only interpolates the glyphs you ask it for.

It is not properly wrapped yet. So you need to use the ObjectiveC methods directly.

interpolatedFont

Returns a ready interpolated GSFont object representing this instance. Other than the source object, this interpolated font will contain only one master and one instance.

Note: When accessing several properties of such an instance consecutively, it is advisable to create the instance once into a variable and then use that. Otherwise, the instance object will be completely interpolated upon each access. See sample below.

Type:

GSFont

# create instance once
interpolated = Glyphs.font.instances[0].interpolatedFont
# then access it several times
print(interpolated.masters)
>> (<GSFontMaster "Light" width 100.0 weight 75.0>)
print(interpolated.instances)
>> (<GSInstance "Web" width 100.0 weight 75.0>)

Functions

generate([format, fontPath, autoHint, removeOverlap, useSubroutines, useProductionNames, containers, decomposeSmartStuff])

Exports the instance. All parameters are optional.

Parameters:
  • format (str) – The format of the outlines: OTF or TTF. Default: OTF

  • fontPath (str) – The destination path for the final fonts. If None, it uses the default location set in the export dialog

  • autoHint (bool) – If autohinting should be applied. Default: True

  • removeOverlap (bool) – If overlaps should be removed. Default: True

  • useSubroutines (bool) – If to use subroutines for CFF. Default: True

  • useProductionNames (bool) – If to use production names. Default: True

  • containers (list) – list of container formats. Use any of the following constants: PLAIN, WOFF, WOFF2, EOT. Default: PLAIN

  • decomposeSmartStuff (bool) – If smart components should be decomposed. Default: True

Returns:

On success, True; on failure, error message.

Return type:

bool/list

# export all instances as OpenType (.otf) and WOFF2 to user’s font folder
exportFolder = '/Users/myself/Library/Fonts'
for instance in Glyphs.font.instances:
    instance.generate(FontPath=exportFolder, Containers=[PLAIN, WOFF2])
Glyphs.showNotification('Export fonts', 'The export of %s was successful.' % (Glyphs.font.familyName))
lastExportedFilePath

Returns a ready interpolated GSFont object representing this instance. Other than the source object, this interpolated font will contain only one master and one instance.

Note: When accessing several properties of such an instance consecutively, it is advisable to create the instance once into a variable and then use that. Otherwise, the instance object will be completely interpolated upon each access. See sample below.

Type:

str

# create instance once
interpolated = Glyphs.font.instances[0].interpolatedFont
# then access it several times
print(interpolated.masters)
>> (<GSFontMaster "Light" width 100.0 weight 75.0>)
print(interpolated.instances)
>> (<GSInstance "Web" width 100.0 weight 75.0>)
addAsMaster()

Add this instance as a new master to the font. Identical to “Instance as Master” menu item in the Font Info’s Instances section.

New in version 2.6.2.

GSCustomParameter

Implementation of the Custom Parameter object. It stores a name/value pair.

You can append GSCustomParameter objects for example to GSFont.customParameters, but this way you may end up with duplicates. It is best to access the custom parameters through its dictionary interface like this:

# access all parameters
for parameter in font.customParameters:
    print(parameter)
# set a parameter
font.customParameters['trademark'] = 'ThisFont is a trademark by MyFoundry.com'
# add multiple parameters:
parameter = GSCustomParameter("Name Table Entry", "1 1;"font name")
font.customParameters.append(parameter)
parameter = GSCustomParameter("Name Table Entry", "2 1;"style name")
font.customParameters.append(parameter)
# delete a parameter
del font.customParameters['trademark']
class GSCustomParameter([name, value])
Parameters:
  • name – The name

  • value – The value

Properties

name

value

Properties

name
Type:

str

value
Type:

str, list, dict, int, float

active

If the the parameter should be used or not

Type:

bool

parent
Type:

GSFont, GSFontMaster or GSInstance

GSClass

Implementation of the class object. It is used to store OpenType classes.

For details on how to access them, please look at GSFont.classes

class GSClass([tag, code])
Parameters:
  • tag – The class name

  • code – A list of glyph names, separated by space or newline

name

code

automatic

active

Properties

name

The class name

Type:

str

code

A string with space separated glyph names.

Type:

str

automatic

Define whether this class should be auto-generated when pressing the ‘Update’ button in the Font Info.

Type:

bool

active
Type:

bool

New in version 2.5.

tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. If you need the data persistent, use class.userData

Type:

dict

# set value
class.tempData['rememberToMakeCoffee'] = True
# delete value
del class.tempData['rememberToMakeCoffee']

GSFeaturePrefix

Implementation of the featurePrefix object. It is used to store things that need to be outside of a feature like standalone lookups.

For details on how to access them, please look at GSFont.featurePrefixes

class GSFeaturePrefix([tag, code])
Parameters:
  • tag – The Prefix name

  • code – The feature code in Adobe FDK syntax

name

code

automatic

active

Properties

name

The FeaturePrefix name

Type:

str

code

A String containing feature code.

Type:

str

automatic

Define whether this should be auto-generated when pressing the ‘Update’ button in the Font Info.

Type:

bool

active
Type:

bool

New in version 2.5.

GSFeature

Implementation of the feature object. It is used to implement OpenType Features in the Font Info.

For details on how to access them, please look at GSFont.features

class GSFeature([tag, code])
Parameters:
  • tag – The feature name

  • code – The feature code in Adobe FDK syntax

Properties

name

code

automatic

notes

active

layers

Functions

update()

Properties

name

The feature name

Type:

str

code

The Feature code in Adobe FDK syntax.

Type:

str

automatic

Define whether this feature should be auto-generated when pressing the ‘Update’ button in the Font Info.

Type:

bool

notes

Some extra text. Is shown in the bottom of the feature window. Contains the stylistic set name parameter

Type:

str

active
Type:

bool

New in version 2.5.

Functions

update()

Calls the automatic feature code generator for this feature. You can use this to update all OpenType features before export.

# first update all features
for feature in font.features:
    if feature.automatic:
        feature.update()
# then export fonts
for instance in font.instances:
    if instance.active:
        instance.generate()
labels

List of Feature names for stylistic set featurs

Type:

list

tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. If you need the data persistent, use feature.userData

Type:

dict

# set value
feature.tempData['rememberToMakeCoffee'] = True
# delete value
del feature.tempData['rememberToMakeCoffee']

GSGlyph

Implementation of the glyph object.

For details on how to access these glyphs, please see GSFont.glyphs

class GSGlyph([name, autoName=True])
Parameters:
  • name – The glyph name

  • autoName – if the name should be converted to nice name

Properties

parent

layers

name

unicode

string

id

category

storeCategory

subCategory

storeSubCategory

case

storeCase

script

storeScript

productionName

storeProductionName

sortName

sortNameKeep

storeSortName

glyphInfo

leftKerningGroup

rightKerningGroup

leftKerningKey

topKerningGroup

bottomKerningKey

rightKerningKey

topKerningKey

bottomKerningKey

leftMetricsKey

rightMetricsKey

widthMetricsKey

export

color

colorObject

note

selected

mastersCompatible

userData

smartComponentAxes

tags

lastChange

Functions

beginUndo()

endUndo()

updateGlyphInfo()

duplicate()

Properties

parent

Reference to the GSFont object.

Type:

GSFont

layers

The layers of the glyph, collection of GSLayer objects. You can access them either by index or by layer ID, which can be a GSFontMaster.id. The layer IDs are usually a unique string chosen by Glyphs.app and not set manually. They may look like this: 3B85FBE0-2D2B-4203-8F3D-7112D42D745E

Type:

list, dict

# get active layer
layer = font.selectedLayers[0]
# get glyph of this layer
glyph = layer.parent
# access all layers of this glyph
for layer in glyph.layers:
    print(layer.name)
# access layer of currently selected master of active glyph ...
# (also use this to access a specific layer of glyphs selected in the Font View)
layer = glyph.layers[font.selectedFontMaster.id]
# directly access 'Bold' layer of active glyph
for master in font.masters:
    if master.name == 'Bold':
        id = master.id
        break
layer = glyph.layers[id]
# add a new layer
newLayer = GSLayer()
newLayer.name = '{125, 100}' # (example for glyph-level intermediate master)
# you may set the master ID that this layer will be associated with, otherwise the first master will be used
newLayer.associatedMasterId = font.masters[-1].id # attach to last master
font.glyphs['a'].layers.append(newLayer)
# duplicate a layer under a different name
newLayer = font.glyphs['a'].layers[0].copy()
newLayer.name = 'Copy of layer'
# FYI, this will still be the old layer ID (in case of duplicating) at this point
print(newLayer.layerId)
font.glyphs['a'].layers.append(newLayer)
# FYI, the layer will have been assigned a new layer ID by now, after having been appended
print(newLayer.layerId)
# replace the second master layer with another layer
newLayer = GSLayer()
newLayer.layerId = font.masters[1].id # Make sure to sync the master layer ID
font.glyphs['a'].layers[font.masters[1].id] = newLayer
# delete last layer of glyph
# (Also works for master layers. They will be emptied)
del font.glyphs['a'].layers[-1]
# delete currently active layer
del font.glyphs['a'].layers[font.selectedLayers[0].layerId]
name

The name of the glyph. It will be converted to a “nice name” (afii10017 to A-cy) (you can disable this behavior in font info or the app preference)

Type:

str

unicode

String with the hex Unicode value of glyph, if encoded.

Type:

str

unicodes

List of Strings‚ with the hex Unicode values of glyph, if encoded.

Type:

list

string

String representation of glyph, if encoded. This is similar to the string representation that you get when copying glyphs into the clipboard.

Type:

str

id

An unique identifier for each glyph

Type:

string

locked

If the glyph is locked TODO

Type:

bool

category

The category of the glyph. e.g. ‘Letter’, ‘Symbol’ Setting only works if GSGlyph.storeCategory is set (see below).

Type:

str

storeCategory

Set to True in order to manipulate the GSGlyph.category of the glyph (see above). Makes it possible to ship custom glyph data inside a .glyphs file without a separate GlyphData file. Same as Cmd-Alt-i dialog in UI.

Type:

bool

subCategory

The subCategory of the glyph. e.g. ‘Currency’, ‘Math’ Setting it only works if GSGlyph.storeSubCategory is set (see below).

Type:

str

storeSubCategory

Set to True in order to manipulate the GSGlyph.subCategory of the glyph (see above). Makes it possible to ship custom glyph data inside a .glyphs file without a separate GlyphData file. Same as Cmd-Alt-i dialog in UI.

Type:

bool

case

e.g: GSUppercase, GSLowercase, GSSmallcaps

Type:

int

New in version 3.

storeCase

Set to True in order to manipulate the GSGlyph.case of the glyph (see above). Makes it possible to ship custom glyph data inside a .glyphs file without a separate GlyphData file. Same as Cmd-Alt-i dialog in UI.

Type:

bool

New in version 3.

direction

Writing direction.

See Writing Directions

Type:

integer

glyph.direction = GSRTL

New in version 3.

storeDirection

Set to True in order to manipulate the GSGlyph.direction of the glyph (see above). Makes it possible to ship custom glyph data inside a .glyphs file without a separate GlyphData file. Same as Cmd-Alt-i dialog in UI.

Type:

bool

New in version 3.

script

The script of the glyph, e.g., ‘latin’, ‘arabic’. Setting only works if GSGlyph.storeScript is set (see below).

Type:

str

storeScript

Set to True in order to manipulate the GSGlyph.script of the glyph (see above). Makes it possible to ship custom glyph data inside a .glyphs file without a separate GlyphData file. Same as Cmd-Alt-i dialog in UI.

Type:

bool

productionName

The productionName of the glyph. Setting only works if GSGlyph.storeProductionName is set (see below).

Type:

str

storeProductionName

Set to True in order to manipulate the GSGlyph.productionName of the glyph (see above). Makes it possible to ship custom glyph data inside a .glyphs file without a separate GlyphData file. Same as Cmd-Alt-i dialog in UI.

Type:

bool

tags

store strings that can be used to filter glyphs or build OT-classes with token filters

Type:

list

glyphInfo

GSGlyphInfo object for this glyph with detailed information.

Type:

GSGlyphInfo

sortName

Alternative name of glyph used for sorting in UI.

Type:

str

sortNameKeep

Alternative name of glyph used for sorting in UI, when using ‘Keep Alternates Next to Base Glyph’ from Font Info. see GSGlyph.storeSortName :type: str

storeSortName

Set to True in order to manipulate the GSGlyph.sortName and GSGlyph.sortNameKeep of the glyph (see above). Makes it possible to ship custom glyph data inside a .glyphs file without a separate GlyphData file. Same as Cmd-Alt-i dialog in UI.

Type:

bool

leftKerningGroup

The leftKerningGroup of the glyph. All glyphs with the same text in the kerning group end up in the same kerning class.

Type:

str

rightKerningGroup

The rightKerningGroup of the glyph. All glyphs with the same text in the kerning group end up in the same kerning class.

Type:

str

topKerningGroup

The topKerningGroup of the glyph. All glyphs with the same text in the kerning group end up in the same kerning class.

Type:

str

bottomKerningGroup

The bottomKerningGroup of the glyph. All glyphs with the same text in the kerning group end up in the same kerning class.

Type:

str

leftKerningKey

The key to be used with the kerning functions (GSFont.kerningForPair(), GSFont.setKerningForPair(), GSFont.removeKerningForPair()).

If the glyph has a leftKerningGroup attribute, the internally used @MMK_R_xx notation will be returned (note that the R in there stands for the right side of the kerning pair for LTR fonts, which corresponds to the left kerning group of the glyph). If no group is given, the glyph’s name will be returned.

Type:

string

# Set kerning for 'T' and all members of kerning class 'a'
# For LTR fonts, always use the .rightKerningKey for the first (left) glyph of the pair, .leftKerningKey for the second (right) glyph.
font.setKerningForPair(font.selectedFontMaster.id, font.glyphs['T'].rightKerningKey, font.glyphs['a'].leftKerningKey, -60)
# which corresponds to:
font.setKerningForPair(font.selectedFontMaster.id, 'T', '@MMK_R_a', -60)
rightKerningKey

The key to be used with the kerning functions (GSFont.kerningForPair(), GSFont.setKerningForPair()GSFont.removeKerningForPair()).

If the glyph has a rightKerningGroup attribute, the internally used @MMK_L_xx notation will be returned (note that the L in there stands for the left side of the kerning pair for LTR fonts, which corresponds to the right kerning group of the glyph). If no group is given, the glyph’s name will be returned.

See above for an example.

Type:

string

New in version 2.4.

topKerningKey

The key to be used with the kerning functions (GSFont.kerningForPair(), GSFont.setKerningForPair(), GSFont.removeKerningForPair()).

New in version 3.

bottomKerningKey

The key to be used with the kerning functions (GSFont.kerningForPair(), GSFont.setKerningForPair(), GSFont.removeKerningForPair()).

New in version 3.

leftMetricsKey

The leftMetricsKey of the glyph. This is a reference to another glyph by name or formula. It is used to synchronize the metrics with the linked glyph.

Type:

str

rightMetricsKey

The rightMetricsKey of the glyph. This is a reference to another glyph by name or formula. It is used to synchronize the metrics with the linked glyph.

Type:

str

widthMetricsKey

The widthMetricsKey of the glyph. This is a reference to another glyph by name or formula. It is used to synchronize the metrics with the linked glyph.

Type:

str

export

Defines whether glyph will export upon font generation

Type:

bool

color

Color marking of glyph in UI

Type:

int

glyph.color = 0         # red
glyph.color = 1         # orange
glyph.color = 2         # brown
glyph.color = 3         # yellow
glyph.color = 4         # light green
glyph.color = 5         # dark green
glyph.color = 6         # light blue
glyph.color = 7         # dark blue
glyph.color = 8         # purple
glyph.color = 9         # magenta
glyph.color = 10        # light gray
glyph.color = 11        # charcoal
glyph.color = None      # not colored, white (before version 1235, use -1)
colorObject

NSColor object of glyph color, useful for drawing in plugins.

Type:

NSColor

# use glyph color to draw the outline
glyph.colorObject.set()
# Get RGB (and alpha) values (as float numbers 0..1, multiply with 256 if necessary)
R, G, B, A = glyph.colorObject.colorUsingColorSpace_(NSColorSpace.genericRGBColorSpace()).getRed_green_blue_alpha_(None, None, None, None)
print(R, G, B)
>> 0.617805719376 0.958198726177 0.309286683798
print(round(R * 256), int(G * 256), int(B * 256))
>> 158 245 245
# Draw layer
glyph.layers[0].bezierPath.fill()
# set the glyph color.
glyph.colorObject = NSColor.colorWithDeviceRed_green_blue_alpha_(247.0 / 255.0, 74.0 / 255.0, 62.9 / 255.0, 1)
# or:
glyph.colorObject = (247.0, 74.0, 62.9) # max 255.0
# or:
glyph.colorObject = (247.0, 74.0, 62.9, 1) # with alpha
# or:
glyph.colorObject = (0.968, 0.29, 0.247, 1) # max 1.0
note
Type:

str

selected

Return True if the Glyph is selected in the Font View. This is different to the property font.selectedLayers which returns the selection from the active tab.

Type:

bool

# access all selected glyphs in the Font View
for glyph in font.glyphs:
    if glyph.selected:
        print(glyph)
mastersCompatible

Return True when all layers in this glyph are compatible (same components, anchors, paths etc.)

Type:

bool

userData

A dictionary to store user data. Use a unique key and only use objects that can be stored in a property list (string, list, dict, numbers, NSData) otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
glyph.userData['rememberToMakeCoffee'] = True
# delete value
del glyph.userData['rememberToMakeCoffee']
smartComponentAxes

A list of GSSmartComponentAxis objects.

These are the axis definitions for the interpolations that take place within the Smart Components. Corresponds to the ‘Properties’ tab of the glyph’s ‘Show Smart Glyph Settings’ dialog.

Also see https://glyphsapp.com/tutorials/smart-components for reference.

Type:

list

# Adding two interpolation axes to the glyph
axis1 = GSSmartComponentAxis()
axis1.name = 'crotchDepth'
axis1.topValue = 0
axis1.bottomValue = -100
g.smartComponentAxes.append(axis1)
axis2 = GSSmartComponentAxis()
axis2.name = 'shoulderWidth'
axis2.topValue = 100
axis2.bottomValue = 0
g.smartComponentAxes.append(axis2)
# Deleting one axis
del g.smartComponentAxes[1]
lastChange

Change date when glyph was last changed as datetime.

Check Python’s time module for how to use the timestamp.

Functions

beginUndo()

Call this before you do a longer running change to the glyph. Be extra careful to call glyph.endUndo() when you are finished.

endUndo()

This closes a undo group that was opened by a previous call of glyph.beginUndo() Make sure that you call this for each beginUndo() call.

updateGlyphInfo(changeName=True)

Updates all information like name, unicode etc. for this glyph.

duplicate([name])

Duplicate the glyph under a new name and return it.

If no name is given, .00n will be appended to it.

GSLayer

Implementation of the layer object.

For details on how to access these layers, please see GSGlyph.layers

class GSLayer

Properties

parent

name

master

associatedMasterId

layerId

attributes

color

colorObject

shapes

guides

annotations

hints

anchors

components

paths

selection

LSB

RSB

TSB

BSB

width

vertWidth

leftMetricsKey

rightMetricsKey

widthMetricsKey

bounds

selectionBounds

background

backgroundImage

bezierPath

openBezierPath

userData

smartComponentPoleMapping

isSpecialLayer

isMasterLayer

italicAngle

visible

Functions

decomposeComponents()

decomposeCorners()

compareString()

connectAllOpenPaths()

copyDecomposedLayer()

syncMetrics()

correctPathDirection()

removeOverlap()

roundCoordinates()

addNodesAtExtremes()

beginChanges()

endChanges()

cutBetweenPoints()

intersections()

intersectionsBetweenPoints()

addMissingAnchors()

clearSelection()

clear()

swapForegroundWithBackground()

reinterpolate()

applyTransform()

transform()

Properties

parent

Reference to the glyph object that this layer is attached to.

Type:

GSGlyph

name

Name of layer

Type:

str

master

Master that this layer is connected to. Read only.

Type:

GSFontMaster

associatedMasterId

The ID of the fontMaster this layer belongs to, in case this isn’t a master layer. Every layer that isn’t a master layer needs to be attached to one master layer.

# add a new layer
newLayer = GSLayer()
newLayer.name = '{125, 100}' # (example for glyph-level intermediate master)
# you may set the master ID that this layer will be associated with, otherwise the first master will be used
newLayer.associatedMasterId = font.masters[-1].id # attach to last master
font.glyphs['a'].layers.append(newLayer)
Type:

str

layerId

The unique layer ID is used to access the layer in the glyphs layer dictionary.

For master layers this should be the id of the fontMaster. It could look like this: FBCA074D-FCF3-427E-A700-7E318A949AE5

Type:

str

# see ID of active layer
id = font.selectedLayers[0].layerId
print(id)
>> FBCA074D-FCF3-427E-A700-7E318A949AE5
# access a layer by this ID
layer = font.glyphs["a"].layers[id]
layer = font.glyphs["a"].layers['FBCA074D-FCF3-427E-A700-7E318A949AE5']
# for master layers, use ID of masters
layer = font.glyphs["a"].layers[font.masters[0].id]
attributes

layer attributes like axisRules, coordinates, colorPalette, sbixSize, color, svg

axis = font.axes[0]
layer.attributes["axisRules"] = {axis.axisId: {'min': 100}}
layer.attributes["coordinates"] = {axis.axisId: 99}
layer.attributes["colorPalette"] = 2  # This makes the layer a CPAL layer for color index 2
Type:

dict

color

Color marking of glyph in UI

Type:

int

glyph.color = 0     # red
glyph.color = 1     # orange
glyph.color = 2     # brown
glyph.color = 3     # yellow
glyph.color = 4     # light green
glyph.color = 5     # dark green
glyph.color = 6     # light blue
glyph.color = 7     # dark blue
glyph.color = 8     # purple
glyph.color = 9     # magenta
glyph.color = 10    # light gray
glyph.color = 11    # charcoal
glyph.color = None  # not colored, white (before version 1235, use -1)
colorObject

NSColor object of layer color, useful for drawing in plugins.

Type:

NSColor

# use layer color to draw the outline
layer.colorObject.set()
# Get RGB (and alpha) values (as float numbers 0..1, multiply with 256 if necessary)
R, G, B, A = layer.colorObject.colorUsingColorSpace_(NSColorSpace.genericRGBColorSpace()).getRed_green_blue_alpha_(None, None, None, None)
print(R, G, B)
>> 0.617805719376 0.958198726177 0.309286683798
print(round(R * 256), int(G * 256), int(B * 256))
>> 158 245 245
# Draw layer
layer.bezierPath.fill()
# set the layer color.
layer.colorObject = NSColor.colorWithDeviceRed_green_blue_alpha_(247.0 / 255.0, 74.0 / 255.0, 62.9 / 255.0, 1)
components

Collection of GSComponent objects. This is only a helper proxy to iterate all components (without paths). To add/remove items, use GSLayer.shapes.

Type:

list

for component in layer.components:
    print(component)
guides

List of GSGuide objects.

Type:

list

# access all guides
for guide in layer.guides:
    print(guide)
# add guide
newGuide = GSGuide()
newGuide.position = NSPoint(100, 100)
newGuide.angle = -10.0
layer.guides.append(newGuide)
# delete guide
del layer.guides[0]
# copy guides from another layer
import copy
layer.guides = copy.copy(anotherlayer.guides)
annotations

List of GSAnnotation objects.

Type:

list

# access all annotations
for annotation in layer.annotations:
    print(annotation)
# add new annotation
newAnnotation = GSAnnotation()
newAnnotation.type = TEXT
newAnnotation.text = 'Fuck, this curve is ugly!'
layer.annotations.append(newAnnotation)
# delete annotation
del layer.annotations[0]
# copy annotations from another layer
import copy
layer.annotations = copy.copy(anotherlayer.annotations)
hints

List of GSHint objects.

Type:

list

# access all hints
for hint in layer.hints:
    print(hint)
# add a new hint
newHint = GSHint()
# change behaviour of hint here, like its attachment nodes
layer.hints.append(newHint)
# delete hint
del layer.hints[0]
# copy hints from another layer
import copy
layer.hints = copy.copy(anotherlayer.hints)
# remember to reconnect the hints’ nodes with the new layer’s nodes
anchors

List of GSAnchor objects.

Type:

list, dict

# access all anchors:
for a in layer.anchors:
    print(a)
# add a new anchor
layer.anchors['top'] = GSAnchor()
# delete anchor
del layer.anchors['top']
# copy anchors from another layer
import copy
layer.anchors = copy.copy(anotherlayer.anchors)
shapes

List of GSShape objects. That are most likely GSPath or GSComponent

Type:

list

# access all shapes
for shape in layer.shapes:
    print(shape)
# delete shape
del layer.shapes[0]
# copy shapes from another layer
import copy
layer.shapes = copy.copy(anotherlayer.shapes)
paths

List of GSPath objects. This is only a helper proxy to iterate all paths (without components). To add/remove items, use GSLayer.shapes.

Type:

list

# access all paths
for path in layer.paths:
    print(path)
selection

List of all selected objects in the glyph.

This list contains all selected items, including nodes, anchors, guides etc. If you want to work specifically with nodes, for instance, you may want to cycle through the nodes (or anchors etc.) and check whether they are selected. See example below.

Type:

list

# access all selected nodes
for path in layer.paths:
    for node in path.nodes: # (or path.anchors etc.)
        print(node.selected)
# clear selection
layer.clearSelection()
LSB

Left sidebearing

Type:

float

RSB

Right sidebearing

Type:

float

TSB

Top sidebearing

Type:

float

BSB

Bottom sidebearing

Type:

float

width

Layer width

Type:

float

vertWidth

Layer vertical width

set it to None to reset it to default

Type:

float

New in version 2.6.2.

vertOrigin

Layer vertical origin

set it to None to reset it to default

Type:

float

New in version 2.6.2.

ascender

The ascender for this layer.

Type:

float

New in version 3.0.2.

descender

The descender for this layer.

Type:

float

New in version 3.0.2.

leftMetricsKey

The leftMetricsKey of the layer. This is a reference to another glyph by name or formula. It is used to synchronize the metrics with the linked glyph.

Type:

str

rightMetricsKey

The rightMetricsKey of the layer. This is a reference to another glyph by name or formula. It is used to synchronize the metrics with the linked glyph.

Type:

str

widthMetricsKey

The widthMetricsKey of the layer. This is a reference to another glyph by name or formula. It is used to synchronize the metrics with the linked glyph.

Type:

str

bounds

Bounding box of whole glyph as NSRect. Read-only.

Type:

NSRect

# origin
print(layer.bounds.origin.x, layer.bounds.origin.y)
# size
print(layer.bounds.size.width, layer.bounds.size.height)
selectionBounds

Bounding box of the layer’s selection (nodes, anchors, components etc). Read-only.

Type:

NSRect

metrics

The metrics layer are a list of horizontal metrics filtered specifically for this layer. Use this instead of master.alignmentZones.

Type:

GSMetricValue

New in version 3.0.1.

background

The background layer

Type:

GSLayer

# copy layer to its background
layer.background = layer.copy()
# remove background layer
layer.background = None
backgroundImage

The background image. It will be scaled so that 1 em unit equals 1 of the image’s pixels.

Type:

GSBackgroundImage

# set background image
layer.backgroundImage = GSBackgroundImage('/path/to/file.jpg')
# remove background image
layer.backgroundImage = None
bezierPath

The layer as an NSBezierPath object. Useful for drawing glyphs in plug-ins.

Type:

NSBezierPath

# draw the path into the Edit view
NSColor.redColor().set()
layer.bezierPath.fill()
openBezierPath

All open paths of the layer as an NSBezierPath object. Useful for drawing glyphs as outlines in plug-ins.

Type:

NSBezierPath

# draw the path into the Edit view
NSColor.redColor().set()
layer.openBezierPath.stroke()
completeBezierPath

The layer as an NSBezierPath object including paths from components. Useful for drawing glyphs in plug-ins.

Type:

NSBezierPath

# draw the path into the Edit view
NSColor.redColor().set()
layer.completeBezierPath.fill()
completeOpenBezierPath

All open paths of the layer as an NSBezierPath object including paths from components. Useful for drawing glyphs as outlines in plugins.

Type:

NSBezierPath

# draw the path into the Edit view
NSColor.redColor().set()
layer.completeOpenBezierPath.stroke()
isAligned

Indicates if the components are auto aligned.

Type:

bool

isSpecialLayer

If the layer is a brace, bracket or a smart component layer

Type:

bool

isMasterLayer

If it is a master layer

Type:

bool

italicAngle

The italic angle that applies to this layer

Type:

float

visible

if the layer is visble (the eye icon in the layer panel)

Type:

bool

userData

A dictionary to store user data. Use a unique key and only use objects that can be stored in a property list (string, list, dict, numbers, NSData) otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
layer.userData['rememberToMakeCoffee'] = True
# delete value
del layer.userData['rememberToMakeCoffee']
tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. If you need the data persistent, use layer.userData

Type:

dict

# set value
layer.tempData['rememberToMakeCoffee'] = True
# delete value
del layer.tempData['rememberToMakeCoffee']
smartComponentPoleMapping

Maps this layer to the poles on the interpolation axes of the Smart Glyph. The dictionary keys are the names of the GSSmartComponentAxis objects. The values are 1 for bottom pole and 2 for top pole. Corresponds to the ‘Layers’ tab of the glyph’s ‘Show Smart Glyph Settings’ dialog.

Also see https://glyphsapp.com/tutorials/smart-components for reference.

Type:

dict, int

# Map layers to top and bottom poles:
crotchDepthAxis = glyph.smartComponentAxes['crotchDepth']
shoulderWidthAxis = glyph.smartComponentAxes['shoulderWidth']
for layer in glyph.layers:
    # Regular layer
    if layer.name == 'Regular':
        layer.smartComponentPoleMapping[crotchDepthAxis.id] = 2
        layer.smartComponentPoleMapping[shoulderWidthAxis.id] = 2
    # NarrowShoulder layer
    elif layer.name == 'NarrowShoulder':
        layer.smartComponentPoleMapping[crotchDepthAxis.id] = 2
        layer.smartComponentPoleMapping[shoulderWidthAxis.id] = 1
    # LowCrotch layer
    elif layer.name == 'LowCrotch':
        layer.smartComponentPoleMapping[crotchDepthAxis.id] = 1
        layer.smartComponentPoleMapping[shoulderWidthAxis.id] = 2

Functions

decomposeComponents()

Decomposes all components of the layer at once.

decomposeCorners()

Decomposes all corners of the layer at once.

New in version 2.4.

compareString()

Returns a string representing the outline structure of the glyph, for compatibility comparison.

Returns:

The comparison string

Return type:

string

print(layer.compareString())
>> oocoocoocoocooc_oocoocoocloocoocoocoocoocoocoocoocooc_
connectAllOpenPaths()

Closes all open paths when end points are further than 1 unit away from each other.

copyDecomposedLayer()

Returns a copy of the layer with all components decomposed.

Returns:

A new layer object

Return type:

GSLayer

syncMetrics()

Take over LSB and RSB from linked glyph.

# sync metrics of all layers of this glyph
for layer in glyph.layers:
    layer.syncMetrics()
correctPathDirection()

Corrects the path direction.

removeOverlap([checkSelection=False])

Joins all contours.

Parameters:

checkSelection – If the selection will be considered. Default: False

roundCoordinates()

Round the positions of all coordinates to the grid (size of which is set in the Font Info).

addNodesAtExtremes([force=False, checkSelection=False])

Add nodes at layer’s extrema, e.g., top, bottom etc.

Parameters:
  • force – if points are always added, even if that would distort the shape

  • checkSelection – only process selected segments

applyTransform(transform)

Apply a transformation matrix to the layer.

layer.applyTransform([
    0.5, # x scale factor
    0.0, # x skew factor
    0.0, # y skew factor
    0.5, # y scale factor
    0.0, # x position
    0.0  # y position
])
from Foundation import NSAffineTransform, NSMidX, NSMidY
bounds = Layer.bounds
transform = NSAffineTransform.new()
transform.translateXBy_yBy_(NSMidX(bounds), NSMidY(bounds))
transform.rotateByDegrees_(-30)
transform.translateXBy_yBy_(-NSMidX(bounds), -NSMidY(bounds))
Layer.applyTransform(transform)
Parameters:

transform – a list of 6 numbers, a NSAffineTransform or a NSAffineTransformStruct

transform(transform[, selection=False, components=True])

Apply a NSAffineTransform to the layer.

Parameters:
  • transform – A NSAffineTransform

  • selection – check selection

  • components – if components should be transformed

transformation = NSAffineTransform()
transformation.rotate(45, (200, 200))
layer.transform(transformation)
beginChanges()

Call this before you do bigger changes to the Layer. This will increase performance and prevent undo problems. Always call layer.endChanges() if you are finished.

endChanges()

Call this if you have called layer.beginChanges before. Make sure to group bot calls properly.

cutBetweenPoints(Point1, Point2)

Cuts all paths that intersect the line from Point1 to Point2

Parameters:
  • Point1 – one point

  • Point2 – the other point

# cut glyph in half horizontally at y=100
layer.cutBetweenPoints(NSPoint(0, 100), NSPoint(layer.width, 100))
intersections()

returns a list of all intersections between overlapiung paths in the layer.

intersectionsBetweenPoints(Point1, Point2, components=False)

Return all intersection points between a measurement line and the paths in the layer. This is basically identical to the measurement tool in the UI.

Normally, the first returned point is the starting point, the last returned point is the end point. Thus, the second point is the first intersection, the second last point is the last intersection.

Parameters:
  • Point1 – one point

  • Point2 – the other point

  • components – if components should be measured. Default: False

  • ignoreLocked – ignore locked or unfocused paths. Default: False

# show all intersections with glyph at y=100
intersections = layer.intersectionsBetweenPoints((-1000, 100), (layer.width+1000, 100))
print(intersections)
# left sidebearing at measurement line
print(intersections[1].x)
# right sidebearing at measurement line
print(layer.width - intersections[-2].x)
addMissingAnchors()

Adds missing anchors defined in the glyph database.

clearSelection()

Unselect all selected items in this layer.

clear()

Remove all elements from layer.

swapForegroundWithBackground()

Swap Foreground layer with Background layer.

reinterpolate()

Re-interpolate a layer according the other layers and its interpolation values.

Applies to both master layers as well as brace layers and is equivalent to the ‘Re-Interpolate’ command from the Layers palette.

GSAnchor

Implementation of the anchor object.

For details on how to access them, please see GSLayer.anchors

class GSAnchor([name, pt])
Parameters:
  • name – the name of the anchor

  • pt – the position of the anchor

Properties

position

name

selected

orientation

Properties

position

The position of the anchor

Type:

NSPoint

# read position
print(layer.anchors['top'].position.x, layer.anchors['top'].position.y)
# set position
layer.anchors['top'].position = NSPoint(175, 575)
# increase vertical position by 50 units
layer.anchors['top'].position = NSPoint(layer.anchors['top'].position.x, layer.anchors['top'].position.y + 50)
name

The name of the anchor

Type:

str

selected

Selection state of anchor in UI.

# select anchor
layer.anchors[0].selected = True
# log selection state
print(layer.anchors[0].selected)
Type:

bool

orientation

If the position of the anchor is relaive to the LSB (0), center (2) or RSB (1).

Type:

int

userData

A dictionary to store user data. Use a unique key and only use objects that can be stored in a property list (string, list, dict, numbers, NSData) otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
anchor.userData['rememberToMakeCoffee'] = True
# delete value
del component.userData['rememberToMakeCoffee']

New in version 3.

GSComponent

Implementation of the component object. For details on how to access them, please see GSLayer.components

class GSComponent(glyph[, position])
Parameters:
  • glyph – a GSGlyph object or the glyph name

  • position – the position of the component as NSPoint

Properties

position

scale

rotation

componentName

componentMasterId

component

layer

transform

bounds

automaticAlignment

anchor

selected

smartComponentValues

bezierPath

userData

Functions

decompose()

applyTransform()

Properties

position

The position of the component.

Type:

NSPoint

scale

Scale factor of the component.

A tuple containing the horizontal and vertical scale.

Type:

tuple

rotation

Rotation angle of the component.

Type:

float

componentName

The glyph name the component is pointing to.

Type:

str

name

The glyph name the component is pointing to.

Type:

str

New in version 2.5.

componentMasterId

The ID of the master to component is pointing to.

Type:

str

New in version 3.1.

component

The GSGlyph the component is pointing to. This is read-only. In order to change the referenced base glyph, set componentName to the new glyph name.

Type:

GSGlyph

componentLayer

The GSLayer the component is pointing to. This is read-only. In order to change the referenced base glyph, set componentName to the new glyph name.

For Smart Components, the componentLayer contains the interpolated result.

Type:

GSLayer

New in version 2.5.

transform

Transformation matrix of the component. If Glyphs 3, this is computed from the scale, rotation and position.

Type:

NSAffineTransformStruct

component.transform = ((
    0.5, # x scale factor
    0.0, # x skew factor
    0.0, # y skew factor
    0.5, # y scale factor
    0.0, # x position
    0.0  # y position
))
bounds

Bounding box of the component, read-only

Type:

NSRect

component = layer.components[0] # first component
# origin
print(component.bounds.origin.x, component.bounds.origin.y)
# size
print(component.bounds.size.width, component.bounds.size.height)
automaticAlignment

Defines whether the component is automatically aligned.

Type:

bool

alignment

New in version 2.5.

TODO

locked

New in version 2.5.

If the component is locked TODO

Type:

bool

anchor

If more than one anchor/_anchor pair would match, this property can be used to set the anchor to use for automatic alignment

This can be set from the anchor button in the component info box in the UI

Type:

str

selected

Selection state of component in UI.

Type:

bool

# select component
layer.components[0].selected = True
# print(selection state)
print(layer.components[0].selected)
attributes

attributes attributes like mask or reversePaths

component.attributes['mask'] = True
component.attributes['reversePaths'] = True
Type:

dict

smartComponentValues

Dictionary of interpolations values of the Smart Component. Key are the axis.id, values are between the top and the bottom value of the corresponding GSSmartComponentAxis objects. Corresponds to the values of the ‘Smart Component Settings’ dialog. Returns None if the component is not a Smart Component.

For newly setup smart glyhs, the axis.id is a random string. After saving and re-opening the file, the name and id is the same. As long as you don’t change the name. So it is saver to always go through the smart glyphs > axis > id (as explained in the code sample below.

Also see https://glyphsapp.com/tutorials/smart-components for reference.

Type:

dict, int

component = glyph.layers[0].shapes[1]
widthAxis = component.component.smartComponentAxes['Width']  # get the width axis from the smart glyph
components.smartComponentValues[widthAxis.id] = 45
# Check whether a component is a smart component
for component in layer.components:
    if component.smartComponentValues is not None:
        # do stuff
bezierPath

The component as an NSBezierPath object. Useful for drawing glyphs in plugins.

Type:

NSBezierPath

# draw the path into the Edit view
NSColor.redColor().set()
layer.components[0].bezierPath.fill()
userData

A dictionary to store user data. Use a unique key and only use objects that can be stored in a property list (string, list, dict, numbers, NSData) otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
component.userData['rememberToMakeCoffee'] = True
# delete value
del component.userData['rememberToMakeCoffee']

New in version 2.5.

tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. If you need the data persistent, use component.userData

Type:

dict

# set value
component.tempData['rememberToMakeCoffee'] = True
# delete value
del component.tempData['rememberToMakeCoffee']

Functions

decompose([doAnchors=True, doHints=True])

Decomposes the component.

Parameters:
  • doAnchors – get anchors from components

  • doHints – get hints from components

applyTransform()

Apply a transformation matrix to the component.

component = layer.components[0]
component.applyTransform((
    0.5, # x scale factor
    0.0, # x skew factor
    0.0, # y skew factor
    0.5, # y scale factor
    0.0, # x position
    0.0  # y position
))

GSGlyphReference

a small helper class to store a reference to a glyph in userData that will keep track of changes to the glyph name.

New in version 3.0.4.

class GSGlyphReference

Properties

glyph

Properties

glyph

the GSGlyph to keep track of

Type:

GSGlyph

glyphReference = GSGlyphReference(font.glyphs["A"])

GSSmartComponentAxis

Implementation of the Smart Component interpolation axis object. For details on how to access them, please see GSGlyph.smartComponentAxes

New in version 2.3.

class GSSmartComponentAxis

Properties

name

topValue

bottomValue

Properties

name

Name of the axis. The name is for display purpose only.

Type:

str

id

Id of the axis. This Id will be used to map the Smart Glyph’s layers to the poles of the interpolation. See GSLayer.smartComponentPoleMapping

Type:

str

New in version 2.5.

topValue

Top end (pole) value on interpolation axis.

Type:

int, float

bottomValue

Bottom end (pole) value on interpolation axis.

Type:

int, float

GSShape

Implementation of the shape object.

For details on how to access them, please see GSLayer.shapes

class GSShape

Properties

position

locked

shapeType

locked

Locked

Type:

bool

shapeType

the type of the shapes. can be GSShapeTypePath or GSShapeTypeComponent

Type:

int

GSPath

Implementation of the path object.

For details on how to access them, please see GSLayer.paths

If you build a path in code, make sure that the structure is valid. A curve node has to be preceded by two off-curve nodes. And an open path has to start with a line node.

class GSPath

Properties

parent

nodes

segments

closed

direction

bounds

selected

bezierPath

attributes

tempData

Functions

reverse()

addNodesAtExtremes()()

applyTransform()()

Properties

parent

Reference to the layer object.

Type:

GSLayer

nodes

A list of GSNode objects

Type:

list

# access all nodes
for path in layer.paths:
    for node in path.nodes:
        print(node)
segments

A list of segments as NSPoint objects. Two objects represent a line, four represent a curve. Start point of the segment is included.

Type:

list

# access all segments
for path in layer.paths:
    for segment in path.segments:
        print(segment)
closed

Returns True if the the path is closed

Type:

bool

direction

Path direction. -1 for counter clockwise, 1 for clockwise.

Type:

int

bounds

Bounding box of the path, read-only

Type:

NSRect

path = layer.paths[0] # first path
# origin
print(path.bounds.origin.x, path.bounds.origin.y)
# size
print(path.bounds.size.width, path.bounds.size.height)
selected

Selection state of path in UI.

Type:

bool

# select path
layer.paths[0].selected = True
# print(selection state)
print(layer.paths[0].selected)
bezierPath

The same path as an NSBezierPath object. Useful for drawing glyphs in plugins.

Type:

NSBezierPath

# draw the path into the Edit view
NSColor.redColor().set()
layer.paths[0].bezierPath.fill()

Functions

reverse()

Reverses the path direction

attributes

path attributes like fill, mask, strokeWidth, strokeHeight, strokeColor', strokePos

# in B/W layers:
path.attributes['fill'] = True
path.attributes['mask'] = True
path.attributes['strokeWidth'] = 100
path.attributes['strokeHeight'] = 80
# in color layers:
path.attributes['strokeColor'] = NSColor.redColor()
path.attributes['fillColor'] = NSColor.blueColor()
path.attributes['strokePos'] = 1 # or 0, -1
Type:

dict

tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. If you need the data persistent, use path.userData

Type:

dict

# set value
path.tempData['rememberToMakeCoffee'] = True
# delete value
del path.tempData['rememberToMakeCoffee']

draw the object with a fontTools pen

addNodesAtExtremes([force=False, checkSelection=False])

Add nodes at path’s extrema, e.g., top, bottom etc.

Parameters:
  • force – if points are always added, even if that would distort the shape

  • checkSelection – only process selected segments

applyTransform()

Apply a transformation matrix to the path.

path = layer.paths[0]
path.applyTransform((
    0.5, # x scale factor
    0.0, # x skew factor
    0.0, # y skew factor
    0.5, # y scale factor
    0.0, # x position
    0.0  # y position
))

GSNode

Implementation of the node object.

For details on how to access them, please see GSPath.nodes

class GSNode([pt, type = type])
Parameters:
  • pt – The position of the node.

  • type – The type of the node, LINE, CURVE or OFFCURVE

Properties

position

type

connection

selected

index

nextNode

prevNode

name

orientation

Functions

makeNodeFirst()

toggleConnection()

Properties

position

The position of the node.

Type:

NSPoint

type

The type of the node, LINE, CURVE or OFFCURVE

Always compare against the constants, never against the actual value.

Type:

str

smooth

If it is a smooth connection or not

Type:

BOOL

connection

The type of the connection, SHARP or SMOOTH

Type:

string

Deprecated since version 2.3: Use smooth instead.

selected

Selection state of node in UI.

Type:

bool

# select node
layer.paths[0].nodes[0].selected = True
# print(selection state)
print(layer.paths[0].nodes[0].selected)
index

Returns the index of the node in the containing path or maxint if it is not in a path.

Type:

int

nextNode

Returns the next node in the path.

Please note that this is regardless of the position of the node in the path and will jump across the path border to the beginning of the path if the current node is the last.

If you need to take into consideration the position of the node in the path, use the node’s index attribute and check it against the path length.

Type:

GSNode

print(layer.paths[0].nodes[0].nextNode # returns the second node in the path (index 0 + 1))
print(layer.paths[0].nodes[-1].nextNode # returns the first node in the path (last node >> jumps to beginning of path))
# check if node is last node in path (with at least two nodes)
print(layer.paths[0].nodes[0].index == (len(layer.paths[0].nodes) - 1)) # returns False for first node
print(layer.paths[0].nodes[-1].index == (len(layer.paths[0].nodes) - 1)) # returns True for last node
prevNode

Returns the previous node in the path.

Please note that this is regardless of the position of the node in the path, and will jump across the path border to the end of the path if the current node is the first.

If you need to take into consideration the position of the node in the path, use the node’s index attribute and check it against the path length.

Type:

GSNode

print(layer.paths[0].nodes[0].prevNode) # returns the last node in the path (first node >> jumps to end of path)
print(layer.paths[0].nodes[-1].prevNode) # returns second last node in the path
# check if node is first node in path (with at least two nodes)
print(layer.paths[0].nodes[0].index == 0) # returns True for first node
print(layer.paths[0].nodes[-1].index == 0) # returns False for last node
name

Attaches a name to a node.

Type:

str

orientation

If the position of the node is relaive to the LSB (0), center (2) or RSB (1).

Type:

int

userData

A dictionary to store user data. Use a unique key and only use objects that can be stored in a property list (string, list, dict, numbers, NSData) otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
node.userData['rememberToMakeCoffee'] = True
# delete value
del node.userData['rememberToMakeCoffee']

New in version 2.4.1.

Functions

makeNodeFirst()

Turn this node into the start point of the path.

toggleConnection()

Toggle between sharp and smooth connections.

GSPathSegment

Implementation of the segment object.

For details on how to access them, please see GSPath.segments

class GSPathSegment

Properties

type

bounds

length

Functions

reverse()

middlePoint()

lastPoint()

inflectionPoints()

curvatureAtTime_()

pointAtTime_()

normalAtTime_()

tangentAtTime_()

extremePoints()

extremeTimes()

normalizeHandles()

bounds

Bounding box of the segment as NSRect. Read-only.

Type:

NSRect

bounds = segment.bounds
# origin
print(bounds.origin.x, bounds.origin.y)
# size
print(bounds.size.width, bounds.size.height)
type

The type of the node, LINE, CURVE or QCURVE

Always compare against the constants, never against the actual value.

Type:

str

reverse()

reverses the segments

middlePoint()

the point at t=0.5

lastPoint()

the ending point of the segment

inflectionPoints()

a list of “t” values of inflection points on the segment

curvatureAtTime_(t)

the curvature at “t”

pointAtTime_(t)

the point a “t”

normalAtTime_(t)

the normal vector at “t”

tangentAtTime_(t)

the tanget at “t”

extremePoints()

a list of extreme points

extremeTimes()

a list of “t” value for the extreme points

normalizeHandles()

balances the length of the handle while trying to keep the shape as good as possible

GSGuide

Implementation of the guide object.

For details on how to access them, please see GSLayer.guides

class GSGuide

Properties

position

angle

name

filter

showMeasurement

selected

locked

userData

lockAngle

locks the angle

Type:

bool

angle

Angle

Type:

float

name

a optional name

Type:

str

selected

Selection state of guide in UI.

Type:

bool

# select guide
layer.guides[0].selected = True
# print(selection state)
print(layer.guides[0].selected)
locked

Locked

Type:

bool

filter

A filter to only show the guide in certain glyphs. Only relevant in global guides

Type:

NSPredicate

showMeasurement

If the guide is showing measurments

Type:

bool

New in version 3.1.

userData

A dictionary to store user data. Use a unique key and only use objects that can be stored in a property list (string, list, dict, numbers, NSData) otherwise the data will not be recoverable from the saved file.

Type:

dict

# set value
guide.userData['rememberToMakeCoffee'] = True
# delete value
del guide.userData['rememberToMakeCoffee']

GSAnnotation

Implementation of the annotation object.

For details on how to access them, please see GSLayer.annotations

class GSAnnotation

position

type

text

angle

width

Properties

position

The position of the annotation.

Type:

NSPoint

type

The type of the annotation.

Available constants are: TEXT ARROW CIRCLE PLUS MINUS

Type:

int

text

The content of the annotation. Only useful if type == TEXT

Type:

str

angle

The angle of the annotation.

Type:

float

width

The width of the annotation.

Type:

float

GSHint

Implementation of the hint object.

For details on how to access them, please see GSLayer.hints

class GSHint

parent

originNode

targetNode

otherNode1

otherNode2

originIndex

targetIndex

otherIndex1

otherIndex2

type

horizontal

selected

isTrueType

isPostScript

isCorner

name

stem

Properties

parent

Parent layer of hint.

Type:

GSLayer

originNode

The first node the hint is attached to.

Type:

GSNode or GSHandle (e.g. when attached to intersections)

targetNode

The the second node this hint is attached to. In the case of a ghost hint, this value will be empty.

Type:

GSNode or GSHandle (e.g. when attached to intersections)

otherNode1

A third node this hint is attached to. Used for Interpolation or Diagonal hints.

Type:

GSNode or GSHandle (e.g. when attached to intersections)

otherNode2

A fourth node this hint is attached to. Used for Diagonal hints.

Type:

GSNode or GSHandle (e.g. when attached to intersections)

originIndex

The indexPath to the first node the hint is attached to.

Type:

NSIndexPath

targetIndex

The indexPath to the second node this hint is attached to. In the case of a ghost hint, this value will be empty.

Type:

NSIndexPath

otherIndex1

A indexPath to the third node this hint is attached to. Used for Interpolation or Diagonal hints.

Type:

NSIndexPath

otherIndex2

A indexPath to the fourth node this hint is attached to. Used for Diagonal hints.

Type:

NSIndexPath

type

See Hint Types

Type:

int

options

Stores extra options for the hint. For TT hints, that might be the rounding settings.

See Hint Option

For corner components, it stores the alingment settings: left = 0, center = 2, right = 1, auto (for caps) = alignment | 8

Type:

int

horizontal

True if hint is horizontal, False if vertical.

Type:

bool

selected

Selection state of hint in UI.

Type:

bool

# select hint
layer.hints[0].selected = True
# print(selection state)
print(layer.hints[0].selected)
name

Name of the hint. This is the referenced glyph for corner and cap components.

Type:

string

stem

Index of TrueType stem that this hint is attached to. The stems are defined in the custom parameter “TTFStems” per master.

For no stem, value is -1.

For automatic, value is -2.

Type:

int

isTrueType

if it is a TrueType instruction

Type:

bool

New in version 3.

isPostScript

if it is a PostScript hint

Type:

bool

New in version 3.

isCorner

if it is a Corner (or Cap, Brush…) component

Type:

bool

New in version 3.

tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. (If you need the data persistent, use hint.settings() (not documented, yet))

Type:

dict

# set value
hint.tempData['rememberToMakeCoffee'] = True
# delete value
del hint.tempData['rememberToMakeCoffee']

GSBackgroundImage

Implementation of background image.

For details on how to access it, please see GSLayer.backgroundImage

class GSBackgroundImage([path])
Parameters:

path – Initialize with an image file (optional)

Properties

path

image

crop

locked

position

scale

rotation

transform

alpha

Functions

resetCrop()

scaleWidthToEmUnits()

scaleHeightToEmUnits()

Properties

path

Path to image file.

Type:

str

image

NSImage object of background image, read-only (as in: not settable)

Type:

NSImage

crop

Crop rectangle. This is relative to the image size in pixels, not the font’s em units (just in case the image is scaled to something other than 100%).

Type:

NSRect

# change cropping
layer.backgroundImage.crop = NSRect(NSPoint(0, 0), NSPoint(1200, 1200))
locked

Defines whether image is locked for access in UI.

Type:

bool

alpha

Defines the transparence of the image in the Edit view. Default is 50%, possible values are 10–100.

To reset it to default, set it to anything other than the allowed values.

Type:

int

position

Position of image in font units.

Type:

NSPoint

# change position
layer.backgroundImage.position = NSPoint(50, 50)
scale

Scale factor of image.

A scale factor of 1.0 (100%) means that 1 font unit is equal to 1 point.

Set the scale factor for x and y scale simultaneously with an integer or a float value. For separate scale factors, please use a tuple.

Type:

tuple

# change scale
layer.backgroundImage.scale = 1.2 # changes x and y to 120%
layer.backgroundImage.scale = (1.1, 1.2) # changes x to 110% and y to 120%
rotation

Rotation angle of image.

Type:

float

transform

Transformation matrix.

Type:

NSAffineTransformStruct

# change transformation
layer.backgroundImage.transform = ((
    1.0, # x scale factor
    0.0, # x skew factor
    0.0, # y skew factor
    1.0, # y scale factor
    0.0, # x position
    0.0  # y position
))

Functions

resetCrop()

Resets the cropping to the image’s original dimensions.

scaleWidthToEmUnits()

Scale the image’s cropped width to a certain em unit value, retaining its aspect ratio.

# fit image in layer’s width
layer.backgroundImage.scaleWidthToEmUnits(layer.width)
scaleHeightToEmUnits()

Scale the image’s cropped height to a certain em unit value, retaining its aspect ratio.

# position image’s origin at descender line
layer.backgroundImage.position = NSPoint(0, font.masters[0].descender)
# scale image to UPM value
layer.backgroundImage.scaleHeightToEmUnits(font.upm)

GSGradient

Implementation of the gradient object.

class GSGradient

Properties

Properties

colors

A list of colors. Each is an list contaning a NSColor and and position between 0.0 and 1.0.

Type:

list

type

The gradient type. Linear = 0, Circular = 1

Type:

int

start

A NSPoint that relatively to the shapes bounding box defines the starting point of the gradient

Type:

NSPoint

end

A NSPoint that relatively to the shapes bounding box defines the ending point of the gradient

Type:

NSPoint

absoluteStart

A NSPoint of the absoltue starting point of the gradient

Type:

NSPoint

absoluteEnd

A NSPoint of the absoltue ending point of the gradient

Type:

NSPoint

GSEditViewController

Implementation of the GSEditViewController object, which represents Edit tabs in the UI.

For details on how to access them, please look at GSFont.tabs

class GSEditViewController

Properties

parent

text

layers

composedLayers

scale

viewPort

bounds

selectedLayerOrigin

textCursor

textRange

direction

features

previewInstances

previewHeight

bottomToolbarHeight

masterIndex

tempData

Functions

close()

saveToPDF()

redraw()

Properties

parent

The GSFont object that this tab belongs to.

Type:

GSFont

text

The text of the tab, either as text, or slash-escaped glyph names, or mixed. OpenType features will be applied after the text has been changed.

Type:

str

string = ""
for l in font.selectedLayers:
    string += "/"+l.parent.name
tab = font.tabs[-1]
tab.text = string
string

The plain underlying string of the tab

Type:

str

string = ""
for l in font.selectedLayers:
    char = font.characterForGlyph(l.parent)
    string += chr(char)
tab = font.tabs[-1]
tab.text = string

New in version 3.2.

masterIndex

The index of the active master (selected in the toolbar).

Type:

int

New in version 2.6.1.

layers

Alternatively, you can set (and read) a list of GSLayer objects. These can be any of the layers of a glyph.

Type:

list

layers = []
# display all layers of one glyph next to each other
for layer in font.glyphs['a'].layers:
    layers.append(layer)
# append line break
layers.append(GSControlLayer(10)) # 10 being the ASCII code of the new line character (\n)
font.tabs[0].layers = layers
composedLayers

Similar to the above, but this list contains the GSLayer objects after the OpenType features have been applied (see GSEditViewController.features). Read-only.

Deprecated. .layers behave like this now.

Type:

list

New in version 2.4.

scale

Scale (zoom factor) of the Edit view. Useful for drawing activity in plugins.

The scale changes with every zoom step of the Edit view. So if you want to draw objects (e.g. text, stroke thickness etc.) into the Edit view at a constant size relative to the UI (e.g. constant text size on screen), you need to calculate the object’s size relative to the scale factor. See example below.

Type:

float

print(font.currentTab.scale)
>> 0.414628537193
# Calculate text size
desiredTextSizeOnScreen = 10 #pt
scaleCorrectedTextSize = desiredTextSizeOnScreen / font.currentTab.scale
print(scaleCorrectedTextSize)
>> 24.1179733255
viewPort

The visible area of the Edit view in screen pixel coordinates (view coordinates).

The NSRect’s origin value describes the top-left corner (top-right for RTL, both at ascender height) of the combined glyphs’ bounding box (see bounds), which also serves as the origin of the view plane.

The NSRect’s size value describes the width and height of the visible area.

When using drawing methods such as the view-coordinate-relative method in the Reporter Plugin, use these coordinates.

Type:

NSRect

# The far corners of the Edit view:
# Lower left corner of the screen
x = font.currentTab.viewPort.origin.x
y = font.currentTab.viewPort.origin.y
# Top left corner of the screen
x = font.currentTab.viewPort.origin.x
y = font.currentTab.viewPort.origin.y + font.currentTab.viewPort.size.height
# Top right corner of the screen
x = font.currentTab.viewPort.origin.x + font.currentTab.viewPort.size.width
y = font.currentTab.viewPort.origin.y + font.currentTab.viewPort.size.height
# Bottom right corner of the screen
x = font.currentTab.viewPort.origin.x + font.currentTab.viewPort.size.width
y = font.currentTab.viewPort.origin.y
bounds

Bounding box of all glyphs in the Edit view in view coordinate values.

Type:

NSRect

selectedLayerOrigin

Position of the active layer’s origin (0,0) relative to the origin of the view plane (see bounds), in view coordinates.

Type:

NSPoint

textCursor

Position of text cursor in text, starting with 0.

Type:

integer

textRange

Amount of selected glyphs in text, starting at cursor position (see above).

Type:

integer

layersCursor

Position of cursor in the layers list, starting with 0.

See also

GSEditViewController.layers

Type:

integer

New in version 2.4.

direction

Writing direction.

See Writing Directions

Type:

integer

font.currentTab.direction = GSRTL
features

List of OpenType features applied to text in Edit view.

Type:

list

font.currentTab.features = ['locl', 'ss01']
tempData

A dictionary to store data temporarily. Use a unique key. This will not be saved to file. If you need the data persistent, use layer.userData

Type:

dict

# set value
layer.tempData['rememberToMakeCoffee'] = True
# delete value
del layer.tempData['rememberToMakeCoffee']
previewInstances

Instances to show in the Preview area.

Values are 'live' for the preview of the current content of the Edit view, 'all' for interpolations of all instances of the current glyph, or individual GSInstance objects.

Type:

string/GSInstance

# Live preview of Edit view
font.currentTab.previewInstances = 'live'
# Text of Edit view shown in particular Instance interpolation (last defined instance)
font.currentTab.previewInstances = font.instances[-1]
# All instances of interpolation
font.currentTab.previewInstances = 'all'
previewHeight

Height of the preview panel in the Edit view in pixels.

Needs to be set to 16 or higher for the preview panel to be visible at all. Will return 0 for a closed preview panel or the current size when visible.

Type:

float

bottomToolbarHeight

Height of the little toolbar at the very bottom of the window. Read-only.

Type:

float

New in version 2.4.

Functions

close()

Close this tab.

saveToPDF(path[, rect])

Save the view to a PDF file.

Parameters:

New in version 2.4.

redraw()

forces a update of the edit view

GSGlyphInfo

Implementation of the GSGlyphInfo object.

This contains valuable information from the glyph database. See GSGlyphsInfo for how to create these objects.

class GSGlyphInfo

Properties

name

productionName

category

subCategory

components

accents

anchors

unicode

unicode2

script

index

sortName

sortNameKeep

desc

altNames

direction

desc

Properties

name

Human-readable name of glyph (“nice name”).

Type:

str

productionName

Production name of glyph. Will return a value only if production name differs from nice name, otherwise None.

Type:

str

category

This is mostly from the UnicodeData.txt file from unicode.org. Some corrections have been made (Accents, …) e.g: “Letter”, “Number”, “Punctuation”, “Mark”, “Separator”, “Symbol”, “Other”

Type:

str

subCategory

This is mostly from the UnicodeData.txt file from unicode.org. Some corrections and additions have been made. e.g: “Nonspacing”, “Ligature”, “Decimal Digit”, …

Type:

str

case

e.g: GSUppercase, GSLowercase, GSSmallcaps

Type:

int

components

This glyph may be composed of the glyphs returned as a list of GSGlyphInfo objects.

Type:

list

accents

This glyph may be combined with these accents, returned as a list of glyph names.

Type:

list

anchors

Anchors defined for this glyph, as a list of anchor names.

Type:

list

unicode

Unicode value

Type:

str

unicode2

a second unicode value it present

Type:

str

script

Script of glyph, e.g: “latin”, “cyrillic”, “greek”.

Type:

str

index

Index of glyph in database. Used for sorting in UI.

Type:

str

sortName

Alternative name of glyph used for sorting in UI.

Type:

str

sortNameKeep

Alternative name of glyph used for sorting in UI, when using ‘Keep Alternates Next to Base Glyph’ from Font Info.

Type:

str

desc

Unicode description of glyph.

Type:

str

altNames

Alternative names for glyphs that are not used, but should be recognized (e.g., for conversion to nice names).

Type:

str

direction

Writing direction.

See Writing Directions

Type:

integer

glyph.direction = GSRTL

New in version 3.

GSFontInfoValueLocalized

The GSFontInfoValueLocalized

class GSFontInfoValueLocalized

Properties

key

values

defaultValue

Properties

key

the key

Type:

str

# searching for GSFontInfoValueLocalized with given "designers" key
for fontInfo in font.properties:
    if fontInfo.key == "designers":
        print(fontInfo)
values

A list of GSFontInfoValue objects.

Type:

list

# listing values of GSFontInfoValueLocalized
for fontInfoValue in fontInfoValueLocalized.values:
    print(fontInfoValue)
defaultValue

the value that is considered the default (either the dflt or English entry)

Type:

str

# prints the default value for given GSFontInfoValueLocalized instance
print(fontInfoValueLocalized.defaultValue)
# The print below will always return True, because
# font.designer represent the same value
fontInfoValueLocalized = None
for fontInfo in font.properties:
    if fontInfo.key == "designers":
        fontInfoValueLocalized = fontInfo
print(fontInfoValueLocalized.defaultValue == font.designer)

GSFontInfoValueSingle

The GSFontInfoValueSingle

class GSFontInfoValueSingle

Properties

key

value

Properties

key

the key

Type:

str

# GSFontInfoValueSingle is stored in e.g. font.properties
# one of the differences between GSFontInfoValueSingle and GSFontInfoValueLocalized
# is that the first doesn't have "values" attribute
for fontProperty in font.properties:
    if not hasattr(fontProperty, "values"):
        print(fontProperty.key)
value

The value

Type:

str

# GSFontInfoValueSingle is stored in e.g. font.properties
# one of the differences between GSFontInfoValueSingle and GSFontInfoValueLocalized
# is that the first doesn't have "values" attribute
for fontProperty in font.properties:
    if not hasattr(fontProperty, "values"):
        print(fontProperty.value)

GSFontInfoValue

The GSFontInfoValue

class GSFontInfoValue

Properties

key

value

languageTag

Properties

key

the key

Type:

str

# GSFontInfoValue is stored in e.g. values attribute of font.properties
for fontProperty in font.properties:
    # not all of font.properties contains this attribute
    # so we are going to look for those, that have it
    if hasattr(fontProperty, "values"):
        for fontInfoValue in fontProperty.values:
            # this line prints out the key attribute of
            # found GSFontInfoValue instance
            print(fontInfoValue.key)
value

The value

Type:

str

# GSFontInfoValue is stored in e.g. values attribute of font.properties
for fontProperty in font.properties:
    # not all of font.properties contains this attribute
    # so we are going to look for those, that have it
    if hasattr(fontProperty, "values"):
        for fontInfoValue in fontProperty.values:
            # this line prints out the value attribute of
            # found GSFontInfoValue instance
            print(fontInfoValue.value)
languageTag

The languageTag

Type:

str

# GSFontInfoValue is stored in e.g. values attribute of font.properties
for fontProperty in font.properties:
    # not all of font.properties contains this attribute
    # so we are going to look for those, that have it
    if hasattr(fontProperty, "values"):
        for fontInfoValue in fontProperty.values:
            # this line prints out the languageTag attribute of
            # found GSFontInfoValue instance
            print(fontInfoValue.languageTag)

GSMetricValue

The GSMetricValue objects represent vertical metrics values and theirs overshoots.

class GSMetricValue

Properties

position

overshoot

name

filter

metric

Properties

position

The y position of the metric.

Type:

float

overshoot

Value of overshoot’s width.

Type:

float

name

The name of the metric value. Eg. Descender, Small Cap, Cap Height etc.

Type:

str

filter

A filter to limit the scope of the metric.

Type:

NSPredicate

metric

Corresponding GSMetric object. see GSFont.metrics.

Type:

GSMetric

PreviewTextWindow

The Text Preview Window

class PreviewTextWindow

Properties

text

font

instanceIndex

fontSize

Functions

open()

close()

Properties

font

The font

Type:

GSFont

text

The text

Type:

str

instanceIndex

The index of the selected instance

Type:

int

fontSize

The font size

Type:

int

open()
opens the Preview Text Window
# open PreviewTextWindow
PreviewTextWindow.open()
# setting instance in PreviewTextWindow to "Regular"
font = PreviewTextWindow.font
instanceNames = [instance.name for instance in font.instances]
regularIndex = instanceNames.index("Regular")
PreviewTextWindow.instanceIndex = regularIndex
# setting text and font size value
PreviewTextWindow.text = 'hamburgefontsiv'
PreviewTextWindow.fontSize = 200
close()
closes the Preview Text Window

NSAffineTransform

The NSAffineTransform object.

class NSAffineTransform

Functions

shift

scale

rotate

skew

Properties

transformStruct

shift

shift by x, y

Type:

tuple or NSPoint

scale

if a single number, scale uniformly, otherwise scale by x, y if center is given, that is used as the origin of the scale

Type:

int/float or tuple

rotate

The angle of the rotation. In degree, positive angles are CCW if center is given, that is used as the origin of the rotation

Type:

int/float

skew

if a single number, skew in x-direction otherwise skew by x, y if center is given, that is used as the origin of the skew

Type:

int/float or tuple

matrix

The transformation matrix.

Type:

tuple

Methods

divideCurve()

distance()

addPoints()

subtractPoints()

scalePoint()

removeOverlap()

subtractPaths()

intersectPaths()

GetOpenFile()

GetSaveFile()

GetFolder()

Message()

LogToConsole()

LogError()

divideCurve(P0, P1, P2, P3, t)

Divides the curve using the De Casteljau’s algorithm.

Parameters:
  • P0 – The Start point of the Curve (NSPoint)

  • P1 – The first off curve point

  • P2 – The second off curve point

  • P3 – The End point of the Curve

  • t – The time parameter

Returns:

A list of points that represent two curves. (Q0, Q1, Q2, Q3, R1, R2, R3). Note that the ‘middle’ point is only returned once.

Return type:

list

distance(P0, P1)

calculates the distance between two NSPoints

Parameters:
  • P0 – a NSPoint

  • P1 – another NSPoint

Returns:

The distance

Return type:

float

addPoints(P1, P2)

Add the points.

Parameters:
  • P0 – a NSPoint

  • P1 – another NSPoint

Returns:

The sum of both points

Return type:

NSPoint

subtractPoints(P1, P2)

Subtracts the points.

Parameters:
  • P0 – a NSPoint

  • P1 – another NSPoint

Returns:

The subtracted point

Return type:

NSPoint

scalePoint(P, scalar)

Scaled a point.

Parameters:
  • P – a NSPoint

  • scalar – The multiplier

Returns:

The multiplied point

Return type:

NSPoint

removeOverlap(paths)

removes the overlaps from the list of paths

paths = [path1, path2, path3]
mergePaths = removeOverlap(paths)
Parameters:

paths – A list of paths

Returns:

The resulting list of paths

Return type:

list

subtractPaths(paths, subtract)

removes the overlaps from the list of paths

Parameters:
  • paths – a list of paths

  • subtract – the subtracting paths

Returns:

The resulting list of paths

Return type:

list

intersectPaths(paths, otherPaths)

removes the overlaps from the list of paths

Parameters:
  • paths – a list of paths

  • otherPaths – the other paths

Returns:

The resulting list of paths

Return type:

list

GetSaveFile(message=None, ProposedFileName=None, filetypes=None)

Opens a file chooser dialog.

Parameters:
  • message

  • filetypes

  • ProposedFileName

Returns:

The selected file or None

Return type:

unicode

GetOpenFile(message=None, allowsMultipleSelection=False, filetypes=None, path=None)

Opens a file chooser dialog.

Parameters:
  • message – A message string.

  • allowsMultipleSelection – Boolean, True if user can select more than one file

  • filetypes – list of strings indicating the filetypes, e.g., [“gif”, “pdf”]

  • path – The initial directory path

Returns:

The selected file or a list of file names or None

Return type:

unicode or list

GetFolder(message=None, allowsMultipleSelection=False, path=None)

Opens a folder chooser dialog.

Parameters:
  • message

  • allowsMultipleSelection

  • path

Returns:

The selected folder or None

Return type:

unicode

Message(message, title='Alert', OKButton=None)

Shows an alert panel.

Parameters:
  • message – the string

  • title – a title of the dialog

  • OKButton – the label of the confirmation button

AskString(message, value=None, title="Glyphs", OKButton=None, placeholder=None):

AskString Dialog

Parameters:
  • message – the string

  • value – a default value

  • title – a title of the dialog

  • OKButton – the label of the confirmation button

  • placeholder – a placeholder value that is displayed in gray when the text field is emtpy

Returns:

the string

Return type:

str

PickGlyphs(content=None, masterID=None, searchString=None, defaultsKey=None):

AskString Dialog

Parameters:
  • content – a list of glyphs from with to pick from (e.g. filter for corner components)

  • masterID – The master ID to use for the previews

  • searchString – to prepopulate the search

  • defaultsKey – The userdefaults to read and store the search key. Setting this will ignore the searchString

Returns:

the list of selected glyphs and

Return type:

tuple(list, str)

New in version 3.2.

LogToConsole(message)

Write a message to the Mac’s Console.app for debugging.

Parameters:

message (str) –

LogError(message)

Log an error message and write it to the Macro window’s output (in red).

Parameters:

message

Constants

Node Types

LINE

Line node.

CURVE

Curve node. Make sure that each curve node is preceded by two off-curve nodes.

QCURVE

Quadratic curve node. Make sure that each curve node is preceded by at least one off-curve node.

OFFCURVE

Off-curve node

Path attributes


FILL

fill

FILLCOLOR

fillColor

FILLPATTERNANGLE

fillPatternAngle

FILLPATTERNBLENDMODE

fillPatternBlendMode

FILLPATTERNFILE

fillPatternFile

FILLPATTERNOFFSET

fillPatternOffset

FILLPATTERNSCALE

fillPatternScale

STROKECOLOR

strokeColor

STROKELINECAPEND

lineCapEnd

STROKELINECAPSTART

lineCapStart

STROKELINEJOIN

lineJoin

STROKEPOSITION

strokePos

STROKEWIDTH

strokeWidth

STROKEHEIGHT

strokeHeight

GRADIENT

gradient

SHADOW

shadow

INNERSHADOW

shadowIn

MASK

mask

File Format Versions

A constant that is used when saving are reading .glyphs file but also for the clipboard.

GSFormatVersion1

The Format used by Glyphs 2

GSFormatVersion3

The Format used by Glyphs 3

GSFormatVersionCurrent

This will always return the format of the current app.

Export formats

OTF

Write CFF based font

TTF

Write CFF based font

VARIABLE

Write Variable font

UFO

Write UFO based font

WOFF

Write WOFF

WOFF2

Write WOFF

PLAIN

do not package as webfont

EOT

Write EOT

New in version 2.5.

Info Property Keys

GSPropertyNameFamilyNamesKey

Family Names

GSPropertyNameDesignersKey

Designers

GSPropertyNameDesignerURLKey

Designer URL

GSPropertyNameManufacturersKey

Manufacturers

GSPropertyNameManufacturerURLKey

Manufacturer URL

GSPropertyNameCopyrightsKey

Copyrights

GSPropertyNameVersionStringKey

Version String

GSPropertyNameVendorIDKey

VendorID

GSPropertyNameUniqueIDKey

UniqueID

GSPropertyNameLicensesKey

Licenses

GSPropertyNameLicenseURLKey

License URL

GSPropertyNameTrademarksKey

Trademarks

GSPropertyNameDescriptionsKey

Descriptions

GSPropertyNameSampleTextsKey

SampleTexts

GSPropertyNamePostscriptFullNamesKey

PostscriptFullNames

GSPropertyNamePostscriptFontNameKey

PostscriptFontName

GSPropertyNameCompatibleFullNamesKey

CompatibleFullNames

GSPropertyNameStyleNamesKey

StyleNames

GSPropertyNameStyleMapFamilyNamesKey

StyleMapFamilyNames

GSPropertyNameStyleMapStyleNamesKey

StyleMapStyleNames

GSPropertyNamePreferredFamilyNamesKey

PreferredFamilyNames

GSPropertyNamePreferredSubfamilyNamesKey

PreferredSubfamilyNames

GSPropertyNameVariableStyleNamesKey

VariableStyleNames

GSPropertyNameWWSFamilyNameKey

WWSFamilyName

GSPropertyNameWWSSubfamilyNameKey

WWSSubfamilyName

GSPropertyNameVariationsPostScriptNamePrefixKey

VariationsPostScriptNamePrefix

New in version 3.1.

Instance Types

INSTANCETYPESINGLE

single interpolation instance

INSTANCETYPEVARIABLE

variable font setting

New in version 3.0.1.

Hint Types

TOPGHOST

Top ghost for PS hints

STEM

Stem for PS hints

BOTTOMGHOST

Bottom ghost for PS hints

TTSNAP

Snap for TT hints

TTSTEM

Stem for TT hints

TTSHIFT

Shift for TT hints

TTINTERPOLATE

Interpolation for TT hints

TTDIAGONAL

Diagonal for TT hints

TTDELTA

Delta TT hints

CORNER

Corner Component

path = Layer.shapes[0]
brush = GSHint()
brush.name = "_corner.test"
brush.type = CORNER
brush.originNode = path.nodes[1]
Layer.hints.append(brush)
CAP

Cap Component

BRUSH

Brush Component

New in version 3.1.

SEGMENT

Segment Component

New in version 3.1.

Hint Option

This is only used for TrueType hints.

TTROUND

Round to grid

TTROUNDUP

Round up

TTROUNDDOWN

Round down

TTDONTROUND

Don’t round at all

TRIPLE = 128

Indicates a triple hint group. There need to be exactly three horizontal TTStem hints with this setting to take effect.

Callback Keys

This are the available callbacks

DRAWFOREGROUND

to draw in the foreground

DRAWBACKGROUND

to draw in the background

DRAWINACTIVE

draw inactive glyphs

DOCUMENTOPENED

is called if a new document is opened

DOCUMENTACTIVATED

is called when the document becomes the active document

DOCUMENTWASSAVED

is called when the document is saved. The document itself is passed in notification.object()

DOCUMENTEXPORTED

if a font is exported. This is called for every instance and notification.object() will contain the path to the final font file.

def exportCallback(info):
    try:
        print(info.object())
    except:
        # Error. Print exception.
        import traceback
        print(traceback.format_exc())
# add your function to the hook
Glyphs.addCallback(exportCallback, DOCUMENTEXPORTED)
DOCUMENTCLOSED

is called when the document is closed

Deprecated since version 3.0.4: please use DOCUMENTWILLCLOSE

DOCUMENTWILLCLOSE

is called just before a document will be closed

the info object contains the GSWindowController object

New in version 3.0.4.

DOCUMENTDIDCLOSE

is called after a document was closed

the info object contains the NSDocument object

New in version 3.0.4.

TABDIDOPEN

if a new tab is opened

TABWILLCLOSE

if a tab is closed

UPDATEINTERFACE

if some thing changed in the edit view. Maybe the selection or the glyph data.

MOUSEMOVED

is called if the mouse is moved. If you need to draw something, you need to call Glyphs.redraw() and also register to one of the drawing callbacks.

FILTER_FLAT_KERNING

is called when exporting a kern table

In a (general) plugin, implememt a method like this:

@objc.typedSelector(b'@@:@o^@')
def filterFlatKerning_error_(self, flattKerning, error):
        newKerning = list()
        for kern in flattKerning:
                name1 = kern[0]
                name2 = kern[1]
                if len(name1) > 1 and len(name2) > 1: # this is way oversiplified.
                        continue
                if abs(kern[2]) < 10: # ignore small pairs
                        continue
                newKerning.append(kern)
        return newKerning, None

Register the callback like this:

GSCallbackHandler.addCallback_forOperation_(self, FILTER_FLAT_KERNING) # self needs to be a subclass of NSObject (as all plugins are)

New in version 3.2.

Writing Directions

The writing directions of the Edit View.

GSBIDI

for characters that follow the main writing direction (like punctuation)

GSLTR

Left to Right (e.g. Latin)

GSRTL

Right to Left (e.g. Arabic, Hebrew)

GSVertical

Top to Bottom, Right to Left (e.g. Chinese, Japanese, Korean)

GSVerticalToRight

Top to Bottom, Left to Right (e.g. Mongolian)

Shape Type

GSShapeTypePath

Path

GSShapeTypeComponent

Component

Annotation types

TEXT
ARROW
CIRCLE
PLUS
MINUS

Inspector Sizes

GSInspectorSizeSmall
GSInspectorSizeRegular
GSInspectorSizeLarge
GSInspectorSizeXLarge

Metrics Types

metrics types are used in GSFont.metrics. see GSMetric.type

GSMetricsTypeUndefined
GSMetricsTypeAscender
GSMetricsTypeCapHeight
GSMetricsTypeSlantHeight
GSMetricsTypexHeight
GSMetricsTypeMidHeight
GSMetricsTypeBodyHeight
GSMetricsTypeDescender
GSMetricsTypeBaseline
GSMetricsTypeItalicAngle