Olen päättänyt keskeyttää yritystoiminnan toistaiseksi.
Jatkan näitä hommia ehkä joskus tulevaisuudessa.
Tekijä: Henri
PDF Tools demo
Ohjelmointi projektissani tarvitsee myös tavan luoda PDF tiedostoja inventaariota, laskujen yms. tekoon. Joten tein tälläisen demon jolla saan tehtyä helposti myös listoja joka on myös yksi sen tärkeimmistä ominaisuuksista.
Seuraavia ominaisuuksia tarvitsen tässä vähintään
- Ruudukon, kuten esim. excelissä
- Automaattisesti lisää uusia sivuja
- Ylä- ja alaotsakkeet
- Kuvia
Tämäkin löytyy GitHubista.
Perus idea
Perus ideana on rankentaa PDF ”palikoista”. Sivulla on ylä- ja alaotsakkeet, niiden väliin lisätään muita palikoita josta sivun muu sisältö koostuu.

Tulokset
Oikean puoleisessa piirretään myös testi tarkoituksissa kunkin tekstin, kuvan yms. alueet joihin ne on piirretty.


Avalonia Dialog Manager Demo

Kerran kun Avaloniassa ei tule mukana ”MessageBox” toimintoa joka on esim. WinForms puolella niin silloin täytyy käyttää valmiita ratkaisuja joita Avalonia esim. mainitsee heidän dokumentaatiossa täällä taikka tehdä oma ratkaisu.
Joten tein oman ratkaisun jonka laitoin myös GitHub sivuilleni.
Tässä lyhyesti miten se toimii demossa.
using Avalonia.Collections;
using AvaloniaDialogManagerDemo.Models;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Threading.Tasks;
namespace AvaloniaDialogManagerDemo.ViewModels
{
public partial class MainWindowViewModel : ViewModelBase
{
[ObservableProperty]
private ItemModel? selectedItem;
[ObservableProperty]
private AvaloniaList<ItemModel> items;
[ObservableProperty]
private bool isItemSelected = false;
public MainWindowViewModel()
{
items = new AvaloniaList<ItemModel>();
}
partial void OnSelectedItemChanged(ItemModel? value)
{
IsItemSelected = value != null;
}
[RelayCommand]
private async Task New()
{
var result = await DialogManager.ShowDialog(new DialogItemViewModel(null), "Create new item", ["Ok", "Cancel"]);
if (result.ButtonPressed == "Ok" && result.ReturningObject != null)
{
Items.Add((ItemModel)result.ReturningObject);
}
}
[RelayCommand]
private async Task Edit()
{
if (SelectedItem == null) return;
var result = await DialogManager.ShowDialog(new DialogItemViewModel(SelectedItem), "Edit item", ["Ok", "Cancel"]);
string oldId = SelectedItem.ID;
if (result.ButtonPressed == "Ok" && result.ReturningObject != null)
{
for(int i = 0; i < Items.Count; i++)
{
if (Items[i].ID == oldId)
{
Items.RemoveAt(i);
Items.Insert(i, (ItemModel)result.ReturningObject);
SelectedItem = (ItemModel)result.ReturningObject;
break;
}
}
}
}
[RelayCommand]
private async Task Delete()
{
if (SelectedItem == null) return;
var result = await DialogManager.ShowDialog(new DialogMessageViewModel($"Delete {SelectedItem.Name}?"), "Delete item", ["Ok", "Cancel"]);
if(result.ButtonPressed == "Ok")
{
Items.Remove(SelectedItem);
SelectedItem = null;
}
}
}
}
Puinen silmälasikotelo


Silmälasi- tai aurinkolasikotelo joka on tehty koivusta.
Kotelon sisus on pinnoitettu nylon nukkauksella ja kotelo on pintakäsitelty pellavaöljyllä. Kansi on saranoitu naudan verhoilunahalla ja kantta pitää kiinni kaksi neodyymimagneettia.
Sisämitat (leveys, syvyys, korkeus): ~14,7 x 5 x 2,8 cm

Arduino ADC Suodatin

Arduino kirjasto lukujen suodattamiseen.
Kuinka suodatin toimii?
Tässä suodattimessa on juokseva keskiarvoistus raaka arvoille ADC:stä ja exponential smoothing raaka arvojen summan keskiarvolle.
Visuaaliset arvot suodattimesta
Muutamia kuvia kuinka hyvin suodatin suoriutuu.
Testissä minulla on lineaarinen hall-effect sensori (A1324) 4.7uF erotuskondensaattorilla ja Arduino nano. Uusi arvo printataan joka 10ms (115200 baud rate). Sininen viiva on korkein arvo ja punainen on alin saatu arvo Arduinosta.
Muista että sinun tulokset voivat olla erilaiset.
Raaka

