• Welcome to Forum graficzne Burning-Brushes.pl. Please log in or sign up.
 

KaliGFX

Zaczęty przez Abik, Czerwiec 23, 2011, 14:24:32

Poprzedni wątek - Następny wątek
Interfejs:


Tutaj linki do działającego skompilowanego (wpół skompilowanego bo to java) programu:
HOTFILE
FILESONIC
FILESERVE
RAPIDSHARE

Kod źródłowy:

import javax.swing.*;
import javax.imageio.ImageIO;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.Color;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class kali{
public static void main(String[] args) {
UI gui = new UI();
}
}

class Obraz{
private int szer = 2480, wys = 3508;
private Color szary = Color.gray, bialy = Color.white;
private BufferedImage img = new BufferedImage(szer, wys, BufferedImage.TYPE_INT_ARGB);
private File outFile;
private String formatPliku;
private int stalowka, odstep;
private boolean pion;

Obraz(String formatPliku, File outFile, double mm, int odstep, boolean pion){ //pamietac, ze nazwe i typ
this.outFile = outFile; //pliku podajemy dopiero w konstruktorze
this.formatPliku = formatPliku;
this.stalowka = mmToPx(mm);
this.odstep = odstep;
this.pion = pion;
}
Obraz(){
this.outFile = new File("obrazek.png");
this.formatPliku = "png";
this.stalowka = 12;
this.odstep = 120;
this.pion = false;
}

public void rysuj(){
//tworzymy obiekt do rysowania
Graphics2D gfx = img.createGraphics();
//tworzenia bialego tla
Rectangle2D tlo = new Rectangle2D.Double(0,0,szer,wys);
gfx.setPaint(bialy);
gfx.fill(tlo);
gfx.draw(tlo);
//rysowanie kresek
gfx.setPaint(szary);
int x = 0;
int petla = 0;
if(!pion){
petla = 5*(int)Math.floor(3508/((13*stalowka)+odstep));
for(int i=1;i<=petla;++i){
if(((i-1)%5)==0) x += odstep;
if(((i-2)%5)==0) x += stalowka;
if(((i-3)%5)==0) x += 3*stalowka;
if(((i-4)%5)==0){ x += 6*stalowka; gfx.drawLine(0,x-1,2480,x-1);}
if(((i-0)%5)==0) x += 3*stalowka;
gfx.drawLine(0,x,2480,x);
}
} else {
petla = 5*(int)Math.floor(2480/((13*stalowka)+odstep));
for(int i=1;i<=petla;++i){
if(((i-1)%5)==0) x += odstep;
if(((i-2)%5)==0) x += stalowka;
if(((i-3)%5)==0) x += 3*stalowka;
if(((i-4)%5)==0){ x += 6*stalowka; gfx.drawLine(x-1,0,x-1,3508);}
if(((i-0)%5)==0) x += 3*stalowka;
gfx.drawLine(x,0,x,3508);
}
}
//przenoszenie wszystkiego na obraz
gfx.drawImage(img, null, 0, 0);
}

public void zapisz(){
try{
ImageIO.write(img, formatPliku, outFile);
} catch(IOException e){
System.out.println("Przykro mi, ale nie moge zapisac pliku!");
}
}

private int mmToPx(double mm){
return (int)(mm * 12);
}
}

