No BSD License  

Highlights from
EC-SIM 1.1

image thumbnail
from EC-SIM 1.1 by Rasmus Anthin
Design circuits, simulate (steady-state and sweep) and define your own models.

schplot(sch,fs,n)
function schplot(sch,fs,n)
%SCHPLOT  Plots schematic from a schematic matrix.
%   SCHPLOT(SCHEMATIC[,FS[,N]])  plots the schematic matrix
%   SCHEMATIC with fontsize FS (10) and with N digits of precision
%   (variable).
%
%   See also ECSIM, VALPLOT, SCH2NET.

% Copyright (c) 2003-08-23, B. Rasmus Anthin.
% Revision 2003-08-29, 2003-08-30, 2003-08-31, 2003-09-02,
%          2003-09-03, 2003-09-08, 2003-09-09, 2003-09-11.

sch(isnan(sch))=inf;
if nargin<2, fs=10;end
if nargin<3, n=[];end
c=1/3;
ish=ishold;
hold on


t=linspace(0,1);
r=c*(cos(2*pi*t)+j*sin(2*pi*t));    %circle

%sort out lines beloning to a terminal in order
%to know how to rotate its label.
for i=1:size(sch,1)
   p1(i)=0;
   p2(i)=0;
   if sch(i,1)==-3
      for k=1:size(sch,1)
         if sch(k,1)==-2
            if sch(i,2)==sch(k,2)
               p1(i)=sch(k,2);
               p2(i)=sch(k,3);
            elseif sch(i,2)==sch(k,3)
               p1(i)=sch(k,3);
               p2(i)=sch(k,2);
            end
         end
      end
   end
end

