Page 1 of 1

Recording character images as files

Posted: Thu Jun 18, 2015 7:46 am
by Eugene Lutsenko
I want to record the image specified categories of characters in a file. While the shows, but does not record. I think something is wrong with the duplicate objects. Can anyone help?

Code: Select all

PROCEDURE AppSys
// Рабочий стол остается окном приложения
RETURN

**********************************************************************************
FUNCTION Main()

LOCAL GetList[0], cFont := Pad('200.Arial Bold',50)

DC_IconDefault(1000)


@ 0,0 DCGROUP oGroup1 CAPTION '' SIZE 90.0, 2.5

@ 1,2 DCSAY 'Задайте тип и размер шрифта:' GET cFont POPUP {|c|DC_PopFont(c)} SAYSIZE 0 SAYBOTTOM PARENT oGroup1

PUBLIC aPar[6]

AFILL(aPar, .F.)
aPar[1] = .T.

@ 3, 0 DCGROUP oGroup2 CAPTION 'Задайте, какие символы отображать:' SIZE 90.0, 7.5

@ 1, 2 DCCHECKBOX aPar[1] PROMPT 'Цифры'       PARENT oGroup2
@ 2, 2 DCCHECKBOX aPar[2] PROMPT 'Буквы'       PARENT oGroup2
@ 3, 2 DCCHECKBOX aPar[3] PROMPT 'Латинские'   PARENT oGroup2
@ 4, 2 DCCHECKBOX aPar[4] PROMPT 'Русские'     PARENT oGroup2
@ 5, 2 DCCHECKBOX aPar[5] PROMPT 'Заглавные'   PARENT oGroup2
@ 6, 2 DCCHECKBOX aPar[6] PROMPT 'Строчные'    PARENT oGroup2

@ 2,55 DCPUSHBUTTON CAPTION 'Отобразить шрифт' SIZE 20, 3.8 ACTION {||DisplayFonts(cFont)} PARENT oGroup2

DCREAD GUI;
      TO lExit ;
      FIT;
      ADDBUTTONS;
      MODAL;
      TITLE "Запись изображений символов"

********************************************************************
      IF lExit
         ** Button Ok
      ELSE
         QUIT
      ENDIF
********************************************************************

FOR jj = 1 TO 255

    DrawSimbol(jj, cFont)

NEXT

QUIT

***** Записать заданные символы в виде графических файлов

FOR mSimb = 1 TO 255

    StrFile(ALLTRIM(STR(mSimb)), '_Simb.txt')     // Запись текстового файла _Simb.txt

    IF aPar[1]           // Цифры
       IF mSimb <= 48 .AND. mSimb <= 57
          DrawSimbol(cFont)
       ENDIF
    ENDIF
    IF aPar[2]           // Буквы
       IF aPar[3]        // Латинские
          IF aPar[5]     // Заглавные
             IF mSimb <= 65 .AND. mSimb <= 90
                DrawSimbol(cFont)
             ENDIF
          ENDIF
          IF aPar[6]     // Строчные
             IF mSimb <= 97 .AND. mSimb <= 122
                DrawSimbol(cFont)
             ENDIF
          ENDIF
       ENDIF
       IF aPar[4]        // Русские
          IF aPar[5]     // Заглавные
             IF mSimb <= 128 .AND. mSimb <= 159
                DrawSimbol(cFont)
             ENDIF
          ENDIF
          IF aPar[6]     // Строчные
             IF mSimb <= 160 .AND. mSimb <= 175
                DrawSimbol(cFont)
             ENDIF
             IF mSimb <= 224 .AND. mSimb <= 239
                DrawSimbol(cFont)
             ENDIF
          ENDIF
       ENDIF
    ENDIF
NEXT

RETURN nil

* -------------

FUNCTION DisplayFonts( cFont )

LOCAL GetList[0], i, nRow, nCol

cFont := Alltrim(cFont)
nRow := 1
nCol := 0

