Improve localized messages
[scilab.git] / scilab / modules / graphics / macros / surf.sci
index 6239658..ba0f828 100644 (file)
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 // you should have received as part of this distribution.  The terms
-// are also available at    
+// are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
 
 function surf(varargin)
 
-[lhs,rhs]=argn(0);
-
-if ~rhs
-       Z= [  0.0001    0.0013    0.0053   -0.0299   -0.1809   -0.2465   -0.1100   -0.0168   -0.0008   -0.0000; ..
-          0.0005    0.0089    0.0259   -0.3673   -1.8670   -2.4736   -1.0866   -0.1602   -0.0067    0.0000; ..
-          0.0004    0.0214    0.1739   -0.3147   -4.0919   -6.4101   -2.7589   -0.2779    0.0131    0.0020; ..
-         -0.0088   -0.0871    0.0364    1.8559    1.4995   -2.2171   -0.2729    0.8368    0.2016    0.0130; ..
-         -0.0308   -0.4313   -1.7334   -0.1148    3.0731    0.4444    2.6145    2.4410    0.4877    0.0301; ..
-         -0.0336   -0.4990   -2.3552   -2.1722    0.8856   -0.0531    2.6416    2.4064    0.4771    0.0294; ..
-         -0.0137   -0.1967   -0.8083    0.2289    3.3983    3.1955    2.4338    1.2129    0.2108    0.0125; ..
-         -0.0014   -0.0017    0.3189    2.7414    7.1622    7.1361    3.1242    0.6633    0.0674    0.0030; ..
-          0.0002    0.0104    0.1733    1.0852    2.6741    2.6725    1.1119    0.1973    0.0152    0.0005; ..
-          0.0000    0.0012    0.0183    0.1099    0.2684    0.2683    0.1107    0.0190    0.0014    0.0000];
-       f=gcf();
-       f.color_map = jetcolormap(64);
-       surf(Z,"edgeco","b","marker","d","markersiz",9,"markeredg","red","markerfac","k");
-       return;
-end
-
-X=[];
-Y=[];
-Z=[];
-C=[];
-
-CurColor = 0; // current color used if no color specified via LineSpec
-// nor PropertyName
-
-ListArg = varargin;
-
-//detect and set the current axes now:
-if type(ListArg(1)) == 9
-  hdle = ListArg(1);
-  if (hdle.type == "Axes")
-    sca(ListArg(1));
-    ListArg(1) = null(); // remove this parameter from the list
-  else
-    error(msprintf(gettext("%s: Wrong type for input argument #%d: An ''Axes'' handle expected.\n"), "surf", 1));
-    return;
-  end
-end
-
-
-nv = size(ListArg)
-
-
-T=[];
-d=[];
-
-typeOfPlot = 'surf';
-//given_data = 2;
-
-for k=1:nv
-  T(k,1) = type(ListArg(k))
-end
-
-given_data = 0;
-P1 = 0;
-
-for i=1:nv
-  if T(i) == 1
-    given_data = given_data +1;
-  else
-    P1 = i;  // Position of the first PropertyName field
-    break;
-  end
-end
-
-
-// delay the drawing commands
-// smart drawlater
-current_figure=gcf();
-cur_draw_mode = current_figure.immediate_drawing;
-current_figure.immediate_drawing = 'off';
-
-colormap_size = size(current_figure.color_map,1);
-
-if given_data == 1 //surf(Z) with Z giving us data + color info.
-  // ---------------------------------------------------------- //
-  
-  if or(size(ListArg(1))==1)
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input argument #%d: A matrix of size greater than %d-by-%d expected.\n"), "surf", 1,  2, 2));
-    return;
-  end
-  
-  X = 1:size(ListArg(1),2);
-  Y = 1:size(ListArg(1),1);
-  Z = ListArg(1)'; // here a transposition is needed
-  C = Z;
-  
-  [XX,YY,ZZ] = genfac3d(X,Y,Z);
-  CC = ZZ; // Add a color matrix based on Z values
-
-elseif given_data == 2 //surf(Z,COLOR)
-  // ---------------------------------------------------------- //
-  if or(size(ListArg(1))==1)
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input argument #%d: A matrix of size greater than %d-by-%d expected.\n"), "surf", 1,  2, 2));
-    return;
-  end
-  
-  if ((size(ListArg(1)) <> size(ListArg(2))) & (size(ListArg(1))-1 <> size(ListArg(2))))
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input argument #%d: A %d-by-%d or %d-by-%d matrix expected.\n"),..
-                      "surf", 2, size(ListArg(1),1), size(ListArg(1),2), size(ListArg(1),1) - 1, size(ListArg(1),2) -1 ));
-    return;
-  end
-  
-  X = 1:size(ListArg(1),2);
-  Y = 1:size(ListArg(1),1);
-  Z = ListArg(1)'; // here a transposition is needed
-  C = ListArg(2)';
-  
-  [XX,YY,ZZ] = genfac3d(X,Y,Z);
-  
-  if (size(ListArg(2)) == size(ListArg(1))) // color number == zdata number
-    [XX,YY,CC] = genfac3d(X,Y,C);     // CC must be a color matrix of size nf x n
-  elseif ((size(ListArg(2))) == size(ListArg(1))-1) // color number -1 == zdata number => ONLY flat mode can be enabled
-    Ctmp=[];
-    Ctmp = [C [C(:,$)]] ;
-    Ctmp = [Ctmp; Ctmp($,:)];
-    [XX,YY,CC] = genfac3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
-  end
-  
-elseif given_data == 3 //surf(X,Y,Z) with Z giving us data + color info.
-  // ---------------------------------------------------------- //
-  
-  X = ListArg(1)
-  Y = ListArg(2);
-  Z = ListArg(3);
-                 
-  // check if the call is OK
-  err = execstr('[XX,YY,ZZ,CC] = CreateFacetsFromXYZ(X,Y,Z,current_figure, cur_draw_mode)','errcatch','n');
-  
-  if (err <> 0) then
-    // reset data
-    processSurfError(current_figure, cur_draw_mode);
-  end
-  
-elseif given_data == 4 //surf(X,Y,Z,COLOR)
-  // ---------------------------------------------------------- //
-  if ((size(ListArg(3)) <> size(ListArg(4))) & (size(ListArg(3))-1 <> size(ListArg(4))))
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input argument #%d: A %d-by-%d or %d-by-%d matrix expected.\n"),..
-                      "surf", 4, size(ListArg(3),1), size(ListArg(3),2), size(ListArg(3),1) - 1, size(ListArg(3),2) -1 ));
-    return;
-  end
-  
-  X = ListArg(1)
-  Y = ListArg(2);
-  Z = ListArg(3);
-  C = ListArg(4);
-  
-  // check if the call is OK
-  err = execstr('[XX,YY,ZZ,CC] = CreateFacetsFromXYZColor(X,Y,Z,C,current_figure, cur_draw_mode)','errcatch','n');
-  if (err <> 0) then
-    // reset data
-    processSurfError(current_figure, cur_draw_mode);
-  end
-end
+    [lhs,rhs]=argn(0);
+
+    if ~rhs
+        Z= [  0.0001    0.0013    0.0053   -0.0299   -0.1809   -0.2465   -0.1100   -0.0168   -0.0008   -0.0000; ..
+        0.0005    0.0089    0.0259   -0.3673   -1.8670   -2.4736   -1.0866   -0.1602   -0.0067    0.0000; ..
+        0.0004    0.0214    0.1739   -0.3147   -4.0919   -6.4101   -2.7589   -0.2779    0.0131    0.0020; ..
+        -0.0088   -0.0871    0.0364    1.8559    1.4995   -2.2171   -0.2729    0.8368    0.2016    0.0130; ..
+        -0.0308   -0.4313   -1.7334   -0.1148    3.0731    0.4444    2.6145    2.4410    0.4877    0.0301; ..
+        -0.0336   -0.4990   -2.3552   -2.1722    0.8856   -0.0531    2.6416    2.4064    0.4771    0.0294; ..
+        -0.0137   -0.1967   -0.8083    0.2289    3.3983    3.1955    2.4338    1.2129    0.2108    0.0125; ..
+        -0.0014   -0.0017    0.3189    2.7414    7.1622    7.1361    3.1242    0.6633    0.0674    0.0030; ..
+        0.0002    0.0104    0.1733    1.0852    2.6741    2.6725    1.1119    0.1973    0.0152    0.0005; ..
+        0.0000    0.0012    0.0183    0.1099    0.2684    0.2683    0.1107    0.0190    0.0014    0.0000];
+        f=gcf();
+        f.color_map = jetcolormap(64);
+        surf(Z,"edgeco","b","marker","d","markersiz",9,"markeredg","red","markerfac","k");
+        return;
+    end
+
+    X=[];
+    Y=[];
+    Z=[];
+    C=[];
+
+    CurColor = 0; // current color used if no color specified via LineSpec
+    // nor PropertyName
+
+    ListArg = varargin;
+
+    //detect and set the current axes now:
+    if type(ListArg(1)) == 9
+        hdle = ListArg(1);
+        if (hdle.type == "Axes")
+            sca(ListArg(1));
+            ListArg(1) = null(); // remove this parameter from the list
+        else
+            error(msprintf(gettext("%s: Wrong type for input argument #%d: An ''Axes'' handle expected.\n"), "surf", 1));
+            return;
+        end
+    end
 
 
+    nv = size(ListArg)
 
 
-// P1 is the position of the first PropertyName field.
-Property = P1;
+    T=[];
+    d=[];
 
