⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rckcad.m

📁 航天工程工具箱
💻 M
📖 第 1 页 / 共 2 页
字号:
function rckcad(cb)
%RCKCAD  Tool for rocket layout design.
%   RCKCAD  (Rocket CAD) is a CAD program for designing rockets
%   using simple shapes which allows for a reliable enough
%   estimate on the rockets center of pressure CP.
%
%   See also LOADCAD, RCKPLOT, EVALCP, SMARG.

% Copyright (c) 2003-06-26, B. Rasmus Anthin.
% Revisited 2003-06-27, 2003-06-28, 2003-07-17,
%           2003-07-18, 2003-07-23 - 2003-07-25.

if ~nargin
   % <FILE>
   clear global mquit rck hfig hmain idx deffname hs sidx motorh
   global mquit rck hfig hmain idx deffname hs sidx
   rck.comp={zeros(0,11)};
   deffname=[];
   hh=dialog('name','File','handlevis','on');
   pos=get(hh,'pos');
   set(hh,'pos',[pos(1:2) 200 150])
   mquit=0;
   uicontrol('style','text','string','Action:','pos',[20 120 100 20],'horiz','l')
   h(1)=uicontrol('style','popup','string',{'New','Load'},'val',1,'pos',[20 100 100 20]);
   h(2)=uicontrol('style','push','string','Ok','callback','uiresume');
   h(3)=uicontrol('style','push','string','Cancel','callback','cb_cancel');
   set(h(3),'pos',get(h(2),'pos')+[100 0 0 0])
   uiwait
   action=get(h(1),'val');
   close
   if mquit, rquit;return,end
   
   %<LOAD>
   if action==2
      godir(mfilename)
      cd rocket
      [fname,path]=uigetfile('*.cad','Load Rocket');
      godir
      if ~ischar(fname), rquit;return,end
      deffname=fname;
      file=fullfile(path,fname);
      load(file,'rck','-mat')
      %rck2=rck;
      %clear rck;
   end
   
   %<EDIT>
   hh=dialog('name','Rocket Setup','handlevis','on');
   xmax=300;
   ymax=150;
   pos=get(hh,'pos');
   set(hh,'pos',[pos(1:2) xmax ymax])
   x0=20;
   y0=ymax-30;
   xl=80;
   yl=20;
   dx=xl+20;
   dy=yl+10;
   mquit=0;
   if action==1
      name='<untitled>';
      stages='1';
      sprev=1;
   elseif action==2
      name=rck.name;
      stages=int2str(rck.stages);
      sprev=rck.stages;
   end
   h(1,1)=uicontrol('style','text','string','Rocket Name:','pos',[x0 y0 xl yl],'horiz','l');
   h(1,2)=uicontrol('style','edit','string',name,'pos',[x0+dx y0 xl yl],'horiz','l');
   h(2,1)=uicontrol('style','text','string','# Stages:','pos',[x0 y0-dy xl yl],'horiz','l');
   h(2,2)=uicontrol('style','edit','string',stages,'pos',[x0+dx y0-dy 40 yl],'horiz','l');
   h(3,2)=uicontrol('style','push','string','Ok','callback','uiresume');
   h(4,2)=uicontrol('style','push','string','Cancel','callback','cb_cancel');
   set(h(4,2),'pos',get(h(3,2),'pos')+[xmax-100 0 0 0])
   uiwait
   rck.name=get(h(1,2),'string');
   rck.stages=str2num(get(h(2,2),'string'));
   for i=sprev+1:rck.stages
      rck.comp{i}=zeros(0,11);
   end
   for i=1:rck.stages
      comp{i}=rck.comp{i};
   end
   rck.comp=comp;
   close
   if mquit, rquit;return;end
   
   % <MAIN>
   hh=dialog('name','Main','handlevis','on');
   hmain=hh;
   ymax=360;
   set(hh,'pos',[50 100 100 ymax])
   dy=35;
   str={'Nose','Tube','Coupler','Fins','Motor','Edit','Delete','Save','Quit'};
   for i=1:9
      uicontrol('style','push', ...
         'string',str{i}, ...
         'pos',[5 ymax-40*(i>5)-i*dy 90 30], ...
         'callback',['rckcad(' num2str(i) ');'])
   end
   sstr={};
   for i=1:rck.stages
      sstr{i}=num2str(rck.stages+1-i);     %start with upper stage first.
   end
   sidx=rck.stages;
   hs=uicontrol('style','popup','string',sstr,'val',1,'pos',[5 ymax-6*dy-5 50 30],'callback','rckcad(60)');
   hfig=figure;
   set(hfig,'name',['Rocket CAD : ' rck.name],'numbertitle','off')
   set(hfig,'menubar','none')
   rckplot(rck.comp{sidx})
