Calculo de CPP (Caracteres por polegada)

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Calculo de CPP (Caracteres por polegada)

Mensagem 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.
Kapiaba
Colaborador
Colaborador
Mensagens: 1912
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Calculo de CPP (Caracteres por polegada)

Mensagem por Kapiaba »

Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Calculo de CPP (Caracteres por polegada)

Mensagem por Eduardo Pinho »

Nao. Só usei o proprio metodo da Win_prn que já me dá o PPP: oJob:PixelsPerInchX

E é 600.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Calculo de CPP (Caracteres por polegada)

Mensagem por JoséQuintas »

Chutando:

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/
Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Calculo de CPP (Caracteres por polegada)

Mensagem 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.
Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Calculo de CPP (Caracteres por polegada)

Mensagem 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.
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 565
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Calculo de CPP (Caracteres por polegada)

Mensagem 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
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

Calculo de CPP (Caracteres por polegada)

Mensagem 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".
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)
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 565
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Calculo de CPP (Caracteres por polegada)

Mensagem por Poka »

Eu só uso um tipo de fonte pra tudo, COURIER NEW. se não é sofrer demais.



Poka
Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Calculo de CPP (Caracteres por polegada)

Mensagem 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

Responder