| list=string2hist(cmd)
%string2hist - convert a string of commands to a numerical list
% list=string2hist(cmd)
% F(ront),R(ight),U(p) are axes 1,2,3 on positive sides
% B(ack),L(eft),D(own) are these axes on negative sides
% a list is something lik |
function list=string2hist(cmd)
%string2hist - convert a string of commands to a numerical list
% list=string2hist(cmd)
% F(ront),R(ight),U(p) are axes 1,2,3 on positive sides
% B(ack),L(eft),D(own) are these axes on negative sides
% a list is something like
% FR2(UR)3, which means Front (clockwise (direction 1)), double right
% three times the combination of Up and Right
% ("'" can also be used for 3 rotates clockwise - or reverse)
% the list may be ended with ".", after which all characters are not used
list=zeros(100,3);
iL=0;
S=cell(0,2);
cmd(end+1)='.'; % sentinel
iCmd=1;
while cmd(iCmd)~='.'
axe=0;
switch lower(cmd(iCmd))
case 'f'
axe=1;
side=1;
case 'r'
axe=2;
side=1;
case 'u'
axe=3;
side=1;
case 'b'
axe=1;
side=-1;
case 'l'
axe=2;
side=-1;
case 'd'
axe=3;
side=-1;
case ''''
if isempty(S)
list(iL,3)=-list(iL,3);
elseif S{end,2} % still open
S{end,1}(end,3)=-S{end,1}(end,3);
else
S{end,1}=S{end,1}(end:-1:1,:);
S{end,1}(:,3)=-S{end,1}(:,3);
[S,list,iL]=TestEnd(S,list,iL);
end
case {'1','2','3','4','5','6','7','8','9'}
i=iCmd+1;
while any(cmd(i)=='0123456789')
i=i+1;
end
n=str2num(cmd(iCmd:i-1));
if n>1
if isempty(S)
list(iL+1:iL+n-1,:)=list(iL+zeros(1,n-1),:);
iL=iL+n-1;
elseif S{end,2} % still open
m=size(S{end,1},1);
S{end,1}(m+1:m+n-1,:)=S{end,1}(m+zeros(1,n-1),:);
else
S{end,1}=repmat(S{end,1},n,1);
[S,list,iL]=TestEnd(S,list,iL);
end
end
iCmd=i-1;
case '('
[S,list,iL]=TestEnd(S,list,iL);
S{end+1,1}=zeros(0,3);
S{end,2}=1;
case ')'
[S,list,iL]=TestEnd(S,list,iL);
S{end,2}=0;
case {' ',','}
% doe niets
otherwise
error(sprintf('Unknown character in command list (''%c'')',cmd(iCmd)))
end
if axe
[S,list,iL]=TestEnd(S,list,iL);
if isempty(S)
iL=iL+1;
list(iL,1)=axe;
list(iL,2)=side;
list(iL,3)=1;
else
S{end,1}(end+1,:)=[axe side 1];
end
end
iCmd=iCmd+1;
end
[S,list,iL]=TestEnd(S,list,iL);
if ~isempty(S)
error('Not a correct command list')
end
list=list(1:iL,:);
function [S,list,iL]=TestEnd(S,list,iL)
if ~isempty(S)
if S{end,2}==0
if size(S,1)==1
n1=size(S{end,1},1);
list(iL+1:iL+n1,:)=S{end,1};
iL=iL+n1;
else
S{end-1,1}=[S{end-1,1};S{end,1}];
end
S(end,:)=[];
end
end
|
|