Package: ufoProcessor
ufoProcessorPython package based on thedesignSpaceDocumentfromfontTools.designspaceLib) specifically toprocessandgenerateinstances for UFO files, glyphs and other data.Collect source materialsProvide mutators for specific glyphs, font info, kerning so that other tools can generate partial instances. Either fromMutatorMathorfonttools varlib.model.Support designspace format 4 with layers.Apply avar-like designspace bendingApply rulesGenerate actual UFO instances in formats 2 and 3.Round geometry as requestedTry to stay up to date with fontToolsBaseclass for tools that need access to designspace data.UsageThe easiest way to use ufoProcessor is to callbuild(designspacePath)documentPath: path to the designspace file.outputUFOFormatVersion: integer, 2, 3. Format for generated UFOs. Note: can be different from source UFO format.roundGeometry: bool, if the geometry needs to be rounded to whole integers. This affects glyphs, metrics, kerning, select font info.processRules: bool, when generating UFOs, execute designspace rules as swaps.logger: optional logger object.documentPath:               filepath to the .designspace documentoutputUFOFormatVersion:     ufo format for output, default is the current, so 3.useVarlib:                  True if you want the geometry to be generated withvarLib.modelinstead ofmutatorMath.ExamplesGenerate all the instances (using the varlib model, no rounding):importufoProcessormyPath="myDesignspace.designspace"ufoProcessor.build(myPath)Generate all the instances (using the varlib model, but round all the geometry to integers):importufoProcessormyPath="myDesignspace.designspace"ufoProcessor.build(myPath,roundGeometry=True)Generate all the instances (using the mutatormath model, no rounding):importufoProcessormyPath="myDesignspace.designspace"ufoProcessor.build(myPath,useVarlib=False)Generate an instance for one glyph,"A"atwidth=100, weight=200. (assuming the designspace has those axes and the masters have that glyph)importufoProcessormyPath="myDesignspace.designspace"doc=ufoProcessor.DesignSpaceProcessor()doc.read(myPath)doc.loadFonts()glyphMutator=doc.getGlyphMutator("A")instance=glyphMutator.makeInstance(Location(width=100,weight=200)Depending on the setting forusevarlib, theglyphMutatorobject returned bygetGlyphMutatorin the example above can either be aMutatorMath.Mutator, or aVariationModelMutatorobject. That uses thefontTools.varLib.models.VariationModelbut it is wrapped and can be called as a Mutator object to generate instances. This wayDesignSpaceProcessordoes not need to know much about which math model it is using.Convert Superpolator to designspaceThe ufoProcessor.sp3 module has some tools for interpreting Superpolator .sp3 documents. Not all data is migrated. But the important geometry is there. Given that Superpolator can read designspace files, there is hopefully no real need for a writer. Note that this conversion is lossy.AxisdimensionsnametagSourceufo pathfamilyname, stylenamemute state (stored in lib)locationInstanceufo pathfamilyname, stylenamestylemap nameslocationRulesSimple Rulesare wrapped in a conditionset.most of the really old Superpolator rules can't be converted. Only rules with<or>operators are used.Some Superpolator user prefsPreview textWhich axes used vertically and horizontallyUsage# convert sp3 file to designspace# first make a new designspace doc objectdoc=DesignSpaceDocument()# feed it to the readerreader=SuperpolatorReader(sp3path,doc)reader.read()# now you can work with it, even save itdoc.write(designspacePath)Indeed that last example comes from this convenience function:sp3_to_designspace(sp3path, designspacePath=None)If designspacePath = None, sp3_to_designspace will use the same path for the output, but replace the.sp3with.designspaceextension. If the file exists it will overwrite.NotesGlyph-specific masters in instances are ignored.Instance notes are ignored.Designspace geometry requires the default master to be on the default value of each axis. Superpolator handled that differently, it would find the default dynamically. So it is possible that converted designspaces need some work in terms of the basic structure. That can't be handled automatically.