FOR i := 1 TO 255
  @ nRow, nCol DCSAY Str(i,3) FONT '10.Lucida Console' SAYRIGHTBOTTOM SAYSIZE 10
  @ DCGUI_ROW, DCGUI_COL + 10 DCSAY Chr(i) FONT cFont SAYSIZE 0 SAYBOTTOM
  nRow++
  IF nRow % 33 == 0
    nRow := 1
    nCol += 18
  ENDIF
NEXT

DCREAD GUI FIT TITLE 'Displaying Fonts: ' + cFont MODAL

RETURN nil

***********************************************************************************
******** Display a warning message
******** Может выдавать сообщения элементами массива и без ctitle:

*message := {}
*AADD(message,'1-е сообщение')
*AADD(message,'2-е сообщение')
*AADD(message,'3-е сообщение')
*LB_Warning( message )

FUNCTION LB_Warning( message, ctitle )

  LOCAL aMsg := {}
  DEFAULT cTitle TO ''
  IF valtype(message) # 'A'
    aadd(aMsg,message)
  ELSE
    aMsg := message
  ENDIF
  IF LEN(ALLTRIM(cTitle)) > 0
     DC_MsgBox( ,,aMsg,cTitle)
  ELSE
     DC_MsgBox( ,,aMsg,'(C) Универсальная когнитивная аналитическая система "Эйдос-Х++"')
  ENDIF

RETURN NIL


**********************************************
******** ВИЗУАЛИЗАЦИЯ СИМВОЛА ****************
**********************************************
FUNCTION DrawSimbol(jj, cFont)

   LOCAL GetList := {}, oStatic

   PRIVATE nEvent, mp1, mp2, oXbp                      // Переменные анализа событий

   PUBLIC X_MaxW := 1313, Y_MaxW := 640                // Размер графического окна для самого графика в пикселях

   @ 2,1 DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX SIZE X_MaxW+11, Y_MaxW+20 PIXEL; // Размер окна в пикселях (от Тома)
         OBJECT oStatic;
         EVAL {|| _PresSpaceSimbol(jj, oStatic, cFont) }

   DCREAD GUI ;
      TITLE "Рисование изображений символов в системе ЭЙДОС-X++";   // Надпись на окне графика
      FIT ;
      BUTTONS DCGUI_BUTTON_EXIT

RETURN NIL
*************************************************
STATIC FUNCTION _PresSpaceSimbol(jj, oStatic, cFont )

   LOCAL oPS, oDevice

   PUBLIC X_MaxW := 1313, Y_MaxW := 640                // Размер графического окна для самого графика в пикселях

   oPS := XbpPresSpace():new()         // Create a PS
   oDevice := oStatic:winDevice()      // Get the device context
   oPS:create( oDevice )               // Link device context to PS
   oPS:SetViewPort( { 0, 0, X_MaxW, Y_MaxW } )
   oStatic:paint := {|mp1,mp2,obj| mp1 := LC_DrawSimbol(jj, oPS, oStatic, cFont ) }

RETURN NIL

*******************************************************
STATIC FUNCTION LC_DrawSimbol(jj, oPS, oStatic, cFont )