else
   global rck idx sidx hfig h hs
   switch(cb)
   case 1       %Menu items
      if ~isempty(rck.comp{sidx}) & any(rck.comp{sidx}(:,1)==1)
         errordlg('Cannot have more than one nose.','Rocket CAD')
      else
         idx=0;
         cb_nose
      end
   case 2
      idx=0;
      cb_tube
   case 3
      idx=0;
      cb_coupler
   case 4
      idx=0;
      cb_fins
   case 5
      idx=0;
      cb_motor
   case 6
      cb_edit
   case 7
      cb_delete
   case 8
      cb_save
   case 9
      cb_quit
   case 11            %Nose : type
      type=get(h(1,2),'val');
      rck.comp{sidx}(idx,2)=type;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 12            %Nose : length
      L=str2num(get(h(2,2),'string'));
      rck.comp{sidx}(idx,4)=L;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 13            %Nose : offset
      dL=str2num(get(h(3,2),'string'));
      rck.comp{sidx}(idx,3)=dL;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 14            %Nose : diameter
      d=str2num(get(h(4,2),'string'));
      rck.comp{sidx}(idx,6)=d;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 15            %Nose : CG
      rpos=str2num(get(h(5,2),'string'));
      rck.comp{sidx}(idx,10)=rpos;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 16            %Nose : mass
      w=str2num(get(h(6,2),'string'));
      rck.comp{sidx}(idx,11)=w;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 21            %Tube : position
      pos=str2num(get(h(1,2),'string'));
      rck.comp{sidx}(idx,3)=pos;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 22            %Tube : length
      L=str2num(get(h(2,2),'string'));
      rck.comp{sidx}(idx,4)=L;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 23            %Tube : diameter
      d=str2num(get(h(3,2),'string'));
      rck.comp{sidx}(idx,6)=d;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 24            %Tube : CG
      rpos=str2num(get(h(4,2),'string'));
      rck.comp{sidx}(idx,10)=rpos;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 25            %Tube : mass
      w=str2num(get(h(5,2),'string'));
      rck.comp{sidx}(idx,11)=w;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 31            %Coupler : position
      pos=str2num(get(h(1,2),'string'));
      rck.comp{sidx}(idx,3)=pos;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 32            %Coupler : length
      L=str2num(get(h(2,2),'string'));
      rck.comp{sidx}(idx,4)=L;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 33            %Coupler : upper diameter
      d1=str2num(get(h(3,2),'string'));
      d2=str2num(get(h(4,2),'string'));
      rck.comp{sidx}(idx,5)=d1;
      rck.comp{sidx}(idx,2)=(d1<d2)+2*(d1>d2);
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 34            %Coupler : lower diameter
      d1=str2num(get(h(3,2),'string'));
      d2=str2num(get(h(4,2),'string'));
      rck.comp{sidx}(idx,6)=d2;
      rck.comp{sidx}(idx,2)=(d1<d2)+2*(d1>d2);
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 35            %Coupler : CG
      rpos=str2num(get(h(4,2),'string'));
      rck.comp{sidx}(idx,10)=rpos;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 36            %Coupler : mass
      w=str2num(get(h(5,2),'string'));
      rck.comp{sidx}(idx,11)=w;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 41            %Fins : count
      nval=get(h(1,2),'val');
      n=[3 4 6];
      rck.comp{sidx}(idx,9)=n(nval);
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 42            %Fins : position
      pos=str2num(get(h(2,2),'string'));
      a=str2num(get(h(3,2),'string'));
      rck.comp{sidx}(idx,3)=pos;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 43            %Fins : base length
      pos=str2num(get(h(2,2),'string'));
      a=str2num(get(h(3,2),'string'));
      rck.comp{sidx}(idx,4)=a;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 44            %Fins : top length
      b=str2num(get(h(4,2),'string'));
      rck.comp{sidx}(idx,5)=b;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 45            %Fins : body tube radius
      R=str2num(get(h(5,2),'string'));
      rck.comp{sidx}(idx,6)=R;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 46            %Fins : fin height
      S=str2num(get(h(6,2),'string'));
      rck.comp{sidx}(idx,7)=S;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 47            %Fins : fin offset
      m=str2num(get(h(7,2),'string'));
      rck.comp{sidx}(idx,8)=m;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 48            %Fins : CG
      rpos=str2num(get(h(4,2),'string'));
      rck.comp{sidx}(idx,10)=rpos;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 49            %Fins : mass
      w=str2num(get(h(5,2),'string'));
      rck.comp{sidx}(idx,11)=w;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 51            %Motor : count
      n=str2num(get(h(1,2),'string'));
      rck.comp{sidx}(idx,9)=n;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 52            %Motor : position
      pos=str2num(get(h(2,2),'string'));
      rck.comp{sidx}(idx,3)=pos;
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 53            %Motor : load motor
      global motorh
      eng=loadeng;
      userdata(motorh,eng,2)
      if ~isempty(eng)
         rck.comp{sidx}(idx,4)=eng.L;    %NB!  [mm]
         rck.comp{sidx}(idx,6)=eng.D;    %NB!  [mm]
         rck.comp{sidx}(idx,10)=eng.L/2; %NB!  [mm]
         rck.comp{sidx}(idx,11)=(eng.mf+eng.mm)*1e3; %NB!  [g]
         set(h(3,2),'string',eng.name)
      end
      figure(hfig)
      rckplot(rck.comp{sidx})
   case 60            %Switch stage
      scopy
      sidx=rck.stages+1-get(hs,'val');
      figure(hfig)
      rckplot(rck.comp{sidx})
   end