-while ((Property <> 0) & (Property <= nv-1))
-  PropertyName  = ListArg(Property);
-  PropertyValue = ListArg(Property+1);
-  
-  // Xdata
-  PName = getSurfPropertyName(PropertyName);
-  if (PName == 'xdata')
-    
-    if (type(PropertyValue)<>1)
-         ResetFigureDDM(current_figure, cur_draw_mode);
-         error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", 'xdata'));
-      return;
+    typeOfPlot = "surf";
+    //given_data = 2;
+
+    for k=1:nv
+        T(k,1) = type(ListArg(k))
     end
-    
-    X = PropertyValue;
-    [XX,tmp2,tmp3] = CreateFacetsFromXYZ(PropertyValue,Y,Z,current_figure, cur_draw_mode);
-        
-    // Ydata
-  elseif (PName == 'ydata')
-    
-    if (type(PropertyValue)<>1)
-         ResetFigureDDM(current_figure, cur_draw_mode);
-      error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", 'ydata'));
-      return;
+
+    given_data = 0;
+    P1 = 0;
+
+    for i=1:nv
+        if T(i) == 1
+            given_data = given_data +1;
+        else
+            P1 = i;  // Position of the first PropertyName field
+            break;
+        end
     end
-    
-    Y = PropertyValue;
-    [tmp1,YY,tmp3] = CreateFacetsFromXYZ(X,PropertyValue,Z,current_figure, cur_draw_mode);
-        
-    // Zdata
-  elseif (PName == 'zdata')
-    
-    if (type(PropertyValue)<>1) then
-         ResetFigureDDM(current_figure, cur_draw_mode);
-         error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", 'zdata'));
-      return;
-       end
-       if (or(size(PropertyValue)==1)) then
-         ResetFigureDDM(current_figure, cur_draw_mode);
-      error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A matrix of size greater than %d-by-%d expected.\n"), "surf", 'zdata',  2, 2));
-      return;
+
+
+    // delay the drawing commands
+    // smart drawlater
+    current_figure=gcf();
+    cur_draw_mode = current_figure.immediate_drawing;
+    current_figure.immediate_drawing = "off";
+
+    colormap_size = size(current_figure.color_map,1);
+
+    if given_data == 1 //surf(Z) with Z giving us data + color info.
+        // ---------------------------------------------------------- //
+
+        if or(size(ListArg(1))==1)
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument #%d: A matrix of size greater than %d-by-%d expected.\n"), "surf", 1,  2, 2));
+            return;
+        end
+
+        X = 1:size(ListArg(1),2);
+        Y = 1:size(ListArg(1),1);
+        Z = ListArg(1)'; // here a transposition is needed
+        C = Z;
+
+        [XX,YY,ZZ] = genfac3d(X,Y,Z);
+        CC = ZZ; // Add a color matrix based on Z values
+
+    elseif given_data == 2 //surf(Z,COLOR)
+        // ---------------------------------------------------------- //
+        if or(size(ListArg(1))==1)
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument #%d: A matrix of size greater than %d-by-%d expected.\n"), "surf", 1,  2, 2));
+            return;
+        end
+
+        if ((size(ListArg(1)) <> size(ListArg(2))) & (size(ListArg(1))-1 <> size(ListArg(2))))
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument #%d: A %d-by-%d or %d-by-%d matrix expected.\n"),..
+            "surf", 2, size(ListArg(1),1), size(ListArg(1),2), size(ListArg(1),1) - 1, size(ListArg(1),2) -1 ));
+            return;
+        end
+
+        X = 1:size(ListArg(1),2);
+        Y = 1:size(ListArg(1),1);
+        Z = ListArg(1)'; // here a transposition is needed
+        C = ListArg(2)';
+
+        [XX,YY,ZZ] = genfac3d(X,Y,Z);
+
+        if (size(ListArg(2)) == size(ListArg(1))) // color number == zdata number
+            [XX,YY,CC] = genfac3d(X,Y,C);     // CC must be a color matrix of size nf x n
+        elseif ((size(ListArg(2))) == size(ListArg(1))-1) // color number -1 == zdata number => ONLY flat mode can be enabled
+            Ctmp=[];
+            Ctmp = [C [C(:,$)]] ;
+            Ctmp = [Ctmp; Ctmp($,:)];
+            [XX,YY,CC] = genfac3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
+        end
+
+    elseif given_data == 3 //surf(X,Y,Z) with Z giving us data + color info.
+        // ---------------------------------------------------------- //
+
+        X = ListArg(1)
+        Y = ListArg(2);
+        Z = ListArg(3);
+
+        // check if the call is OK
+        err = execstr("[XX,YY,ZZ,CC] = CreateFacetsFromXYZ(X,Y,Z,current_figure, cur_draw_mode)","errcatch","n");
+
+        if (err <> 0) then
+            // reset data
+            processSurfError(current_figure, cur_draw_mode);
+        end
+
+    elseif given_data == 4 //surf(X,Y,Z,COLOR)
+        // ---------------------------------------------------------- //
+        if ((size(ListArg(3)) <> size(ListArg(4))) & (size(ListArg(3))-1 <> size(ListArg(4))))
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument #%d: A %d-by-%d or %d-by-%d matrix expected.\n"),..
+            "surf", 4, size(ListArg(3),1), size(ListArg(3),2), size(ListArg(3),1) - 1, size(ListArg(3),2) -1 ));
+            return;
+        end
+
+        X = ListArg(1)
+        Y = ListArg(2);
+        Z = ListArg(3);
+        C = ListArg(4);
+
+        // check if the call is OK
+        err = execstr("[XX,YY,ZZ,CC] = CreateFacetsFromXYZColor(X,Y,Z,C,current_figure, cur_draw_mode)","errcatch","n");
+        if (err <> 0) then
+            // reset data
+            processSurfError(current_figure, cur_draw_mode);
+        end
     end
