Decorating the RF objects!



  • Hi, I wanted to add a method to the glyph object every time on startup. Like decorating the Glyph class for example I could do this:

    g = CurrentGlyph()
    g.myCustomMethod()
    >>> "Hello!"
    

    Is this possible?
    Thanks ( ͡° ͜ʖ ͡°)


  • admin

    hello @bahman,

    yes, this is possible and super useful. here’s an example:

    # my custom method
    def drawRect(self, x, y, w, h):
        pen = self.getPen()
        pen.moveTo((x, y))
        pen.lineTo((x + w, y))
        pen.lineTo((x + w, y + h))
        pen.lineTo((x, y + h))
        pen.closePath()
    
    # do this once at startup
    from mojo.roboFont import RGlyph
    RGlyph.rect = drawRect
    
    # then use the custom method anywhere
    g = CurrentGlyph()
    g.rect(0, 100, 200, 300)
    g.rect(50, 400, 200, 300)
    

    cheers!



  • Ow so simple! I thought if I do that it wouldn't affect all the objects. Thank you!


  • admin

    If you add a method to the class all instances of the class will have that new method!

    the beauty of python!



  • @frederik Yeah that is very powerful. I have another related question. let's say I want my custom method to be executed every time an object changes. I don't want to add a defcon notification but rather override a method and use the super on an internal method of glyph object, then execute my own method. I looked at defcon but it seemed that it's only possible by overriding _set_dirty, but not sure if that's the right way. What do you think?


Log in to reply