end


function cb_nose
global rck h hfig idx hh sidx
hh=dialog('name','Nose','handlevis','on');
xmax=400;
ymax=200;
pos=get(hh,'pos');
set(hh,'pos',[pos(1:2) xmax ymax])
if idx
   type=rck.comp{sidx}(idx,2);
   dL=rck.comp{sidx}(idx,3);
   L=rck.comp{sidx}(idx,4);
   d=rck.comp{sidx}(idx,6);
   rpos=rck.comp{sidx}(idx,10);
   w=rck.comp{sidx}(idx,11);
else
   idx=size(rck.comp{sidx},1)+1;
   type=1;
   dL=0;
   L=200;
   d=50;
   rpos=100;
   w=100;
end
hold on
rckplot([1 1 0 100 0 40 nan nan nan 80 100],0,1)
%[x0 y0 xsc ysc]=winscale(gca);
set(findobj('type','line'),'color','k')
plot([0 100],[0 0],'r:')
plot([35 35],[-7 7],'k')
plot([0 0 35 35],[0 -15 -15 -7],'r:')
plot([35 35 80 80],[-15 -20 -20 0],'r:')
axis([0 100 -20 20])
axis equal off
typestr={'Conical','Ogive','Parabolic'};
h(1,1)=uicontrol('style','text','string','Type:','pos',[20 170 50 20],'horiz','l');
h(1,2)=uicontrol('style','popup','string',typestr,'val',type,'pos',[75 170 80 20]);
set(h(1,2),'callback','rckcad(11)')
h(2,1)=uicontrol('style','text','string','L','pos',[190 95 10 20],'horiz','l');
h(2,2)=uicontrol('style','edit','string',num2str(L),'pos',[205 95 40 20]);
set(h(2,2),'callback','rckcad(12)')
h(3,1)=uicontrol('style','text','string','dL','pos',[70 50 20 20],'horiz','l');
h(3,2)=uicontrol('style','edit','string',num2str(dL),'pos',[95 50 40 20]);
set(h(3,2),'callback','rckcad(13)')
h(4,1)=uicontrol('style','text','string','d','pos',[330 60 10 20],'horiz','l');
h(4,2)=uicontrol('style','edit','string',num2str(d),'pos',[345 60 40 20]);
set(h(4,2),'callback','rckcad(14)')
h(5,1)=uicontrol('style','text','string','CG','pos',[200 30 20 20],'horiz','l');
h(5,2)=uicontrol('style','edit','string',num2str(rpos),'pos',[225 30 40 20]);
set(h(5,2),'callback','rckcad(15)')
h(6,1)=uicontrol('style','text','string','Mass:','pos',[20 140 50 20],'horiz','l');
h(6,2)=uicontrol('style','edit','string',num2str(w),'pos',[75 140 40 20]);
set(h(6,2),'callback','rckcad(16)')
h(7,2)=uicontrol('style','push','string','Ok','callback','global hh, close(hh)');
rck.comp{sidx}(idx,:)=[1 type dL L 0 d nan nan nan rpos w];
figure(hfig)
rckplot(rck.comp{sidx})


function cb_tube
global rck h hfig idx hh sidx
hh=dialog('name','Body tube','handlevis','on');
xmax=500;
ymax=200;
pos=get(hh,'pos');
set(hh,'pos',[pos(1:2) xmax ymax])
if idx
   pos=rck.comp{sidx}(idx,3);
   L=rck.comp{sidx}(idx,4);
   d=rck.comp{sidx}(idx,6);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -