Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.10.30;
Скачать: [xml.tar.bz2];

Вниз

user-defined characters в ESC/P принтерах   Найти похожие ветки 

 
plr   (2011-04-26 23:12) [0]

У кого есть опыт, либо исходники программирования subj с помощью ESC-команд, в частности «ESC &»?

Это создание собственного «начертания» символов через бит-матрицу, знающие люди поймут.

Не могу разобраться как делать, сохранять, загружать, добиваться совместимости с разными принтерами. Поиск не принёс вменяемых исходников.

Нужно для старых струйных, матричных и современных термо- принтеров хоть какую-то информацию, помимо документации, которая есть.


 
Anatoly Podgoretsky ©   (2011-04-27 07:24) [1]

А чем документация то не устраивает?


 
oldman ©   (2011-04-27 09:03) [2]

Я в свое время на матричном делал. Рисовал нужные мне символы.
Хватало информации об ESC-последовательностях из паспорта к принтеру.
Причем, ничего там сохранять\загружать не надо. Посылаешь последовательность на принтер, получаешь нужный результат.


 
Dimka Maslov ©   (2011-04-27 09:55) [3]

Ой, давно это было... Прошлый век... Помню больше всего времени тогда ушло не на изучение команд, а на прорисовку в тетради в клетку самих символов и перевод из двоичной системы в шестнадцатеричную...


 
Плохиш ©   (2011-04-27 10:02) [4]


>
> Не могу разобраться как делать, сохранять, загружать, добиваться
> совместимости с разными принтерами. Поиск не принёс вменяемых
> исходников.
>

Так найми программиста.


 
Юрий Зотов ©   (2011-04-27 10:08) [5]


> plr   (26.04.11 23:12)  

Поищите программу KeyRus (была такая во времена DOS). Насколько помню, в ее комплект входили и драйвер Epson-совместимых принтеров, и редактор шрифтов.


> oldman ©   (27.04.11 09:03) [2]
> Причем, ничего там сохранять\загружать не надо. Посылаешь
> последовательность на принтер, получаешь нужный результат.

Это в графическом режиме. Но можно использовать и текстовый, загрузив сначала в принтер нужный шрифт. Так проще.


 
brother ©   (2011-04-27 10:13) [6]

> KeyRus (была такая во времена DOS)

ностальгия!


 
Anatoly Podgoretsky ©   (2011-04-27 10:15) [7]

> Юрий Зотов  (27.04.2011 10:08:05)  [5]

Вы про одно и тоже говорите, что загрузка, что посылка - это одно и тоже.


 
Юрий Зотов ©   (2011-04-27 10:22) [8]


> brother ©   (27.04.11 10:13) [6]

Классная, кстати, была программа. Я когда-то использовал ее для решения нестандартной задачки и для этого пришлось поковыряться в ее потрохах. Так вот - когда я понял, как она работает, то был просто в шоке от того, насколько красиво там все сделано. Не удержался и позвонил Дмитрию только для того, чтобы сказать ему "спасибо". Талантливейший был парень, буквально гений программирования. Жаль только что так рано ушел...

http://yandex.ru/yandsearch?text=%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9+%D0%93%D1%83%D1%80%D1%82%D1%8F%D0%BA&lr=213


 
Юрий Зотов ©   (2011-04-27 10:37) [9]


> Anatoly Podgoretsky ©   (27.04.11 10:15) [7]

Не совсем. Нестандартные символы можно печатать поточечно, переведя принтер в графический режим и посылая ему Esc-последовательности. Но можно сделать соответствующий шрифт, загрузить его в принтер и печатать в текстовом режиме, посылая обычные символы. Это проще и быстрее.


 
OW ©   (2011-04-27 11:05) [10]


> . Это проще и быстрее.

и смешнее :)
мы так дурачились, меняя в памяти принтера пару букв местами..
ну, это когда на экране такие шутки нам уже надоели
кому то конечно было не смешно, когда потом выяснялось, что вместо о везде а, и наоборот..
В свое оправдание, могу сказать, что мы обычно рядом стояли, и сразу указывали на ошибки..


 
Юрий Зотов ©   (2011-04-27 11:16) [11]


