Answer to the last part of your question, aka call/passing parameters to RenderPlugin from another plugin (mechanism below however I guess can easily be extended to cover ExecuteAddInPlugin scenario).
Let's take one of our case as exemple: our Ribbon plugin allows the user to select rendering options that are used by our RenderPlugin.
To minimize data exchange between plugins, both share a reference to an instance of our RendererOptions class that contains dozens of structures and parameters.
Since the RenderPlugin use this for each render, in theory there is (ALMOST) nothing to do. When the RibbonPlugin change any parameter in RendererOptions instance, the RendererPlugin will use this at the next render.
I said ALMOST, because we need to tell Navisworks that a redraw is needed, so your RenderPlugin will be called and do its stuff.
This done with:
Application.ActiveDocument.ActiveView.RequestDelayedRedraw(ViewRedrawRequests.All);
Note: this queue a redraw request which is 99% of the time what you want (I can elaborate of the 1% case if needed).
Important/Additional Comments:
- to be exhaustive, you could have case where changing some parameters requires to recompute some cached CPU-intensive stuff. Best is to do this in your Ribbon to keep the Rendering fast and responsible.
- in theory you should use a shared lock or equivalent between both Plugin when doing such stuff. In practice, if you change these settings on a ribbon event, it seems it's not needed, Navisworks being, in the past and in the foreseeable future, mostly single-threaded.