-    
-    Z = PropertyValue;
-    [tmp1,tmp2,ZZ] = CreateFacetsFromXYZ(X,Y,PropertyValue,current_figure, cur_draw_mode);
-  
-  end
-  
-  Property = Property+2;
-end
 
 
 
 
+    // P1 is the position of the first PropertyName field.
+    Property = P1;
 
+    while ((Property <> 0) & (Property <= nv-1))
+        PropertyName  = ListArg(Property);
+        PropertyValue = ListArg(Property+1);
 
-// surf is made now !
-// with default option to simulate the Matlab mode
+        // Xdata
+        PName = getSurfPropertyName(PropertyName);
+        if (PName == "xdata")
 
-err = execstr('plot3d(XX,YY,list(ZZ,CC))','errcatch','n');
+            if (type(PropertyValue)<>1)
+                ResetFigureDDM(current_figure, cur_draw_mode);
+                error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", "xdata"));
+                return;
+            end
 
-if err <> 0
-   processSurfError(current_figure, cur_draw_mode);
-end
+            X = PropertyValue;
+            [XX,tmp2,tmp3] = CreateFacetsFromXYZ(PropertyValue,Y,Z,current_figure, cur_draw_mode);
 
-a=gca();
-a.cube_scaling = 'on';
-a.rotation_angles = [51 -125];
-e=gce();
-e.hiddencolor=0; // to avoid painting the hidden facets
-e.color_flag=4; // Matlab special flat mode by default (different from mode 2)
-e.cdata_mapping = 'scaled'
+            // Ydata
+        elseif (PName == "ydata")
 