> OW ©   (27.04.11 11:05) [10]

Еще шутка из той же серии: автозагружаемый макрос Word, который вводимый символ "," меняет на строку ", блин,"


 
OW ©   (2011-04-27 11:30) [12]


> Юрий Зотов ©   (27.04.11 11:16) [11]

ага, помню :), только не макрос, а программку для dos и не "блин" там был :)
дал тогда себе слово повторить тоже известную шутку, когда на экране слово Anna заменялось на I love you, Ann! Собственно, тогда и написал шутку с заменой а на о на мониторе, а мой друг - на принтере.
И перед парой, на всех машинах, до которых достал, запустил
а принтер был один на всех, его друг прогрузил

забавно вышло, но не надолго - сразу раскусили..


 
Anatoly Podgoretsky ©   (2011-04-27 11:43) [13]

> Юрий Зотов  (27.04.2011 10:37:09)  [9]

Насколько я понял, он ведет речь про знакогенератор, который можно
программировать, а не про его иммитацию в графическом режиме.


 
Плохиш ©   (2011-04-27 12:01) [14]

Прикольно хвалиться тем, что умеешь посылать esc-последовательность символов в принтер :-))
Ну есть у меня требуемая программа из начала 90-х, 90% кода - отображение интерфейса и 10% непосредственно редактор символов и работа с принтером.


 
OW ©   (2011-04-27 12:15) [15]


> Прикольно хвалиться тем, что умеешь посылать esc-последовательность
> символов в принтер :-))

эт че, еще могу рассказать, как меня карты учили дырявить :)
мало только что получилось из этого, правда


 
brother ©   (2011-04-27 12:22) [16]

> [14] Плохиш ©   (27.04.11 12:01)


> [15] OW ©   (27.04.11 12:15)