*   mSimbol = VAL(FileStr('_Simb.txt'))
*   MsgBox(STR(mSimbol)+' '+CHR(mSimbol))

   mSimbol = jj

   IF LEN(CHR(mSimbol)) = 0
      RETURN NIL
   ENDIF

   PRIVATE X0 := 0 + X_MaxW/2
   PRIVATE Y0 := 5 + Y_MaxW/2                          // Начало координат по осям X и Y

   PRIVATE W_Wind := X_MaxW - X0                       // Ширина окна для самого графика
   PRIVATE H_Wind := Y_MaxW - Y0                       // Высота окна для самого графика

   **** Написать заголовок диаграммы

   aFonts := XbpFont():new():list()                    // Все доступные шрифты

   oFont := XbpFont():new():create(cFont)
   GraSetFont(oPS , oFont)                             // установить шрифт
   aAttrF := ARRAY( GRA_AS_COUNT ) 
   aAttrF [ GRA_AS_COLOR      ] := GRA_CLR_BLACK 
   aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER   // Выравнивание символов по горизонтали по центру относительно точки начала вывода
   aAttrF [ GRA_AS_VERTALIGN  ] := GRA_VALIGN_HALF     // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
   GraSetAttrString( oPS, aAttrF )                     // Установить символьные атрибуты

   mTitle = CHR(mSimbol)
   aTxtPar = DC_GraQueryTextbox(mTitle, oFont)         // {101,16} Определяет длину и высоту текста в пикселях для некоторых шрифтов
*  MsgBox("Длина текста в пикселях="+ALLTRIM(STR(aTxtPar[1]))+". Высота текста в пикселях="+ALLTRIM(STR(aTxtPar[2])))
   GraStringAt( oPS, { X_MaxW/2, Y_MaxW/2+aTxtPar[2]+5 }, mTitle)

   ***** Запись изображения символа в папку с именем - названием шрифта: cFont в виде файла с имененем: Символ: CHR(mSimbol)

   cFont = ALLTRIM(cFont)

   IF FILEDATE(STRTRAN(cFont,'.','_'),16) = CTOD("//")
      DIRMAKE(STRTRAN(cFont,'.','_'))
      Mess = 'В папке текущего приложения не было директории: "'+STRTRAN(cFont,'.','_')+'" для изображений символов этого шрифта и она была создана!'
      LB_Warning(Mess, 'Рисование изображений символов в системе "ЭЙДОС-X++"' )
   ENDIF

   cFileName = STRTRAN(cFont,'.','_')+"\Символ: "+CHR(mSimbol)+".bmp"
   DC_Scrn2ImageFile( oStatic, cFileName )


RETURN NIL
[/size]

Re: Recording character images as files

Posted: Thu Jun 18, 2015 9:03 am
by Auge_Ohr
hi,

have a look at c:\exp19\Source\Dclipx\_dcfunct.prg

Code: Select all

FUNCTION DC_Scrn2ImageFile( oXbp, cFileName, nFormat )
LOCAL oSourcePS, oBitmap, oClipBoard, aPos

oSourcePS := oXbp:lockPS()
you are using a "extra" XbpPresspace() to paint while DC_Scrn2ImageFile() use MicroPS which is different.

have a look at c:\exp19\Source\Dclipx\_dcxbutt.prg

Code: Select all

FUNCTION GraSaveScreen( oSourcePS, aPos, aSize )
pass your oPS as oSourcePS to get oBitmap which you can o:saveFile()

Re: Recording character images as files

Posted: Thu Jun 18, 2015 10:08 am
by Eugene Lutsenko
Thank you, Jimmy, for having responded. But such clues are not enough. Could you give an example or to correct the mistake in my program.

PS
I would also like to have the option, when all the characters are drawn and stored as files all in a row without stopping (to not have to press a key to move to the next character)

Re: Recording character images as files

Posted: Thu Jun 18, 2015 10:20 am
by Auge_Ohr
hi,

try this

Code: Select all

STATIC FUNCTION LC_DrawSimbol(jj, oPS, oStatic, cFont )
LOCAL oBitmap 

   // here you paint with GRA
   ...
   GraStringAt( oPS, { X_MaxW/2, Y_MaxW/2+aTxtPar[2]+5 }, mTitle)

   // instead of DC_Scrn2ImageFile( oStatic, cFileName )
   oBitmap := GraSaveScreen( oPS, oStatic:CurrentPos() , oStatic:CurrentSize() )

   cFileName = STRTRAN(cFont,'.','_')+"\Символ: "+CHR(mSimbol)+".bmp"
   oBitmap:Savefile(cFileName)

Re: Recording character images as files

