paramtery układu napędowego
Categories:
Wstęp
Interfejs i jego oddziaływanie poszczególnych danych. Dany plik zaprojektowany jest w App Designer i jest podzielony na Design View oraz Code View
DrivetrainSetupUIFigure: Objekt reprezentujący figurę w UI PowertrainDataPanel: Panel przedstawiający dane o układzie napędowym UITable: Tablica przedstawiająca tablicę w UI idle_rpm1minEditField: Miejsce do edytowania obrotów na luzie TorquemultiplierEditField: Miejsce do edytowania mnożnika momentu obrotowego n_max1minEditField: Miejsce do edycji maksymalnych obrotów DrivetrainEfficencyEditField: Miejsce do edycji efektywności układu napędowego LayoutDropDown: Rozwijane UI do wyboru układu LayoutDropDownLabel: Etykieta do rozwijanego elemntu UI PowertrainSwitch: Przycisk do wyboru układu napędowego EPowertrainParametersPanel: Panel zawierający parametry elektryczne układu napędowego InverterEfficiencyEditField: Miejsce do edycji efektywności falownika PowerlimitWEditField: Miejsce do edycji limitu mocy w watach DeleteEngineButton: Przycisk, który usuwa parametry silnika EnginePresetDropDown: Rozwijany element UI do wybory presetów silnika Panel_2: Obiekt reprezentujący panel. z_chaindriveEditField: Obiekt NumericEditField reprezentujący pole edycji dla napędu łańcuchowego. z_sprocketEditField: Obiekt NumericEditField reprezentujący pole edycji dla zębatki. ChaindriveSingleGearsetCheckBox: Obiekt CheckBox reprezentujący pole wyboru dla pojedynczego układu napędowego łańcuchowego. loadPanel: Obiekt Panel reprezentujący panel dla obciążenia. TY20BaselineButton: Obiekt Button reprezentujący przycisk dla podstawowej konfiguracji TY20. SaveButton: Obiekt Button reprezentujący przycisk do zapisu. ResetButton: Obiekt Button reprezentujący przycisk do resetowania. ElectricBaselineButton: Obiekt Button reprezentujący przycisk dla podstawowej konfiguracji elektrycznej. TY19BaselineButton: Obiekt Button reprezentujący przycisk dla podstawowej konfiguracji TY19. ChaindrivePanel: Obiekt Panel reprezentujący panel dla napędu łańcuchowego. i_PEditField: Obiekt NumericEditField reprezentujący pole edycji dla i_P. GearboxPanel: Obiekt Panel reprezentujący panel dla skrzyni biegów. n_downshift1minEditField: Obiekt NumericEditField reprezentujący pole edycji dla obrotów przy redukcji biegów. EnableGearboxCheckBox: Obiekt CheckBox reprezentujący pole wyboru dla włączenia skrzyni biegów. PlotGearboxdataButton: Obiekt Button reprezentujący przycisk do generowania wykresu danych skrzyni biegów. GearboxTable: Obiekt Table reprezentujący tabelę dla danych skrzyni biegów. Button_4: Obiekt Button reprezentujący kolejny przycisk. Button_3: Obiekt Button reprezentujący jeszcze jeden przycisk. n_shift1minEditField: Obiekt NumericEditField reprezentujący pole edycji dla obrotów przy zmianie biegów. t_shiftsEditField: Obiekt NumericEditField reprezentujący pole edycji dla czasu zmiany biegów. UIAxes3: Obiekt UIAxes reprezentujący osie do generowania wykresów. UIAxes2: Obiekt UIAxes reprezentujący kolejne osie do generowania wykresów. UIAxes: Obiekt UIAxes reprezentujący jeszcze inne osie do generowania wykresów.
Klasa Drivetrain reprezentuje obiekt odpowiedzialny za aktualizację wykresu dla krzywych momentu i mocy silnika.
- Obiekt głównej aplikacji
CallingApp
-
Metoda updateMotorGraph(app) aktualizuje wykresy dla jednego silnika. Metoda ta pobiera dane z tabeli UITable, oblicza moc i moment dla każdej wartości obrotów, a następnie rysuje wykresy dla momentu i mocy.
-
Aktualizuje etykietę przekładni i zwraca wartość przekładni
i_tot = updateGearRatio(app);
- Pobiera wartość mnożnika momentu
torque_multiplier = app.TorquemultiplierEditField.Value;
- Pobiera dane z tabeli UITable
data = app.UITable.Data;
- Separuje dane na dwie 1D tablice, dodając 0 na początku, ponieważ obie osie powinny zaczynać się od zera
x = [1; data(:,1)]; n = RPM
y = [0; data(:,2)] * torque_multiplier; M = Moment
- Oblicza moc silnika dla danej wartości obrotów i momentu
p = zeros(1:size(x,1));
for n = 1 : length(x)
p(n) = (y(n) * x(n)) / 9.5488 / 1000;
end
- Czyści wykres UIAxes, aby można go było ponownie utworzyć
cla(app.UIAxes,'reset');
- Ustawia osie
app.UIAxes.XLabel.String='RPM [1/min]';
yyaxis(app.UIAxes,'left');
- Rysuje wykres momentu
plot(app.UIAxes,x,y);
- Zatrzymuje wykres, aby można było narysować nową oś
hold(app.UIAxes);
title(app.UIAxes,"Single Motor");
yyaxis(app.UIAxes,'right');
app.UIAxes.YLabel.String='Moc [kW]';
- Rysuje wykres mocy
plot(app.UIAxes,x,p);
- Wyłącza możliwość przybliżania dla wykresu
disableDefaultInteractivity(app.UIAxes);
- Sprawdza, który układ silnika jest wybrany i dostosowuje liczbę silników
Motorsdropdown = app.LayoutDropDown.Value;
if (Motorsdropdown == "2 Motor RWD")
numberMotors = 2;
elseif (Motorsdropdown == "1 Motor RWD")
numberMotors = 1;
elseif (Motorsdropdown == "AWD")
numberMotors = 4;
end
- Oblicza moment wytworzony przez daną liczbę silników
y_2 = y * numberMotors;
p_2 = zeros(1:length(x));
- Oblicza moc silników dla danej wartości obrotów i momentu
for n = 1 : length(x)
p_2(n) = (y_2(n) * x(n)) / 9.5488 / 1000;
end
- Czyści wykres UIAxes2, aby można go było ponownie utworzyć
cla(app.UIAxes2,'reset');
-
Metoda rysująca wykresy dla przekładni wtórnej. x - Tablica wartości osi X. y_2 - Tablica wartości osi Y dla momentu obrotowego. p_2 - Tablica wartości osi Y dla mocy.
-
Motorsdropdown - Wybrany rodzaj silnika.
(void)drawPlotsWithX:(NSArray *)x y_2:(NSArray *)y_2 p_2:(NSArray *)p_2 Motorsdropdown:(NSString *)Motorsdropdown {
- Aktualizuje przekładnię wtórną.
return Wartość całkowitego przekładniowego stosunku.
(double)updateGearRatio
return i_tot;
- Zmienia schemat kolorów aplikacji.
(void)changeColorScheme
-Poniżej znajdują się zmienne reprezentujące kolory i style aplikacji. PrimaryColor: Kolor podstawowy aplikacji. OnPrimaryColor: Kolor tekstu na tle PrimaryColor. PrimaryVariantColor: Wariant koloru podstawowego aplikacji. OnPrimaryVariantColor: Kolor tekstu na tle PrimaryVariantColor. SecondaryColor: Kolor drugorzędny aplikacji. OnSecondaryColor: Kolor tekstu na tle SecondaryColor. BackgroundColor: Kolor tła aplikacji. OnBackgroundColor: Kolor tekstu na tle BackgroundColor. SurfaceColor: Kolor powierzchni aplikacji. OnSurfaceColor: Kolor tekstu na tle SurfaceColor. ErrorColor: Kolor błędu aplikacji. OnErrorColor: Kolor tekstu na tle ErrorColor. BorderType: Typ obramowania aplikacji. Host_Logo: Logo hosta aplikacji.
- Ustawia kolor tła dla interfejsu użytkownika DrivetrainSetupUIFigure.
app.DrivetrainSetupUIFigure.Color = BackgroundColor;
- Ustawia kolor czcionki dla etykiety Copyright2021BalticRacingbyEricDorniedenLabel.
app.Copyright2021BalticRacingbyEricDorniedenLabel.FontColor = OnBackgroundColor;
- Ustawia kolor czcionki, tła i typ obramowania dla panelu PowertrainDataPanel.
app.PowertrainDataPanel.ForegroundColor = OnBackgroundColor;
app.PowertrainDataPanel.BackgroundColor = BackgroundColor;
app.PowertrainDataPanel.BorderType = BorderType;
- Ustawia kolor czcionki, tła i typ obramowania dla panelu loadPanel.
app.loadPanel.ForegroundColor = OnSurfaceColor;
app.loadPanel.BackgroundColor = SurfaceColor;
app.loadPanel.BorderType = BorderType;
- Ustawia kolor czcionki, tła i typ obramowania dla panelu Panel.
app.Panel.ForegroundColor = OnSurfaceColor;
app.Panel.BackgroundColor = SurfaceColor;
app.Panel.BorderType = BorderType;
- Ustawia kolor czcionki, tła i typ obramowania dla panelu EPowertrainParametersPanel.
app.EPowertrainParametersPanel.ForegroundColor = OnSurfaceColor;
app.EPowertrainParametersPanel.BackgroundColor = SurfaceColor;
app.EPowertrainParametersPanel.BorderType = BorderType;
- Ustawia kolor czcionki, tła i typ obramowania dla panelu ChaindrivePanel.
app.ChaindrivePanel.ForegroundColor = OnSurfaceColor;
app.ChaindrivePanel.BackgroundColor = SurfaceColor;
app.ChaindrivePanel.BorderType = BorderType;
- Ustawia kolor czcionki, tła i typ obramowania dla panelu GearboxPanel.
app.GearboxPanel.ForegroundColor = OnSurfaceColor;
app.GearboxPanel.BackgroundColor = SurfaceColor;
app.GearboxPanel.BorderType = BorderType;
- Ustawia kolor czcionki dla przycisku PowertrainSwitch.
app.PowertrainSwitch.FontColor = OnSurfaceColor;
- Ustawia kolor czcionki dla etykiety LayoutDropDownLabel oraz kolor tła i czcionki dla rozwijanej listy LayoutDropDown.
app.LayoutDropDownLabel.FontColor = OnSurfaceColor;
app.LayoutDropDown.BackgroundColor = PrimaryColor;
app.LayoutDropDown.FontColor = OnPrimaryColor;
Analogicznie są ustawiane inne kolory.
- Funkcja saveData zapisuje dane z aplikacji do obiektu CallingApp. app - Obiekt aplikacji zawierający dane do zapisania.
function saveData(app)
- Zapisuje dane z rozwijanej listy EnginePresetDropDown do obiektu CallingApp.engineData
app.CallingApp.engineData = app.EnginePresetDropDown.Items;
- Zapisuje wartość z pola PowerlimitWEditField do obiektu CallingApp.p_max
app.CallingApp.p_max = app.PowerlimitWEditField.Value;
- Zapisuje wartość z pola DrivetrainEfficencyEditField do obiektu CallingApp.drivetrain_eff
app.CallingApp.drivetrain_eff = app.DrivetrainEfficencyEditField.Value;
Analogicznie są zapisywane inne wartości.
- Sprawdza, który układ silnika jest wybrany i dostosowuje liczbę silników w obiekcie CallingApp.num_motors
var Motorsdropdown = app.LayoutDropDown.Value;
- Wybiera odpowiednią liczbę silników na podstawie wartości wybranej z rozwijanej listy. Motorsdropdown - wartość wybrana z rozwijanej listy
if (Motorsdropdown == "2 Motor RWD") {
app.CallingApp.num_motors = 2;
} else if (Motorsdropdown == "1 Motor RWD") {
app.CallingApp.num_motors = 1;
} else if (Motorsdropdown == "AWD") {
app.CallingApp.num_motors = 4;
}
- Ustawienie elementów rozwijanej listy EnginePresetDropDown na wartości z app.CallingApp.engineData
app.EnginePresetDropDown.Items = app.CallingApp.engineData;
- Ustawienie wartości pola PowerlimitWEditField na app.CallingApp.p_max
app.PowerlimitWEditField.Value = app.CallingApp.p_max;
- Ustawienie wartości pola DrivetrainEfficencyEditField na app.CallingApp.drivetrain_eff
app.DrivetrainEfficencyEditField.Value = app.CallingApp.drivetrain_eff;
- Ustawienie wartości pola TorquemultiplierEditField na app.CallingApp.trq_multiplier
app.TorquemultiplierEditField.Value = app.CallingApp.trq_multiplier;
- Ustawienie danych tabeli GearboxTable na app.CallingApp.i_param
app.GearboxTable.Data = app.CallingApp.i_param;
- Ustawienie wartości pola InverterEfficiencyEditField na app.CallingApp.invertor_eff
app.InverterEfficiencyEditField.Value = app.CallingApp.invertor_eff;
- Ustawienie wartości pola EnableGearboxCheckBox na app.CallingApp.gearbox
app.EnableGearboxCheckBox.Value = app.CallingApp.gearbox;
Analogicznie są ustawiane inne pola wartości.
- Ustawienie tekstu rozwijanej listy EngineLayoutDropDown w zależności od wartości app.CallingApp.num_motors
if (app.CallingApp.num_motors == 1) {
app.LayoutDropDown.Value = "1 Motor RWD";
} else if (app.CallingApp.num_motors == 2) {
app.LayoutDropDown.Value = "2 Motor RWD";
} else if (app.CallingApp.num_motors == 4) {
app.LayoutDropDown.Value = "AWD";
}
- Aktywacja/dezaktywacja parametrów E/C Panelu w zależności od wartości pola PowertrainSwitch
if (app.PowertrainSwitch.Value == "Electric") {
app.PowerlimitWEditField.Enable = true;
app.InverterEfficiencyEditField.Enable = true;
} else {
app.PowerlimitWEditField.Enable = false;
app.InverterEfficiencyEditField.Enable = false;
}
- Dla każdego wiersza w tabeli, funkcja wywołuje funkcję updateGearRatio(app) w celu obliczenia całkowitego przełożenia. Następnie funkcja aktualizuje wartości w drugiej i trzeciej kolumnie tabeli na podstawie obliczonych wartości.
for i = 1:size(app.GearboxTable.Data, 1)
i_tot = updateGearRatio(app);
app.GearboxTable.Data(i,2) = app.GearboxTable.Data(i,1) * i_tot;
app.GearboxTable.Data(i,3) = app.n_max1minEditField.Value/(30/pi*app.GearboxTable.Data(i,2)/app.CallingApp.R0)*3.6;
- Włącza możliwość edycji pól związanych z przesunięciami biegów.
app.t_shiftsEditField.Enable
- Włącza lub wyłącza możliwość edycji etykiety pola t_shiftsEditField.
app.t_shiftsEditFieldLabel.Enable
- Włącza lub wyłącza możliwość edycji pola n_shift1minEditField.
app.n_shift1minEditField.Enable
Analogicznie są włączabne możliwości edycji w innych polach.
- Kod wykonywany po utworzeniu komponentu
function startupFcn(app, mainapp)
- Aktualizuje wykres momentu i mocy silnika na podstawie danych z UITable
updateMotorGraph(app);
- Callback edycji komórki: UITable
function UITableCellEdit(app, event)
updateMotorGraph(app);
- Funkcja wywoływana po zmianie wartości: LayoutDropDown
function LayoutDropDownValueChanged(app, event)
updateMotorGraph(app);
- Funkcja wywoływana po zmianie wartości: TorquemultiplierEditField
function TorquemultiplierEditFieldValueChanged(app, event)
updateMotorGraph(app);
Analogicznie są wywoływane inne funckje
- Dodaje wpis do UITable
data = app.UITable.Data;
app.UITable.Data = [data; [0 0]];
- Funkcja wywoływana po naciśnięciu przycisku Button_2. Usuwa ostatni wpis w tabeli UITable.
data = app.UITable.Data;
data((length(data)),:) = [];
app.UITable.Data = data;
- Funkcja wywoływana przy próbie zamknięcia okna DrivetrainSetupUIFigure. Zapisuje dane i wyłącza przycisk Drivetrain Options w głównym oknie aplikacji.
function DrivetrainSetupUIFigureCloseRequest(app, event)
saveData(app);
app.CallingApp.DrivetrainButton.Enable = 'on';
delete(app)
- Funkcja wywoływana po naciśnięciu przycisku SaveButton.
function SaveButtonPushed(app, event)
saveData(app);
- Funkcja wywoływana po naciśnięciu przycisku ResetButton.
function ResetButtonPushed(app, event)
loadData(app);
- Funkcja wywoływana po zmianie wartości pola InverterEfficiencyEditField. Aktualizuje wykres silnika.
function InverterEfficiencyEditFieldValueChanged(app, event)
updateMotorGraph(app);
- Funkcja wywoływana po zmianie wartości przełącznika PowertrainSwitch. Aktualizuje parametry zależne od rodzaju napędu.
function PowertrainSwitchValueChanged(app, event)
value = app.PowertrainSwitch.Value;
if value == "Electric"
app.PowerlimitWEditField.Enable = true;
app.InverterEfficiencyEditField.Enable = true;
app.CallingApp.ptype = 1;
else
app.PowerlimitWEditField.Enable = false;
app.InverterEfficiencyEditField.Enable = false;
app.CallingApp.ptype = 0;
end
updateMotorGraph(app)
updateGearRatio(app)
- Funkcja wywoływana po naciśnięciu przycisku Button_3. Dodaje nowy wiersz do tabeli GearboxTable.
function Button_3Pushed(app, event)
data = app.GearboxTable.Data;
app.GearboxTable.Data = [data; 0,0,0];
- Funkcja wywoływana po naciśnięciu przycisku Button_4. Usuwa ostatni wpis w tabeli GearboxTable.
function Button_4Pushed(app, event)
Deletes the last entry in the UITable
data = app.GearboxTable.Data;
data((size(data,1)),:,:) = [];
app.GearboxTable.Data = data;
- Funkcja wywoływana po zmianie wartości pola i_PEditField. Aktualizuje wykres silnika.
function i_PEditFieldValueChanged(app, event)
updateMotorGraph(app);
- Funkcja wywoływana po naciśnięciu przycisku PlotGearboxdataButton. Wyświetla wykres danych z tabeli GearboxTable.
function PlotGearboxdataButtonPushed(app, event)
plotGearboxData(app.GearboxTable.Data,app.n_shift1minEditField.Value,app.t_shiftsEditField.Value,app.n_max1minEditField.Value);
- Funkcja wywoływana po edycji komórki w tabeli GearboxTable. Aktualizuje przekładnie.
function GearboxTableCellEdit(app, event)
updateGearRatios(app);
- Funkcja wywoływana po zmianie wartości pola EnableGearboxCheckBox. Aktualizuje przekładnie.
function EnableGearboxCheckBoxValueChanged(app, event)
updateGearbox(app);
- Funkcja wywoływana po naciśnięciu przycisku TY19BaselineButton. Ustawia wartości związane z układem napędowym dla trybu spalinowego, ładuje dane z pliku “Dynojet Momentenverlauf.mat”, ustawia parametry układu napędowego dla symulacji oraz wywołuje funkcję loadData(app) w celu załadowania danych.
function TY19BaselineButtonPushed(app, event)
app.PowertrainSwitch.Value = "Combustion";
app.PowerlimitWEditField.Enable = false;
app.InverterEfficiencyEditField.Enable = false;
app.EnableGearboxCheckBox.Value = 1;
triumphEngine = load('Dynojet Momentenverlauf.mat');
ptype - Typ napędu. n_max - Maksymalna prędkość obrotowa. i_param - Parametry prądowe. i_P - Wzmocnienie regulatora prądu. z_chaindrive - Liczba zębów w łańcuchu napędowym. z_sprocket - Liczba zębów w zębatce. gearbox - Przełożenie skrzyni biegów. engine_param - Parametry silnika. num_motors - Liczba silników. idleRPM - Prędkość obrotowa na biegu jałowym.
app.CallingApp.ptype = 0;
app.CallingApp.n_max = 11000;
app.CallingApp.i_param = [1.857; 1.565; 1.35; 1.238; 1.136];
app.CallingApp.i_P = 1.848;
app.CallingApp.z_chaindrive = 37;
app.CallingApp.z_sprocket = 11;
app.CallingApp.gearbox = 1;
app.CallingApp.engine_param = [triumphEngine.n(:) triumphEngine.M(:)];
app.CallingApp.num_motors = 1;
app.CallingApp.idleRPM = 2000;
loadData(app);
end
- Funkcja wywoływana po naciśnięciu przycisku ElectricBaselineButton, ustawia wartości związane z układem napędowym dla trybu elektrycznego, umożliwia edycję pól PowerlimitWEditField i InverterEfficiencyEditField, wyłącza pole EnableGearboxCheckBox, ustawia parametry układu napędowego dla symulacji oraz wywołuje funkcję loadData(app) w celu załadowania danych.
function ElectricBaselineButtonPushed(app, event)
app.PowertrainSwitch.Value = "Electric";
app.PowerlimitWEditField.Enable = true;
app.InverterEfficiencyEditField.Enable = true;
app.EnableGearboxCheckBox.Value = 0;
app.CallingApp.ptype = 1;
app.CallingApp.n_max = 6000;
app.CallingApp.i_param = 1;
app.CallingApp.i_P = 1;
app.CallingApp.z_chaindrive = 66;
app.CallingApp.z_sprocket = 17;
app.CallingApp.gearbox = 0;
app.CallingApp.engine_param = [0 140; 1000 140; 2000 138; 3000 136; 4000 135; 5000 127; 6000 115];
app.CallingApp.num_motors = 2;
app.CallingApp.idleRPM = 0;
loadData(app);
end
- Funkcja wywoływana po naciśnięciu przycisku TY20BaselineButton, ustawia wartości związane z układem napędowym dla trybu spalania, ładuje dane z pliku “Dynojet Momentenverlauf.mat”, Ustawia parametry układu napędowego dla symulacji oraz wywołuje funkcję loadData(app) w celu załadowania danych.
function TY20BaselineButtonPushed(app, event)
app.PowertrainSwitch.Value = "Combustion";
app.PowerlimitWEditField.Enable = false;
app.InverterEfficiencyEditField.Enable = false;
app.EnableGearboxCheckBox.Value = 1;
triumphEngine = load('Dynojet Momentenverlauf.mat');
app.CallingApp.ptype = 0;
app.CallingApp.n_max = 11000;
app.CallingApp.i_param = [2.579; 1.720; 1.429; 1.238];
app.CallingApp.i_P = 1.848;
app.CallingApp.z_chaindrive = 37;
app.CallingApp.z_sprocket = 11;
app.CallingApp.gearbox = 1;
app.CallingApp.engine_param = [triumphEngine.n(:) triumphEngine.M(:)];
app.CallingApp.num_motors = 1;
app.CallingApp.idleRPM = 2000;
loadData(app);
- Funkcja wywoływana po zmianie wartości pola ChaindriveSingleGearsetCheckBox, ustawia wartość zmiennej i_chain na podstawie wartości pól związanych z przekładnią, jeśli pole ChaindriveSingleGearsetCheckBox jest zaznaczone, włącza pole związane z ilością zębów koła zębatego.
function ChaindriveSingleGearsetCheckBoxValueChanged(app, event)
value = app.ChaindriveSingleGearsetCheckBox.Value;
if value
app.i_chain = app.z_sprocketEditField.Value * app.z_chaindriveEditField.Value;
app.z_sprocketEditField.Enable = 'true';
else
app.i_chain = 1;
- Funkcja wywoływana po zmianie wartości w polu EnginePresetDropDown, aktualizuje parametry silnika na podstawie wybranego silnika oraz Aktualizuje interfejs użytkownika.
function EnginePresetDropDownValueChanged(app, event)
value = app.EnginePresetDropDown.Value;
- Wczytaj plik .mat dla wybranego silnika
engine = load([value '.mat']);
- Wczytaj parametry silnika z pliku .mat
app.CallingApp.engine_param = [engine.n(:) engine.M(:)];
- Funkcja wywoływana po naciśnięciu przycisku SaveEngineButton, zapisuje zmienne silnika do pliku .mat oraz dodaje nowy silnik do listy rozwijanej, jeśli nazwa nie jest już częścią listy.
function SaveEngineButtonPushed(app, event)
data = app.UITable.Data;
n = data(:,1);
M = data(:,2);
- Otwiera okno dialogowe do zapisu pliku
[filename, pathname] = uiputfile('*.mat','Zapisz zmienne silnika jako','NowySilnik.mat');
newfilename = fullfile(pathname, filename);
- Zapisuje plik z podanymi parametrami
save(newfilename, 'n','M');
- Dodaje nowy silnik do listy rozwijanej, jeśli nazwa nie jest już częścią listy.
if ~strcmp(app.EnginePresetDropDown.Items, filename(1:end-4))
data = app.EnginePresetDropDown.Items;
data(end) = [];
app.EnginePresetDropDown.Items = [data filename(1:end-4) "NowySilnik"];
app.CallingApp.engineData = app.EnginePresetDropDown.Items;
- Funkcja wywoływana po naciśnięciu przycisku DeleteEngineButton, usuwa wybrany silnik z listy rozwijanej oraz aktualizuje interfejs użytkownika.
function DeleteEngineButtonPushed(app, event)
selected = app.EnginePresetDropDown.Value;
- Sprawdza, czy użytkownik próbuje usunąć wpis “NowySilnik”
if selected == "NowySilnik"
app.CallingApp.engine_param = [0 0; 1000 0; 2000 0; 3000 0; 4000 0; 5000 0; 6000 0];
return;
end
data = app.EnginePresetDropDown.Items;
- Znajduje indeks wybranego silnika i usuwa go z listy
ind = find(strcmp(data,selected));
data(ind) = [];
- Aktualizuj listę rozwijaną
app.EnginePresetDropDown.Items = data;
app.CallingApp.engineData = data;
- Przełącza na pierwszy silnik
app.EnginePresetDropDown.Value = app.EnginePresetDropDown.Items(1);
- Tworzenie UIFigure i komponentów
function createComponents(app)
- Ustawia widoczność figury na wyłączoną.
app.DrivetrainSetupUIFigure = uifigure('Visible', 'off');
- Ustawia pozycję figury na [100 100 1107 764].
app.DrivetrainSetupUIFigure.Position = [100 100 1107 764];
- Ustawia nazwę figury na ‘Drivetrain Setup’.
app.DrivetrainSetupUIFigure.Name = 'Drivetrain Setup';
- Ustawia ikonę figury na ‘Baltic.png’.
app.DrivetrainSetupUIFigure.Icon = 'Baltic.png';
- Wyłącza możliwość zmiany rozmiaru figury.
app.DrivetrainSetupUIFigure.Resize = 'off';
- Ustawia funkcję wywoływaną przy próbie zamknięcia figury na DrivetrainSetupUIFigureCloseRequest.
app.DrivetrainSetupUIFigure.CloseRequestFcn = createCallbackFcn(app, @DrivetrainSetupUIFigureCloseRequest, true);
- Tworzenie panelu PowertrainDataPanel
app.PowertrainDataPanel = uipanel(app.DrivetrainSetupUIFigure);
app.PowertrainDataPanel.Title = 'Dane napędu';
app.PowertrainDataPanel.Position = [2 1 1107 764];
- Tworzenie UIAxes
app.UIAxes = uiaxes(app.PowertrainDataPanel);
title(app.UIAxes, 'Pojedynczy silnik')
xlabel(app.UIAxes, 'RPM [1/min]')
ylabel(app.UIAxes, 'Moment obrotowy [Nm]')
app.UIAxes.XTickLabelRotation = 0;
app.UIAxes.YTickLabelRotation = 0;
app.UIAxes.ZTickLabelRotation = 0;
app.UIAxes.Position = [552 535 525 185];
- Tworzenie UIAxes2
app.UIAxes2 = uiaxes(app.PowertrainDataPanel);
title(app.UIAxes2, 'Tytuł')
xlabel(app.UIAxes2, 'X')
ylabel(app.UIAxes2, 'Y')
app.UIAxes2.XTickLabelRotation = 0;
app.UIAxes2.YTickLabelRotation = 0;
app.UIAxes2.ZTickLabelRotation = 0;
app.UIAxes2.Position = [552 130 525 185];
- Tworzenie UIAxes3
app.UIAxes3 = uiaxes(app.PowertrainDataPanel);
title(app.UIAxes3, 'Tytuł')
xlabel(app.UIAxes3, 'X')
ylabel(app.UIAxes3, 'Y')
app.UIAxes3.XTickLabelRotation = 0;
app.UIAxes3.YTickLabelRotation = 0;
app.UIAxes3.ZTickLabelRotation = 0;
app.UIAxes3.Position = [552 333 525 185];
- Tworzenie panelu GearboxPanel
app.GearboxPanel = uipanel(app.PowertrainDataPanel);
app.GearboxPanel.TitlePosition = 'centertop';
app.GearboxPanel.Title = 'Skrzynia biegów';
app.GearboxPanel.Position = [263 83 257 480];
- Tworzenie etykiety t_shiftsEditFieldLabel
app.t_shiftsEditFieldLabel = uilabel(app.GearboxPanel);
app.t_shiftsEditFieldLabel.HorizontalAlignment = 'right';
app.t_shiftsEditFieldLabel.Position = [77 398 55 23];
app.t_shiftsEditFieldLabel.Text = 't_shift [s]';
- Tworzenie pola edycyjnego t_shiftsEditField
app.t_shiftsEditField = uieditfield(app.GearboxPanel, 'numeric');
app.t_shiftsEditField.LowerLimitInclusive = 'off';
app.t_shiftsEditField.UpperLimitInclusive = 'off';
app.t_shiftsEditField.Limits = [0 Inf];
app.t_shiftsEditField.Position = [150 399 87 22];
app.t_shiftsEditField.Value = 0.035;
- Tworzenie etykiety n_shift1minEditFieldLabel
app.n_shift1minEditFieldLabel = uilabel(app.GearboxPanel);
app.n_shift1minEditFieldLabel.HorizontalAlignment = 'right';
app.n_shift1minEditFieldLabel.Position = [51 371 80 23];
app.n_shift1minEditFieldLabel.Text = 'n_shift [1/min]';
- Tworzenie pola edycyjnego n_shift1minEditField
app.n_shift1minEditField = uieditfield(app.GearboxPanel, 'numeric');
app.n_shift1minEditField.UpperLimitInclusive = 'off';
app.n_shift1minEditField.Limits = [1 Inf];
app.n_shift1minEditField.ValueDisplayFormat = '%.0f';
app.n_shift1minEditField.Tooltip = {''};
app.n_shift1minEditField.Position = [150 372 87 22];
app.n_shift1minEditField.Value = 10500;
- Tworzenie przycisku Button_3
app.Button_3 = uibutton(app.GearboxPanel, 'push');
app.Button_3.ButtonPushedFcn = createCallbackFcn(app, @Button_3Pushed, true);
app.Button_3.Position = [10 26 37 22];
app.Button_3.Text = '+';
- Tworzenie przycisku Button_4
app.Button_4 = uibutton(app.GearboxPanel, 'push');
app.Button_4.ButtonPushedFcn = createCallbackFcn(app, @Button_4Pushed, true);
app.Button_4.Position = [47 26 37 22];
app.Button_4.Text = '-';
- Tworzenie tabeli GearboxTable
app.GearboxTable = uitable(app.GearboxPanel);
app.GearboxTable.ColumnName = {'Gear Ratio'; 'Final Ratio'; 'Vmax [km/h]'};
app.GearboxTable.RowName = {};
app.GearboxTable.ColumnEditable = [true false false];
app.GearboxTable.CellEditCallback = createCallbackFcn(app, @GearboxTableCellEdit, true);
app.GearboxTable.Position = [7 47 245 282];
- Tworzenie przycisku PlotGearboxdataButton
app.PlotGearboxdataButton = uibutton(app.GearboxPanel, 'push');
app.PlotGearboxdataButton.ButtonPushedFcn = createCallbackFcn(app, @PlotGearboxdataButtonPushed, true);
app.PlotGearboxdataButton.Position = [136 14 112 22];
app.PlotGearboxdataButton.Text = 'Plot Gearbox data';
- Tworzenie pola wyboru EnableGearboxCheckBox
app.EnableGearboxCheckBox = uicheckbox(app.GearboxPanel);
app.EnableGearboxCheckBox.ValueChangedFcn = createCallbackFcn(app, @EnableGearboxCheckBoxValueChanged, true);
app.EnableGearboxCheckBox.Text = 'Enable Gearbox';
app.EnableGearboxCheckBox.Position = [7 435 109 22];
- Tworzenie etykiety n_downshift1minEditFieldLabel
app.n_downshift1minEditFieldLabel = uilabel(app.GearboxPanel);
app.n_downshift1minEditFieldLabel.HorizontalAlignment = 'right';
app.n_downshift1minEditFieldLabel.Position = [15 344 116 23];
app.n_downshift1minEditFieldLabel.Text = 'n_downshift [1/min]';
- Tworzenie pola edycyjnego n_downshift1minEditField
app.n_downshift1minEditField = uieditfield(app.GearboxPanel, 'numeric');
app.n_downshift1minEditField.UpperLimitInclusive = 'off';
app.n_downshift1minEditField.Limits = [1 Inf];
app.n_downshift1minEditField.ValueDisplayFormat = '%.0f';
app.n_downshift1minEditField.Tooltip = {''};
app.n_downshift1minEditField.Position = [150 345 87 22];
app.n_downshift1minEditField.Value = 6000;
- Tworzenie panelu ChaindrivePanel
app.ChaindrivePanel = uipanel(app.PowertrainDataPanel);
app.ChaindrivePanel.Title = 'Chaindrive';
app.ChaindrivePanel.Position = [264 576 256 162];
- Tworzenie etykiety i_PLabel
app.i_PLabel = uilabel(app.ChaindrivePanel);
app.i_PLabel.HorizontalAlignment = 'right';
app.i_PLabel.Position = [136 112 55 23];
app.i_PLabel.Text = 'i_P [-]';
- Tworzenie pola edycyjnego i_PEditField
app.i_PEditField = uieditfield(app.ChaindrivePanel, 'numeric');
app.i_PEditField.LowerLimitInclusive = 'off';
app.i_PEditField.UpperLimitInclusive = 'off';
app.i_PEditField.Limits = [0 Inf];
app.i_PEditField.ValueChangedFcn = createCallbackFcn(app, @i_PEditFieldValueChanged, true);
app.i_PEditField.Position = [200 112 48 22];
app.i_PEditField.Value = 1;
- Tworzenie panelu loadPanel
app.loadPanel = uipanel(app.PowertrainDataPanel);
app.loadPanel.Title = 'load';
app.loadPanel.Position = [566 42 524 56];
- Tworzenie przycisku TY19BaselineButton
app.TY19BaselineButton = uibutton(app.loadPanel, 'push');
app.TY19BaselineButton.ButtonPushedFcn = createCallbackFcn(app, @TY19BaselineButtonPushed, true);
app.TY19BaselineButton.Position = [14 8 100 22];
app.TY19BaselineButton.Text = 'TY-19 Baseline';
- Tworzenie przycisku ElectricBaselineButton
app.ElectricBaselineButton = uibutton(app.loadPanel, 'push');
app.ElectricBaselineButton.ButtonPushedFcn = createCallbackFcn(app, @ElectricBaselineButtonPushed, true);
app.ElectricBaselineButton.Position = [232 8 108 22];
app.ElectricBaselineButton.Text = 'Electric Baseline';
- Tworzenie przycisku ResetButton
app.ResetButton = uibutton(app.loadPanel, 'push');
app.ResetButton.ButtonPushedFcn = createCallbackFcn(app, @ResetButtonPushed, true);
app.ResetButton.FontSize = 14;
app.ResetButton.Position = [352 6 56 26];
app.ResetButton.Text = 'Reset';
- Tworzenie przycisku SaveButton
app.SaveButton = uibutton(app.loadPanel, 'push');
app.SaveButton.ButtonPushedFcn = createCallbackFcn(app, @SaveButtonPushed, true);
app.SaveButton.FontSize = 14;
app.SaveButton.Position = [415 6 99 26];
app.SaveButton.Text = 'Save';
- Tworzenie przycisku TY20BaselineButton
app.TY20BaselineButton = uibutton(app.loadPanel, 'push');
app.TY20BaselineButton.ButtonPushedFcn = createCallbackFcn(app, @TY20BaselineButtonPushed, true);
app.TY20BaselineButton.Position = [123 8 100 22];
app.TY20BaselineButton.Text = 'TY-20 Baseline';
- Tworzenie panelu Panel_2
app.Panel_2 = uipanel(app.PowertrainDataPanel);
app.Panel_2.Position = [264 575 256 107];
- Tworzenie CheckBoxa dla napędu łańcuchowego / pojedynczego układu biegów
app.ChaindriveSingleGearsetCheckBox = uicheckbox(app.Panel_2);
app.ChaindriveSingleGearsetCheckBox.ValueChangedFcn = createCallbackFcn(app, @ChaindriveSingleGearsetCheckBoxValueChanged, true);
app.ChaindriveSingleGearsetCheckBox.Text = {'Napęd łańcuchowy /'; 'Pojedynczy układ biegów'};
app.ChaindriveSingleGearsetCheckBox.Position = [6 74 101 28];
- Tworzenie etykiety dla pola edycji zębów koła zębatego
app.z_sprocketEditFieldLabel = uilabel(app.Panel_2);
app.z_sprocketEditFieldLabel.HorizontalAlignment = 'right';
app.z_sprocketEditFieldLabel.Position = [112 77 78 22];
app.z_sprocketEditFieldLabel.Text = 'z_sprocket [-]';
- Tworzenie pola edycji zębów koła zębatego
app.z_sprocketEditField = uieditfield(app.Panel_2, 'numeric');
app.z_sprocketEditField.UpperLimitInclusive = 'off';
app.z_sprocketEditField.Limits = [1 Inf];
app.z_sprocketEditField.ValueChangedFcn = createCallbackFcn(app, @z_sprocketEditFieldValueChanged, true);
app.z_sprocketEditField.Position = [198 77 49 22];
app.z_sprocketEditField.Value = 17;
- Tworzenie etykiety dla pola edycji zębów napędu łańcuchowego
app.z_chaindriveEditFieldLabel = uilabel(app.Panel_2);
app.z_chaindriveEditFieldLabel.HorizontalAlignment = 'right';
app.z_chaindriveEditFieldLabel.Position = [103 43 87 22];
app.z_chaindriveEditFieldLabel.Text = 'z_chaindrive [-]';
- Tworzenie pola edycji zębów napędu łańcuchowego
app.z_chaindriveEditField = uieditfield(app.Panel_2, 'numeric');
app.z_chaindriveEditField.UpperLimitInclusive = 'off';
app.z_chaindriveEditField.Limits = [1 Inf];
app.z_chaindriveEditField.ValueChangedFcn = createCallbackFcn(app, @z_chaindriveEditFieldValueChanged, true);
app.z_chaindriveEditField.Position = [198 43 49 22];
app.z_chaindriveEditField.Value = 66;
- Tworzenie etykiety dla współczynnika przekładni
app.GearRatioLabel = uilabel(app.Panel_2);
app.GearRatioLabel.Position = [159 8 89 22];
app.GearRatioLabel.Text = 'Gear Ratio';
- Tworzenie etykiety dla rozwijanej listy wyboru silnika
app.EnginePresetDropDownLabel = uilabel(app.PowertrainDataPanel);
app.EnginePresetDropDownLabel.HorizontalAlignment = 'right';
app.EnginePresetDropDownLabel.Position = [21 378 81 22];
app.EnginePresetDropDownLabel.Text = 'Engine Preset';
- Tworzenie rozwijanej listy wyboru silnika
app.EnginePresetDropDown = uidropdown(app.PowertrainDataPanel);
app.EnginePresetDropDown.Items = {'Triumph_D67LD', 'EMRAX_188_TorqueData_Peak', 'EMRAX_208_TorqueData_Peak', 'Emrax 228', 'Emrax 268', 'Emrax 348', 'Rotax_125_Junior_MAX_evo', 'Rotax_125_MAX_DD2_evo', 'Rotax_125_MAX_evo', 'new Engine'};
app.EnginePresetDropDown.ValueChangedFcn = createCallbackFcn(app, @EnginePresetDropDownValueChanged, true);
app.EnginePresetDropDown.Position = [112 378 135 22];
app.EnginePresetDropDown.Value = 'Triumph_D67LD';
- Tworzenie przycisku do usuwania silnika
app.DeleteEngineButton = uibutton(app.PowertrainDataPanel, 'push');
app.DeleteEngineButton.ButtonPushedFcn = createCallbackFcn(app, @DeleteEngineButtonPushed, true);
app.DeleteEngineButton.Tooltip = {'Usuwa aktualnie wybrany silnik, jeśli pozostało więcej niż jeden typ silnika.'};
app.DeleteEngineButton.Position = [155 97 91 22];
app.DeleteEngineButton.Text = 'Delete Engine';
- Tworzenie przycisku do zapisywania silnika
app.SaveEngineButton = uibutton(app.PowertrainDataPanel, 'push');
app.SaveEngineButton.ButtonPushedFcn = createCallbackFcn(app, @SaveEngineButtonPushed, true);
app.SaveEngineButton.Position = [68 97 84 22];
app.SaveEngineButton.Text = 'Save Engine';
- Tworzenie panelu dla parametrów napędu elektrycznego
app.EPowertrainParametersPanel = uipanel(app.PowertrainDataPanel);
app.EPowertrainParametersPanel.TitlePosition = 'centertop';
app.EPowertrainParametersPanel.Title = 'E Powertrain Parameters';
app.EPowertrainParametersPanel.Position = [18 411 230 92];
- Tworzenie etykiety dla pola edycji limitu mocy
app.PowerlimitWEditFieldLabel = uilabel(app.EPowertrainParametersPanel);
app.PowerlimitWEditFieldLabel.HorizontalAlignment = 'right';
app.PowerlimitWEditFieldLabel.Position = [33 43 86 22];
app.PowerlimitWEditFieldLabel.Text = 'Power limit [W]';
- Tworzenie pola edycji limitu mocy
app.PowerlimitWEditField = uieditfield(app.EPowertrainParametersPanel, 'numeric');
app.PowerlimitWEditField.LowerLimitInclusive = 'off';
app.PowerlimitWEditField.UpperLimitInclusive = 'off';
app.PowerlimitWEditField.Limits = [0 Inf];
app.PowerlimitWEditField.ValueDisplayFormat = '%.0f';
app.PowerlimitWEditField.Position = [136 43 87 22];
app.PowerlimitWEditField.Value = 80000;
- Tworzenie etykiety dla pola edycji sprawności falownika
app.InverterEfficiencyEditFieldLabel = uilabel(app.EPowertrainParametersPanel);
app.InverterEfficiencyEditFieldLabel.HorizontalAlignment = 'right';
app.InverterEfficiencyEditFieldLabel.Position = [1 12 116 22];
app.InverterEfficiencyEditFieldLabel.Text = 'Inverter Efficiency [-]';
- Tworzenie pola edycji sprawności falownika
app.InverterEfficiencyEditField = uieditfield(app.EPowertrainParametersPanel, 'numeric');
app.InverterEfficiencyEditField.LowerLimitInclusive = 'off';
app.InverterEfficiencyEditField.UpperLimitInclusive = 'off';
app.InverterEfficiencyEditField.Limits = [0 Inf];
app.InverterEfficiencyEditField.ValueChangedFcn = createCallbackFcn(app, @InverterEfficiencyEditFieldValueChanged, true);
app.InverterEfficiencyEditField.Position = [137 12 86 22];
app.InverterEfficiencyEditField.Value = 0.95;
- Tworzenie panelu
app.Panel = uipanel(app.PowertrainDataPanel);
app.Panel.Title = 'Panel';
app.Panel.Position = [17 517 227 220];
- Tworzenie przełącznika dla wyboru napędu
app.PowertrainSwitch = uiswitch(app.Panel, 'slider');
app.PowertrainSwitch.Items = {'Electric', 'Combustion'};
app.PowertrainSwitch.ValueChangedFcn = createCallbackFcn(app, @PowertrainSwitchValueChanged, true);
app.PowertrainSwitch.Position = [85 170 45 20];
app.PowertrainSwitch.Value = 'Electric';
- Tworzenie etykiety dla rozwijanej listy wyboru układu
app.LayoutDropDownLabel = uilabel(app.Panel);
app.LayoutDropDownLabel.HorizontalAlignment = 'right';
app.LayoutDropDownLabel.Position = [40 132 42 22];
app.LayoutDropDownLabel.Text = 'Layout';
- Tworzenie rozwijanej listy rozmieszczenia napędu.
app.LayoutDropDown = uidropdown(app.Panel);
app.LayoutDropDown.Items = {'2 Motor RWD', '1 Motor RWD', 'AWD'};
app.LayoutDropDown.ValueChangedFcn = createCallbackFcn(app, @LayoutDropDownValueChanged, true);
app.LayoutDropDown.Position = [93 132 107 22];
app.LayoutDropDown.Value = '2 Motor RWD';
- Tworzenie etykiety pola edycji dla sprawności układu napędowego.
app.DrivetrainEfficencyEditFieldLabel = uilabel(app.Panel);
app.DrivetrainEfficencyEditFieldLabel.HorizontalAlignment = 'right';
app.DrivetrainEfficencyEditFieldLabel.Position = [22 98 123 22];
app.DrivetrainEfficencyEditFieldLabel.Text = 'Sprawność układu napędowego [-]';
- Tworzenie pola edycji dla sprawności układu napędowego.
app.DrivetrainEfficencyEditField = uieditfield(app.Panel, 'numeric');
app.DrivetrainEfficencyEditField.LowerLimitInclusive = 'off';
app.DrivetrainEfficencyEditField.Limits = [0 1];
app.DrivetrainEfficencyEditField.ValueChangedFcn = createCallbackFcn(app, @DrivetrainEfficencyEditFieldValueChanged, true);
app.DrivetrainEfficencyEditField.Position = [155 98 52 22];
app.DrivetrainEfficencyEditField.Value = 0.95;
- Tworzenie etykiety pola edycji dla maksymalnej prędkości obrotowej.
app.n_max1minEditFieldLabel = uilabel(app.Panel);
app.n_max1minEditFieldLabel.HorizontalAlignment = 'right';
app.n_max1minEditFieldLabel.Position = [51 68 81 22];
app.n_max1minEditFieldLabel.Text = 'n_max [1/min]';
- Tworzenie pola edycji dla maksymalnej prędkości obrotowej.
app.n_max1minEditField = uieditfield(app.Panel, 'numeric');
app.n_max1minEditField.UpperLimitInclusive = 'off';
app.n_max1minEditField.Limits = [1 Inf];
app.n_max1minEditField.ValueDisplayFormat = '%.0f';
app.n_max1minEditField.Position = [155 68 53 22];
app.n_max1minEditField.Value = 6000;
- Tworzenie etykiety pola edycji dla mnożnika momentu obrotowego.
app.TorquemultiplierEditFieldLabel = uilabel(app.Panel);
app.TorquemultiplierEditFieldLabel.HorizontalAlignment = 'right';
app.TorquemultiplierEditFieldLabel.Position = [20 38 108 22];
app.TorquemultiplierEditFieldLabel.Text = 'Mnożnik momentu obrotowego [-]';
- Tworzenie pola edycji dla mnożnika momentu obrotowego.
app.TorquemultiplierEditField = uieditfield(app.Panel, 'numeric');
app.TorquemultiplierEditField.LowerLimitInclusive = 'off';
app.TorquemultiplierEditField.UpperLimitInclusive = 'off';
app.TorquemultiplierEditField.Limits = [0 Inf];
app.TorquemultiplierEditField.ValueChangedFcn = createCallbackFcn(app, @TorquemultiplierEditFieldValueChanged, true);
app.TorquemultiplierEditField.Position = [155 38 54 22];
app.TorquemultiplierEditField.Value = 1;
- Tworzenie etykiety pola edycji dla prędkości jałowej.
app.idle_rpm1minEditFieldLabel = uilabel(app.Panel);
app.idle_rpm1minEditFieldLabel.HorizontalAlignment = 'right';
app.idle_rpm1minEditFieldLabel.Position = [42 8 91 22];
app.idle_rpm1minEditFieldLabel.Text = 'Prędkość jałowa [1/min]';
- Tworzenie pola edycji dla prędkości jałowej.
app.idle_rpm1minEditField = uieditfield(app.Panel, 'numeric');
app.idle_rpm1minEditField.UpperLimitInclusive = 'off';
app.idle_rpm1minEditField.Limits = [0 Inf];
app.idle_rpm1minEditField.Position = [156 8 53 22];
app.idle_rpm1minEditField.Value = 2000;
- Tworzenie etykiety z informacją o prawach autorskich.
app.Copyright2021BalticRacingbyEricDorniedenLabel = uilabel(app.PowertrainDataPanel);
app.Copyright2021BalticRacingbyEricDorniedenLabel.Position = [834 1 274 22];
app.Copyright2021BalticRacingbyEricDorniedenLabel.Text = 'Copyright © 2021 Baltic Racing by Eric Dornieden';
- Wyświetlanie logo Baltic Racing.
app.Image2 = uiimage(app.PowertrainDataPanel);
app.Image2.Position = [7 6 196 77];
app.Image2.ImageSource = 'balticracing_logo_transparent.png';
- Tworzenie przycisku dodawania.
app.Button = uibutton(app.PowertrainDataPanel, 'push');
app.Button.ButtonPushedFcn = createCallbackFcn(app, @ButtonPushed, true);
app.Button.Position = [25 98 21 21];
app.Button.Text = '+';
- Tworzenie przycisku odejmowania.
app.Button_2 = uibutton(app.PowertrainDataPanel, 'push');
app.Button_2.ButtonPushedFcn = createCallbackFcn(app, @Button_2Pushed, true);
app.Button_2.Position = [45 98 20 21];
app.Button_2.Text = '-';
- Tworzenie tabeli do wyświetlania danych napędu.
app.UITable = uitable(app.PowertrainDataPanel);
app.UITable.ColumnName = {'RPM [1/min]'; 'Moment obrotowy [Nm]'};
app.UITable.RowName = {};
app.UITable.ColumnEditable = true;
app.UITable.CellEditCallback = createCallbackFcn(app, @UITableCellEdit, true);
app.UITable.Position = [24 119 222 258];
- Wyświetlanie okna po utworzeniu wszystkich komponentów.
app.DrivetrainSetupUIFigure.Visible = 'on';
- Konstruktor aplikacji, tworzy obiekt aplikacji Drivetrain, przyjmuje opcjonalne argumenty wejściowe
function app = Drivetrain(varargin)
- Tworzenie UIFigure i komponentów
createComponents(app)
- Rejestrowanie aplikacji w App Designer
registerApp(app, app.DrivetrainSetupUIFigure)
- Wykonanie funkcji startupFcn
runStartupFcn(app, @(app)startupFcn(app, varargin{:}))
- Jeśli nie ma argumentów wyjściowych, usuń obiekt aplikacji
if nargout == 0
clear app
- Usunięcie UIFigure przy usuwaniu aplikacji
delete(app.DrivetrainSetupUIFigure)