I'm using C# to pass data to Mathematica and return graphs:
MathKernel k = new MathKernel();
k.CaptureGraphics = true;
k.GraphicsFormat = "JPEG";
k.Compute("Show[Graphics[{Thick, Blue, Circle[{#, 0}] & /@ Range[4], Black, Dashed, Line[{{0, 0}, {5, 0}}]}]]");
pictureBox1.Image = k.Graphics[0];
This works until I need to use a package. I'm seeing the raw data is returned instead of an image:
StringBuilder command = new StringBuilder();
command.Append("fakedata01 = With[{n = DayCount[{2008, 01, 01}, {2011, 3, 27}]}, Transpose[{Array[DatePlus[{2008, 01, 01}, #] &, n, 0], #}] & /@ (100. + (Accumulate /@ RandomVariate[NormalDistribution[0, 1], {8, n}]))];");
command.Append("Dimensions[%];");
command.Append("XYZLineGraph[fakedata01, Title -> \"Banks\\[CloseCurlyQuote] Share Prices\", Subtitle -> \"1 January 2008 = 100\", ScaleUnits -> \"Index\", DateLabelFormat -> \"Quarter1\", PartialLastYear -> 2.95/12, Footnotes -> {{\"*\", \"MSCI financials index\"}}, Sourcenotes -> {\"Bloomberg\"}, SpecialGridValues -> 100, PlotStyle -> {Red, XYZDarkBlue, XYZPink, XYZMauve, XYZPaleOrange, XYZTurquoise, Green, Gray}, Epilog -> {Red, Arrow[{{{2009, 3}, 30}, {{2009, 8}, 48}}], Text[\"Label\", {{2009, 3}, 25}]}]");
MathKernel k = new MathKernel();
k.CaptureGraphics = true;
k.GraphicsFormat = "JPEG";
k.Compute("Get[\"XYZ`XYZGraphs`\"];");
k.Compute("Get[\"XYZ`XYZUtilities`\"]");
k.Compute("Show[" + command.ToString() + "]");
pictureBox1.Image = k.Graphics[0];
The error is:
Get::noopen: Cannot open XYZXYZGraphs
.
I have installed the Packages in Mathematica so on startup they are available. When I run the command in Mathematica it gives me the expected output.
Does anyone know how to load the packages so they are available via a .NET call?
These two lines dont work:
k.Compute("Get[\"XYZ`XYZGraphs`\"];");
k.Compute("Get[\"XYZ`XYZUtilities`\"]");
I've also tried the following and it has the same problem:
k.Compute("Get[\"XYZ`XYZGraphs`\"];Get[\"XYZ`XYZUtilities`\"];Show[" + command.ToString() + "]");
I've already seen these threads but they are in Mathematica not in C#: https://stackoverflow.com/questions/8385317/load-a-mathematica-package-from-within-a-package https://stackoverflow.com/questions/5567980/building-application-packages-with-multple-packages-and-references-in-mathematic
Edit:
I have managed to overcome the error: Get::noopen: Cannot open XYZ`XYZGraphs
by not issuing the Get
, but maybe I do need to get the packages and that's why I'm getting this next error.
I'm getting the result back as data, not -Graphics-, how do I force it to show?
Edit 2:
Providing the keyword Graphics
I got a result but its got an error, any ideas how I fix it?
Edit 3:
Sorry to make you dizzy by going in full circles, but now I'm pretty sure I DO have to specify the Packages like so:
k.Compute("Get[\"XYZ`XYZGraphs`\"];Get[\"XYZ`XYZUtilities`\"];Show[Graphics[" + command.ToString() + "]]");
And when I do this I get the error again:
Get::noopen: Cannot open XYZ`XYZGraphs`.
Get::noopen: Cannot open XYZ`XYZUtilities`.
Edit 4:
I'm stumped why they cannot be opened. I took a ProcMon trace and it shows the packages are found and read successfully:
Edit 5:
I've discovered loading the packages via .Net has errors:
Does this mean before even trying to Get
the package that I will need to load them in? Or does this error mean the package is already available to the MathKernel?
$Path
from within Mathematica and from within C# (but in Mathematica) give you? Are they the same? It looks like your mathlink kernel's path is bare and all you might need to do is to add the appropriate path in C#. $\endgroup$