+            if (type(PropertyValue)<>1)
+                ResetFigureDDM(current_figure, cur_draw_mode);
+                error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", "ydata"));
+                return;
+            end
 
+            Y = PropertyValue;
+            [tmp1,YY,tmp3] = CreateFacetsFromXYZ(X,PropertyValue,Z,current_figure, cur_draw_mode);
 
+            // Zdata
+        elseif (PName == "zdata")
 
+            if (type(PropertyValue)<>1) then
+                ResetFigureDDM(current_figure, cur_draw_mode);
+                error(msprintf(gettext("%s: Wrong type for input argument ''%s'': A Real matrix expected.\n"), "surf", "zdata"));
+                return;
+            end
+            if (or(size(PropertyValue)==1)) then
+                ResetFigureDDM(current_figure, cur_draw_mode);
+                error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A matrix of size greater than %d-by-%d expected.\n"), "surf", "zdata",  2, 2));
+                return;
+            end
 
+            Z = PropertyValue;
+            [tmp1,tmp2,ZZ] = CreateFacetsFromXYZ(X,Y,PropertyValue,current_figure, cur_draw_mode);
 
+        end
 
+        Property = Property+2;
+    end
 
-// F.Leray
-// Today: 17.03.05
-// XYZ-DataMode under Matlab seems really bugged (see following samples and read Matlab doc.):
-//
-// surf(X,Y,Z,'XDataMode','auto')
-// surf(X,Y,Z,'XDataMode','auto')
-// surf(X+20,Y,Z,'XDataMode','auto')
-// surf(X+20,Y,Z,'XDataMode','man')
-// surf(X+20,Y,Z,'XDataMode','auto')
-// surf(X+20,Y,Z,'Xdata',X-100,'XDataMode','auto')
-// surf(X+20,Y,Z,'Xdata',X-100,'XDataMode','man')
-// surf(X+20,Y,Z,'XData',X-100,'XDataMode','auto')
-// surf(X+20,Y,Z,'XData',X-100,'XDataMode','man')
-// surf(Z,'XData',X-100,'XDataMode','man')
-// surf(Z,'XData',X-100,'XDataMode','auto')
-// surf(X+20,Y,Z,'XDataMode','man')
-// surf(X+20,Y,Z,'XDataMode','auto')
-// 
-// That is why I do not support those properties.
-// Below and in comment is the code we could add to treat those properties.
-// by giving  XYZ-DataModeVal to setSurfProperty (to better treat XYZ-Data input).
-//
-//
-//XdataModeVal=1;
-//YdataModeVal=1;
-//ZdataModeVal=1;
-//
-//if Property <> 0
-//  XdataMode = getIndexInStringTable('xdatam',ListArg([Property nv]))
-//  if XdataMode <> []
-//    XdataModeVal = getIndexInStringTable(ListArg(XdataMode+1),['auto','manual'])
-//    if size(XdataModeVal,'*') <> 1
-//      disp("Error: Bad XdataMode selected");
-//      return;
-//    end
-//  end  
-//  
-//  YdataMode = getIndexInStringTable('ydatam',ListArg([Property nv]))
-//  if YdataMode <> []
-//    YdataModeVal = getIndexInStringTable(ListArg(YdataMode+1),['auto','manual'])
-//    if size(YdataModeVal,'*') <> 1
-//      disp("Error: Bad YdataMode selected");
-//      return;
-//    end
-//  end 
-//  
-//  ZdataMode = getIndexInStringTable('zdatam',ListArg([Property nv]))
-//  if ZdataMode <> []
-//    ZdataModeVal = getIndexInStringTable(ListArg(ZdataMode+1),['auto','manual'])
-//    if size(ZdataModeVal,'*') <> 1
-//      disp("Error: Bad ZdataMode selected");
-//      return;
-//   end
-//  end
-//end
-//
 
 
-///////////////////////////////////
-//Global Property treatment      //
-//PropertyName and PropertyValue //
-///////////////////////////////////
 
 
-// P1 is the position of the first PropertyName field.
-Property = P1;
 
-current_surface = gce(); // get the newly created fac3d
-current_surface.mark_size_unit='point';
+    // surf is made now !
+    // with default option to simulate the Matlab mode
 
+    err = execstr("plot3d(XX,YY,list(ZZ,CC))","errcatch","n");
 
+    if err <> 0
+        processSurfError(current_figure, cur_draw_mode);
+    end
 
-while ((Property <> 0) & (Property <= nv-1))
-  setSurfProperty(ListArg(Property),ListArg(Property+1),current_surface,X,Y,Z,C,current_figure,cur_draw_mode)
-  
-  Property = Property+2;
-end
+    a=gca();
+    a.cube_scaling = "on";
+    a.rotation_angles = [51 -125];
+    e=gce();
+    e.hiddencolor=0; // to avoid painting the hidden facets
+    e.color_flag=4; // Matlab special flat mode by default (different from mode 2)
+    e.cdata_mapping = "scaled"
+
+
+
+
+
+
+
+
+    // F.Leray
+    // Today: 17.03.05
+    // XYZ-DataMode under Matlab seems really bugged (see following samples and read Matlab doc.):
+    //
+    // surf(X,Y,Z,'XDataMode','auto')
+    // surf(X,Y,Z,'XDataMode','auto')
+    // surf(X+20,Y,Z,'XDataMode','auto')
+    // surf(X+20,Y,Z,'XDataMode','man')
+    // surf(X+20,Y,Z,'XDataMode','auto')
+    // surf(X+20,Y,Z,'Xdata',X-100,'XDataMode','auto')
+    // surf(X+20,Y,Z,'Xdata',X-100,'XDataMode','man')
+    // surf(X+20,Y,Z,'XData',X-100,'XDataMode','auto')
+    // surf(X+20,Y,Z,'XData',X-100,'XDataMode','man')
+    // surf(Z,'XData',X-100,'XDataMode','man')
+    // surf(Z,'XData',X-100,'XDataMode','auto')
+    // surf(X+20,Y,Z,'XDataMode','man')
+    // surf(X+20,Y,Z,'XDataMode','auto')
+    //
+    // That is why I do not support those properties.
+    // Below and in comment is the code we could add to treat those properties.
+    // by giving  XYZ-DataModeVal to setSurfProperty (to better treat XYZ-Data input).
+    //
+    //
+    //XdataModeVal=1;
+    //YdataModeVal=1;
+    //ZdataModeVal=1;
+    //
+    //if Property <> 0
+    //  XdataMode = getIndexInStringTable('xdatam',ListArg([Property nv]))
+    //  if XdataMode <> []
+    //    XdataModeVal = getIndexInStringTable(ListArg(XdataMode+1),['auto','manual'])
+    //    if size(XdataModeVal,'*') <> 1
+    //      disp("Error: Bad XdataMode selected");
+    //      return;
+    //    end
+    //  end
+    //
+    //  YdataMode = getIndexInStringTable('ydatam',ListArg([Property nv]))
+    //  if YdataMode <> []
+    //    YdataModeVal = getIndexInStringTable(ListArg(YdataMode+1),['auto','manual'])
+    //    if size(YdataModeVal,'*') <> 1
+    //      disp("Error: Bad YdataMode selected");
+    //      return;
+    //    end
+    //  end
+    //
+    //  ZdataMode = getIndexInStringTable('zdatam',ListArg([Property nv]))
+    //  if ZdataMode <> []
+    //    ZdataModeVal = getIndexInStringTable(ListArg(ZdataMode+1),['auto','manual'])
+    //    if size(ZdataModeVal,'*') <> 1
+    //      disp("Error: Bad ZdataMode selected");
+    //      return;
+    //   end
+    //  end
+    //end
+    //
+
+
+    ///////////////////////////////////
+    //Global Property treatment      //
+    //PropertyName and PropertyValue //
+    ///////////////////////////////////
+
+
+    // P1 is the position of the first PropertyName field.
+    Property = P1;
+
+    current_surface = gce(); // get the newly created fac3d
+    current_surface.mark_size_unit="point";
+
+
+
+    while ((Property <> 0) & (Property <= nv-1))
+        setSurfProperty(ListArg(Property),ListArg(Property+1),current_surface,X,Y,Z,C,current_figure,cur_draw_mode)
+
+        Property = Property+2;
+    end
 
 
-//postponed drawings are done now !
-// smart drawnow
-ResetFigureDDM(current_figure, cur_draw_mode);
+    //postponed drawings are done now !
+    // smart drawnow
+    ResetFigureDDM(current_figure, cur_draw_mode);
 
 endfunction
 
@@ -357,15 +357,15 @@ endfunction
 //else
 //  C = ones(C) * (NCOLMIN+NCOLMAX)/2;
 //end
-//endfunction 
+//endfunction
 //
 //
 
 
 function k=getIndexInStringTable(pattern,table)
 
-str =  convstr(pattern);
-k=find(part(table,1:length(str))==str);
+    str =  convstr(pattern);
+    k=find(part(table,1:length(str))==str);
 
 endfunction
 
