我想将在visual-studio 2012中用c#编写的winform编译成一个dll,然后将其加载到matlab 2013a中。使用 matlab .net 接口,我想与 winform 交互,监听它的事件并通过一组预定义的公共方法传递数据。我正在使用 Windows 7 Ultimate SP2。
这工作得非常好,我能够与所有本机 Winform 工具、按钮、树、面板甚至图表进行交互。但是,我想使用 ILnumerics,尤其是用于显示包含所有奇妙事物的“场景”的 ILpanel。这是我撞到了砖墙,当它被编译为 dll 并被调用到 matlab 中时,IPanel 中没有任何东西被渲染。它只显示默认的椭圆形。
我可以在 Visual Studio 中将 matlab 作为一个进程附加并运行代码。这一切都执行得很好。看起来第 32 行的场景没有正确连接到 iLPanel1。
任何帮助,将不胜感激。
没有 form1.Designer.cs 的Form1.cs主要 c# 代码
using System;
using System.Windows.Forms;
using ILNumerics;
using ILNumerics.Drawing.Plotting;
using ILNumerics.Drawing;
using MarkerStyle = ILNumerics.Drawing.MarkerStyle;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void PlotData(double[,] myX)
{
var myDoubleVec = new double[myX.Length];
for (int i = 0; i < myX.Length; i++)
{
myDoubleVec[i] = myX[i, 0];
}
var scene = new ILScene();
ILArray<double> myNumX = myDoubleVec;
scene.Add(new ILPlotCube {
new ILLinePlot(ILMath.tosingle(myNumX.T),
markerStyle: MarkerStyle.Dot)
});
ilPanel1.Scene = scene;
}
private void ilPanel1_Load_1(object sender, EventArgs e)
{
var myDouble = new double[,] { { 2 }, { 4 }, {9 }, { 16 } }; ;
PlotData(myDouble);
}
public void PlotRandom()
{
double yValue = 50.0;
double yValue2 = 200.0;
if (chart1.Series["Series1"].Points.Count > 0)
{
yValue = chart1.Series["Series1"].Points[chart1.Series["Series1"].Points.Count - 1].YValues[0];
yValue2 = chart1.Series["Series2"].Points[chart1.Series["Series1"].Points.Count - 1].YValues[0];
}
Random random = new Random();
for (int pointIndex = 0; pointIndex < 50; pointIndex++)
{
yValue = yValue + (float)(random.NextDouble() * 10.0 - 5.0);
chart1.Series["Series1"].Points.AddY(yValue);
yValue2 = yValue2 + (float)(random.NextDouble() * 10.0 - 5.0);
chart1.Series["Series2"].Points.AddY(yValue2);
}
}
private void button1_Click(object sender, EventArgs e)
{
PlotRandom();
}
private void button2_Click(object sender, EventArgs e)
{
var myDouble = new double[,] { { 2 }, { 4 }, { 6 }, { 8 } }; ;
PlotData(myDouble);
}
}
}
生成的 winform 如下所示。
Matlab 代码加载程序集和操作表单。
NET.addAssembly('C:\Users\philliproso\Documents\Visual Studio 2012\Projects\WindowsFormsApplication3\WindowsFormsApplication3\bin\Debug\WindowsFormsApplication3.dll')
myForm=WindowsFormsApplication3.Form1;
myForm.Show;
myForm.plotRandom; %this call works fine
myForm.PlotData(rand(50,1)); %this call has no effect