Calculo de CPP (Caracteres por polegada)
Moderador: Moderadores
-
Eduardo Pinho
- Colaborador

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Calculo de CPP (Caracteres por polegada)
Boa tarde,
Pessoal, estou apanhando muito e nao consigo entender uma coisa, será que alguem consegue me explicar?
Se oPrinter:PixelsPerInchX // Pixels por Polegada igual a 600
e oPrinter:CharWidth // Largura do caractere em pixels igual 62
CPP (Caracteres por polegada) nao deveria ser 9.68 (600 / 62) ?
Eu acho que sim. Mas entao porque oPrinter:fontWidth[2] dividido por oPrinter:fontWidth[1] está dando 9.43 ?
Notem que isso nao sao variaveis minhas, sao todos valores retornados pelos metodos da classe.
Entao porque estao incoerentes?
Nao consigo descobrir onde estou errando.
Agradeço a ajuda.
Pessoal, estou apanhando muito e nao consigo entender uma coisa, será que alguem consegue me explicar?
Se oPrinter:PixelsPerInchX // Pixels por Polegada igual a 600
e oPrinter:CharWidth // Largura do caractere em pixels igual 62
CPP (Caracteres por polegada) nao deveria ser 9.68 (600 / 62) ?
Eu acho que sim. Mas entao porque oPrinter:fontWidth[2] dividido por oPrinter:fontWidth[1] está dando 9.43 ?
Notem que isso nao sao variaveis minhas, sao todos valores retornados pelos metodos da classe.
Entao porque estao incoerentes?
Nao consigo descobrir onde estou errando.
Agradeço a ajuda.
-
Eduardo Pinho
- Colaborador

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Calculo de CPP (Caracteres por polegada)
Nao. Só usei o proprio metodo da Win_prn que já me dá o PPP: oJob:PixelsPerInchX
E é 600.
E é 600.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Calculo de CPP (Caracteres por polegada)
Chutando:
Talvez margens ?
Talvez margens ?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
Eduardo Pinho
- Colaborador

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Calculo de CPP (Caracteres por polegada)
Sei la, Quintas, pode ser.
Eu ainda nao consegui entender essa matematica, mas descobri porque acontece e como corrigir.
Com :SetFont eu defino o CPP com um array de 2 elementos, o segundo dividido pelo primeiro. Até aí tudo bem.
Só que descobri que {1,20} não é a mesma coisa que {3,60} nao sei porque. Só sei que usando o 1 essa incoerencia que me fez abrir o topico, aumenta.
Se eu usar o 3 melhora. Mas como nao faz diferenca que divisor usar, porque afinal vai dividir o segundo pelo primeiro, botei logo {50,1000}.
E assim a incoerencia acabou. Ficou tudo perfeito os posicionamentos de margens, etc...
Ou seja, corrigi, mas nao entendi o que exatamente :SetFont faz.
Eu ainda nao consegui entender essa matematica, mas descobri porque acontece e como corrigir.
Com :SetFont eu defino o CPP com um array de 2 elementos, o segundo dividido pelo primeiro. Até aí tudo bem.
Só que descobri que {1,20} não é a mesma coisa que {3,60} nao sei porque. Só sei que usando o 1 essa incoerencia que me fez abrir o topico, aumenta.
Se eu usar o 3 melhora. Mas como nao faz diferenca que divisor usar, porque afinal vai dividir o segundo pelo primeiro, botei logo {50,1000}.
E assim a incoerencia acabou. Ficou tudo perfeito os posicionamentos de margens, etc...
Ou seja, corrigi, mas nao entendi o que exatamente :SetFont faz.
-
Eduardo Pinho
- Colaborador

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Calculo de CPP (Caracteres por polegada)
Meu melhor palpite é precisao. 20 caracteres em 1 polegada seria diferente de 60 caracteres em 3 polegadas, devido a precisao. Mas isso só se CPP fosse obrigatoriamente um numero inteiro, mas acho que nao é. CPP que eu saiba pode ser fracionado, logo, essa teoria nao me convence.
O metodo :SetFont, na hora de calcular o :CharWidth baseado no CPP informado, calcula errado se o primeiro elemento do array for baixo. Essa foi minha conclusao. Para um :CharWidth mais coerente com o CPP que voce informou, use um divisor mais alto.
O metodo :SetFont, na hora de calcular o :CharWidth baseado no CPP informado, calcula errado se o primeiro elemento do array for baixo. Essa foi minha conclusao. Para um :CharWidth mais coerente com o CPP que voce informou, use um divisor mais alto.
Calculo de CPP (Caracteres por polegada)
Bom dia
Não sei se entendi bem, vc quer saber quanto cabe em determinado tamanho?
considerando larg da pagina 190mm
multiplicar 190 * indice = qt carac
para tamanho da letra 5 indice 1 = 190 caracters
tamanho 6 indice 0,85 = 161
tam 7 ind 0,70 == 133
tam 8 indice 0,633 = 120
tam 9 ind 0,56 = 106
tam 10 ind 0,50 = 95
tam 11 ind 0,45 = 85
tam 12 ind 0,42 = 79
tam 13 ind 0,40 = 76
tam 14 ind 0,36 = 68
tam 15 ind 0.35 = 66
exm um quadro com 80mm larg e tamanho letra 11
80 * 0,45 = 36 caract.
Não sei se isso que vc quer.
Poka
Não sei se entendi bem, vc quer saber quanto cabe em determinado tamanho?
considerando larg da pagina 190mm
multiplicar 190 * indice = qt carac
para tamanho da letra 5 indice 1 = 190 caracters
tamanho 6 indice 0,85 = 161
tam 7 ind 0,70 == 133
tam 8 indice 0,633 = 120
tam 9 ind 0,56 = 106
tam 10 ind 0,50 = 95
tam 11 ind 0,45 = 85
tam 12 ind 0,42 = 79
tam 13 ind 0,40 = 76
tam 14 ind 0,36 = 68
tam 15 ind 0.35 = 66
exm um quadro com 80mm larg e tamanho letra 11
80 * 0,45 = 36 caract.
Não sei se isso que vc quer.
Poka
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Calculo de CPP (Caracteres por polegada)
Somente se você estiver usando fonte monoespaçada. Se a fonte for tamanho variável, no mesmo espaço de pixels você coloca muitos "i" e bem poucos "w".Eduardo Pinho escreveu:Se oPrinter:PixelsPerInchX // Pixels por Polegada igual a 600
e oPrinter:CharWidth // Largura do caractere em pixels igual 62
CPP (Caracteres por polegada) nao deveria ser 9.68 (600 / 62) ?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Calculo de CPP (Caracteres por polegada)
Eu só uso um tipo de fonte pra tudo, COURIER NEW. se não é sofrer demais.
Poka
Poka
-
Eduardo Pinho
- Colaborador

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Calculo de CPP (Caracteres por polegada)
Sim, Jairo, sei disso sim.. Só uso Lucida Console.
Poka, nao é bem isso. Esse calculo eu faço de uma outra forma, mas sim, todos tem que chegar no mesmo lugar.
O que queimou meus miolos é que após eu definir os tamanhos de fonte, OS PRÓPRIOS METODOS DA WIN_PRN retornavam valores incoerentes (veja o post de abertura do tópico). O :CharWidth que ele definia não era apropriado para o CPP que eu informei no array de 2 elementos de :SetFont. (Só dá o problema com CPP quebrado, CPP inteiro fica tudo certo.)
PPP=600 (pixels por polegada) dividido pelo CPP que voce define no famigerado array {1,9.43}, dá 63.6. Como o pixel nao pode ser "quebrado", isso, na minha cabeça, teria que gerar OBRIGATORIAMENTE um :CharWidth de 63 ou 64, mas gerava 67.
Resolvi o problema quando descobri que o divisor (primeiro elemento do array) muito baixo aumentava a incoerencia. Divisor 1 é o pior (NUNCA USE {1,CPP}. Esse era o vilão. Aumente o divisor. Quanto maior a fonte, maior tem que ser o divisor senao vai dar errado. Fontes garrafais dá errado completamente se voce usar divisor 1.
Resumindo, nao entendi o porque mas resolvi, informando um array {2000,2000*CPP}. Assim o :CharWidth ficou coerente e tudo deu certo. O :CharWidth é essencial pra suas contas darem certo.
Experimente compilar e rodar o teste abaixo pra voces verem o que estou falando. É muito louco. O divisor 1 estraga tudo. Confira aí.
A proposito, uso HB3.0, nos mais novos nao sei se mudaram isso.
Poka, nao é bem isso. Esse calculo eu faço de uma outra forma, mas sim, todos tem que chegar no mesmo lugar.
O que queimou meus miolos é que após eu definir os tamanhos de fonte, OS PRÓPRIOS METODOS DA WIN_PRN retornavam valores incoerentes (veja o post de abertura do tópico). O :CharWidth que ele definia não era apropriado para o CPP que eu informei no array de 2 elementos de :SetFont. (Só dá o problema com CPP quebrado, CPP inteiro fica tudo certo.)
PPP=600 (pixels por polegada) dividido pelo CPP que voce define no famigerado array {1,9.43}, dá 63.6. Como o pixel nao pode ser "quebrado", isso, na minha cabeça, teria que gerar OBRIGATORIAMENTE um :CharWidth de 63 ou 64, mas gerava 67.
Resolvi o problema quando descobri que o divisor (primeiro elemento do array) muito baixo aumentava a incoerencia. Divisor 1 é o pior (NUNCA USE {1,CPP}. Esse era o vilão. Aumente o divisor. Quanto maior a fonte, maior tem que ser o divisor senao vai dar errado. Fontes garrafais dá errado completamente se voce usar divisor 1.
Resumindo, nao entendi o porque mas resolvi, informando um array {2000,2000*CPP}. Assim o :CharWidth ficou coerente e tudo deu certo. O :CharWidth é essencial pra suas contas darem certo.
Experimente compilar e rodar o teste abaixo pra voces verem o que estou falando. É muito louco. O divisor 1 estraga tudo. Confira aí.
A proposito, uso HB3.0, nos mais novos nao sei se mudaram isso.
Código: Selecionar todos
*#include "visual2.ch"
#include "common.ch"
#Include "dbinfo.ch"
#include "hbdyn.ch"
REQUEST HB_CodePage_ITISB
REQUEST HB_CodePage_PT860
REQUEST DBFCDX
hb_langSelect( "pt" )
*#require "hbmisc"
*#require "hbfoxpro"
func main
#include "hbgtinfo.ch"
#include "inkey.ch"
#include "directry.ch"
*Set( _SET_CODEPAGE, "ITISB" )
Set( _SET_CODEPAGE, "PT850" )
SET( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE )
*SET( _SET_EVENTMASK, INKEY_ALL )
rddsetdefault([DBFCDX])
hb_gtinfo( HB_GTI_ICONFILE , [rei.ico] )
hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
hb_gtinfo( HB_GTI_FONTSIZE , 24 )
hb_gtinfo( HB_GTI_FONTWIDTH, 36 )
para impressora
* Se nao informou a impressora no parametro pega a primeira da lista
if impressora=NIL
a=Getprinters()
impressora=a[1]
endif
oJob = win_prn():New(impressora)
oJob:Create()
oJob:Landscape:= .F.
oJob:SetPrintQuality(-1)
oJob:Copies:= 1
oJob:FormType:= 9 // A4
*clear
CPP=0
accept [CPP desejado : ] to CPP
CPP=val(strtran(CPP,[,],[.]))
PPP = oJob:PixelsPerInchX
melhor=round(PPP/CPP,0)
? [Pixels por Polegada (PPP) = ]+str(PPP,5,0)
? [Melhor valor para :CharWidth (PPP / CPP) = ]+str(melhor,4,0)
for divisor=1 to 10
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
next
for divisor=20 to 100 step 10
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
next
for divisor=200 to 1000 step 100
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
next
divisor=1500
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
divisor=2000
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
? []
quit