@@ -378,113 +378,113 @@ endfunction
 
 function [XX,YY,ZZ,CC] = CreateFacetsFromXYZ(X,Y,Z,current_figure, cur_draw_mode)
 
-if or(size(X)==1) & or(size(Y)==1) // X and Y are vector
-    
-  tmp = X;
-  X = Y;
-  Y = tmp;
-  
-  if size(X,'*') ~= size(Z,1) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'Y', size(Z,1)));
-    return;
-  end
-  
-  if size(Y,'*') ~= size(Z,2) then
-       ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'X', size(Z,2)));
-    return;
-  end 
-
-  [XX,YY,ZZ] = genfac3d(Y,X,Z');
-
-  // COLOR treatment
-  CC = ZZ;
-  
-elseif and(size(X)>1) & and(size(Y)>1) // X and Y are matrix
-  
-  if or(size(X) ~= size(Y)) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Y'));
-    return;
-  end
-  
-  if or(size(X) ~= size(Z)) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Z'));
-    return;
-  end 
-  
-  [XX,YY,ZZ] = nf3d(X,Y,Z);
-  
-  // COLOR treatment
-  CC = ZZ;
-  
-elseif or(size(X)==1) & and(size(Y)>1) // X is a vector and Y is a matrix
-  
-  if size(X,'*') ~= size(Z,2) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'X', size(Z,2)));
-    return;
-  end
-  
-  if or(size(Y) ~= size(Z)) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'Y', 'Z'));
-    return;
-  end 
-  
-  // X vector
-  // Y matrix
-  // Z matrix
-  
-  X=X(:)'; // X is forced to be a row vector
-  XMAT=[];
-  
-  for i=1:size(Z,2)
-    XMAT=[XMAT;X];
-  end
-  
-  [XX,YY,ZZ] = nf3d(XMAT,Y,Z);
-  
-  // COLOR treatment
-  CC = ZZ;
-  
-elseif or(size(Y)==1) & and(size(X)>1) // Y is a vector and X is a matrix
-  
-  if or(size(X) ~= size(Z)) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Z'));
-    return;
-  end 
-  
-  if size(Y,'*') ~= size(Z,2) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'Y', size(Z,2)));
-    return;
-  end
-  
-  // Y vector
-  // X matrix
-  // Z matrix
-  
-  Y=Y(:); // Y is forced to be a column vector
-  YMAT=[];
-  
-  for i=1:size(Z,1)
-    YMAT=[YMAT,Y];
-  end
-  
-  [XX,YY,ZZ] = nf3d(X,YMAT,Z);
-  
-  // COLOR treatment
-  CC = ZZ;
-  
-else
-  ResetFigureDDM(current_figure, cur_draw_mode);
-  error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Same size expected.\n"), "surf", 'X', 'Y'));
-  return;
-end
+    if or(size(X)==1) & or(size(Y)==1) // X and Y are vector
+
+        tmp = X;
+        X = Y;
+        Y = tmp;
+
+        if size(X,"*") ~= size(Z,1) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "Y", size(Z,1)));
+            return;
+        end
+
+        if size(Y,"*") ~= size(Z,2) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "X", size(Z,2)));
+            return;
+        end
+
+        [XX,YY,ZZ] = genfac3d(Y,X,Z');
+
+        // COLOR treatment
+        CC = ZZ;
+
+    elseif and(size(X)>1) & and(size(Y)>1) // X and Y are matrix
+
+        if or(size(X) ~= size(Y)) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Y"));
+            return;
+        end
+
+        if or(size(X) ~= size(Z)) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Z"));
+            return;
+        end
+
+        [XX,YY,ZZ] = nf3d(X,Y,Z);
+
+        // COLOR treatment
+        CC = ZZ;
+
+    elseif or(size(X)==1) & and(size(Y)>1) // X is a vector and Y is a matrix
+
+        if size(X,"*") ~= size(Z,2) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "X", size(Z,2)));
+            return;
+        end
+
+        if or(size(Y) ~= size(Z)) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "Y", "Z"));
+            return;
+        end
+
+        // X vector
+        // Y matrix
+        // Z matrix
+
+        X=X(:)'; // X is forced to be a row vector
+        XMAT=[];
+
+        for i=1:size(Z,2)
+            XMAT=[XMAT;X];
+        end
+
+        [XX,YY,ZZ] = nf3d(XMAT,Y,Z);
+
+        // COLOR treatment
+        CC = ZZ;
+
+    elseif or(size(Y)==1) & and(size(X)>1) // Y is a vector and X is a matrix
+
+        if or(size(X) ~= size(Z)) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Z"));
+            return;
+        end
+
+        if size(Y,"*") ~= size(Z,2) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "Y", size(Z,2)));
+            return;
+        end
+
+        // Y vector
+        // X matrix
+        // Z matrix
+
+        Y=Y(:); // Y is forced to be a column vector
+        YMAT=[];
+
+        for i=1:size(Z,1)
+            YMAT=[YMAT,Y];
+        end
+
+        [XX,YY,ZZ] = nf3d(X,YMAT,Z);
+
+        // COLOR treatment
+        CC = ZZ;
+
+    else
+        ResetFigureDDM(current_figure, cur_draw_mode);
+        error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Same size expected.\n"), "surf", "X", "Y"));
+        return;
+    end
 
 endfunction
 