class UI extends JFrame implements ActionListener{
private double mm;
private boolean pion;
private String formatPliku;
private File outFile;
private String[] uklady = {"Poziome", "Pionowe"};
private String[] formaty = {"PNG", "JPG", "GIF"};
private String tekstPomocy;

private JPanel panel;
private JLabel label1;
private JTextField mmfield;
private JButton generuj, pomoc;
private JComboBox uklad, format;
UI(){
super();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400,120);
setTitle("KaliGFX");
setVisible(true);

panel = new JPanel();
label1 = new JLabel("Grubość stalówki (w milimetrach)");
mmfield = new JTextField(5);
mmfield.setToolTipText("Jeśli chcesz podać wartość niecałkowitą skorzystaj z kropki " +
  "zamiast przecinka, np: 1.5");
generuj = new JButton("GENERUJ");
generuj.setToolTipText("Wciśnij aby wygenerować obraz. Obraz znajdziesz w folderze z programem.");
generuj.setActionCommand("pobierz");
generuj.addActionListener(this);
uklad = new JComboBox(uklady);
uklad.setToolTipText("Wybierz orientację lini.");
format = new JComboBox(formaty);
format.setToolTipText("Wybierz format graficzny w jakim zapisany będzie wygenerowany obraz.");
pomoc = new JButton("POMOC");
pomoc.setToolTipText("Wciśnij aby przeczytać jak poprawnie używać tego programu.");
pomoc.setActionCommand("pomoz");
pomoc.addActionListener(this);

add(panel);
panel.add(label1);
panel.add(mmfield);
panel.add(generuj);
panel.add(uklad);
panel.add(format);
panel.add(pomoc);
try {
pobierzTekst();
} catch (IOException e) {

e.printStackTrace();
}
}

@Override
public void actionPerformed(ActionEvent zdarzenie) {
if(zdarzenie.getActionCommand()=="pobierz"){
mm = Double.parseDouble(mmfield.getText()); //wartosc mm
if(uklad.getSelectedIndex()==0) pion = false; //wartosc pion
else pion = true;
if(format.getSelectedIndex()==0){//wartosc formatPliku i outFile
formatPliku="png";
outFile = new File("obrazek.png");
} else if(format.getSelectedIndex()==1){
formatPliku = "jpg";
outFile = new File("obrazek.jpg");
} else {
formatPliku = "gif";
outFile = new File("obrazek.gif");
}

Obraz obraz = new Obraz(formatPliku, outFile, mm, 120, pion);
obraz.rysuj();
obraz.zapisz();
}
if(zdarzenie.getActionCommand()=="pomoz"){

JOptionPane.showMessageDialog(this, tekstPomocy, "Okno pomocy", JOptionPane.INFORMATION_MESSAGE);
}
}

private void pobierzTekst() throws IOException{
FileReader fr = new FileReader("pomoc.txt");
BufferedReader br = new BufferedReader(fr);
String s;
while((s=br.readLine())!=null){
tekstPomocy += s;
tekstPomocy += "\n";
} br.close(); fr.close();
}
}

Wszystko w jednym pliku, chociaż jak sobie popatrzyłem na te klasy to idealnie by się nadawały do wsadzenia każdej w osobny, ale nie chce mi się teraz tego robić, może w jakiejś następnej wersji programu, jeśli powstanie :D

Co ten program robi?
Generuje coś takiego:
http://img.burning-brushes.pl/images/obrazedcd.png
lub takiego:
http://img.burning-brushes.pl/images/obrazeshs.png
zależnie od tego czy wybierzemy sobie linie pionowe czy poziome... do PNG, JPG albo GIF (ale z JPG okazał się jakiś problem, jeszcze nie wiem jak go naprawić)
Zależnie od tego jaką wartość podamy w polu 'grubość stalówki'

Szczegóły są w pomocy programu:

(przy czym tam też jest delikatny błąd, on czyta tą pomoc, z pliku 'pomoc.txt' i nie wiem czemu ładuje na początku 'null')
:D

Java  :heart-anim:
czyli to robi te linie do robienia layków ?

nie do layów, a do pisania różnymi stylami pisma - gotyk itd. Ogólnie kaligrafowania.
bo chciałem







A cała twórczość widnieje tu: WhiteBlackRose

decremi.pl/ portfolio

nie wiem do końca do czego służy to co robi ten program, Qajs powiedział mi, że na takich "arkuszach" ćwiczy się "pisanie" (kaligrafię czy jak to tam się zwie, ja to wolę nazywać pisaniem :D )
coś takiego dokładniej:
http://kaligrafia.info/samouczek-kaligrafii/rozmiar-odstepy-i-proporcje