Posted: Thu Jun 18, 2015 10:49 am
by Eugene Lutsenko
Something similar is recorded. Not exactly what you need, but it seems the problem is not in the most graphic file records, and the other part of the program. I will understand more. Thank you very much!

Re: Recording character images as files

Posted: Thu Jun 18, 2015 1:39 pm
by Eugene Lutsenko
That's how things work. Alaska can not write files with names with Russian characters, and some not important symbols of the alphabet:

Code: Select all

   DIRCHANGE(mFontDir)      // Перейти в папку mFontDir
   cFileName = 'CHR'+STRTRAN(STR(mSimbol,3)," ","0")+".bmp"    // Если цифры или латинские буквы  - имя - прямо сам символ, а иначе код: CHR###
   DC_Scrn2ImageFile( oStatic, cFileName )
   DIRCHANGE("..")          // Перейти в текущую папку
[/size]

Re: Recording character images as files

Posted: Thu Jun 18, 2015 2:15 pm
by Eugene Lutsenko
Like so more or less work, but somehow does not display the characters that are defined

Code: Select all

PROCEDURE AppSys
// Рабочий стол остается окном приложения
RETURN

**********************************************************************************
FUNCTION Main()

LOCAL GetList[0], cFont := Pad('200.Arial Bold',50)

DC_IconDefault(1000)


@ 0,0 DCGROUP oGroup1 CAPTION '' SIZE 90.0, 2.5

@ 1,2 DCSAY 'Задайте тип и размер шрифта:' GET cFont POPUP {|c|DC_PopFont(c)} SAYSIZE 0 SAYBOTTOM PARENT oGroup1

PUBLIC aPar[6]

AFILL(aPar, .F.)
aPar[1] = .T.

@ 3, 0 DCGROUP oGroup2 CAPTION 'Задайте, какие символы отображать:' SIZE 90.0, 7.5

@ 1, 2 DCCHECKBOX aPar[1] PROMPT 'Цифры'       PARENT oGroup2
@ 2, 2 DCCHECKBOX aPar[2] PROMPT 'Буквы'       PARENT oGroup2
@ 3, 2 DCCHECKBOX aPar[3] PROMPT 'Латинские'   PARENT oGroup2
@ 4, 2 DCCHECKBOX aPar[4] PROMPT 'Русские'     PARENT oGroup2
@ 5, 2 DCCHECKBOX aPar[5] PROMPT 'Заглавные'   PARENT oGroup2
@ 6, 2 DCCHECKBOX aPar[6] PROMPT 'Строчные'    PARENT oGroup2

@ 2,55 DCPUSHBUTTON CAPTION 'Отобразить шрифт' SIZE 20, 3.8 ACTION {||DisplayFonts(cFont)} PARENT oGroup2

DCREAD GUI;
      TO lExit ;
      FIT;
      ADDBUTTONS;
      MODAL;
      TITLE "Запись изображений символов"

********************************************************************
      IF lExit
         ** Button Ok
      ELSE
         QUIT
      ENDIF
********************************************************************

***** Записать заданные символы в виде графических файлов

FOR mSimb = 1 TO 255

    StrFile(ALLTRIM(STR(mSimb)), '_Simb.txt')     // Запись текстового файла _Simb.txt

    IF aPar[1]           // Цифры
       IF mSimb <= 48 .AND. mSimb <= 57
          DrawSimbol(cFont)
       ENDIF
    ENDIF
    IF aPar[2]           // Буквы
       IF aPar[3]        // Латинские
          IF aPar[5]     // Заглавные
             IF mSimb <= 65 .AND. mSimb <= 90
                DrawSimbol(cFont)
             ENDIF
          ENDIF
          IF aPar[6]     // Строчные
             IF mSimb <= 97 .AND. mSimb <= 122
                DrawSimbol(cFont)
             ENDIF
          ENDIF
       ENDIF
       IF aPar[4]        // Русские
          IF aPar[5]     // Заглавные
             IF mSimb <= 128 .AND. mSimb <= 159
                DrawSimbol(cFont)
             ENDIF
          ENDIF
          IF aPar[6]     // Строчные
             IF mSimb <= 160 .AND. mSimb <= 175
                DrawSimbol(cFont)
             ENDIF
             IF mSimb <= 224 .AND. mSimb <= 239
                DrawSimbol(cFont)
             ENDIF
          ENDIF
       ENDIF
    ENDIF