@@ -494,143 +494,143 @@ endfunction
 
 function [XX,YY,ZZ,CC] = CreateFacetsFromXYZColor(X,Y,Z,C,current_figure, cur_draw_mode)
 
-if or(size(X)==1) & or(size(Y)==1) // X and Y are vector
-  
-  Z = Z'; // here a transposition is needed
-  C = C'; // here a transposition is needed
-  
-  if size(X,'*') ~= size(Z,1) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'X', size(Z,1)));
-    return;
-  end
-  
-  if size(Y,'*') ~= size(Z,2) then
-       ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'Y', size(Z,2)));
-    return;
-  end
-  
-  [XX,YY,ZZ] = genfac3d(X,Y,Z);
-  
-  // COLOR treatment
-  if (size(C) == size(Z)) // color number == zdata number
-    [XX,YY,CC] = genfac3d(X,Y,C);     // CC must be a color matrix of size nf x n
-  elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
-    Ctmp=[];
-    Ctmp = [C [C(:,$)]] ;
-    Ctmp = [Ctmp; Ctmp($,:)];
-    [XX,YY,CC] = genfac3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
-  end
-  
-elseif and(size(X)>1) & and(size(Y)>1) // X and Y are matrices
-  
-  if or(size(X) ~= size(Y)) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Y'));
-    return;
-  end
-  
-  if or(size(X) ~= size(Z)) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Z'));
-    return;
-  end 
-  
-  [XX,YY,ZZ] = nf3d(X,Y,Z);
-  
-  // COLOR treatment
-  if (size(C) == size(Z)) // color number == zdata number
-    [XX,YY,CC] = nf3d(X,Y,C);     // CC must be a color matrix of size nf x n
-  elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
-    Ctmp=[];
-    Ctmp = [C [C(:,$)]] ;
-    Ctmp = [Ctmp; Ctmp($,:)];
-    [XX,YY,CC] = nf3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
-  end
-  
-elseif or(size(X)==1) & and(size(Y)>1) // X is a vector and Y is a matrix
-  
-  if size(X,'*') ~= size(Z,2) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'X', size(Z,2)));
-    return;
-  end
-  
-  if or(size(Y) ~= size(Z)) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'Y', 'Z'));
-    return;
-  end 
-  
-  // X vector
-  // Y matrix
-  // Z matrix
-  
-  X=X(:)'; // X is forced to be a row vector
-  XMAT=[];
-  
-  for i=1:size(Z,2)
-    XMAT=[XMAT;X];
-  end
-
-  
-  
-  [XX,YY,ZZ] = nf3d(XMAT,Y,Z);
-  
-  // COLOR treatment
-  if (size(C) == size(Z)) // color number == zdata number
-    [XX,YY,CC] = nf3d(XMAT,Y,C);     // CC must be a color matrix of size nf x n
-  elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
-    Ctmp=[];
-    Ctmp = [C [C(:,$)]] ;
-    Ctmp = [Ctmp; Ctmp($,:)];
-    [XX,YY,CC] = nf3d(XMAT,Y,Ctmp);     // CC must be a color matrix of size nf x n
-  end
-  
-elseif or(size(Y)==1) & and(size(X)>1) // Y is a vector and X is a matrix
-  
-  if or(size(X) ~= size(Z)) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Z'));
-    return;
-  end 
-  
-  if size(Y,'*') ~= size(Z,2) then
-    ResetFigureDDM(current_figure, cur_draw_mode);
-    error(msprintf(gettext("%s: Wrong size for input arguments ''%s'': A vector of size %d expected.\n"), "surf", 'Y', size(Z,2)));
-    return;
-  end
-  
-  
-  // Y vector
-  // X matrix
-  // Z matrix
-  
-  Y=Y(:); // Y is forced to be a column vector
-  YMAT=[];
-  
-  for i=1:size(Z,1)
-    YMAT=[YMAT,Y];
-  end
-  
-  [XX,YY,ZZ] = nf3d(X,YMAT,Z);
-  
-  // COLOR treatment
-  if (size(C) == size(Z)) // color number == zdata number
-    [XX,YY,CC] = nf3d(X,YMAT,C);     // CC must be a color matrix of size nf x n
-  elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
-    Ctmp=[];
-    Ctmp = [C [C(:,$)]] ;
-    Ctmp = [Ctmp; Ctmp($,:)];
-    [XX,YY,CC] = nf3d(X,YMAT,Ctmp);     // CC must be a color matrix of size nf x n
-  end
-  
-else
-  ResetFigureDDM(current_figure, cur_draw_mode);
-  error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", 'X', 'Y'));
-  return;
-end
+    if or(size(X)==1) & or(size(Y)==1) // X and Y are vector
+
+        Z = Z'; // here a transposition is needed
+        C = C'; // here a transposition is needed
+
+        if size(X,"*") ~= size(Z,1) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "X", size(Z,1)));
+            return;
+        end
+
+        if size(Y,"*") ~= size(Z,2) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "Y", size(Z,2)));
+            return;
+        end
+
+        [XX,YY,ZZ] = genfac3d(X,Y,Z);
+
+        // COLOR treatment
+        if (size(C) == size(Z)) // color number == zdata number
+            [XX,YY,CC] = genfac3d(X,Y,C);     // CC must be a color matrix of size nf x n
+        elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
+            Ctmp=[];
+            Ctmp = [C [C(:,$)]] ;
+            Ctmp = [Ctmp; Ctmp($,:)];
+            [XX,YY,CC] = genfac3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
+        end
+
+    elseif and(size(X)>1) & and(size(Y)>1) // X and Y are matrices
+
+        if or(size(X) ~= size(Y)) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Y"));
+            return;
+        end
+
+        if or(size(X) ~= size(Z)) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Z"));
+            return;
+        end
+
+        [XX,YY,ZZ] = nf3d(X,Y,Z);
+
+        // COLOR treatment
+        if (size(C) == size(Z)) // color number == zdata number
+            [XX,YY,CC] = nf3d(X,Y,C);     // CC must be a color matrix of size nf x n
+        elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
+            Ctmp=[];
+            Ctmp = [C [C(:,$)]] ;
+            Ctmp = [Ctmp; Ctmp($,:)];
+            [XX,YY,CC] = nf3d(X,Y,Ctmp);     // CC must be a color matrix of size nf x n
+        end
+
+    elseif or(size(X)==1) & and(size(Y)>1) // X is a vector and Y is a matrix
+
+        if size(X,"*") ~= size(Z,2) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "X", size(Z,2)));
+            return;
+        end
+
+        if or(size(Y) ~= size(Z)) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "Y", "Z"));
+            return;
+        end
+
+        // X vector
+        // Y matrix
+        // Z matrix
+
+        X=X(:)'; // X is forced to be a row vector
+        XMAT=[];
+
+        for i=1:size(Z,2)
+            XMAT=[XMAT;X];
+        end
+
+
+
+        [XX,YY,ZZ] = nf3d(XMAT,Y,Z);
+
+        // COLOR treatment
+        if (size(C) == size(Z)) // color number == zdata number
+            [XX,YY,CC] = nf3d(XMAT,Y,C);     // CC must be a color matrix of size nf x n
+        elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
+            Ctmp=[];
+            Ctmp = [C [C(:,$)]] ;
+            Ctmp = [Ctmp; Ctmp($,:)];
+            [XX,YY,CC] = nf3d(XMAT,Y,Ctmp);     // CC must be a color matrix of size nf x n
+        end
+
+    elseif or(size(Y)==1) & and(size(X)>1) // Y is a vector and X is a matrix
+
+        if or(size(X) ~= size(Z)) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Z"));
+            return;
+        end
+
+        if size(Y,"*") ~= size(Z,2) then
+            ResetFigureDDM(current_figure, cur_draw_mode);
+            error(msprintf(gettext("%s: Wrong size for input argument ''%s'': A vector of size %d expected.\n"), "surf", "Y", size(Z,2)));
+            return;
+        end
+
+
+        // Y vector
+        // X matrix
+        // Z matrix
+
+        Y=Y(:); // Y is forced to be a column vector
+        YMAT=[];
+
+        for i=1:size(Z,1)
+            YMAT=[YMAT,Y];
+        end
+
+        [XX,YY,ZZ] = nf3d(X,YMAT,Z);
+
+        // COLOR treatment
+        if (size(C) == size(Z)) // color number == zdata number
+            [XX,YY,CC] = nf3d(X,YMAT,C);     // CC must be a color matrix of size nf x n
+        elseif (size(C) == size(Z)-1) // color number -1 == zdata number => ONLY flat mode can be enabled
+            Ctmp=[];
+            Ctmp = [C [C(:,$)]] ;
+            Ctmp = [Ctmp; Ctmp($,:)];
+            [XX,YY,CC] = nf3d(X,YMAT,Ctmp);     // CC must be a color matrix of size nf x n
+        end
+
+    else
+        ResetFigureDDM(current_figure, cur_draw_mode);
+        error(msprintf(gettext("%s: Wrong size for input arguments ''%s'' and ''%s'': Matrices of same size expected.\n"), "surf", "X", "Y"));
+        return;
+    end
 
 endfunction
 
@@ -638,20 +638,20 @@ endfunction
 // If an error occurs in the surf code, we need to catch it
 // order to reset some default values
 function processSurfError(cur_figure, cur_draw_mode)
-  // reset data
+    // reset data
     ResetFigureDDM(current_figure, cur_draw_mode);
 
     // get the error
     [err_message, err_number, err_line, err_func] = lasterror(%t);
-               
-       // rethrow it
-       
-       // for now error can only have a single string as input.
-       // If there are several lines we need to concatane them.
-       err_message_nbLines = size(err_message, '*');
-       if (err_message_nbLines > 1) then
-         // put a \n betwee, each string
-         err_message(1) = strcat(err_message, "\n");
-       end
-       error(err_message(1), err_number);
+
+    // rethrow it
+
+    // for now error can only have a single string as input.
+    // If there are several lines we need to concatane them.
+    err_message_nbLines = size(err_message, "*");
+    if (err_message_nbLines > 1) then
+        // put a \n betwee, each string
+        err_message(1) = strcat(err_message, "\n");
+    end
+    error(err_message(1), err_number);
 endfunction