%Wersja programu dostosowana zarowno do Matlaba4.2 jak i wersji Matlaba5.2
%Wersja Matlaba jest sprawdzana komenda : version;
%W wersji 4.2 wczytywanych jest ze zbioru wynikowego *.prz 14 linii jako opisy,
%natomiast w wersji 5.2 ten sam opis interpretowany jest jako 16 linii 
%przyczyna : znak o kodzie szesnastkowym 0d,jest to znak powrotu karetki
%wywolywany dwa razy bez znaku wysuwu papieru. 
%Nie ma tego problemu w plikach *.wdy
clear all
nazwa=input('Podstawowa czesc nazwy plikow:','s');
wsps=input('Wspolczynnik skali dla trajektorii:','s');
wspr=input('Wspolczynnik skali dla linii kinetostatycznej:','s');
parll=input('Parametr linii laczacej punkty 0-bez,1-0,2-90,3-180,4-270 :','s');
parl=str2num(parll);
kcpp=input('Par. kcp=0 - traj. wzgl.(zb.: .cp1) nie sa rysowane, kcp=1 - sa:','s');
kcp=str2num(kcpp);
wsp=str2num(wsps);
wsr=str2num(wspr);
skala=input('skala , reczna - r, automatyczna - a:','s');
if skala=='r'
rmix=input('min xy:','s');
rmax=input('max xy:','s');
rminx=str2num(rmix);
rmaxx=str2num(rmax);
end %skala

mykoniec=0;
kcp=1;

%Oznaczenia kolorow: 'w' - bialy, 'k' - czarny, 'y' - zolty, 'r' - czerwony, 
%                    'b' - niebieski, 'c'- cyan, 'g' - zielony, 'm' - magenta
%Linia walu - dla Matlaba4: bialy (na wydruku czarny), dla Matlaba5: czarny .
%      Odksztalcona linia walu - czerwony. 
%Trajektorie - niebieski. Traj. wzgledne - czerwony. Traj. panwi - zielony
%Punkty 0 na trajektoriach - niebieski, punkty 90 - zielony, punkty 180 - magenta,
% punkty 270  - cyan,

 fid=fopen([nazwa '.str']);

   kon='kon';
   bra='bra';
   nzwz=[nazwa '.prz'];
   nazwaz=[nazwa '.wdy'];

   if exist(nazwaz)
    fd=fopen(nazwaz);
   for i=1:9
    lin=fgets(fd);
   end % for
   lipo=fscanf(fd,'%d',6);
   for i=1:lipo(2)+5
    lin=fgets(fd);
   end % for 
  else
    bl=input('Brak pliku o rozszerzeniu .wdy');
    break
   end % exist .wdy

   if exist(nzwz)
    fdd=fopen(nzwz); 
%W zaleznosci od wersji matlabu ilin=14 lub w nowej 16
wersja=version;
wer=str2num(wersja(1));
if wer==4
 ilin=14;
 linwa='w';
 linst='LineStyle';
else
 ilin=16;
 linwa='k';
 linst='Marker';
end %wer==4

   for i=1:ilin
    lin=fgets(fdd);
   end % for
   else
   bl=input('Brak pliku z przemieszczeniami walu');
   end %if exist .prz

  np=2;
  nw=2;
    zp(1)=0;
  while nw>1
 qz=fscanf(fd,'%d %d %d %g %g %g %g %g',8);
  lin=fgets(fd);
 if wsr>0
 bz=fscanf(fdd,'%d %g %g %g %g',5);
    uxp(np-1)=bz(2);
    uyp(np-1)=bz(4);
  else
    uxp(np-1)=0;
    uyp(np-1)=0;
  end %wsr>0
 if isempty(qz) 
  nw=-1;
  else
 zp(np)=zp(np-1)+qz(4);
 izp(np-1)=qz(2);
 izp(np)=qz(3); 
 np=np+1;
  end %if qz
  end %while nw>1