Tässä käyrässä on raaka arvot ilman suodatinta. Arvo vaihtelee 793-791 välillä, joten erotus on 2.
Exponential smoothing alpha = 0.9

Arvo vaihtelee ~791.65-790.65 välillä, joten erotus on 1.
Exponential smoothing alpha = 0.1
Arvo vaihtelee ~791.3-790.8 välillä, joten erotus on 0.5.

Esimerkki
#include <ADCFilter.h>
#define ANALOG_PIN A0
#define MS 10
//Filter has 16 channels and 6 samples by default
//To change channel count and sample count edit ADCFilter.h file
ADCFilter filter;
void setup() {
Serial.begin(9600);
//Alpha must be 0 < a < 1, default value is 0.1
//The lower alpha value, the higher smoothing
//This is not required but, to set new alpha value use:
filter.setAlpha(0.2f);
}
void loop() {
//Update channel 0 with new value
filter.update(0, analogRead(ANALOG_PIN));
//Get smoothed value from channel 0 and print it
Serial.println(filter.get(0));
delay(MS);
}
Ensimmäinen rimakanootti

Rakensin ensimmäisen rimakanoottini opiskellessani veneen rakennuksen perustutkintoa. Kanootin rakennuksessa minulla oli apuna rimakanootin rakennusopas jonka on kirjoittanut Lauri Hovi.

Tämän kanootin rakensin männystä, kuten kuvasta näkyy nämä laudat ovat lyhyen näköisiä. Rimat jatketaan viisteliitoksella. Riman vähimmäis pituus tässä kanootissa on ~5m.

Kun rimaan tehdään koverat ja kuperat syrjät voi rimoja kallistaa sulavasti mallikaaren mukaan ja samalla saumasta saa tiiviin. Saumoihin laitetaan perus puuliimaa.

RIMAN PROFIILI
Paksuus on 6mm
Leveys on 20mm

Kanootin rakentamiseen tarvitsee myös rakennuspukin johon kiinnitetään mallikaaret.
Kaaret kiinnitetään 30cm välein aloittaen rakennuspukin keskeltä.
Mallikaarissa olevilla keskiviivoilla ja narua käyttäen on mallikaaret helppo asemoida keskelle.

Kanoottiin tarvitaan myös yhteensä neljä keulakaarta, sisä- ja ulkokaaret. Kaaret voi tehdä samasta 6x20mm rimasta. Nämä rimat on hyvä höyryttää ennen taivuttamista jotta ne eivät napsahda poikki taivuttaessa. Yön yli kuivuttuaan liimasin ne D4 polyuretaaniliimalla.


Rimoja kasataan päällekkäin niitaten ne mallikaareen kiinni ja samalla rimojen päädyt tasataan kaartavasten.
Kuvassa olevat muoviliuskat ovat tyhjistä liimapulloista. Ne laitoin niitin kanssa jotta se ei uppoa liikaa puuhun.



Niittien poiston jälkeen pinnan kittaus käyttäen epoksia ja mänty hiontapölyä.
Kittauksen jälkeen hionta ja sitä tehdessä kannattaa muistaa että hiomakone pitää olla aina liikkeessä, kaarevan pinnan takia kuoppia voi syntyä tosi herkästi.
Hionnan jälkeen pinnan kyllästys epoksilla ja sen kuivuttua pinta kannattaa puhdistaa vaikka asetonilla ja tehdä vielä kevyt hionta jotta uusi epoksi kerros tarttuu hyvin.
Eli uusi kerros epoksia, lasikuitu kangas pintaan ja senkin päälle epoksia.

Reunat siistiksi ja sisälle myös epoksit ja kangas niin kuin ulkopuolelle.


Ulkopuolelle törmäyslistat ja sisälle sellainen jossa on rakoja jotta saa veden valutettua ulos.

Kansiin laitoin ”koivunlehden” näköisen kaiveruksen jonka täytin epoksilla ja mahonki puupölyllä (tuli vähän mämmin näköinen sekote).
Lopuksi hionta, kaksikomponentti lakka, mela ja ei kun vesille.

Shakkia vai tammea

Shakin tai tammen pelaamista raittiissa ulkoilmassa.
Renderöidyt kuvat






Symbolit






Valmiit tuotteet












Tekniset tiedot




Säilytyslaatikko
- 12mm Filmivaneria
- Kulmasuojalistaa
- 40×40 Kyllästetyt jalat
- 2kpl Laatikkokahvaa
- 2kpl T-Saranaa
- Riippulukko paikkainen laatikkosalpa
- Vanerin reunat käsitelty Osmo Color suojaavalla kuultoöljyllä
Shakkinappulat
- Mänty
- Osmo Color suojaava kuultoöljy
- Symbolit Tikkurila teho ikkunamaali
Tamminappulat
- Kuusi
- 12mm Filmivaneri
- Osmo Color suojaava kuultoöljy