Over on the Forum of Sho drobertson asked how to create a Contour Chart from C# within a form. I thought that would make good example code, so here it is:
using System;using System.Collections.Generic;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using ShoNS.Visualization;using ShoNS.Array;using ShoNS.MathFunc;namespace testForm{ // Create a composite visualization by deriving from System.Windows.Forms.Form public class testForm : Form { private ShoChart ch; // this will hold a Sho contour chart private Button button1; // a button to update the contour chart private Label label1; // a label to show how many times the button has been clicked private int num; // a counter public testForm() { num = 0; InitializeComponent(); } // code to generate (slightly random) data and create a contour chart from it // this method shows examples of calling into the Sho math libraries and the Sho viz libraries private ShoChart GenChart() { // first, create a range object that spans from 0 to pi, with 100 elements DoubleRange b = new DoubleRange(0.0, Math.PI); b.Count = 100; // now, create a row vector and fill it with random numbers DoubleArray x = new DoubleArray(1, 100); ArrayRandom.FillRandom<double>(x); // shift and scale the random numbers, and add sin(b) to it, to make a noisy sinusoid x = (x-0.5) * 0.1 + ArrayMath.Sin(b); // analogously, we'll make a noisy cosine row vector, 100 long DoubleArray y = new DoubleArray(1, 100); ArrayRandom.FillRandom<double>(y); y = (y-0.5) * 0.1 + ArrayMath.Cos(b); // now, make a matrix from the outer product of x and y. DoubleArray arr = x.T * y; // from the matrix, create a contour plot. Second argument says automatically choose the contours ShoChart ch = new ShoContourChart(arr, null); // all of the Sho viz classes inherit from control, so we can set WinForms control parameters // to size the contour plot and place it within the parent form. ch.AutoSize = true; ch.Location = new Point(25, 75); ch.Name = "ContourChart"; ch.Size = new Size(375, 225); return ch; } // a button click will create a new contour chart with slightly randomized data private void buttonClick(object sender, EventArgs e) { SuspendLayout(); // take the old contour plot out of the form Controls.Remove(ch); // generate a new one, and put it into the form ch = GenChart(); Controls.Add(ch); // increment the label label1.Text = num.ToString(); num++; // relayout and refresh the form ResumeLayout(false); PerformLayout(); Refresh(); } private void InitializeComponent() { // code derived from form wizard: create a button and label button1 = new Button(); label1 = new Label(); SuspendLayout(); // position and parameterize the button button1.Location = new Point(175, 50); button1.Name = "button1"; button1.Size = new Size(100, 20); button1.TabIndex = 0; button1.Text = "click me"; button1.UseVisualStyleBackColor = true; button1.Click += new EventHandler(buttonClick); // hook up button click handler // position and parameterize the label label1.AutoSize = true; label1.Location = new Point(215, 25); label1.Name = "label1"; label1.Size = new Size(50, 20); label1.Text = num.ToString(); label1.TextAlign = ContentAlignment.MiddleCenter; num++; // create a new contour plot ch = GenChart(); AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; ClientSize = new System.Drawing.Size(425, 325); Controls.Add(label1); Controls.Add(button1); Controls.Add(ch); Name = "Form1"; Text = "Example showing ShoChart embedded in WinForm using C#"; // layout the controls: now we're ready to start the message pump ResumeLayout(false); PerformLayout(); } }}
From inside of Sho, you can test this by dynamically loading the dll, and running the form in its own thread (made easy with ShoThread):
>>> load('testForm.dll')<Assembly testForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...>>>> from testForm import *>>> t = ShoThread(lambda : System.Windows.Forms.Application.Run(testForm()))>>> t.Start()