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: 1908
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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Calculo de CPP (Caracteres por polegada)

Mensagem por JoséQuintas »

Chutando:

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/
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: 563
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: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

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: 563
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