I am planning to do a blog series on extending Alteryx and various options that are provided to do this (but it takes me ages to write a post!). As part of learning some of the tricks for this I have been working on a set of Formula Addins (xml based)) and Custom DotNet Tools. I will post a lot more details later, but felt worth opening up the development work more publicly.
At the moment, the formula add ins are centred around Date functions and a few random others. Take a look at the GitHub repository here: https://github.com/jdunkerley/AlteryxFormulaAddOns
I was pleased when I got the HexBins functions working in there as well. Formula is disgusting but I took the d3 implementation and created a function which reproduces it, and produces the same results as the Tableau functions.
Custom DotNet Tools:
The custom tools are just starting off but I think is a nice approach. The GitHub repo for this project is here: https://github.com/jdunkerley/AlteryxAddIns
It uses a lot of reflection to hide most of the boiler plate code needed. This means it is less flexible than the base API (for example, no support for union style inputs yet) but hopefully it will make it quicker and easier to create simple tools.
The BaseTool class handles the Plugin implementation. It takes a configuration type and an engine type. It follows the same rules as the BaseEngine class to work out Incoming and Outgoing connections. As a cheat, the WinForms PropertyGrid is used to create a simple GUI for configuring the tool. The standard XmlSerialiser is called on the configuration type to allows saving back into and reading from the workflow.
The BaseEngine class handles most of the work interfacing with Alteryx Engine, only requiring the configuration type and an implementation of PI_PushAllRecords. Outputs connections are just properties on the derived engine class of type PluginOutputConnectionHelper, using attributes to label and order them. Likewise Input connections are just IIncomingConnectionInterface properties, using the same attributes to label and order them.
At the moment, I haven’t finished the Incoming connection work, this will be built up next and hopefully then this project can be used to allow people to understand how to build up custom tools and expose the fantastic API to more people.