% Identyfikator fid odp. .str
 lin=fgets(fid);
 lpodp=fscanf(fid,'%d',1);
 lin=fgets(fid);
 lin=fgets(fid);
 for i=1:lpodp
  dlpodp(i)=fscanf(fid,'%g',1);
 end %for   
 lin=fgets(fid);
 lin=fgets(fid);
 
%Dla plikow .cp?
 for i=1:lpodp
  is=num2str(i);
  nazpodp=[nazwa '.cp' is];
  eval(['load ' nazpodp]);
 ikp=size(nazpodp);
 for ii=1:ikp(2)
  if nazpodp(ii)=='.'
   break
  else
   nazwzpdp(ii)=nazpodp(ii);
  end % if '.'
 end % for ii=1:ikp(2)
 wspop=eval(nazwzpdp);
ilkp=1;
 nxnp=size(wspop,1);
 xnp=wspop(1:ilkp:nxnp,2);
 ynp=wspop(1:ilkp:nxnp,3);
 if i==1
  osxp=xnp;
  osyp=ynp;
 else 
   osxp=[osxp xnp];
   osyp=[osyp ynp];
 end % if i==1
 end %for i=1:lpodp

 for i=1:lpodp
nazwzpan=[];
  npan=fscanf(fid,'%3s',1);
llog=(isempty(npan)|npan==bra(1:size(npan),2));
 if ~llog
npanw(i)=str2num(npan);
 nazpanw=[nazwa '.' npan];
  eval(['load ' nazpanw]);
 ikpa=size(nazpanw);
 for ii=1:ikpa(2)
  if nazpanw(ii)=='.'
   break
 else
   nazwzpan(ii)=nazpanw(ii);
  end % if '.'
 end % for ii=1:ikpa(2)
 wspan=eval(nazwa);
 %nazwzpan;
 ilkpa=1;
 nxnpa=size(wspan,1);
 xnpa=wspan(1:ilkpa:nxnpa,2);
 ynpa=wspan(1:ilkpa:nxnpa,3);
 if i==1
  osxpa=xnpa;
  osypa=ynpa;
 else 
   osxpa=[osxpa xnpa];
   osypa=[osypa ynpa];
 end % if i==1
else
break
end %npan~=[]
 end %for i=1:lpodp 

  lin=fgets(fid);
 lin=fgets(fid);
  
n=0;
while 1
 n=n+1;
 if n==1
  z(n)=0;
 else
  z(n)=z(n-1);
 end % wartosc pocz. z

  roz=fscanf(fid,'%3s',1);
  nazwap=[nazwa '.' roz];
  sr=size(roz);
 if roz~=kon(1:size(roz,2))
    if mykoniec==0 
       mykoniec=1;
    end %mykoniec
    iz(n)=str2num(roz);
 end %if roz
 if sr(2)==3 
   if roz==kon(1:size(roz,2))
    z(:,[n])=[];
    n=n-1;
    break
   end 
  end % 'KONIEC'

 eval(['load ' nazwap]);
 ik=size(nazwap);
 for i=1:ik(2)
  if nazwap(i)=='.'
   break
  else
   nazwz(i)=nazwap(i);
  end % if '.'
 end % for
 wspo=eval(nazwz);
ilk=1;
nxn=size(wspo,1);
 xn=wspo(1:ilk:nxn,2);
 yn=wspo(1:ilk:nxn,3);

 if n==1
  osx=xn;
  osy=yn;
 else 
   osx=[osx xn];
   osy=[osy yn];
 end
end % while 1

if mykoniec==0
    xn=0;
    yn=0;
    osx=[0 0];
    osy=[0  0];
    iz=izp;
end %if mykoniec

n=size(osx,2);
icd=1;
for i=1:n
for ii=icd:size(zp,2)
if iz(i)==izp(ii)
z(i)=zp(ii);
ux(i)=uxp(ii);
uy(i)=uyp(ii);
icd=ii;
break
end %if
end %ii
end %i
if n>1
 zn=ones(size(xn))*zp(n);
  xs=ones(size(zp))*0;
  ys=xs;
end %n>1

zos=min(z):.01*(max(z)-min(z)):max(z);
nx=size(xn);
if skala=='a'
if kcp==0
osxp=0;osyp=0;
end %if kcp==0
if isempty(osx)
minosx=0;maxosx=0;minosy=0;maxosy=0;
ux=0;uy=0;
else
minosx=min(osx);maxosx=max(osx);minosy=min(osy);maxosy=max(osy);
end %if
if isempty(osxp)
minosxp=0;maxosxp=0;minosyp=0;maxosyp=0;
ux=0;uy=0;
else
minosxp=min(osxp);maxosxp=max(osxp);minosyp=min(osyp);maxosyp=max(osyp);
end %if
minx=min(minosx+ux+min(minosxp)+min(uxp));miny=min(minosy+uy+min(minosyp)+min(uyp));
maxx=max(maxosx+ux+max(maxosxp)+max(uxp));maxy=max(maxosy+uy+max(maxosyp)+max(uyp));

if minx>miny
 minxyu=miny;
else
 minxyu=minx;
end
if maxx>maxy
 maxxyu=maxx;
else
 maxxyu=maxy;
end
else %skala
minxyu=rminx;maxxyu=rmaxx;
end %skala

axis([min(zp) max(zp) minxyu maxxyu minxyu maxxyu]);

% Jesli nalezy zmienic wielkosc kolek zerowych na trajektorii 
% i podporowych w stosunku do skali max., to zmieniamy wsp.
%przy obliczaniu rok z 0.01 na inny

tpi=0:0.05*pi:2*pi;
if wsr==0
rok=0.02*maxxyu;
else
rok=0.02*maxxyu*wsr;
end %ifwsr==0
xok=rok*sin(tpi); yok=rok*cos(tpi);
onok=ones(size(xok));
if isempty(xs)
xs=0*uxp;ys=0*uyp;
end %if

% Kolor linii geodezyjnej linwa i kinetostatycznej 'r'

if ~wsr==0
  wyk3=plot3(zp,xs,ys,linwa,zp,xs+uxp*wsr,ys+uyp*wsr,'r');
else
  wyk3=plot3(zp,xs,ys,linwa);
end %if ~wsr=0
hold on

% Grubosc linii geodezyjnej i kinetostatycznej walu ( do 4)

set(wyk3,'LineWidth',1.5)
  hold on

if n>1
  for i=1:n
 zz=ones(size(osx(:,i)))*z(i);
xxu=wsp*osx(:,i)+ux(i)*wsr;yyu=wsp*osy(:,i)+uy(i)*wsr;
axis([min(z) max(z) minxyu maxxyu minxyu maxxyu]);

zokr=z(i)*onok;
xokr=xxu(1)*onok+xok;
yokr=yyu(1)*onok+yok;

%Kolor trajektorii bezwzglednych walu 'b' i punktow 0

 wyk4=plot3(zz,xxu,yyu,'b',zokr,xokr,yokr,'b');

% Grubosc i styl linii trajektorii bezwzglednych walu

set(wyk4,'LineStyle','-','LineWidth',0.5)
 hold on
end

%Kolor, styl i grubosc punktow wezlowych na linii kinetostatycznej 'b'

 wyk7=plot3(z,ux*wsr,uy*wsr,'b');
set(wyk7,linst,'.','LineWidth',2)
 hold on
end %n>1

  ep=.0001*max(zp);
  for i=1:lpodp
   for ii=1:size(zp,2)
    if abs(dlpodp(i)-zp(ii))<ep
     npodp(i)=ii;
    end %if
   end %for ii
  end %for i
  for i=1:lpodp