też lubię Javę :D

a, czyli robi takie linie jakie się miało w zeszycie do j. polskiego w 1 klasie podstawówki :)
Cytatteż lubię Javę
dawno nic nie napisałem w niej

Sympatyku takich lini raczej nie robi :) Są one inne i dostosowywane do wielkości stalówki :)
bo chciałem







A cała twórczość widnieje tu: WhiteBlackRose

decremi.pl/ portfolio

Kilka poprawek
-możliwość podania odstępów pomiędzy 5liniami
-możliwość zmniejszenia (ucięcia) wymiarów grafiki tak żeby drukarka nie skalowała
-poprawiony interfejs : D
-no i trochę większy porządek w kodzie + mikro zmiany w nim



Filesonic
Fileserve
Hotfile

kali.java:
package gfx;

public class kali{
public static void main(String[] args) {
new UI();
}
}


ui.java:

package gfx;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

class UI extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;

private double mm;
private int odstep;
private boolean pion, usunMarginesy;
private String formatPliku;
private File outFile;

private String[] uklady = {"Poziome", "Pionowe"};
private String[] formaty = {"PNG", "JPG", "GIF"};
private String tekstPomocy;

private JPanel polnoc, srodek, poludnie;
private JLabel label1, label2;
private JTextField mmfield, odstepfield;
private JButton generuj, pomoc;
private JComboBox uklad, format;
private JCheckBox margines;

UI(){
super("KaliGFX");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(420,150);
setLayout(new BorderLayout());
setVisible(true);

polnoc = new JPanel();
polnoc.setLayout(new GridLayout(2,2));
label1 = new JLabel("Grubość stalówki (w milimetrach)");
label2 = new JLabel("Odstępy między 'pięcioliniami'");
mmfield = new JTextField(5);
mmfield.setToolTipText("Jeśli chcesz podać wartość niecałkowitą skorzystaj z kropki " +
  "zamiast przecinka, np: 1.5");
odstepfield = new JTextField(5);
odstepfield.setToolTipText("Podaj odstep w milimetrach jako wartość całkowitą (1cm = 10mm).");
polnoc.add(label1);
polnoc.add(mmfield);
polnoc.add(label2);
polnoc.add(odstepfield);

srodek = new JPanel();
srodek.setLayout(new FlowLayout());
uklad = new JComboBox(uklady);
uklad.setToolTipText("Wybierz orientację lini.");
format = new JComboBox(formaty);
format.setToolTipText("Wybierz format graficzny w jakim zapisany będzie wygenerowany obraz.");
margines = new JCheckBox("Utnij marginesy");
margines.setSelected(true);
margines.setToolTipText("Zaznacz tę opcję by uciąć margines (1cm) z każdej strony grafiki.");
srodek.add(uklad);
srodek.add(format);
srodek.add(margines);

poludnie = new JPanel();
poludnie.setLayout(new FlowLayout());
generuj = new JButton("GENERUJ");
generuj.setToolTipText("Wciśnij aby wygenerować obraz. Obraz znajdziesz w folderze z programem.");
generuj.setActionCommand("pobierz");
generuj.addActionListener(this);
pomoc = new JButton("POMOC");
pomoc.setToolTipText("Wciśnij aby przeczytać jak poprawnie używać tego programu.");
pomoc.setActionCommand("pomoz");
pomoc.addActionListener(this);
poludnie.add(generuj);
poludnie.add(pomoc);

add(polnoc, BorderLayout.NORTH);
add(srodek, BorderLayout.CENTER);
add(poludnie, BorderLayout.SOUTH);
try {
pobierzTekst();
} catch (IOException e) {

e.printStackTrace();
}
}

