Файл: Проектирование реализации операций бизнес-процесса «Движение библиотечного фонда» (ДИАГРАММА ПОСЛЕДОВАТЕЛЬНОСТИ).pdf
Добавлен: 30.06.2023
Просмотров: 182
Скачиваний: 5
% Interpreter 'tex', 'latex' or 'none', default = default for text()
%
% Syntax:
% handle = uibutton('PropertyName',PropertyValue,...)
% handle = uibutton(parent,'PropertyName',PropertyValue,...)
% [text_obj,axes_handle] = uibutton('Style','text',...
% 'PropertyName',PropertyValue,...)
%
% uibutton creates a temporary axes and text object containing the text to
% be displayed, captures the axes as an image, deletes the axes and then
% displays the image on the uicontrol. The handle to the uicontrol is
% returned. If you pass in a handle to an existing uicontol as the first
% argument then uibutton will use that uicontrol and not create a new one.
%
% If the Style is set to 'text' then the axes object is not deleted and the
% text object handle is returned (as well as the handle to the axes in a
% second output argument).
%
% See also UICONTROL.
% Version: 1.6, 20 April 2006
% Author: Douglas M. Schwarz
% Email: dmschwarz=ieee*org, dmschwarz=urgrad*rochester*edu
% Real_email = regexprep(Email,{'=','*'},{'@','.'})
% Detect if first argument is a uicontrol handle.
keep_handle = false;
if nargin > 0
h = varargin{1};
if isscalar(h) && ishandle(h) && strcmp(get(h,'Type'),'uicontrol')
keep_handle = true;
varargin(1) = [];
end
end
% Parse arguments looking for 'Interpreter' property. If found, note its
% value and then remove it from where it was found.
interp_value = get(0,'DefaultTextInterpreter');
arg = 1;
remove = [];
while arg <= length(varargin)
v = varargin{arg};
if isstruct(v)
fn = fieldnames(v);
for i = 1:length(fn)
if strncmpi(fn{i},'interpreter',length(fn{i}))
interp_value = v.(fn{i});
v = rmfield(v,fn{i});
end
end
varargin{arg} = v;
arg = arg + 1;
elseif ischar(v)
if strncmpi(v,'interpreter',length(v))
interp_value = varargin{arg+1};
remove = [remove,arg,arg+1];
end
arg = arg + 2;
elseif arg == 1 && isscalar(v) && ishandle(v) && ...
any(strcmp(get(h,'Type'),{'figure','uipanel'}))
arg = arg + 1;
else
error('Invalid property or uicontrol parent.')
end
end
varargin(remove) = [];
% Create uicontrol, get its properties then hide it.
if keep_handle
set(h,varargin{:})
else
h = uicontrol(varargin{:});
end
s = get(h);
if ~any(strcmp(s.Style,{'pushbutton','togglebutton','text'}))
delete(h)
error('''Style'' must be pushbutton, togglebutton or text.')
end
set(h,'Visible','off')
% Create axes.
parent = get(h,'Parent');
ax = axes('Parent',parent,...
'Units',s.Units,...
'Position',s.Position,...
'XTick',[],'YTick',[],...
'XColor',s.BackgroundColor,...
'YColor',s.BackgroundColor,...
'Box','on',...
'Color',s.BackgroundColor);
% Adjust size of axes for best appearance.
set(ax,'Units','pixels')
pos = round(get(ax,'Position'));
if strcmp(s.Style,'text')
set(ax,'Position',pos + [0 1 -1 -1])
else
set(ax,'Position',pos + [4 4 -8 -8])
end
switch s.HorizontalAlignment
case 'left'
x = 0.0;
case 'center'
x = 0.5;
case 'right'
x = 1;
end
% Create text object.
text_obj = text('Parent',ax,...
'Position',[x,0.5],...
'String',s.String,...
'Interpreter',interp_value,...
'HorizontalAlignment',s.HorizontalAlignment,...
'VerticalAlignment','middle',...
'FontName',s.FontName,...
'FontSize',s.FontSize,...
'FontAngle',s.FontAngle,...
'FontWeight',s.FontWeight,...
'Color',s.ForegroundColor);
% If we are creating something that looks like a text uicontrol then we're
% all done and we return the text object and axes handles rather than a
% uicontrol handle.
if strcmp(s.Style,'text')
delete(h)
if nargout
hout = text_obj;
ax_out = ax;
end
return
end
% Capture image of axes and then delete the axes.
frame = getframe(ax);
delete(ax)
% Build RGB image, set background pixels to NaN and put it in 'CData' for
% the uicontrol.
if isempty(frame.colormap)
rgb = frame.cdata;
else
rgb = reshape(frame.colormap(frame.cdata,:),[pos([4,3]),3]);
end
size_rgb = size(rgb);
rgb = double(rgb)/255;
back = repmat(permute(s.BackgroundColor,[1 3 2]),size_rgb(1:2));
isback = all(rgb == back,3);
rgb(repmat(isback,[1 1 3])) = NaN;
set(h,'CData',rgb,'String','','Visible',s.Visible)
% Assign output argument if necessary.
if nargout
hout = h;
end
%%
end
end
demo = uicontrol(fig_1,'String','Demo','callback',@demo_button_press,...
'Position',[20 5 60 20]);
rnd_demo = uicontrol(fig_1,'String','Random Move','callback',@rnd_demo_button_press,...
'Position',[100 5 80 20]);
clr_trail = uicontrol(fig_1,'String','Clr Trail','callback',@clr_trail_button_press,...
'Position',[200 5 60 20]);
%
home = uicontrol(fig_1,'String','Home','callback',@home_button_press,...
'Position',[280 5 70 20]);
%
% Kinematics Panel
%
K_p = uipanel(fig_1,...
'units','pixels',...
'Position',[20 45 265 200],...
'Title','Kinematics','FontSize',11);
%
% Angle Range Default Name
% Theta 1: 320 (-160 to 160) 90 Waist Joint
% Theta 2: 220 (-110 to 110) -90 Shoulder Joint
% Theta 3: 270 (-135 to 135) -90 Elbow Joint
% Theta 4: 532 (-266 to 266) 0 Wrist Roll
% Theta 5: 200 (-100 to 100) 0 Wrist Bend
% Theta 6: 532 (-266 to 266) 0 Wrist Swivel
t1_home = 90; % offset to define the "home" position as UP.
t2_home = -90;
t3_home = -90;
LD = 105; % Left, used to set the GUI.
HT = 18; % Height
BT = 156; % Bottom
%% GUI buttons for Theta 1. pos is: [left bottom width height]
t1_slider = uicontrol(K_p,'style','slider',...
'Max',160,'Min',-160,'Value',0,...
'SliderStep',[0.05 0.2],...
'callback',@t1_slider_button_press,...
'Position',[LD BT 120 HT]);
t1_min = uicontrol(K_p,'style','text',...
'String','-160',...
'Position',[LD-30 BT+1 25 HT-4]); % L, from bottom, W, H
t1_max = uicontrol(K_p,'style','text',...
'String','+160',...
'Position',[LD+125 BT+1 25 HT-4]); % L, B, W, H
t1_text = uibutton(K_p,'style','text',... % Nice program Doug. Need this
'String','\theta_1',... % due to no TeX in uicontrols.
'Position',[LD-100 BT 20 HT]); % L, B, W, H
% t1_text = uicontrol(K_p,'style','text',... % when matlab fixes uicontrol
% 'String','t1',... % for TeX, then I can use this.
% 'Position',[LD-100 BT 20 HT]); % L, B, W, H
t1_edit = uicontrol(K_p,'style','edit',...
'String',0,...
'callback',@t1_edit_button_press,...
'Position',[LD-75 BT 30 HT]); % L, B, W, H
%
%% GUI buttons for Theta 2.
BT = 126; % Bottom
t2_slider = uicontrol(K_p,'style','slider',...
'Max',115,'Min',-115,'Value',0,... % Mech. stop limits !
'SliderStep',[0.05 0.2],...
'callback',@t2_slider_button_press,...
'Position',[LD BT 120 HT]);
t2_min = uicontrol(K_p,'style','text',...
'String','-110',...
'Position',[LD-30 BT+1 25 HT-4]); % L, from bottom, W, H
t2_max = uicontrol(K_p,'style','text',...
'String','+110',...
'Position',[LD+125 BT+1 25 HT-4]); % L, B, W, H
t2_text = uibutton(K_p,'style','text',...
'String','\theta_2',...
'Position',[LD-100 BT 20 HT]); % L, B, W, H
t2_edit = uicontrol(K_p,'style','edit',...
'String',0,...
'callback',@t2_edit_button_press,...
'Position',[LD-75 BT 30 HT]); % L, B, W, H
%
%% GUI buttons for Theta 3.
BT = 96; % Bottom
t3_slider = uicontrol(K_p,'style','slider',...
'Max',135,'Min',-135,'Value',0,...
'SliderStep',[0.05 0.2],...
'callback',@t3_slider_button_press,...
'Position',[LD BT 120 HT]);
t3_min = uicontrol(K_p,'style','text',...
'String','-135',...
'Position',[LD-30 BT+1 25 HT-4]); % L, from bottom, W, H
t3_max = uicontrol(K_p,'style','text',...
'String','+135',...
'Position',[LD+125 BT+1 25 HT-4]); % L, B, W, H
t3_text = uibutton(K_p,'style','text',...
'String','\theta_3',...
'Position',[LD-100 BT 20 HT]); % L, B, W, H
t3_edit = uicontrol(K_p,'style','edit',...
'String',0,...
'callback',@t3_edit_button_press,...
'Position',[LD-75 BT 30 HT]); % L, B, W, H
%
%% GUI buttons for Theta 4.
BT = 66; % Bottom
t4_slider = uicontrol(K_p,'style','slider',...
'Max',266,'Min',-266,'Value',0,...
'SliderStep',[0.05 0.2],...
'callback',@t4_slider_button_press,...
'Position',[LD BT 120 HT]);
t4_min = uicontrol(K_p,'style','text',...
'String','-266',...
'Position',[LD-30 BT+1 25 HT-4]); % L, from bottom, W, H
t4_max = uicontrol(K_p,'style','text',...
'String','+266',...
'Position',[LD+125 BT+1 25 HT-4]); % L, B, W, H
t4_text = uibutton(K_p,'style','text',...
'String','\theta_4',...
'Position',[LD-100 BT 20 HT]); % L, B, W, H
t4_edit = uicontrol(K_p,'style','edit',...
'String',0,...
'callback',@t4_edit_button_press,...
'Position',[LD-75 BT 30 HT]); % L, B, W, H
%
%% GUI buttons for Theta 5.
BT = 36; % Bottom
t5_slider = uicontrol(K_p,'style','slider',...
'Max',100,'Min',-100,'Value',0,...
'SliderStep',[0.05 0.2],...
'callback',@t5_slider_button_press,...
'Position',[LD BT 120 HT]);
t5_min = uicontrol(K_p,'style','text',...
'String','-100',...
'Position',[LD-30 BT+1 25 HT-4]); % L, from bottom, W, H
t5_max = uicontrol(K_p,'style','text',...
'String','+100',...
'Position',[LD+125 BT+1 25 HT-4]); % L, B, W, H
t5_text = uibutton(K_p,'style','text',...
'String','\theta_5',...
'Position',[LD-100 BT 20 HT]); % L, B, W, H
t5_edit = uicontrol(K_p,'style','edit',...
'String',0,...
'callback',@t5_edit_button_press,...
'Position',[LD-75 BT 30 HT]); % L, B, W, H
%
%% GUI buttons for Theta 6.
BT = 6; % Bottom
t6_slider = uicontrol(K_p,'style','slider',...
'Max',266,'Min',-266,'Value',0,...
'SliderStep',[0.05 0.2],...
'callback',@t6_slider_button_press,...
'Position',[LD BT 120 HT]);
t6_min = uicontrol(K_p,'style','text',...
'String','-266',...
'Position',[LD-30 BT+1 25 HT-4]); % L, from bottom, W, H
t6_max = uicontrol(K_p,'style','text',...
'String','+266',...
'Position',[LD+125 BT+1 25 HT-4]); % L, B, W, H
t6_text = uibutton(K_p,'style','text',...
'String','\theta_6',...
'Position',[LD-100 BT 20 HT]); % L, B, W, H
t6_edit = uicontrol(K_p,'style','edit',...
'String',0,...
'callback',@t6_edit_button_press,...
'Position',[LD-75 BT 30 HT]); % L, B, W, H
%
%% Slider for Theta 1 motion.
%
function t1_slider_button_press(h,dummy)
slider_value = round(get(h,'Value'));
set(t1_edit,'string',slider_value);
T_Old = getappdata(0,'ThetaOld');
t2old = T_Old(2); t3old = T_Old(3); t4old = T_Old(4);
t5old = T_Old(5); t6old = T_Old(6);
pumaANI(slider_value+t1_home,t2old,t3old,t4old,t5old,t6old,10,'n')
end
%
%% Slider for Theta 2 motion.
%
function t2_slider_button_press(h,dummy)
slider_value = round(get(h,'Value'));
set(t2_edit,'string',slider_value);
T_Old = getappdata(0,'ThetaOld');
t1old = T_Old(1); t3old = T_Old(3); t4old = T_Old(4);
t5old = T_Old(5); t6old = T_Old(6);
pumaANI(t1old,slider_value+t2_home,t3old,t4old,t5old,t6old,10,'n')
end
%
%% Slider for Theta 3 motion.
function t3_slider_button_press(h,dummy)
slider_value = round(get(h,'Value'));
set(t3_edit,'string',slider_value);
T_Old = getappdata(0,'ThetaOld');
t1old = T_Old(1); t2old = T_Old(2); t4old = T_Old(4);
t5old = T_Old(5); t6old = T_Old(6);
pumaANI(t1old,t2old,slider_value+t3_home,t4old,t5old,t6old,10,'n')
end
%
%% Slider for Theta 4 motion.
function t4_slider_button_press(h,dummy)
slider_value = round(get(h,'Value'));
set(t4_edit,'string',slider_value);
T_Old = getappdata(0,'ThetaOld');
t1old = T_Old(1); t2old = T_Old(2); t3old = T_Old(3);
t5old = T_Old(5); t6old = T_Old(6);
pumaANI(t1old,t2old,t3old,slider_value,t5old,t6old,10,'n')
end
%
%% Slider for Theta 5 motion.
function t5_slider_button_press(h,dummy)
slider_value = round(get(h,'Value'));
set(t5_edit,'string',slider_value);
T_Old = getappdata(0,'ThetaOld');
t1old = T_Old(1); t2old = T_Old(2); t3old = T_Old(3);
t4old = T_Old(4); t6old = T_Old(6);
pumaANI(t1old,t2old,t3old,t4old,slider_value,t6old,10,'n')
end
%
%% Slider for Theta 6 motion.
function t6_slider_button_press(h,dummy)
slider_value = round(get(h,'Value'));
set(t6_edit,'string',slider_value);
T_Old = getappdata(0,'ThetaOld');
t1old = T_Old(1); t2old = T_Old(2); t3old = T_Old(3);
t4old = T_Old(4); t5old = T_Old(5);
pumaANI(t1old,t2old,t3old,t4old,t5old,slider_value,10,'n')
end
%
%% Edit box for Theta 1 motion.
%
function t1_edit_button_press(h,dummy)
user_entry = check_edit(h,-160,160,0,t1_edit);
set(t1_slider,'Value',user_entry); % slider = text box.
T_Old = getappdata(0,'ThetaOld'); % Current pose
%
t2old = T_Old(2); t3old = T_Old(3); t4old = T_Old(4);
t5old = T_Old(5); t6old = T_Old(6);
%
pumaANI(user_entry+t1_home,t2old,t3old,t4old,t5old,t6old,10,'n')
end
%
%% Edit box for Theta 2 motion.
%
function t2_edit_button_press(h,dummy)
user_entry = check_edit(h,-110,110,0,t2_edit);
set(t2_slider,'Value',user_entry); % slider = text box.
T_Old = getappdata(0,'ThetaOld'); % Current pose
%
t1old = T_Old(1); t3old = T_Old(3); t4old = T_Old(4);
t5old = T_Old(5); t6old = T_Old(6);
%
pumaANI(t1old,user_entry+t2_home,t3old,t4old,t5old,t6old,10,'n')
end
%% Edit box for Theta 3 motion.
%
function t3_edit_button_press(h,dummy)
user_entry = check_edit(h,-135,135,0,t3_edit);
set(t3_slider,'Value',user_entry); % slider = text box.
T_Old = getappdata(0,'ThetaOld'); % Current pose
%
t1old = T_Old(1); t2old = T_Old(2); t4old = T_Old(4);
t5old = T_Old(5); t6old = T_Old(6);
%
pumaANI(t1old,t2old,user_entry+t3_home,t4old,t5old,t6old,10,'n')
end
%%
%% Edit box for Theta 4 motion.
%
function t4_edit_button_press(h,dummy)
user_entry = check_edit(h,-266,266,0,t4_edit);
set(t4_slider,'Value',user_entry); % slider = text box.
T_Old = getappdata(0,'ThetaOld'); % Current pose
%
t1old = T_Old(1); t2old = T_Old(2); t3old = T_Old(3);
t5old = T_Old(5); t6old = T_Old(6);
%
pumaANI(t1old,t2old,t3old,user_entry,t5old,t6old,10,'n')
end
%% Edit box for Theta 5 motion.
%
function t5_edit_button_press(h,dummy)
user_entry = check_edit(h,-100,100,0,t5_edit);
set(t5_slider,'Value',user_entry); % slider = text box.
T_Old = getappdata(0,'ThetaOld'); % Current pose
%
t1old = T_Old(1); t2old = T_Old(2); t3old = T_Old(3);
t4old = T_Old(4); t6old = T_Old(6);
%
pumaANI(t1old,t2old,t3old,t4old,user_entry,t6old,10,'n')
end
%%
%% Edit box for Theta 6 motion.
%
function t6_edit_button_press(h,dummy)
user_entry = check_edit(h,-266,266,0,t6_edit);
set(t6_slider,'Value',user_entry); % slider = text box.
T_Old = getappdata(0,'ThetaOld'); % Current pose
%
t1old = T_Old(1); t2old = T_Old(2); t3old = T_Old(3);
t4old = T_Old(4); t5old = T_Old(5);
%
pumaANI(t1old,t2old,t3old,t4old,t5old,user_entry,10,'n')
end
%%
function user_entry = check_edit(h,min_v,max_v,default,h_edit)
% This function will check the value typed in the text input box
% against min and max values, and correct errors.
%
% h: handle of gui
% min_v min value to check
% max_v max value to check
% default is the default value if user enters non number
% h_edit is the edit value to update.
%
user_entry = str2double(get(h,'string'));
if isnan(user_entry)
errordlg(['You must enter a numeric value, defaulting to ',num2str(default),'.'],'Bad Input','modal')
set(h_edit,'string',default);
user_entry = default;
end
%
if user_entry < min_v
errordlg(['Minimum limit is ',num2str(min_v),' degrees, using ',num2str(min_v),'.'],'Bad Input','modal')
user_entry = min_v;
set(h_edit,'string',user_entry);
end
if user_entry > max_v
errordlg(['Maximum limit is ',num2str(max_v),' degrees, using ',num2str(max_v),'.'],'Bad Input','modal')
user_entry = max_v;
set(h_edit,'string',user_entry);
end
end
%
%% Demo button's callback
function demo_button_press(h,dummy)
%
% disp('pushed demo bottom');
% R = 500;
% x = 1000;
n = 2; % demo ani steps
num = 30; % home to start, and end to home ani steps
% j = 1;
% M = 1000;
for t = 0:.1:7*pi
Px = 30*t*cos(t);
Py = 1200-300*t*(t)/(50*pi);
Pz = 30*t*sin(t);
[theta1,theta2,theta3,theta4,theta5,theta6] = PumaIK(Px,Py,Pz);
if t==0 %move to start of demo
pumaANI(theta1,theta2,theta3-180,0,0,0,num,'n')
end
% Theta 4, 5 & 6 are zero due to plotting at wrist origen.
pumaANI(theta1,theta2,theta3-180,0,0,0,n,'y')
set(t1_edit,'string',round(theta1)); % Update slider and text.
set(t1_slider,'Value',round(theta1));
set(t2_edit,'string',round(theta2));
set(t2_slider,'Value',round(theta2));
set(t3_edit,'string',round(theta3-180));
set(t3_slider,'Value',round(theta3-180));
end
gohome
% pumaANI(90,-90,-90,0,0,0,num,'n')
end
%
%
%%
function home_button_press(h,dummy)
%disp('pushed home bottom');
gohome
end
%
%%
function clr_trail_button_press(h,dummy)
%disp('pushed clear trail bottom');
handles = getappdata(0,'patch_h'); %
Tr = handles(9);
%
setappdata(0,'xtrail',0); % used for trail tracking.
setappdata(0,'ytrail',0); % used for trail tracking.
setappdata(0,'ztrail',0); % used for trail tracking.
%
set(Tr,'xdata',0,'ydata',0,'zdata',0);
end
%
%
function rnd_demo_button_press(h, dummy)
%disp('pushed random demo bottom');
% a = 10; b = 50; x = a + (b-a) * rand(5)
% Angle Range Default Name
% Theta 1: 320 (-160 to 160) 90 Waist Joint
% Theta 2: 220 (-110 to 110) -90 Shoulder Joint
% Theta 3: 270 (-135 to 135) -90 Elbow Joint
% Theta 4: 532 (-266 to 266) 0 Wrist Roll
% Theta 5: 200 (-100 to 100) 0 Wrist Bend
% Theta 6: 532 (-266 to 266) 0 Wrist Swival
t1_home = 90; % offsets to define the "home" postition as UP.
t2_home = -90;
t3_home = -90;
theta1 = -160 + 320*rand(1); % offset for home
theta2 = -110 + 220*rand(1); % in the UP pos.
theta3 = -135 + 270*rand(1);
theta4 = -266 + 532*rand(1);
theta5 = -100 + 200*rand(1);
theta6 = -266 + 532*rand(1);
n = 50;
pumaANI(theta1+t1_home,theta2+t2_home,theta3+t3_home,theta4,theta5,theta6,n,'y')
set(t1_edit,'string',round(theta1)); % Update slider and text.
set(t1_slider,'Value',round(theta1));
set(t2_edit,'string',round(theta2));
set(t2_slider,'Value',round(theta2));
set(t3_edit,'string',round(theta3));
set(t3_slider,'Value',round(theta3));
set(t4_edit,'string',round(theta4));
set(t4_slider,'Value',round(theta4));
set(t5_edit,'string',round(theta5));
set(t5_slider,'Value',round(theta5));
set(t6_edit,'string',round(theta6));
set(t6_slider,'Value',round(theta6));
end
%%
%Here are the functions used for this robot example:
%
%%
% When called this function will simply initialize a plot of the Puma 762
% robot by plotting it in it's home orientation and setting the current
% angles accordingly.
function gohome()
pumaANI(90,-90,-90,0,0,0,20,'n') % show it animate home
%PumaPOS(90,-90,-90,0,0,0) %drive it home, no animate.
set(t1_edit,'string',0);
set(t1_slider,'Value',0); %At the home position, so all
set(t2_edit,'string',0); %sliders and input boxes = 0.
set(t2_slider,'Value',0);
set(t3_edit,'string',0);
set(t3_slider,'Value',0);
set(t4_edit,'string',0);
set(t4_slider,'Value',0);
set(t5_edit,'string',0);
set(t5_slider,'Value',0);
set(t6_edit,'string',0);
set(t6_slider,'Value',0);
setappdata(0,'ThetaOld',[90,-90,-90,0,0,0]);
end
%%
% This function will load the 3D CAD data.
%
function loaddata
% Loads all the link data from file linksdata.mat.
% This data comes from a Pro/E 3D CAD model and was made with cad2matdemo.m
% from the file exchange. All link data manually stored in linksdata.mat