Página 1 de 1

Calculo de CPP (Caracteres por polegada)

Enviado: 26 Ago 2023 13:32
por Eduardo Pinho
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.

Calculo de CPP (Caracteres por polegada)

Enviado: 01 Set 2023 13:06
por Kapiaba

Calculo de CPP (Caracteres por polegada)

Enviado: 01 Set 2023 15:45
por Eduardo Pinho
Nao. Só usei o proprio metodo da Win_prn que já me dá o PPP: oJob:PixelsPerInchX

E é 600.

Calculo de CPP (Caracteres por polegada)

Enviado: 01 Set 2023 15:48
por JoséQuintas
Chutando:

Talvez margens ?

Calculo de CPP (Caracteres por polegada)

Enviado: 01 Set 2023 15:59
por Eduardo Pinho
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.

Calculo de CPP (Caracteres por polegada)

Enviado: 01 Set 2023 16:10
por Eduardo Pinho
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.

Calculo de CPP (Caracteres por polegada)

Enviado: 02 Set 2023 08:05
por Poka
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

Calculo de CPP (Caracteres por polegada)

Enviado: 02 Set 2023 08:59
por Jairo Maia
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) ?
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".

Calculo de CPP (Caracteres por polegada)

Enviado: 02 Set 2023 09:51
por Poka
Eu só uso um tipo de fonte pra tudo, COURIER NEW. se não é sofrer demais.



Poka

Calculo de CPP (Caracteres por polegada)

Enviado: 03 Set 2023 09:39
por Eduardo Pinho
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.

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