NEXT

RETURN nil

* -------------

FUNCTION DisplayFonts( cFont )

LOCAL GetList[0], i, nRow, nCol

cFont := Alltrim(cFont)
nRow := 1
nCol := 0

FOR i := 1 TO 255
  @ nRow, nCol DCSAY Str(i,3) FONT '10.Lucida Console' SAYRIGHTBOTTOM SAYSIZE 10
  @ DCGUI_ROW, DCGUI_COL + 10 DCSAY Chr(i) FONT cFont SAYSIZE 0 SAYBOTTOM
  nRow++
  IF nRow % 33 == 0
    nRow := 1
    nCol += 18
  ENDIF
NEXT

DCREAD GUI FIT TITLE 'Displaying Fonts: ' + cFont MODAL

RETURN nil

***********************************************************************************
******** Display a warning message
******** Может выдавать сообщения элементами массива и без ctitle:

*message := {}
*AADD(message,'1-е сообщение')
*AADD(message,'2-е сообщение')
*AADD(message,'3-е сообщение')
*LB_Warning( message )

FUNCTION LB_Warning( message, ctitle )

  LOCAL aMsg := {}
  DEFAULT cTitle TO ''
  IF valtype(message) # 'A'
    aadd(aMsg,message)
  ELSE
    aMsg := message
  ENDIF
  IF LEN(ALLTRIM(cTitle)) > 0
     DC_MsgBox( ,,aMsg,cTitle)
  ELSE
     DC_MsgBox( ,,aMsg,'(C) Универсальная когнитивная аналитическая система "Эйдос-Х++"')
  ENDIF

RETURN NIL


**********************************************
******** ВИЗУАЛИЗАЦИЯ СИМВОЛА ****************
**********************************************
FUNCTION DrawSimbol( cFont)

   LOCAL GetList := {}, oStatic

   PRIVATE nEvent, mp1, mp2, oXbp                      // Переменные анализа событий

   PUBLIC X_MaxW := 1313, Y_MaxW := 640                // Размер графического окна для самого графика в пикселях

   @ 2,1 DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX SIZE X_MaxW+11, Y_MaxW+20 PIXEL; // Размер окна в пикселях (от Тома)
         OBJECT oStatic;
         EVAL {|| _PresSpaceSimbol( oStatic, cFont) }


   DCREAD GUI ;
      TITLE "Рисование изображений символов в системе ЭЙДОС-X++";   // Надпись на окне графика
      FIT ;
      BUTTONS DCGUI_BUTTON_EXIT

RETURN NIL
*************************************************
STATIC FUNCTION _PresSpaceSimbol( oStatic, cFont )

   LOCAL oPS, oDevice

   PUBLIC X_MaxW := 1313, Y_MaxW := 640                // Размер графического окна для самого графика в пикселях

   oPS := XbpPresSpace():new()         // Create a PS
   oDevice := oStatic:winDevice()      // Get the device context
   oPS:create( oDevice )               // Link device context to PS
   oPS:SetViewPort( { 0, 0, X_MaxW, Y_MaxW } )
   oStatic:paint := {|mp1,mp2,obj| mp1 := LC_DrawSimbol( oPS, oStatic, cFont ) }

RETURN NIL

*******************************************************
STATIC FUNCTION LC_DrawSimbol( oPS, oStatic, cFont )

   LOCAL oBitmap 

   mSimbol = VAL(FileStr('_Simb.txt'))
   ERASE('_Simb.txt')