@Override
public void actionPerformed(ActionEvent zdarzenie) {
if(zdarzenie.getActionCommand()=="pobierz"){
mm = Double.parseDouble(mmfield.getText()); //wartosc mm
odstep = Integer.parseInt(odstepfield.getText()); //wartosc odstep

if(uklad.getSelectedIndex()==0) pion = false; //wartosc pion
else pion = true;

if(format.getSelectedIndex()==0){//wartosc formatPliku i outFile
formatPliku="png";
outFile = new File("obrazek.png");
} else if(format.getSelectedIndex()==1){
formatPliku = "jpg";
outFile = new File("obrazek.jpg");
} else {
formatPliku = "gif";
outFile = new File("obrazek.gif");
}

if(margines.isSelected()) usunMarginesy = true; //wartosc usunMarginesy
else usunMarginesy = false;

Obraz obraz = new Obraz(formatPliku, outFile, mm, odstep, pion, usunMarginesy);
obraz.rysuj();
obraz.zapisz();
}
if(zdarzenie.getActionCommand()=="pomoz"){
JOptionPane.showMessageDialog(this, tekstPomocy, "Okno pomocy", JOptionPane.INFORMATION_MESSAGE);
}
}

private void pobierzTekst() throws IOException{
FileReader fr = new FileReader("pomoc.txt");
BufferedReader br = new BufferedReader(fr);
String s;
while((s=br.readLine())!=null){
tekstPomocy += s;
tekstPomocy += "\n";
} br.close(); fr.close();
}
}


obraz.java:

package gfx;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;

class Obraz{
private int szer, wys;
private Color szary = Color.gray, bialy = Color.white;
private BufferedImage img;
private File outFile;
private String formatPliku;
private int stalowka, odstep;
private boolean pion, usunMarginesy;

Obraz(String formatPliku, File outFile, double mm, int odstep, boolean pion, boolean usunMarginesy){
szer = 2480;
wys = 3508;

this.outFile = outFile; //pamietac, ze nazwe i typ
this.formatPliku = formatPliku; //pliku podajemy dopiero w konstruktorze
this.stalowka = mmToPx(mm);
this.odstep = mmToPx(odstep);
this.pion = pion;
this.usunMarginesy = usunMarginesy;

if(this.usunMarginesy==true){
if(!pion) wys -= mmToPx(20.0);
else szer -= mmToPx(20.0);
}
img = new BufferedImage(szer, wys, BufferedImage.TYPE_INT_ARGB);
}
Obraz(){
szer = 2480;
wys = 3508;
outFile = new File("obrazek.png");
formatPliku = "png";
stalowka = 12;
odstep = 120;
pion = false;
usunMarginesy = false;
}

public void rysuj(){
//tworzymy obiekt do rysowania
Graphics2D gfx = img.createGraphics();
//tworzenia bialego tla
Rectangle2D tlo = new Rectangle2D.Double(0,0,szer,wys);
gfx.setPaint(bialy);
gfx.fill(tlo);
gfx.draw(tlo);
//rysowanie kresek
gfx.setPaint(szary);
int x = 0;
int petla = 0;
if(!pion){
petla = 5*(int)Math.floor(wys/((13*stalowka)+odstep));
for(int i=1;i<=petla;++i){
if(((i-1)%5)==0) x += odstep;
if(((i-2)%5)==0) x += stalowka;
if(((i-3)%5)==0) x += 3*stalowka;
if(((i-4)%5)==0){ x += 6*stalowka; gfx.drawLine(0,x-1,szer,x-1);}
if(((i-0)%5)==0) x += 3*stalowka;
gfx.drawLine(0,x,szer,x);
}
} else {
petla = 5*(int)Math.floor(szer/((13*stalowka)+odstep));
for(int i=1;i<=petla;++i){
if(((i-1)%5)==0) x += odstep;
if(((i-2)%5)==0) x += stalowka;
if(((i-3)%5)==0) x += 3*stalowka;
if(((i-4)%5)==0){ x += 6*stalowka; gfx.drawLine(x-1,0,x-1,wys);}
if(((i-0)%5)==0) x += 3*stalowka;
gfx.drawLine(x,0,x,wys);
}
}
//przenoszenie wszystkiego na obraz
gfx.drawImage(img, null, 0, 0);
}

public void zapisz(){
try{
ImageIO.write(img, formatPliku, outFile);
} catch(IOException e){
JOptionPane.showMessageDialog(null, "Przykro mi, ale nie mogę zapisać pliku!",
"Błąd!", JOptionPane.WARNING_MESSAGE);
}
}

private int mmToPx(double mm){
return (int)(mm * 11.8);
}
}

