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: 20532
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
- Curtiram: 2 vezes
Calculo de CPP (Caracteres por polegada)
Chutando:
Talvez margens ?
Talvez margens ?
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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.
- Poka
- Usuário Nível 4

- Mensagens: 570
- Registrado em: 25 Out 2004 21:26
- Localização: Leme/SP
- Curtiram: 1 vez
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: 2849
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
- Curtiu: 4 vezes
- Curtiram: 1 vez
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)
- Poka
- Usuário Nível 4

- Mensagens: 570
- Registrado em: 25 Out 2004 21:26
- Localização: Leme/SP
- Curtiram: 1 vez
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