📄 rckcad.m
字号:
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 + -