uxu(i)=uxp(npodp(i))*wsr; uyu(i)=uyp(npodp(i))*wsr;
if kcp>0
xxu=wsp*osxp(:,i)+uxu(i);yyu=wsp*osyp(:,i)+uyu(i);
zz=ones(size(osxp(:,i)))*dlpodp(i);
end %if kcp>0
llog=(isempty(npan)|npan==bra(1:size(npan,2)));
 if ~llog
xxupa=wsp*osxpa(:,i)+uxu(i);yyupa=wsp*osypa(:,i)+uyu(i);
zzz=ones(size(osxpa(:,i)))*dlpodp(i);
end % npan
 
axis([min(zp) max(zp) minxyu maxxyu minxyu maxxyu]);

 if kcp>0
  zokr=dlpodp(i)*onok;
  xokr=xxu(1)*onok+xok;
   yokr=yyu(1)*onok+yok;
  end %kcp>0
llog=(isempty(npan)|npan==bra(1:size(npan,2)));
 if ~llog
   zokr=dlpodp(i)*onok;
   xoka=xxupa(1)*onok+xok;
 yoka=yyupa(1)*onok+yok;

%Kolor trajektorii wzglednych czopow i panwi 'r', oraz kolor trajektorii
%bezwzglednych panwi 'b'

 if kcp>0
     if kcpp=='1'
        wyk6=plot3(zz,xxu,yyu,'r',zokr,xokr,yokr,'r');
        hold on
    end %if kcpp
    wyk10=plot3(zzz,xxupa,yyupa,'b',zokr,xoka,yoka,'b');
 else
  wyk10=plot3(zzz,xxupa,yyupa,'b',zokr,xoka,yoka,'b');
 end %if kcp>0
else
if kcp>0
 wyk6=plot3(zz,xxu,yyu,'r',zokr,xokr,yokr,'r');
end %if kcp>0
end %npan

% Grubosc i styl linii trajektorii wzglednych 

if kcpp=='1'
 set(wyk6,'LineStyle','-','LineWidth',2)
 hold on
end %if kcpp

% Grubosc i styl linii trajektorii bezwzglednych panwi

llog=(isempty(npan)|npan==bra(1:size(npan),2));
 if ~llog
set(wyk10,'LineStyle','-','LineWidth',2)
hold on
end %if llog
end %for i=1:n

for i=1:lpodp
zokrp=zp(npodp(i))*onok;
xokrp=uxu(i)*onok+xok;
yokrp=uyu(i)*onok+yok;

%Kolor i grubosc kolek zaznaczajacych podpory na linii kinetostatycznej: linwa

wyk8=plot3(zokrp,xokrp,yokrp,linwa);
set(wyk8,'LineWidth',2);
hold on

%Kolor, styl i grubosc kolek zaznaczajacych podpory na linii geodezyjnej: linwa

  wyk9=plot3(zokrp,xok,yok,linwa);
 set(wyk9,'LineWidth',2);
hold on
end %for i=1:lpodp

%Okreslenie przedzialu rysowania linii char.- jest co 360 stop

for k=1:parl
 j=0;
for i=1:nx(1)
  if abs(wspo(i,4)-(k-1)*90)<1
   xosu=spline(z,wsp*osx(i,:)+ux*wsr,zos);
   yosu=spline(z,wsp*osy(i,:)+uy*wsr,zos);
   j=j+1;

%Ustawienie kolorow linii laczacej punkty charakterystyczne na trajektoriach:
% 0 - 'g', 360 -  'g', 720 - 'g', *** - 'm'
kolo=['g' 'b' 'm' 'c'];
%axis([min(z) max(z) minxyu maxxyu minxyu maxxyu]);

if k==parl
  wyk5=plot3(zos,xosu,yosu,kolo(k));

% Grubosc linii charakterystycznych

set(wyk5,'LineWidth',0.5)
  hold on
end %if parl

[k i wspo(i,4)];
  end % if 
 end 
end

tytul=[nazwa '   (:' wsps,'    :' wspr ')'];
title(tytul);
axis on
hold off