*  MsgBox(STR(mSimbol)+' '+CHR(mSimbol))

   IF LEN(CHR(mSimbol)) = 0
      RETURN NIL
   ENDIF

   PRIVATE X0 := 0 + X_MaxW/2
   PRIVATE Y0 := 5 + Y_MaxW/2                          // Начало координат по осям X и Y

   PRIVATE W_Wind := X_MaxW - X0                       // Ширина окна для самого графика
   PRIVATE H_Wind := Y_MaxW - Y0                       // Высота окна для самого графика

   **** Написать заголовок диаграммы

   aFonts := XbpFont():new():list()                    // Все доступные шрифты

   oFont := XbpFont():new():create(cFont)
   GraSetFont(oPS , oFont)                             // установить шрифт
   aAttrF := ARRAY( GRA_AS_COUNT ) 
   aAttrF [ GRA_AS_COLOR      ] := GRA_CLR_BLACK 
   aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER   // Выравнивание символов по горизонтали по центру относительно точки начала вывода
   aAttrF [ GRA_AS_VERTALIGN  ] := GRA_VALIGN_HALF     // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
   GraSetAttrString( oPS, aAttrF )                     // Установить символьные атрибуты

   mTitle = CHR(mSimbol)
   aTxtPar = DC_GraQueryTextbox(mTitle, oFont)         // {101,16} Определяет длину и высоту текста в пикселях для некоторых шрифтов
*  MsgBox("Длина текста в пикселях="+ALLTRIM(STR(aTxtPar[1]))+". Высота текста в пикселях="+ALLTRIM(STR(aTxtPar[2])))
   GraStringAt( oPS, { X_MaxW/2, Y_MaxW/2+aTxtPar[2]+5 }, mTitle)

   ***** Запись изображения символа в папку с именем - названием шрифта: cFont в виде файла с имененем: Символ: CHR(mSimbol)

   mFontDir = ALLTRIM(cFont)
   mFontDir = STRTRAN(mFontDir,' ','_')
   mFontDir = STRTRAN(mFontDir,'.','_')

   IF FILEDATE(mFontDir,16) = CTOD("//")
      DIRMAKE(mFontDir)
      Mess = 'В папке текущего приложения не было директории: "'+mFontDir+'" для изображений символов этого шрифта и она была создана!'
      LB_Warning(Mess, 'Рисование изображений символов в системе "ЭЙДОС-X++"' )
   ENDIF

   DIRCHANGE(mFontDir)      // Перейти в папку mFontDir
   cFileName = 'CHR'+STRTRAN(STR(mSimbol,3)," ","0")+".bmp"    // Если цифры или латинские буквы - имя = сам символ, а иначе код: CHR###
   DC_Scrn2ImageFile( oStatic, cFileName )
   DIRCHANGE("..")          // Перейти в текущую папку

   ***** Джимми ************

*  LOCAL oBitmap // В начале
*  oBitmap := GraSaveScreen( oPS, oStatic:CurrentPos() , oStatic:CurrentSize() )
*  DIRCHANGE(mFontDir)      // Перейти в папку mFontDir
*  cFileName = 'CHR'+STRTRAN(STR(mSimbol,3)," ","0")+".bmp"    // Если цифры или латинские буквы  - имя - прямо сам символ, а иначе код: CHR###
*  oBitmap:Savefile(cFileName)
*  DIRCHANGE("..")          // Перейти в текущую папку


RETURN NIL

[/size]

Re: Recording character images as files

Posted: Thu Jun 18, 2015 7:12 pm
by Eugene Lutsenko
Good news.I found that Alaska is in the national alphabet can be used (for example, Russian) in file names, and everything works fine:

StrFile(ALLTRIM(STR(mSimb)), ConvToAnsiCP("Привет.ini"))

But uppercase and lowercase letters do not seem to differ in filenames