Żabo, ponoć są problemy z programem na linuksie, a dokładniej nie trybi tam :(
I co na to poradzisz ?

Objaw{?}:
CytatInterfejs się uruchamia, ale już niestety nie generuje stron :/ a sprawdzałem zarówno na Sun Java jak i Open Java
bo chciałem







A cała twórczość widnieje tu: WhiteBlackRose

decremi.pl/ portfolio

Nie mam na chwilę obecną pojęcia skąd to się może brać, mam nadzieję, że będę mieć ochotę nad tym pomyśleć : P

Jednak pod linuxem (ubuntu) dało się uruchomić, ale wymagało to trochę ambicji. Wnioski z uruchomienia są następujące:
- okno pomocy jest puste;
- przydała by się jakaś informacja gdzie jest generowany obrazek, dobrze, że go znalazłem w katalogu domowywm, ale brak jakiejkolwiek informacji ze został wygenerowany; może dodać okno wyboru pliku, albo przynajmniej ścieżkę dostępu '.\obrazek.png'; gdybym nie przejrzał kodu to bym się nie zorientował nawet czego szukać, zwłaszcza, że pomocy brak;
- co autor miał na myśli wstawiając dodatkową linię o szerokości stalówki? Wygenerowany obrazek ma następujące odstępy 1:3:5:3:intelinia;
- dlaczego linia bazowa jest pogrubiona? pierwsze wrażenie to WTF? jeżeli pogrubia się linię bazową to powinno się też pogrubić tą linię nad nią, nie wiem czy autor pamięta jak wyglądały zeszyty w 3 linie do 1 klasy podstawówki; z pogrubieniem lini bazowej pierwszy raz się stykam, jest ono poza wszelakimi konwenansami, bo albo jest tak jak w zeszytach, albo wszystkie linie równe.;
- wygenerowanie JPG daje czarny obrazek, PNG działa prawidłowo.

Jeżeli po tych nieprzychylnych słowach autorowi nie prysnęła całkiem ambicja, to mam pomysł na usprawnienia. Dodanie wyboru kroju pisma:
- unicjała proporcje stalówki 4:interlinia;
- italika proporcje stalówki 3:5:3 interlinia;
- copperplate proporcje 4:3:4:intelinia, przy czym wysokość litery "x" wynosi 5mm dla stalówki XF i 6 mm dla stalówki F;
Dodanie czegoś na wzór ramki i tabelki jak w rysunku technicznym, lub przynajmniej samego napisu do jakiego kroju pisma przeznaczony jest arkusz i do jakiej stalówki. Zerknij na http://kaligrafia.info/wp-content/uploads/2011/02/arkusz-italika-nib1-6.pdf tam takowy opis istnieje.
Rysowanie linii skośnych, dla:
- pisanki angielskiej pod kątem 52 stopnie od poziomu
- italiki 5 stopni od pionu (patrz wcześniej wspomniany arkusz).
Jakiś punkt odniesienia, np duży napis KaliGFX (patrz przytoczony arkusz). Bez takiego punktu odniesienia użytkownik pada ofiarą pełzania oka (migoczące linie i oczopląs). Mógł by być to też np. rysunek kąta pod jakim trzymać stalówkę (w jednej książce widziałem coś takiego).
Podawanie rozmiarów mogło by się odbywać z listy wyboru, bo np. nie każdy zna rozmiar stalówki, więc łatwiej jest wybrać np. Mitchel Round Nib rozmiar 1, albo Brause Cito Fein (w kwestii wymiarów mogę pomóc)

Nie wiem jak sytuacja wygląda pod Linuxem bo tam nie testowałem programu, ale sprawdzę to bo byłem pewny, że wszystko powinno działać bez żadnych problemów.
Ale pod Windowsem okno pomocy nie jest puste ani trochę i tam też (w oknie pomocy) pisze gdzie generowany jest obraz. Poza tym, treść okna pomocy jest zapisana w pliku pomoc.txt, więc można go sobie przeczytać nawet poza programem.

o problemie z jpg wiem, ale nie wiem jeszcze jak to naprawić, pod windowsem obrazek zamiast czarny jest czerwony, a to też nie to o co chodziło

nie mam pojęcia jakie linie trzeba pogrubić, jakie nie, jakie mają być między nimi proporcje czy cokolwiek innego, dostałem przed zrobieniem programu jakieś tam wytyczne i tylko je zrealizowałem, więc dzięki za info

co do wszystkich błędów i tych zasugerowanych usprawnień, to myślę, że wszystko będzie powoli wdrażane, nie wiem kiedy bo teraz mam wakacje i wiele zajęć, a na domiar złego nie mam na nowym kompie zainstalowanych żadnych narzędzi do programowania, ani linuxa
dzięki wielkie za znalezienie i wskazanie tych wszystkich błędów, ja nie mam zielonego pojęcia o kaligrafii i program robiłem na potrzeby znajomego tylko po to żeby realizował prostą funkcjonalność generowania strony, no ale dzięki takim ludziom jak Ty, wiem, że nie tylko on tego używa i że warto poświęcić na to czas
dzięki jeszcze raz i tak jak pisałem, błędy będą poprawiane, a program będzie wzbogacany o nowe funkcje (między innymi te, które podałeś), ale nie wiem czy to nie zacznie się dopiero kiedy wrócę na studia ;s 

Cytat: Abik w Sierpień 23, 2011, 13:49:15

nie mam pojęcia jakie linie trzeba pogrubić, jakie nie, jakie mają być między nimi proporcje czy cokolwiek innego, dostałem przed zrobieniem programu jakieś tam wytyczne i tylko je zrealizowałem, więc dzięki za info

Uncjała - tym krojem pisze się jednym pasie (pomiędzy dwoma liniami), proporcje to 4 szerokości stalówki a dalej ewentualny odstęp na interlinię, w skrócie [4:i]
italika - tym krojem pisze się w trzech pasach (pomiędzy 4 liniami) z czego środkowe dwie mogą być pogrubione (lub nie) tak jak w zeszycie do podstawówki. Proporcje odstępów między liniami zależą tutaj też od stalówki i wynoszą [3:5:3:i] gdzie i oznacza odstęp pomiędzy wierszami - interlinię
we wszystkich krojach interlinia to przeważnie 1 lub 2 szerokości stalówki
copperplate (po polsku pisanka angielska) - tutaj nie ma bezpośredniej zależności pomiędzy szerokością stalówki a odstępami, bo używa się innego rodzaju stalówek. Pisze się tak jak italikę pomiędzy 4 liniami (trzy pasy), ale proporcje pomiędzy liniami wynoszą [4:3:4:i] Tu również środkowe dwie linie można pogrubić lub nie (opcja do wyboru dla programu). Są proporcje ale nie ma wymiarów, więc już je podaję, dla stalówki F (fine) czyli cienkiej środkowy pas ma wysokość 6 mm, czyli łatwo policzyć że odstępy w mm będą [8mm:6mm:8mm:i], natomiast dla stalówki XF (extra fine), czyli po polsku super cienkiej, środkowy pas wynosi 5 mm, czyli proporcje [6,666 mm : 5 mm : 6,666 mm : i].

Co do narzędzi programistycznych to notepad jest w każdym windowsie, a notepad+ łatwo ściągnąć. Ubuntu chodzi z obrazu płyty.

P.S. Udanych wakacji życzę, mam nadzieję że moje wskazówki przydadzą się po wakacjach

Dzięki, przydadzą się te wszystkie informacje
notatnik jest, ale plików projektu eclipse to on edytować nie potrafi (tak samo z resztą jak notepad++), a sam kod i tak wymaga jeszcze kompilacji

To tych trzech krojów pisma, można dorzucić czwarty
- skrypt spenserski (link http://www.iampeth.com/lessons/spencerian/new_standard/spencer_new_standard_page0.html )
pisany w 5 pasach (6) liniach proporcje [1:1:1:1:1] pogrubione ewentualnie dwie środkowe linie, plus skośne linie tak jak przy copperplate pod kątem 52 stopnie (patrz link) szerokość sądzę, że ten arkusz powinien wyglądać jak papier w kratkę (4x4 mm), tyle, że pionowe linie są pod kątem 52 stopnie no i ewentualne pogrubienie środkowych linii.

Po 291 dniach od poprzedniej wersji, mam przyjemność (lub nie :D to się okaże) przedstawić obiecaną wersję drugą KaliGFX!
Zaimplementowano w niej wszystkie zaproponowane przez tofiego poprawki. Dodano wybór wszystkich zaproponowanych krojów, skośne linie pomocnicze, wypisywanie podstawowej konfiguracji na arkuszu, automatyczne uzupełnianie interlinii zależnie od podanej stalówki i możliwość automatycznego ustalenia grubości stalówki (to kuleje bo nie znam się na rodzajach stalówek). Naprawiono problem czerwonego tła w przypadku generowania plików jpg. Dodatkowo dodanych zostało kilka innych opcji takich jak możliwość wyboru linii do pogrubienia, możliwość wybrania koloru linii, dodano dodatkowe formaty zapisu pliku graficznego arkusza, możliwość wydrukowania arkusza bezpośrednio z programu, nieinwazyjne (lub inwazyjne zależnie od konfiguracji usera) komunikaty na temat błędów popełnianych podczas wykorzystywania programu, podgląd generowanego pliku oraz możliwość zapisu arkusza do pliku kgfx z możliwością ponownego jego wczytania!
Zmianie podległa też technologia przy pomocy, które zostało wykonane oprogramowanie. Tym razem nie była to java, a .net. W związku z tym nie ma na razie wersji, która mogłaby działać na linuxie (ale o tym jeszcze za chwilę).

Na chwilę obecną wersja druga wygląda tak:


Ściągnąć ją można stąd:
http://www.sendspace.com/file/y1vlsv

Na razie nie działa jeszcze funkcja "Utnij margiensy" bo nie pamiętam co ona robiła w poprzedniej wersji, a nie sprawdzałem i zupełnie o niej zapomniałem robiąc inne rzeczy. Ale ona chyba generowała trochę mniejszy obraz, żeby niektóre drukarki mogły dobrze drukować generowane arkusze (to była sugestia Qajsa, że jest to potrzebne : p)
Co do działania tego programu na linuxie to sprawa nie jest oczywista. Na linuxie jest implementacja .net'a tzw. mono i jeśli będzie mi się chciało to spróbuję je zainstalować i skompilować tam program. Nie obiecuję, ale zobaczymy.
Dodatkowo na razie tu jest tylko kompilacja pod .net framework w wersji 4.0 na komputery 32 bitowe, później dorzucę jeszcze inne wersje (niższe wersje .net framework i wersję 64 bitową).
Chciałbym też program przetłumaczyć na przynajmniej język angielski, więc jak się uda to w przyszłości dodana będzie opcja wyboru języka. Ale to też jest "jak mi się zache" : p
Napiszę później jeszcze jakiś tam plik pomocy bo na razie go nie ma, też będzie w jakiejś następnej wersji. Później też udostępnię kod, chociaż piękny to on raczej nie jest, ale otwarty musi być :D
Tyle na dziś, jak kto może to niech używa i jak zauważy jakieś błędy to niech zgłasza :D