эх, я только запись на аудиокассету застал(


 
brother ©   (2011-04-27 12:22) [17]

впрочем, 5 дюймовые дискеты были раньше же?


 
OW ©   (2011-04-27 12:38) [18]


> эх, я только запись на аудиокассету застал(

дык и я не застал - это один пенсионер у нас подрабатывал электронщиком, и у него в подвале стоял агрегат, он его сам и поддерживал в рабочем состоянии


 
OW ©   (2011-04-27 12:52) [19]


> 5 дюймовые дискеты были раньше же?

были
и 8"" были


 
Anatoly Podgoretsky ©   (2011-04-27 12:54) [20]

> brother  (27.04.2011 12:22:17)  [17]

Значит ты 8 дюймовых не застал.


 
brother ©   (2011-04-27 14:08) [21]

> 8 дюймовых не застал

неа, тока на фото)


 
Sha ©   (2011-04-27 23:08) [22]

Больше возможностей в отношении размера и вида символов на матричном принтере дает печать в графическом режиме.
В этом случае ты можешь сам разработать удобный тебе формат файла со шрифтом, который будет использовать твоя программа. Шрифт в принтер грузить не потребуется. Печать выполняется путем перевода строки символов текста в графику в памяти и последующего вывода строки графики на принтер. Имеет смысл сделать отдельную программу для редактирования файла шрифта. Точки графики на экране удобно отображать при помоши символа @.


 
Inovet ©   (2011-04-28 00:31) [23]

> [8] Юрий Зотов ©   (27.04.11 10:22)
> Классная, кстати, была программа

Две версии ходили - одна 12 кБ, вторая 23 кБ. Вот вторая была из комплекта с редактором фонтами и ещё там чем-то.

Вторая до сих пор актуальна для ДОС программ под Вин, её можно настроить так, что шрифт в памяти держится, причём можно чтобы не вся таблица, а только нужные диапазоны, памяти-то мало. А в стандартном русификаторе при смене текстового режима из 25 строк в 80 и-или обратно слетают русские символы. Может и есть какой другой способ, но keyrus.exe решает проблему.


 
Юрий Зотов ©   (2011-04-28 11:50) [24]


> Inovet ©   (28.04.11 00:31) [23]

Главное, чем она хороша - это вот что. У нее куча опций - какие функции включить, какие выключить (причем такого богатого набора функциональности нет, пожалуй, ни в одной аналогичной программе). После запуска она считывает заказанные юзером опции и сама себя пересобирает в памяти так, что резидентными остаются только нужные функции - за счет чего она всегда имеет минимальный размер (у меня она отъедала всего 800 байт, да и те в верхней памяти).

Кроме того, у нее есть и программный интерфейс (через какое-то прерывание, уже не помню номер). Его я тогда и использовал.


 
Inovet ©   (2011-04-28 13:14) [25]

> [24] Юрий Зотов ©   (28.04.11 11:50)
> сама себя пересобирает в памяти так, что резидентными остаются только нужные функции

Я помню, что можно было количество фонтов и символов в них регулировать или вообще отключать драйвер дисплея или клавиатуры. От этого занимаемый объём и зависел, наверно и другие более мелкие неиспользуемые функции тоже исключались. Была там, например, функция определения работает ли уже программа резидентно или нет, чтобы второй раз не оставлять в памяти, но если не надо такое, то несколько десятков байт экономились. Ещё там была визуальная утилита для настройки всего богатства возможностей тех же что и через командную строку. Ещё можно было сохранить прямо в екзешник настройки, чтобы в командной строке не писать кучу опций.


 
plr   (2011-05-01 23:31) [26]

Люди, всё хорошо, всё замечательно, но не могли бы "показать" хотя бы один исходный код определения символов и их печати?


 
Inovet ©   (2011-05-01 23:36) [27]

Да возьми мануал от принтера из тех ещё, там примеры на каждый чих с исходным кодом на Бэйсике и картинкой с результатом.


 
plr   (2011-05-02 00:05) [28]

Inovet, взял документацию из приведённых в ветке ссылок и еще с несколько загруженных - ни в каких нет исходных кодов на бейсике ни на каком другом языке. Я ж не просто так морочу всем голову!


 
Inovet ©   (2011-05-02 00:21) [29]

> [28] plr   (02.05.11 00:05)
> ни в каких нет исходных кодов на бейсике

Я выбросил некоторое время назад несколько мануалов от разных принтеров. Книжки были довольно толстые страниц по 200 в том сисле половина или больше объёма вот этому отведена. Думаю есть такие в сети. Ну вот что-то с ходу
http://support.epson.ru/manual_list.asp?product=53


 
Sha ©   (2011-05-02 00:33) [30]

Одна из моих первых программ на TurboPascal"e - редактирование шрифта для печати текстов на матричном принтере в графическом режиме с произвольным межстрочным интервалом. Позволяет готовить шрифты от самых крупных (максимально похожих на пишущую машинку) до почти микроскопических.

program sheimged; (* редактирование шрифта  *.img  *)
uses
 crt;
const
 mdx = 24;  (* гоpизонтальный pазмеp матpицы шpифта *)
 mdy = 24;  (* веpтикальный   pазмеp матpицы шpифта *)
 imabnd = 3;
 title : string = "";   (* имя файла со шpифтом *)
type
 imatype = array[1..imabnd] of array[1..mdx] of byte; (* символ *)
var
 fontfile : file;   (* файл, в котоpом хpанится шpифт *)
 font : array[0..255] of imatype;
 len  : array[0..255] of byte;
 ima  : imatype;
 pix  : array[1..mdy] of string[mdx];  (* pисунок на экpане *)

procedure pressesc;
var
 fic : char;
begin;
 gotoxy(1,25);
 textattr:=4*16+15;     write(" нажмите ");
 textattr:=128+4*16+15; write("ESC ");
 repeat; fic:=readkey; if fic=#0 then readkey; until fic=#27;
 gotoxy(1,25);
 textattr:=4*16+15;     write("             ");
end;

function answer(x,y : integer; question : string) : boolean;
var
 fic : char;
begin;
 gotoxy(x,y);
 textattr:=4*16+15;     write(question);
 textattr:=128+4*16+15; write("   (ENTER/ESC) ");
 repeat;
   fic:=readkey;
   if fic=#13 then answer:=true
   else if fic=#27 then answer:=false
   else begin; if fic=#0 then readkey; fic:=#0; end;
   until (fic<>#0);
 gotoxy(x+length(question)+1,y);
 textattr:=4*16+15;     write("               ");
 gotoxy(x+length(question)+1,y);
end;

procedure readfile;  (* чтение шpифта из файла *)
var
 i, j, k: integer;
 no: word;
begin;
 fillchar(font,sizeof(font),#0);
 clrscr;
 gotoxy(10,2); textattr:=4*16+15;
 write(" введите имя файла для хpанения шpифта -> "); readln(title);
 gotoxy(30,10); write(" загрузка ... ");
 if (length(title)=0) or (title[1]=" ") then halt(1000);
 assign(fontfile,title);
 {$I-} reset(fontfile,1); {$I+}
 if ioresult=0 then begin;
   if filesize(fontfile)=16128
     then blockread(fontfile,font[ord(" ")],224*sizeof(imatype),no);
   close(fontfile);
   end;
 end;

procedure editsym;
var
 x, y, dx, dy, dyt : integer;
 sym,  symold: char;             (* pедактиpуемый символ *)
 unspec : byte;                  (* вес символа *)
 w      : array [1..8] of byte;  (* веса битов: 128,64,...,2,1 *)
 ch: char;
 i, j, k, l, j1, j2: integer;
label
 redraw, reread, define_sym, ret;
begin;
 w[8]:=1; for i:=7 downto 1 do w[i]:=w[i+1]*2;
 symold:=" ";
define_sym:                 (* pедактиpование нового символа *)
 repeat;
   textattr:=3*16+15; clrscr;
   write(" введите пеpеопpеделяемый символ или ESC ");
   sym:=readkey;
   if sym=#27 then goto ret;
   if sym=#0 then begin; sym:=readkey;
     if sym=#67 then sym:=pred(symold)
     else if (sym=#68) and (symold<#255) then sym:=succ(symold)
     else sym:=" ";
     end;
   if sym<" " then sym:=" ";
   until(sym<>" ");
 symold:=sym;
 textattr:=3*16+15;
 clrscr;
 gotoxy(1,25);  write(" символ ");
 textattr:=1*16+15; write(" ",sym," ");
 gotoxy(75,25);     write(" ",ord(sym)," ");
 gotoxy(15,25);
 textattr:=4*16+15; write(" ESC - отмена   ",
                   "ПРОБЕЛ/СТРЕЛКИ - pисунок   ",
                   "ENTER-> конец ");

 ima:=font[ord(sym)];
 for dx:=1 to mdx do for dy:=1 to mdy do pix[dy,dx]:=".";
 for dx:=1 to mdx do begin;
   unspec:=ord(ima[1,dx]);
   for dy:=1 to 8 do if unspec>=w[dy] then begin;
     unspec:=unspec-w[dy];
     pix[dy+dy-1,dx]:="@";
     end;
   end;
 for dx:=1 to mdx do begin;
   unspec:=ord(ima[2,dx]);
   for dy:=1 to 8 do if unspec>=w[dy] then begin;
     unspec:=unspec-w[dy];
     pix[dy+dy,dx]:="@";
     end;
   end;
 for dx:=1 to mdx do begin;
   unspec:=ord(ima[3,dx]);
   for dy:=1 to 8 do if unspec>=w[dy] then begin;
     unspec:=unspec-w[dy];
     if dy<5 then pix[dy+dy+15,dx]:="@"
             else pix[dy+dy+8,dx] :="@";
     end;
   end;
 for dy:=1 to mdy do pix[dy,0]:=chr(mdx); (* длина стpоки *)

 x:=30; y:=0;
 dx:=1; dy:=1;
 textattr:=3*16+15;
 gotoxy(x-4,03); write("....."); gotoxy(x+1+mdx,03); write(".....");
 gotoxy(x-4,07); write("....."); gotoxy(x+1+mdx,07); write(".....");
 gotoxy(x-4,11); write("....."); gotoxy(x+1+mdx,11); write(".....");
 gotoxy(x-4,20); write("....."); gotoxy(x+1+mdx,20); write(".....");

redraw:                               (* пеpеpисовка матpицы *)
 textattr:=1*16+15;
 for dyt:=1 to mdy do begin;
   gotoxy(x+1,y+dyt);
   write(pix[dyt]);
   end;

reread:              (* чтение указания на изменение матpицы *)
 textattr:=3*16+15;
 gotoxy(10,3);  write(dx:2,dy:4);
 gotoxy(65,20); write(mdx+1-dx:2,mdy+1-dy:4);

 gotoxy(x+dx,y+dy);
 ch:=readkey;
 if ch=#27 then goto define_sym;      (* отказ от изменения *)
 if ch=" " then begin;                     (* инвеpсия иглы *)
   if pix[dy,dx]="." then begin;
     pix[dy,dx]:="@";
     if dx>1 then pix[dy,dx-1]:=".";
     if dx<mdx then pix[dy,dx+1]:=".";
     goto redraw;
     end
   else begin;
     pix[dy,dx]:=".";
     goto redraw;
     end;
   end;
 if ch=#0 then begin;              (* пеpеход к дpугой игле *)
   ch:=readkey;
   if ch=#66 then begin;                                    {F8}
     for dyt:=1 to mdy do fillchar(pix[dyt,1],mdx,".");
     goto redraw;
     end;
   if ch=#71 then begin; dy:=dy-1; dx:=dx-1; end;
   if ch=#72 then        dy:=dy-1;
   if ch=#73 then begin; dy:=dy-1; dx:=dx+1; end;
   if ch=#75 then                  dx:=dx-1;
   if ch=#77 then                  dx:=dx+1;
   if ch=#79 then begin; dy:=dy+1; dx:=dx-1; end;
   if ch=#80 then        dy:=dy+1;
   if ch=#81 then begin; dy:=dy+1; dx:=dx+1; end;
(*  if dy<=0 then dy:=1; if dy>mdy then dy:=mdy;  *)
(*  if dx<=0 then dx:=1; if dx>mdx then dx:=mdx;  *)
   dy:=(dy+mdy-1) mod mdy +1;
   dx:=(dx+mdx-1) mod mdx +1;
   goto reread;
   end;
 if ch<>#13 then goto reread;   (* пpодолжим pедактиpование *)

 l:=0;   (* последняя колонка *)
 fillchar(ima,sizeof(ima),#0);
 for dx:=1 to mdx do begin;
   for dy:=1 to mdy do begin;
     if pix[dy,dx]="@" then begin;
       l:=dx;
       j1:=(dy+1) mod 2;
       if dy<=16 then j2:=1 else j2:=3-j1;
       if dy<=16 then k:=(dy+1) div 2 else k:=((dy-15) div 2)+4*j1;
       inc(ima[j1+j2,dx],w[k]);
end;
     end;
   end;
 inc(l,2); if l<16 then l:=16; if l>24 then l:=24;
 len[ord(sym)]:=l;
 font[ord(sym)]:=ima;

 goto define_sym;
ret:
 end;

procedure writefile;
var
 i, j, k: integer;
 no: word;
begin;
 rewrite(fontfile,1);
 blockwrite(fontfile,font[ord(" ")],224*sizeof(imatype),no);
 close(fontfile);
 textattr:=0*16+15; writeln(" шpифт сохpанен ");
 pressesc;
 end;

begin;
 readfile;
 editsym;
 clrscr;
 writeln("          pедактиpование окончено");
 if answer(10,3," сохpанить шpифт ? ") then writefile;
 textattr:=0*16+15;
 clrscr;
 end.


 
Inovet ©   (2011-05-02 00:56) [31]

А какой тут код. Тебе надо вывести на принтер управляющие символы точно так же как обычный текст.
Хоть в FARе или в Hex-редаторе открывай текстовый файл и пиши в него последовательность и текст для проверки. Потом
copy file.txt prn
и проверяй результат.


 
plr   (2011-05-02 01:18) [32]

Вывожу код - символы не переопределяются. Печатаются в старом виде. Документации к моему принтеру (Posiflex PP7000) не нашёл, хотя он ESC/p совместимый. По документации к других принтерам вижу разницу в применении ESC & - команды переопределения символов.

Вот и ищу больше вариантов разных исходников переопределения символов, что бы найти работающий для меня вариант.


 
Inovet ©   (2011-05-02 01:32) [33]

\Всю главу прочитал Defining user-defined characters со стр R-17?


 
plr   (2011-05-02 01:37) [34]

Конечно, пробовал различные варианты - не переопределяет начертания символов на моём принтере. Понятно, что я делаю, что-то не так, но что?


 
Германн ©   (2011-05-02 03:17) [35]


> plr   (02.05.11 01:37) [34]
>
> Конечно, пробовал различные варианты

Ты долго просил "варианты".
Пора привести свой код, который неправильно работает.


 
Anatoly Podgoretsky ©   (2011-05-02 07:28) [36]

> plr  (01.05.2011 23:31:26)  [26]

А в разных принтерах это по разному.


 
Sha ©   (2011-05-02 09:39) [37]

> plr   (02.05.11 01:18) [32]

Чтобы принтер позволял переопределять поьзователю символы, он должен быть не только ESC/p совместимым, но и иметь предназначенную для этого установленную память.

Память может быть опцией.


 
Sha ©   (2011-05-02 10:27) [38]

Хотя это очевидно, но все же спрошу.
После загрузки шрифта в принтер, на свой шрифт переключаешься? Команду посылаешь?


 
Sha ©   (2011-05-02 10:39) [39]

Частой причиной ошибок при работе с ESC-командами бывает неверно вычисленная длина последовательности. В результате принтер воспринимает начало следующей команды как часть предыдущей. Иногда это не видно сразу.

Отловить подобное можно при помощи перевода принтера в режим дампа. В этом режиме ты также можешь посмотреть, что посылают на принтер другие программы.


 
Anatoly Podgoretsky ©   (2011-05-02 10:48) [40]

> Sha  (02.05.2011 10:27:38)  [38]

В приведеном руководстве приведена последовательноть команд, как по
программированию, так и по выбору шрифта.


 
Sha ©   (2011-05-02 11:22) [41]

> Anatoly Podgoretsky ©   (02.05.11 10:48) [40]

Ну, я типа в курсе. Не факт, что ТС ее юзает.
По крайней мере из его слов это не следует.


 
Anatoly Podgoretsky ©   (2011-05-02 11:34) [42]

Я не уверен, что он прочитал руководство.


 
Inovet ©   (2011-06-02 13:31) [43]

Нашёл у себя книжку от Epson LX-1050+, не выбросил значит. В ней есть программы на Basic по сабжу. Одна аж 23 строки, другая 25, и в книжке много картинок. Надо?


 
plr   (2011-07-06 18:48) [44]

Парни, всем спасибо, я всё осилил, что хотел, всё получилось.

Если кратко, то:

1. ESC/P - стандарт, но от принтера к принтеру есть расхождения или расширения.

2. Из-за чего я долго не мог вкурить - это построение матрицы каждого символа и представление его в памяти, ряды, верхний бит, нижний.

3. Проще всего символы чертить в приложении, которые существуют под все типы принтеров, затем получать уже готовый bitmap в формате принтера и его засовывать в принтер.

Если кому нужны будут подробности - обращайтесь, подскажу.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2011.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.006 c
2-1310381051
leon2011
2011-07-11 14:44
2011.10.30
Помогите разобраться с TextOutW


2-1310131029
set666
2011-07-08 17:17
2011.10.30
Данные в графическом виде.


15-1309523246
cross
2011-07-01 16:27
2011.10.30
оператор with


11-1238343292
codemaster
2009-03-29 20:14
2011.10.30
KOL и Классы


15-1309445404
картман_
2011-06-30 18:50
2011.10.30
московское метро





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский