example to call scilab from C#
[scilab.git] / scilab / modules / call_scilab / examples / call_scilab / c# / dotnetsci / dotnetsci / Scilab.cs
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Allan CORNET
4  * 
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at    
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 //=============================================================================
13 using System;
14 using System.Collections.Generic;
15 using System.Linq;
16 using System.Text;
17 using System.Runtime.InteropServices;
18 //=============================================================================
19 namespace DotNetScilab
20 {
21     public class Scilab
22     {
23         //=============================================================================
24         private const string CALL_SCILAB_DLL = "call_scilab.dll";
25         private const string LIBSCILAB_DLL = "libscilab.dll";
26         //private bool initialized = false;
27         //=============================================================================
28         /// <summary>
29         /// Constructor, initialize scilab engine.
30         /// </summary>
31         public Scilab()
32         {
33             // start Scilab engine
34             StartScilab(null, null, null);
35             // Disable TCL/TK and Java graphic interfaces
36             DisableInteractiveMode();
37         }
38         //=============================================================================
39         /// <summary>
40         /// Terminate Scilab engine.
41         /// </summary>
42         /// <returns>1 if it is correctly finished</returns>
43         public int finish()
44         {
45             int ierr = TerminateScilab(null);
46             return ierr;
47         }
48         //=============================================================================
49         /// <summary>
50         /// Send a job to scilab
51         /// </summary>
52         /// <param name="command">command to send to scilab</param>
53         /// <returns>error code operation, 0 : OK</returns>
54         public int sendScilabJob(string command)
55         {
56             return SendScilabJob(command);
57         }
58         //=============================================================================
59         /// <summary>
60         /// Write a named matrix of double in Scilab
61         /// </summary>
62         /// <param name="matrixName"> variable name</param>
63         /// <param name="iRows"> Number of row</param>
64         /// <param name="iCols"> Number of column</param>
65         /// <param name="matrixDouble"> pointer on data</param>
66         /// <returns> if the operation successes (0) or not ( !0 )</returns>
67         public int setNamedMatrixOfDouble(string matrixName, int iRows, int iCols, double[] matrixDouble)
68         {
69             return createNamedMatrixOfDouble(matrixName, iRows, iCols, matrixDouble);
70         }
71         //=============================================================================
72         /// <summary>
73         /// Read a named matrix of double from Scilab
74         /// </summary>
75         /// <param name="matrixName"> variable name</param>
76         /// <returns>a matrix of double from scilab. If Variable name does not exist returns null</returns>
77         public unsafe double[] getNamedMatrixOfDouble(string matrixName)
78         {
79             int iRows = 0;
80             int iCols = 0;
81
82             double[] matrixDouble = new double[0];
83             // first , we want to known dimensions iRows and iCols
84             readNamedMatrixOfDouble(matrixName, &iRows , &iCols, matrixDouble);
85             // we allocate matrixDouble array
86             if (iRows * iCols > 0)
87             {
88                 matrixDouble = new double[iRows * iCols];
89
90                 // get values in matrixDouble
91                 readNamedMatrixOfDouble(matrixName, &iRows, &iCols, matrixDouble);
92
93                 return matrixDouble;
94             }
95             return null;
96         }
97         //=============================================================================
98         /// <summary>
99         /// Get dimensions of a named matrix of double in scilab
100         /// </summary>
101         /// <returns>a int array. if variable name does not exist dimensions are 0 0 </returns>
102         public unsafe int[] getNamedMatrixOfDoubleDimensions(string matrixName)
103         {
104             int iRows = 0;
105             int iCols = 0;
106             int[] iDim = new int[2];
107
108             double[] matrixDouble = new double[0];
109             readNamedMatrixOfDouble(matrixName, &iRows, &iCols, matrixDouble);
110
111             iDim[0] = iRows;
112             iDim[1] = iCols;
113
114             return iDim;
115         }
116         //=============================================================================
117         /// <summary>
118         /// Write a named matrix of string in scilab
119         /// </summary>
120         /// <param name="matrixName"> variable name</param>
121         /// <param name="iRows"> Number of row</param>
122         /// <param name="iCols"> Number of column</param>
123         /// <param name="matrixDouble"> pointer on data</param>
124         /// <returns> if the operation successes (0) or not ( !0 )</returns>
125         public int setNamedMatrixOfString(string matrixName, int iRows, int iCols, string[] matrixString)
126         {
127             return createNamedMatrixOfString(matrixName, iRows, iCols, matrixString);
128         }
129         //=============================================================================
130         /// <summary>
131         /// Read a named matrix of string from scilab
132         /// </summary>
133         /// <param name="matrixName"> variable name</param>
134         /// <returns>a matrix of string from scilab. If Variable name does not exist returns null</returns>
135         public unsafe string[] getNamedMatrixOfString(string matrixName)
136         {
137             int iRows = 0;
138             int iCols = 0;
139
140             // first , we want to known dimensions iRows and iCols
141             readNamedMatrixOfString(matrixName, &iRows, &iCols, null, null);
142
143             // we allocate lengthmatrixString
144             int[] lengthmatrixString = new int[iRows * iCols];
145             // we get length of strings
146             readNamedMatrixOfString(matrixName, &iRows, &iCols, lengthmatrixString, null);
147
148             // we allocate each string
149             string[] matrixString = new string[iRows * iCols];
150             for (int i = 0; i < iRows * iCols; i++)
151             {
152                 matrixString[i] = new string(' ',lengthmatrixString[i]);
153             }
154             // we get strings from scilab
155             readNamedMatrixOfString(matrixName, &iRows, &iCols, lengthmatrixString, matrixString);
156
157             return matrixString;
158         }
159         //=============================================================================
160         /// <summary>
161         /// Get dimensions of a named matrix of string in scilab
162         /// </summary>
163         /// <returns>a int array. if variable name does not exist dimensions are 0 0 </returns>
164         public unsafe int[] getNamedMatrixOfStringDimensions(string matrixName)
165         {
166             int iRows = 0;
167             int iCols = 0;
168             int[] iDim = new int[2];
169
170             readNamedMatrixOfString(matrixName, &iRows, &iCols, null, null);
171
172             iDim[0] = iRows;
173             iDim[1] = iCols;
174
175             return iDim;
176         }
177         //=============================================================================
178         /// <summary>
179         /// import SendScilabJob from C (see CallScilab.h)
180         /// </summary>
181         [DllImport(CALL_SCILAB_DLL, CharSet = CharSet.Ansi)]
182         private static extern int SendScilabJob([In]String job);
183         //=============================================================================
184         /// <summary>
185         /// import StartScilab from C (see CallScilab.h)
186         /// </summary>
187         [DllImport(CALL_SCILAB_DLL, CharSet = CharSet.Ansi)]
188         private static extern int StartScilab([In] String SCIpath,
189                                               [In] String ScilabStartup,
190                                               [In] Int32[] Stacksize);
191         //=============================================================================
192         /// <summary>
193         /// import TerminateScilab from C (see CallScilab.h)
194         /// </summary>
195         [DllImport(CALL_SCILAB_DLL, CharSet = CharSet.Ansi)]
196         private static extern int TerminateScilab([In] String ScilabQuit);
197         //=============================================================================
198         /// <summary>
199         /// import DisableInteractiveMode from C (see CallScilab.h)
200         /// </summary>
201         [DllImport(CALL_SCILAB_DLL, CharSet = CharSet.Ansi)]
202         private static extern void DisableInteractiveMode();
203         //=============================================================================
204         /// <summary>
205         /// import createNamedMatrixOfString from C (see api_string.h)
206         /// </summary>
207         [DllImport(LIBSCILAB_DLL, CharSet = CharSet.Ansi)]
208         private static extern int createNamedMatrixOfString([In] String _pstName,
209                                                             [In] int _iRows, [In] int _iCols,
210                                                             [In] String[] _pstStrings);
211         //=============================================================================
212         /// <summary>
213         /// import createNamedMatrixOfDouble from C (see api_double.h)
214         /// </summary>
215         [DllImport(LIBSCILAB_DLL, CharSet = CharSet.Ansi)]
216         private static extern int createNamedMatrixOfDouble([In] String _pstName,
217                                                             [In] int _iRows, [In] int _iCols,
218                                                             [In] double[] _pdblReal);
219         //=============================================================================
220         /// <summary>
221         /// import readNamedMatrixOfString from C (see api_string.h)
222         /// </summary>
223         [DllImport(LIBSCILAB_DLL, CharSet = CharSet.Ansi)]
224         private unsafe static extern int readNamedMatrixOfString([In] String _pstName,
225                                                           [Out]  Int32* _piRows, [Out]  Int32* _piCols,
226                                                           [In, Out] int[] _piLength,
227                                                           [In, Out] String[] _pstStrings);
228         //=============================================================================
229         /// <summary>
230         /// import readNamedMatrixOfDouble from C (see api_double.h)
231         /// </summary>
232         [DllImport(LIBSCILAB_DLL, CharSet = CharSet.Ansi)]
233         private unsafe static extern int readNamedMatrixOfDouble([In] String _pstName,
234                                                           [Out] Int32* _piRows, [Out] Int32* _piCols,
235                                                           [In, Out] Double[] _pdblReal);
236         //=============================================================================
237     }
238 }
239 //=============================================================================