[squeak-dev] Will Newspeak be callable by external programs?
askoh
askoh at askoh.com
Mon Feb 16 21:28:39 UTC 2009
The code below is how C# would call a VisualWorks Smalltalk COM server for
motion simulation. I would like C# to call a Squeak motion simulator in a
similar fashion. But any workable method would be good too.
I look forward to all suggestions. Squeak can benefit from having the
ability to make plugins.
All the best,
Aik-Siong Koh
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CADSM;
public partial class Form1 : Form
{
//Have Added reference to CADSM, under COM tab.
//CADSM is actually a tlb, which is registered in the Registry
//C# program now connects to VisualWorks Smalltalk COM server.
CADSMClass aCADSMClass = new CADSMClass();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Button Click will Trigger the Interaction between CADSM and
C# Code
//Initiate an Assy and assign name and gravity
CSMAssembly aAssembly = (CSMAssembly)aCADSMClass.AddAssembly();
aAssembly.Name = "Assembly1";
double[] aAGravity = {0.0, -9.81, 0.0};
aAssembly.Gravity = aAGravity;
//Add GlobalOriginMarker to Assy and set marker co-ordinates
//This is Global Origin Marker
CSMMarker aGlobalOriginMarker =
(CSMMarker)aAssembly.AddMarker();
aGlobalOriginMarker.Name = "GlobalOriginMarker";
double[] aGlobalOriginMarkerrFfF = { 0.0, 0.0, 0.0 };
aGlobalOriginMarker.rFfF = aGlobalOriginMarkerrFfF;
double[] aGlobalOriginMarkerEulerxyzFf = { 0.0, 0.0, 0.0 };
aGlobalOriginMarker.EulerxyzFf = aGlobalOriginMarkerEulerxyzFf;
//Initiate a Part and assign name, co-ordinates and Eulers
Parameters
CSMPart aPendulumBlock = (CSMPart)aAssembly.AddPart();
aPendulumBlock.Name = "PendulumBlock";
double[] aPendulumBlockrFfF = { 0.0, 0.0, 0.0 };
aPendulumBlock.rFfF = aPendulumBlockrFfF;
double[] aPendulumBlockEulerxyzFf = { 0.0, 0.0, 0.0 };
aPendulumBlock.EulerxyzFf = aPendulumBlockEulerxyzFf;
double[] aPendulumBlockvOfO = { 0.0, 0.0, 0.0 };
aPendulumBlock.vOfO = aPendulumBlockvOfO;
double[] aPendulumBlockOmeOfO = { 0.0, 0.0, 0.0 };
aPendulumBlock.OmeOfO = aPendulumBlockOmeOfO;
//Add MassMarker to PendulumBlock
CSMMassMarker aPendulumBlockMassMarker =
(CSMMassMarker)aPendulumBlock.AddMassMarker();
aPendulumBlockMassMarker.Name = "MassMarker";
double[] aPendulumBlockMassMarkerrFfF = { 0.5, 0.1, 0.0 };
aPendulumBlockMassMarker.rFfF = aPendulumBlockMassMarkerrFfF;
double[] aPendulumBlockMassMarkerEulerxyzFf = { 0.0, 0.0, 0.0 };
aPendulumBlockMassMarker.EulerxyzFf =
aPendulumBlockMassMarkerEulerxyzFf;
aPendulumBlockMassMarker.Mass = 10.0;
double[] aPendulumBlockMassMarkerPrincipalInertias = { 0.1, 0.2,
0.3 };
aPendulumBlockMassMarker.PrincipalInertias =
aPendulumBlockMassMarkerPrincipalInertias;
//Add JointMarker to PendulumBlock
CSMMarker aPendulumBlockJointMarker =
(CSMMarker)aPendulumBlock.AddMarker();
aPendulumBlockJointMarker.Name = "JointMarker";
double[] aPendulumBlockJointMarkerrFfF = { 0.1, 0.1, 0.0 };
aPendulumBlockJointMarker.rFfF = aPendulumBlockJointMarkerrFfF;
double[] aPendulumBlockJointMarkerEulerxyzFf = { 0.0, 0.0, 0.0
};
aPendulumBlockJointMarker.EulerxyzFf =
aPendulumBlockJointMarkerEulerxyzFf;
//Connect the part marker to the ground marker with a joint.
CSMCylindricalJoint aCylindricalJoint =
(CSMCylindricalJoint)aAssembly.AddCylindricalJoint();
aCylindricalJoint.MarkerI = aGlobalOriginMarker.FullName();
aCylindricalJoint.MarkerJ =
aPendulumBlockJointMarker.FullName();
//Add a Prescribed Rotational Motion to Joint
CSMRotationalMotion aMotion1 =
(CSMRotationalMotion)aCylindricalJoint.AddRotation();
aMotion1.Rotation = "2.0*pi*time";
//Setup Simulation parameters
CSMSimulation aSimulation =
(CSMSimulation)aAssembly.SimulationParameters();
aSimulation.Tstart = 0.0;
aSimulation.Tend = 1.0;
aSimulation.Hout = 0.1;
aSimulation.Hmin = 1.0e-9;
aSimulation.Hmax = 1.0;
aSimulation.ErrorTolerance = 1.0e-6;
aCADSMClass.StartDynamic();
//Now, CADSM will start its Dynamic Computations. We need to
check the frame and loop through
// the parts and get their Position details, frame by frame
//Since we have only one part in this example (PendulumBlock),
we just have to get
// Positional Values, frame by frame.
//Get Number of Frames from CADSM, this is the first data, we
get from CADSM to C#
int aNoOfFrames = aCADSMClass.NumberOfFrames();
//Create an Array to store output data in C#.
Array _AllFramesTransformArray = Array.CreateInstance(typeof(Array),
aNoOfFrames);
//Itereate through frames
short iFrame = 1;
while (iFrame <= aNoOfFrames)
{
if (aCADSMClass.CheckFrame(iFrame))
{
Array temp_frameArray = new double[28];
CSMPart current_part = aPendulumBlock ;
//This code gets
Position-Velocity-Acceleration data from CADSM
//This needs to be done to every
part and every frame..
temp_frameArray = (Array)current_part.Pos4by4VelAccData(iFrame);
//Set the Array Value to corresponding index
AllFramesTransformArray.SetValue(temp_frameArray,
iFrame-1);
iFrame++;
}
}
//Makes a cadsm .asm file for Debug purpose, This will
have all the markers and Motion/Forces etc..
aAssembly.DebugASM();
System.Windows.Forms.MessageBox.Show("DebugASM run");
}
}
--
View this message in context: http://www.nabble.com/Will-Newspeak-be-callable-by-external-programs--tp21896396p22046302.html
Sent from the Squeak - Dev mailing list archive at Nabble.com.
More information about the Squeak-dev
mailing list
|