%start plotting symbols
for i=1:size(sch,1)
   sch(i,2:5)=sch(i,2:5)+(0:3)*eps*j;   %to make sure that j is in all points.
   m1=mean(sch(i,2:3));                 %midpoint
   m2=mean(sch(i,4:5));
   x1=real(sch(i,2:3));
   y1=imag(sch(i,2:3));
   x2=real(sch(i,4:5));
   y2=imag(sch(i,4:5));
   phi1=atan2(diff(y1),diff(x1));
   phi2=atan2(diff(y2),diff(x2));
   T1=exp(j*(phi1+pi/2));                %rotation factor
   T2=exp(j*(phi2+pi/2));
   plus=c*([-1 1 nan 0 0]/3+j*[0 0 nan -1 1]/3);    %plus sign
   minus=c*([-1 1]/3);                              %minus sign
   arrow=c*[0+.7j 0-.7j nan -.3-.4j 0-.7j .3-.4j];  %down arrow
   box=c*[1+0j 0+j -1+0j 0-j 1+0j];                 %box (romboid)
   curr=c*([1 -1 0 1]+j*[1 1 -1 1])/4*T1;           %current arrow symbol
   num=symbenum(sch,i);                             %component numbering
   clear h
   switch(sch(i,1))
   case -3
      %TERMINAL
      phi=0;
      x=real([p2(i) p1(i)]);
      y=imag([p2(i) p1(i)]);
      phi=atan2(diff(y),diff(x));
      [tpos,halign,valign,angl]=textrot(phi,sch(i,2),c);         %text rotation
      h(1)=plot(sch(i,2),'ko');
      h(2)=text(real(tpos(1)),imag(tpos(1)),['T_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
   case -2
      %LINE
      h=plot(sch(i,2:3),'k');
   case -1
      %DOT
      h=plot(sch(i,2),'k.');
   case 0
      %GND
      h(1)=plot(sch(i,[2 2])-[0 j]*c,'k');
      h(2)=plot(sch(i,[2 2 2])-j*c+[-1 0 1]*c/2,'k');
   case 1
      %VOLTAGE SOURCE
      %nominal oriention:
      %+
      %-
      [tpos,halign,valign,angl]=textrot(phi1,m1,c*1.2);         %text rotation
      pt=[sch(i,2) m1+c*j*T1];       %plus terminal
      mt=[sch(i,3) m1-c*j*T1];       %minus terminal
      h(1)=plot(r+m1,'k');
      h(2)=plot((plus+c*j/2.5)*T1+m1,'k');
      h(3)=plot((minus-c*j/2.5)*T1+m1,'k');
      h(4)=plot(pt,'k');
      h(5)=plot(mt,'k');
      h(6)=text(real(tpos(1)),imag(tpos(1)),['U_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(7)=text(real(tpos(2)),imag(tpos(2)),num2scic(sch(i,8),n,'V'),'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 2
      %CURRENT SOURCE
      %nominal orientation:
      %|
      %v
      [tpos,halign,valign,angl]=textrot(phi1,m1,c*1.2);
      pt=[sch(i,2) m1+c*j*T1];
      mt=[sch(i,3) m1-c*j*T1];
      h(1)=plot(r+m1,'k');
      h(2)=plot(arrow*T1+m1,'k');
      h(3)=plot(pt,'k');
      h(4)=plot(mt,'k');
      h(5)=text(real(tpos(1)),imag(tpos(1)),['I_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(6)=text(real(tpos(2)),imag(tpos(2)),num2scic(sch(i,8),n,'A'),'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 3
      %VCVS
      [tpos,halign,valign,angl]=textrot(phi2,m2,c*1.2);
      pt=[sch(i,4) m2+c*j*T2];
      mt=[sch(i,5) m2-c*j*T2];
      corners=box*T2+m2;
      ci=find(abs(corners-m1)==min(abs(corners-m1)));
      h(1)=plot(box*T2+m2,'k');
      h(2)=plot((plus+c*j/2.5)*T2+m2,'k');
      h(3)=plot((minus-c*j/2.5)*T2+m2,'k');
      h(4)=plot(pt,'k');
      h(5)=plot(mt,'k');
      h(6)=plot([m1 corners(ci)],':r');
      h(7)=plot(x1(1),y1(1),'ko');
      h(8)=plot(x1(2),y1(2),'ko'); set(h(8),'markerface','k')
      h(9)=text(real(tpos(1)),imag(tpos(1)),['E_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(10)=text(real(tpos(2)),imag(tpos(2)),['v=' num2scic(sch(i,8),n,'')],'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 4
      %CCVS
      [tpos,halign,valign,angl]=textrot(phi2,m2,c*1.2);
      pt=[sch(i,4) m2+c*j*T2];
      mt=[sch(i,5) m2-c*j*T2];
      corners=box*T2+m2;
      ci=find(abs(corners-m1)==min(abs(corners-m1)));
      h(1)=plot(box*T2+m2,'k');
      h(2)=plot((plus+c*j/2.5)*T2+m2,'k');
      h(3)=plot((minus-c*j/2.5)*T2+m2,'k');
      h(4)=plot(pt,'k');
      h(5)=plot(mt,'k');
      h(6)=plot([m1 corners(ci)],':b');
      h(7)=plot(sch(i,2:3),'k');
      h(8)=patch(real(curr+m1),imag(curr+m1),'k');
      h(9)=text(real(tpos(1)),imag(tpos(1)),['H_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(10)=text(real(tpos(2)),imag(tpos(2)),['r=' num2scic(sch(i,8),n,'')],'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 5
      %VCCS
      [tpos,halign,valign,angl]=textrot(phi2,m2,c*1.2);
      pt=[sch(i,4) m2+c*j*T2];
      mt=[sch(i,5) m2-c*j*T2];
      corners=box*T2+m2;
      ci=find(abs(corners-m1)==min(abs(corners-m1)));
      h(1)=plot(box*T2+m2,'k');
      h(2)=plot(arrow*T2+m2,'k');
      h(3)=plot(pt,'k');
      h(4)=plot(mt,'k');
      h(5)=plot([m1 corners(ci)],':r');
      h(6)=plot(x1(1),y1(1),'ko');
      h(7)=plot(x1(2),y1(2),'ko'); set(h(7),'markerface','k')
      h(8)=text(real(tpos(1)),imag(tpos(1)),['G_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(9)=text(real(tpos(2)),imag(tpos(2)),['g=' num2scic(sch(i,8),n,'')],'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 6
      %CCCS
      [tpos,halign,valign,angl]=textrot(phi2,m2,c*1.2);
      pt=[sch(i,4) m2+c*j*T2];
      mt=[sch(i,5) m2-c*j*T2];
      corners=box*T2+m2;
      ci=find(abs(corners-m1)==min(abs(corners-m1)));
      h(1)=plot(box*T2+m2,'k');
      h(2)=plot(arrow*T2+m2,'k');
      h(3)=plot(pt,'k');
      h(4)=plot(mt,'k');
      h(5)=plot([m1 corners(ci)],':b');
      h(6)=plot(sch(i,2:3),'k');
      h(7)=patch(real(curr+m1),imag(curr+m1),'k');
      h(8)=text(real(tpos(1)),imag(tpos(1)),['F_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(9)=text(real(tpos(2)),imag(tpos(2)),['b=' num2scic(sch(i,8),n,'')],'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 7
      %RESISTOR
      [tpos,halign,valign,angl]=textrot(phi1,m1,c*.8);
      R=c*([1 -1 -1 1 1]/3+j*[1 1 -1 -1 1])*T1;
      pt=[sch(i,2) m1+c*j*T1];
      mt=[sch(i,3) m1-c*j*T1];
      h(1)=plot(R+m1,'k');
      h(2)=plot(pt,'k');
      h(3)=plot(mt,'k');
      h(4)=text(real(tpos(1)),imag(tpos(1)),['R_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(5)=text(real(tpos(2)),imag(tpos(2)),num2scic(sch(i,8),n,'\Omega'),'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 8
      %CAPACITOR
      [tpos,halign,valign,angl]=textrot(phi1,m1,c);
      w=1/10;
      C=c*([-1 1 nan -1 1]/2+j*[1 1 nan -1 -1]*w)*T1;
      pt=[sch(i,2) m1+c*w*j*T1];
      mt=[sch(i,3) m1-c*w*j*T1];
      h(1)=plot(C+m1,'k');
      h(2)=plot(pt,'k');
      h(3)=plot(mt,'k');
      h(4)=text(real(tpos(1)),imag(tpos(1)),['C_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(5)=text(real(tpos(2)),imag(tpos(2)),num2scic(sch(i,8),n,'F'),'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 9
      %INDUCTOR
      [tpos,halign,valign,angl]=textrot(phi1,m1,c*.8);
      L=c*([1 -1 -1 1 1]/3+j*[1 1 -1 -1 1])*T1;
      pt=[sch(i,2) m1+c*j*T1];
      mt=[sch(i,3) m1-c*j*T1];
      h(1)=patch(real(L+m1),imag(L+m1),'k');
      h(2)=plot(pt,'k');
      h(3)=plot(mt,'k');
      h(4)=text(real(tpos(1)),imag(tpos(1)),['L_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
      h(5)=text(real(tpos(2)),imag(tpos(2)),num2scic(sch(i,8),n,'H'),'fontsize',fs,'horiz',halign{2},'vert',valign{2},'rot',angl(2));
   case 10
      %OP-AMP
      %nominal orientation:
      %+            -
      %  out          out
      %-            +
      m3=mean([m1 sch(i,4)]);
      x=real([m1 sch(i,4)]);
      y=imag([m1 sch(i,4)]);
      phi3=atan2(diff(y),diff(x));
      T3=exp(j*phi3);
      opamp=c*[2+0j -2+2j -2-2j 2+0j]*1.5*T3+m3;
      tt=c*[-2+j -2-j]*1.5*T3+m3;
      h(1)=plot(opamp,'k');
      if norm(sch(i,2)-tt(1))<norm(sch(i,2)-tt(2))
         h(2)=plot([sch(i,2) tt(1)],'k');
         h(3)=plot([sch(i,3) tt(2)],'k');
         h(4)=plot((plus-2*c+c*j*3/2)*T3+m3,'k');
         h(5)=plot((minus-2*c-c*j*3/2)*T3+m3,'k');
      else
         h(2)=plot([sch(i,2) tt(2)],'k');
         h(3)=plot([sch(i,3) tt(1)],'k');
         h(4)=plot((plus-2*c-c*j*3/2)*T3+m3,'k');
         h(5)=plot((minus-2*c+c*j*3/2)*T3+m3,'k');
      end
      h(6)=plot([opamp(1) sch(i,4)],'k');
      [tpos,halign,valign,angl]=textrot(phi3,m3,0);
      h(7)=text(real(m3),imag(m3),['A_{' int2str(num) '}'],'fontsize',fs,'horiz','c','vert','m');
   case 11
      %DIODE
      [tpos,halign,valign,angl]=textrot(phi1,m1,c*.8);
      h=1/2;
      w=1/2;
      anod=c*([1 -1 0 1]*w+j*[1 1 -1 1]*h)*T1;
      katod=c*([-1 1]*w+j*[-1 -1]*h)*T1;
      h(1)=patch(real(anod+m1),imag(anod+m1),'k');
      h(2)=plot(katod+m1,'k');
      h(3)=plot(sch(i,2:3),'k');
      h(4)=text(real(tpos(1)),imag(tpos(1)),['D_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
   case 16
      %BLOCK
      symb=cmlib('sym',sch(i,7));
      rot=sch(i,1+symb.rotax);
      rotax=[mean(rot(1:2)) mean(rot(3:4))];
      m=mean(rotax);
      dx=diff(real(rotax));
      dy=diff(imag(rotax));
      phi=atan2(dy,dx);
      T=exp(j*phi);
      %should treat flipping here!
      [tpos,halign,valign,angl]=textrot(phi,m,symb.dx,symb.ang);
      h=[];
      for k=1:length(symb.patch);
         h(k)=patch(real(symb.patch{k}*T)+real(m),imag(symb.patch{k}*T)+imag(m),'k');
         set(h(k),'facec',symb.patchcol{k},'edgec',symb.patchcol{k})
      end
      len=length(h);
      for k=1:length(symb.line)
         h(k+len)=line(real(symb.line{k}*T)+real(m),imag(symb.line{k}*T)+imag(m));
         set(h(k+len),'color',symb.linecol{k})
      end
      len=length(h);
      for k=1:length(symb.term)
         tline=[sch(i,k+1) symb.term(k)*T+m];
         h(k+len)=plot(real(tline),imag(tline),'k');
      end
      len=length(h);
      h(len+1)=text(real(tpos(1)),imag(tpos(1)),[symb.label '_{' int2str(num) '}'],'fontsize',fs,'horiz',halign{1},'vert',valign{1},'rot',angl(1));
   end
   set(h,'userdata',[sch(i,1) i h])
end
axis(axis+[-1 1 -1 1]/2)
axis equal
if ~ish, hold off,end

function fname=fixedfont
cmp=computer;
switch(cmp(1:2))
case 'PC'
   fname='courier';
case 'MA'
   fname='monaco';
otherwise
   fname='fixed';
end

function [tpos,halign,valign,angl]=textrot(phi,m,dx,ang)
% phi=0 deg:
% -  Lbl +
% o------o
%    Val
%
%tpos(1) : Lbl
%tpos(2) : Val
%halign(1) : Lbl
%...
if nargin==3, ang=0;end                 %angular offset for text
phi0=pi/180*ang;
phi=mod(mod(phi,pi),pi);     %an extra mod to be sure
T=exp(j*(phi+phi0));
if phi>pi/4 & phi<=3*pi/4
   tpos=m+[1 -1]*j*dx*T;
   halign={'right','left'};
   valign={'middle','middle'};
   angl=phi*180/pi*[1 1]-90;
elseif phi>3*pi/4 & phi<=pi
   tpos=m+[-1 1]*j*dx*T;
   halign={'center','center'};
   valign={'baseline','cap'};
   angl=phi*180/pi*[1 1]-180;
else
   tpos=m+[1 -1]*j*dx*T;
   halign={'center','center'};
   valign={'baseline','cap'};
   angl=phi*180/pi*[1 1];
end

Contact us at files@mathworks.com