%kPlot3D '3D Plot Object Menuform'
% This MatLab function was automatically generated by a converter (KhorosToMatLab) from the Khoros Plot3D.pane file
%
% Parameters: 
% MultiChoice: plot3DXOrientation 'X Orientation', default: 1: 'x orientation'
%    Choices are:
%   1: 'Width'
%   2: 'Height'
%   3: 'Depth'
%   4: 'Time'
%   5: 'Elements'
% MultiChoice: plot3DYOrientation 'Y Orientation', default: 2: 'y orientation'
%    Choices are:
%   1: 'Width'
%   2: 'Height'
%   3: 'Depth'
%   4: 'Time'
%   5: 'Elements'
% Integer: plot3DWidthOffset 'Width Offset', default: 0: 'width offset'
% Integer: plot3DHeightOffset 'Height Offset', default: 0: 'height offset'
% Integer: plot3DDepthOffset 'Depth Offset', default: 0: 'depth offset'
% Integer: plot3DTimeOffset 'Time Offset', default: 0: 'time offset'
% Integer: plot3DElementsOffset 'Elements Offset', default: 0: 'elements offset'
%
% Example: kPlot3D( {'plot3DXOrientation',1;'plot3DYOrientation',2;'plot3DWidthOffset',0;'plot3DHeightOffset',0;'plot3DDepthOffset',0;'plot3DTimeOffset',0;'plot3DElementsOffset',0})
%
% Khoros helpfile follows below:
% 
% The 3D plot object supports the display of a 3D plot.
% .begin tagged
% .item "Plot Type"
% This list selection lets you set the plot type that is used by the
% 3D plot object.  Choices include: "Line Plot," "Wireframe," "Mesh," 
% "Horizon," "Scatter," "Impulse," "Contour 3D," "Contour 2D,"  or 
% "Constant Shade.
% .item "Line Type"
% There are seven line types available: "Solid," "Dotted," "Dot Dash," 
% "Short Dash," "Long Dash," "Odd Dash," and "Grid Dotted."  The line type
% is not used with scatter plots or shaded plots.
% .item "Marker Type"
% This attribute only applies to plots that use a marker, ie, scatter plots.
% There is a wide variety of marker types that may be used with scatter plots.
% .item "Surface Shade Type"
% This attribute only applies to the constant shade plot type.
% It specifies what part of the data is to dictate the shading.  
% "Imagery" specifies that shading is to be done on imagery (or color)
% ie, using the "d" value of each data point as defined by its C
% oord structure.  "Elevation" specifies that shading is to be done on 
% elevation, ie, using the "z" value of each data point as defined
% by its Coord structure.  When "Normals" is used, the normal to each 
% data point is computed, and shading is done using the normals.
% .item "Color Origination"
% When this attribute is set to "Use Foreground Color," the plot is colored in 
% the foreground color.   When set to "Use Data Values," the plot is colored
% according to the plot data (see manual for more details).  
% .item "Foreground Color"
% This stringlist selection lets you set the foreground color of the 3D
% plot, using the color name.  It is only used when "Color Origination"
% is set to "Use Foreground Color."
% .item "Fill Color"
% This stringlist selection lets you set the color that is used with 
% filled plots.  The only filled plots are the mesh and the horizon plots.
% .item "X and Y Orientation"
% These toggles only take effect when the plot data input is provided via a
% data object (as opposed to an array of Coords).  Furthermore, they only apply
% when the plot data is stored in the value segment of the data object (as
% opposed to the location segment of the data object).  They dictate how the
% 3D plot data is to be extracted from the value segment of the data object.
% The 3D plot data is always extracted as a surface, but that surface may be 
% defined over any two of the dimensions supported by the value segment. For
% example, the default surface orientation is (width x height), but you might
% specify it to be (height x depth),  (width x time), or any other combination
% of the 5 supported dimensions.
% .item "Width, Height, Depth, Time, And Elements Offsets"
% These integer selections may be set in conjunction with the "X and Y 
% Orientation" toggles.  When neither the X or Y orientation" set to "Width," 
% the "Width Offset" may be used to specify the width offset at which the 
% surface of plot data is to be extracted.  Similarly, "Height Offset," 
% "Depth Offset," "Time Offset" and "Elements Offset" may be used to specify 
% offsets into height, depth, time, and elements whenever that dimension is
% "not" being plotted.  Note that an offset may only be used when that 
% dimension of the value data is greater than 1.
% .item "Rotation About X"
% This parameter allows you to rotate the camera (the eye) about the X axis.
% Values are given in degrees, from 0 to 360.  
% .item "Rotation About Y"
% This parameter allows you to rotate the camera (the eye) about the Y axis.
% Values are given in degrees, from 0 to 360.  
% .item "Rotation About Z"
% This parameter allows you to rotate the camera (the eye) about the Z axis.
% Values are given in degrees, from 0 to 360.  
% .item "Eye Distance"
% This parameter specifies the distance between the plot and the eye.
% The default value of 0 is right up against the bounding box of the
% plot.
% .end tagged


function varargout = kPlot3D(varargin)
Inputs={};
if nargin ==0
  arglist={'',''};
elseif nargin ==1
  arglist=varargin{1};
else error('Usage: [out1,..] = kPlot3D(arglist).');
end
if size(arglist,2)~=2
  error('arglist must be of form {''ParameterTag1'',value1;''ParameterTag2'',value2}')
 end
narglist={'plot3DXOrientation', 1;'plot3DYOrientation', 2;'plot3DWidthOffset', 0;'plot3DHeightOffset', 0;'plot3DDepthOffset', 0;'plot3DTimeOffset', 0;'plot3DElementsOffset', 0};
maxval={0,0,1,1,1,1,1};
minval={0,0,1,1,1,1,1};
istoggle=[0,0,0,0,0,0,0];
was_set=istoggle * 0;
paramtype={'MultiChoice','MultiChoice','Integer','Integer','Integer','Integer','Integer'};
% identify the input arrays and assign them to the arguments as stated by the user
if ~iscell(Inputs)
Inputs = {Inputs};
end
NumReqOutputs=0; nextinput=1; nextoutput=1;
  for ii=1:size(arglist,1)
  wasmatched=0;
  for jj=1:size(narglist,1)
   if strcmp(arglist{ii,1},narglist{jj,1})  % a given argument was matched to the possible arguments
     wasmatched = 1;
     was_set(jj) = 1;
     if strcmp(narglist{jj,2}, '__input')
      if (nextinput > length(Inputs)) 
        error(['Input ' narglist{jj,1} ' has no corresponding input!']); 
      end
      narglist{jj,2} = 'OK_in';
      nextinput = nextinput + 1;
     elseif strcmp(narglist{jj,2}, '__output')
      if (nextoutput > nargout) 
        error(['Output nr. ' narglist{jj,1} ' is not present in the assignment list of outputs !']); 
      end
      if (isempty(arglist{ii,2}))
        narglist{jj,2} = 'OK_out';
      else
        narglist{jj,2} = arglist{ii,2};
      end

      nextoutput = nextoutput + 1;
      if (minval{jj} == 0)  
         NumReqOutputs = NumReqOutputs - 1;
      end
     elseif isstr(arglist{ii,2})
      narglist{jj,2} = arglist{ii,2};
     else
        if strcmp(paramtype{jj}, 'Integer') & (round(arglist{ii,2}) ~= arglist{ii,2})
            error(['Argument ' arglist{ii,1} ' is of integer type but non-integer number ' arglist{ii,2} ' was supplied']);
        end
        if (minval{jj} ~= 0 | maxval{jj} ~= 0)
          if (minval{jj} == 1 & maxval{jj} == 1 & arglist{ii,2} < 0)
            error(['Argument ' arglist{ii,1} ' must be bigger or equal to zero!']);
          elseif (minval{jj} == -1 & maxval{jj} == -1 & arglist{ii,2} > 0)
            error(['Argument ' arglist{ii,1} ' must be smaller or equal to zero!']);
          elseif (minval{jj} == 2 & maxval{jj} == 2 & arglist{ii,2} <= 0)
            error(['Argument ' arglist{ii,1} ' must be bigger than zero!']);
          elseif (minval{jj} == -2 & maxval{jj} == -2 & arglist{ii,2} >= 0)
            error(['Argument ' arglist{ii,1} ' must be smaller than zero!']);
          elseif (minval{jj} ~= maxval{jj} & arglist{ii,2} < minval{jj})
            error(['Argument ' arglist{ii,1} ' must be bigger than ' num2str(minval{jj})]);
          elseif (minval{jj} ~= maxval{jj} & arglist{ii,2} > maxval{jj})
            error(['Argument ' arglist{ii,1} ' must be smaller than ' num2str(maxval{jj})]);
          end
        end
     end
     if ~strcmp(narglist{jj,2},'OK_out') &  ~strcmp(narglist{jj,2},'OK_in') 
       narglist{jj,2} = arglist{ii,2};
     end
   end
   end
   if (wasmatched == 0 & ~strcmp(arglist{ii,1},''))
        error(['Argument ' arglist{ii,1} ' is not a valid argument for this function']);
   end
end
% match the remaining inputs/outputs to the unused arguments and test for missing required inputs
 for jj=1:size(narglist,1)
     if  strcmp(paramtype{jj}, 'Toggle')
        if (narglist{jj,2} ==0)
          narglist{jj,1} = ''; 
        end;
        narglist{jj,2} = ''; 
     end;
     if  ~strcmp(narglist{jj,2},'__input') && ~strcmp(narglist{jj,2},'__output') && istoggle(jj) && ~ was_set(jj)
          narglist{jj,1} = ''; 
          narglist{jj,2} = ''; 
     end;
     if strcmp(narglist{jj,2}, '__input')
      if (minval{jj} == 0)  % meaning this input is required
        if (nextinput > size(Inputs)) 
           error(['Required input ' narglist{jj,1} ' has no corresponding input in the list!']); 
        else
          narglist{jj,2} = 'OK_in';
          nextinput = nextinput + 1;
        end
      else  % this is an optional input
        if (nextinput <= length(Inputs)) 
          narglist{jj,2} = 'OK_in';
          nextinput = nextinput + 1;
        else 
          narglist{jj,1} = '';
          narglist{jj,2} = '';
        end;
      end;
     else 
     if strcmp(narglist{jj,2}, '__output')
      if (minval{jj} == 0) % this is a required output
        if (nextoutput > nargout & nargout > 1) 
           error(['Required output ' narglist{jj,1} ' is not stated in the assignment list!']); 
        else
          narglist{jj,2} = 'OK_out';
          nextoutput = nextoutput + 1;
          NumReqOutputs = NumReqOutputs-1;
        end
      else % this is an optional output
        if (nargout - nextoutput >= NumReqOutputs) 
          narglist{jj,2} = 'OK_out';
          nextoutput = nextoutput + 1;
        else 
          narglist{jj,1} = '';
          narglist{jj,2} = '';
        end;
      end
     end
  end
end
if nargout
   varargout = cell(1,nargout);
else
  varargout = cell(0);
end
global KhorosRoot
if exist('KhorosRoot') && ~isempty(KhorosRoot)
w=['"' KhorosRoot];
else
if ispc
  w='"C:\Program Files\dip\khorosBin\';
else
[s,w] = system('which cantata');
w=['"' w(1:end-8)];
end
end
callKhoros([w 'Plot3D" '],Inputs,narglist);
