Página 12 de 23

RMChart

Enviado: 19 Mai 2016 09:24
por asimoes
Quintas,

No meu último post, eu tentei reproduzir o gráfico, mas dá erro no AddDataAxis

Código: Selecionar todos

     nIdChart:=2
      oGrafico:CreateChart( hb_gtInfo( HB_GTI_WINHANDLE ), nIdChart, 0, 0, 600, 450, Transparent, RMC_CTRLSTYLEIMAGE, .F., "SEASKY.JPG", "Tahoma", 0, 0 )
      oGrafico:AddRegion( nIdChart, 0, 0, 590, 400, "", .F. )
      oGrafico:AddGrid( nIdChart, 1, Transparent, .F., 20, 20, 575, 330, RMC_BICOLOR_LABELAXIS )
      oGrafico:AddDataAxis(nIdChart,1,RMC_DATAAXISLEFT,0,100,11,8,Chalk,Chalk,RMC_LINESTYLEDOT,0,"","","",RMC_TEXTCENTER) 
      sTemp = "Label 1*Label 2*Label 3*Label 4*Label 5"
      oGrafico:AddLabelAxis( nIdChart, 1, sTemp, 1, 11, RMC_LABELAXISBOTTOM, 5, Yellow, RMC_TEXTCENTER, Chalk, RMC_LINESTYLENONE, "")
      aData:={{50, 70, 40, 60, 30}}
      FOR nCont = 1 TO Len( aData )
         oGrafico:AddBarSeries(nIdChart, 1, aData[nCont], 5, RMC_BARSINGLE, RMC_BAR_FLAT_GRADIENT2, .T., Transparent, .F., 1, RMC_VLABEL_NONE, 1, RMC_HATCHBRUSH_OFF)
      NEXT
      oGrafico:Draw( nIdChart )
      Inkey( 0 )

RMChart

Enviado: 19 Mai 2016 09:29
por asimoes
Descobri o problema:


oGrafico:AddDataAxis(nIdChart,1,RMC_DATAAXISLEFT,0.0,100.0,11,8,Chalk,Chalk,RMC_LINESTYLEDOT,0,"","","",RMC_TEXTCENTER)
aData:={{50.0, 70.0, 40.0, 60.0, 30.0}}

RMChart

Enviado: 19 Mai 2016 09:52
por JoséQuintas
Eu também... rs... Só falta resolver uma linha.
Veja o novo método "tapa-buraco", pra deixar o valor no Harbour com decimais.

Código: Selecionar todos

   METHOD AddDataAxis(a,b,c,d,e, ... )   INLINE ::CallDllStd( "RMC_ADDDATAAXIS", a, b, c, ::ToDecimal(d), ::ToDecimal(e), ... )
   METHOD ToDecimal( c )                 INLINE c + 1.01 - 1.01
Só não funcionou pra essa linha mais escura.

RMChart

Enviado: 19 Mai 2016 09:55
por JoséQuintas
Parece até mentira, mas sem isso dá GPF, porque o tipo de variável não bate com a necessária.


Correção: falta resolver essa linha, e também o gráfico de linha que não aparece no 4.

RMChart

Enviado: 19 Mai 2016 10:01
por JoséQuintas
Um detalhe curioso no gráfico de linhas, mesmo passando com double, os números aparecem em inteiro.
Ele só aparece se eu omitir o restante do gráfico.
grafico.png

RMChart

Enviado: 19 Mai 2016 10:10
por JoséQuintas
Tive uma idéia, não sei se vai ajudar:

Código: Selecionar todos

   METHOD WriteRMCFile( ... )            INLINE ::CallDllStd( "RMC_WRITERMCFILE", ... )
Gravar o gráfico atual, abrir no RMCDesigner, gerar o fonte VB6, e comparar com o fonte anterior VB6.
Talvez ajude a identificar algum parâmetro diferente.

Isso pode ser útil pra outras situações, por isso repassando.

Nota: ficou prática a classe desse jeito... rs

RMChart

Enviado: 19 Mai 2016 10:28
por JoséQuintas
O ideal é não ter que se preocupar com decimais no fonte, por isso é interessante deixar o tratamento disso na classe.
Segue o fonte atual funcionando.
O gráfico em IF .F. é o primeiro, seguido do 5 em 1 no IF .T.

Código: Selecionar todos

#include "hbclass.ch"
#include "rmchart.ch"
#include "hbgtinfo.ch"
#include "hbdyn.ch"
#define RMC_USERWM         ""               // Your watermark
#define RMC_USERWMCOLOR    Black            // Color for the watermark
#define RMC_USERWMLUCENT   30               // Lucent factor between 1(=not visible) and 255(=opaque)
#define RMC_USERWMALIGN    RMC_TEXTCENTER   // Alignment for the watermark
#define RMC_USERFONTSIZE   0                // Fontsize; if 0: maximal size is used

FUNCTION Main

   LOCAL oCrt, cLegenda, cLabels, cTitulo, aDados, cImagem, cUnidade, cTextoVert, nMax, nIdChart
   LOCAL oGrafico := RMChart():New(), nCont, oElement
   LOCAL sTemp1, aData1, sTemp2, aData2, aData3, aData4, aData5, aData6, aData7, aData8, sTemp3 := "", ID_RMC1 := 1

   oCrt           := WvgCrt():New( , , { -1, -1 }, { 35, 90 }, , .T. )
   oCrt:lModal    := .T.
   oCrt:icon      := "demo.ico"
   oCrt:resizable := .T.
   oCrt:create()
   hb_gtInfo( HB_GTI_WINTITLE, "Grafico com RmChart - Dll" )
   IF .F.
      cLegenda   := "Entradas*Saidas*Mais Um"
      cLabels    := "Janeiro*Fevereiro*Março*Abril*Maio*Junho*Julho*Agosto*Setembro*Outubro*Novembro*Dezembro"
      cTitulo    := "Gráfico de Teste"
      aDados     := { ;
                    { 225.25, 100.00, 100.00, 150.00, 250.00, 300.00, 25.00, 75.00, 300.00, 200.00, 325.00, 300.00 }, ;
                    { 220.00, 100.00, 125.00, 300.00, 150.00, 125.00, 85.00, 50.00, 285.00, 275.00, 295.00, 280.00 }, ;
                    { 125.25, 100.00, 100.00, 150.00, 250.00, 300.00, 25.00, 75.00, 300.00, 200.00, 325.00, 300.00 } }
      cImagem    := ""
      cUnidade   := "R$ "
      cTextoVert := ""
      nMax       := 0
      nIdChart   := 1

      FOR EACH oElement IN aDados
         nMax := Max( nMax, aMax( oElement ) )
      NEXT

      nMax := Round( ( Int( nMax / 10 ) * 10 ) + 10, 2 )

      oGrafico:CreateChart( hb_gtInfo( HB_GTI_WINHANDLE ), nIdChart, 0, 0, 770, 400, Azure, RMC_CTRLSTYLE3DLIGHT, .F., cImagem, "", 0, 0 )
      oGrafico:AddRegion( nIdChart, 0, 0, 760, 400, "RmChart", .F. )
      oGrafico:AddCaption( nIdChart, 1, cTitulo, Transparent, Red, 9, .T. )
      oGrafico:AddGrid( nIdChart, 1, LightBlue, .F., 20, 20, 685, 330, RMC_BICOLOR_LABELAXIS )
      oGrafico:AddLabelAxis( nIdChart, 1, cLabels, 1, Len( aDados[ 1 ] ), RMC_LABELAXISBOTTOM, 8, Black, RMC_TEXTCENTER, Black, RMC_LINESTYLENONE, "" )
      oGrafico:AddDataAxis( nIdChart, 1, RMC_DATAAXISRIGHT, 0.0, nMax, Len( aDados[ 1 ] ), 8, Black, Black, RMC_LINESTYLESOLID, 1, cUnidade, cTextoVert, "", RMC_TEXTCENTER )
      oGrafico:AddLegend( nIdChart, 1, cLegenda, RMC_LEGEND_BOTTOM, Transparent, RMC_LEGENDNORECT, Red, 8, .T. )

      FOR nCont = 1 TO Len( aDados )
         oGrafico:AddBarSeries( nIdChart, 1, aDados[ nCont ], 12, RMC_BARGROUP, RMC_BAR_FLAT_GRADIENT2, .F., 0, .F., 1, RMC_VLABEL_NONE, nCont, RMC_HATCHBRUSH_ONPRINTING )
      NEXT

      oGrafico:Draw( nIdChart )

   ENDIF
   IF .T.
      sTemp1 := "Label 1*Label 2*Label 3*Label 4*Label 5"
      aData1 := { 30,40,70,60,20 }
      sTemp2 := "Label 1*Label 2*Label 3*Label 4*Label 5"
      aData2 := { 20, 10, 15, 25, 30 }
      aData3 := { 25, 30, 10, 20, 15 }
      aData4 := { 10, 20, 40, 20, 30 }
      aData5 := { 40, 30, 20, 30, 20 }
      aData6 := { 30, 50, 20, 40, 60 }
      aData7 := { 240, 230, 220, 180, 170, 160, 145, 130, 125, 115 }
      aData8 := { 8.1, 6.2, 4.3, 2.2, 1.2, 3.1, 5.2, 11.4, 7.3, 4.2 }
      DO CASE
      CASE oGrafico:CreateChart( hb_gtInfo( HB_GTI_WINHANDLE ),ID_RMC1,0,0,800,600,AliceBlue,RMC_CTRLSTYLEFLATSHADOW,.F.,"","", 0, 0 ) < 0
      CASE oGrafico:AddRegion( ID_RMC1, 1, 2, 348, 208, "", .F. )  < 0
      CASE oGrafico:AddGrid( ID_RMC1, 1, Beige, .F., 0, 0, 0, 0, RMC_BICOLOR_NONE ) < 0
      CASE oGrafico:AddDataAxis( ID_RMC1, 1, RMC_DATAAXISLEFT, 0, 100, 11, 8, Black, Black, RMC_LINESTYLESOLID, 0, "", "", "", RMC_TEXTCENTER )  < 0
      CASE oGrafico:AddLabelAxis( ID_RMC1, 1, sTemp1, 1, 5, RMC_LABELAXISBOTTOM, 8, Black, RMC_TEXTCENTER, Black, RMC_LINESTYLESOLID, "" ) < 0
      CASE oGrafico:AddBarSeries( ID_RMC1, 1, aData1, 5,RMC_BARSINGLE, RMC_BAR_3D, .F., Default, .F., 1, RMC_VLABEL_NONE, 1, RMC_HATCHBRUSH_OFF )  < 0
      CASE oGrafico:AddRegion( ID_RMC1, 352, 2, -2, 248, "", .F. ) < 0
      CASE oGrafico:AddGrid( ID_RMC1, 2, Beige, .F., 0, 0, 0, 0, RMC_BICOLOR_NONE ) < 0
      CASE oGrafico:AddDataAxis( ID_RMC1, 2, RMC_DATAAXISBOTTOM, 0, 100, 10, 8, Black, Black, RMC_LINESTYLESOLID, 0, "", "", "", RMC_TEXTCENTER ) < 0
      CASE oGrafico:AddLabelAxis( ID_RMC1, 2, sTemp2, 1, 5, RMC_LABELAXISLEFT,8, Black, RMC_TEXTCENTER, Black, RMC_LINESTYLESOLID, "" ) < 0
      CASE oGrafico:AddBarSeries( ID_RMC1, 2, aData2, 5, RMC_BARSTACKED, RMC_COLUMN_FLAT, .F., Default, .T., 1, RMC_VLABEL_NONE, 1, RMC_HATCHBRUSH_OFF ) < 0
      CASE oGrafico:AddBarSeries( ID_RMC1, 2, aData3, 5, RMC_BARSTACKED, RMC_COLUMN_FLAT, .F., Default, .T., 1, RMC_VLABEL_NONE, 1, RMC_HATCHBRUSH_OFF ) < 0
      CASE oGrafico:AddBarSeries( ID_RMC1, 2, aData4, 5, RMC_BARSTACKED, RMC_COLUMN_FLAT, .F., Default, .T., 1, RMC_VLABEL_NONE, 1, RMC_HATCHBRUSH_OFF ) < 0
      CASE oGrafico:AddBarSeries( ID_RMC1, 2, aData5, 5, RMC_BARSTACKED, RMC_COLUMN_FLAT, .F., Default, .T., 1, RMC_VLABEL_NONE, 1, RMC_HATCHBRUSH_OFF )  < 0
      CASE oGrafico:AddRegion( ID_RMC1, 2, 252, 348, -2, "", .F. ) < 0
      CASE oGrafico:AddGridlessSeries( ID_RMC1, 3, aData6, 5, 0, 0, RMC_PIE_3D_GRADIENT, RMC_FULL, 2, .F., RMC_VLABEL_DEFAULT, RMC_HATCHBRUSH_OFF, 0 ) < 0
      CASE oGrafico:AddRegion( ID_RMC1, 352, 252, -2, -2, "", .F.) < 0
      CASE oGrafico:AddGrid( ID_RMC1, 4, AliceBlue, .T., 0, 0, 0, 0, RMC_BICOLOR_NONE ) < 0
      CASE oGrafico:AddDataAxis( ID_RMC1, 4, RMC_DATAAXISLEFT, 100, 250, 11, 8, Blue, Black, RMC_LINESTYLESOLID, 0, "$ ", "", "", RMC_TEXTCENTER )  < 0
      //CASE oGrafico:AddDataAxis( ID_RMC1, 4, RMC_DATAAXISRIGHT, 0, 0, 0, 0, 0, 0, 0, 2, " %", "" ) < 0
      CASE oGrafico:AddLabelAxis( ID_RMC1, 4, sTemp3, 1, 10, RMC_LABELAXISBOTTOM, 8, Black, RMC_TEXTCENTER, Black, RMC_LINESTYLESOLID, "" ) < 0
      CASE oGrafico:AddBarSeries( ID_RMC1, 4, aData7, 10, RMC_BARSINGLE, RMC_BAR_FLAT_GRADIENT2, .F., Gold, .F., 1, RMC_VLABEL_NONE, 1, RMC_HATCHBRUSH_OFF )  < 0
      CASE oGrafico:AddLineSeries( ID_RMC1, 4, aData8, 10, 0, 0, RMC_LINE, RMC_LINE_CABLE, RMC_LSTYLE_LINE, .F., Green, RMC_SYMBOL_NONE, 2, RMC_VLABEL_DEFAULT, RMC_HATCHBRUSH_OFF ) < 0
      CASE oGrafico:SetWatermark( RMC_USERWM, RMC_USERWMCOLOR, RMC_USERWMLUCENT, RMC_USERWMALIGN, RMC_USERFONTSIZE ) < 0
      CASE oGrafico:Draw( ID_RMC1 ) < 0
      ENDCASE
   ENDIF
   Inkey( 0 )
   oCrt:destroy()
   oGrafico:Destroy()
   HB_SYMBOL_UNUSED( sTemp1 + aData1 + sTemp2 + sTemp3 + aData2 + aData3 + aData4 + aData5 + aData6 + aData7 + aData8 )

   RETURN NIL

FUNCTION AMax( x )

   LOCAL nVal, oElement

   nVal := x[ 1 ]
   FOR EACH oElement IN x
      IF oElement > nVal
         nVal := oElement
      ENDIF
   NEXT

   RETURN nVal

CREATE CLASS RmChart

   VAR    nHandle

   METHOD New()                          INLINE ::nHandle := hb_libLoad( "RMChart.dll" ), SELF
   METHOD Destroy()                      INLINE hb_libFree( ::nHandle )
   METHOD CallDllStd( cName, ... )       INLINE hb_DynCall( { cName, ::nHandle, HB_DYN_CALLCONV_STDCALL }, ... )
   METHOD CreateChart( ... )             INLINE ::CallDllStd( "RMC_CREATECHART", ... )
   METHOD AddRegion( ... )               INLINE ::CallDllStd( "RMC_ADDREGION", ... )
   METHOD AddCaption( ... )              INLINE ::CallDllStd( "RMC_ADDCAPTION", ... )
   METHOD AddGrid( ... )                 INLINE ::CallDllStd( "RMC_ADDGRID", ... )
   METHOD AddLabelAxis( ... )            INLINE ::CallDllStd( "RMC_ADDLABELAXIS", ... )
   METHOD AddDataAxis(a,b,c,d,e, ... )   INLINE ::CallDllStd( "RMC_ADDDATAAXIS", a, b, c, ::ToDecimal(d), ::ToDecimal(e), ... )
   METHOD AddLegend( ... )               INLINE ::CallDllStd( "RMC_ADDLEGEND", ... )
   METHOD AddBarSeries(a,b,c, ... )      INLINE ::CallDllStd( "RMC_ADDBARSERIES", a, b, ::ToDouble(c), ... )
   METHOD Draw( ... )                    INLINE ::CallDllStd( "RMC_DRAW", ... )
   METHOD Draw2Clipboard( ... )          INLINE ::CallDllStd( "RMC_DRAW2CLIPBOARD", ... )
   METHOD Draw2Printer( ... )            INLINE ::CallDllStd( "RMC_DRAW2PRINTER", ... )
   METHOD Draw2File( ... )               INLINE ::CallDllStd( "RMC_DRAW2FILE", ... )

   METHOD AddGridLessSeries(a,b,c, ... ) INLINE ::CallDllStd( "RMC_ADDGRIDLESSSERIES", a, b, ::ToDouble(c), ... )
   METHOD AddLineSeries( a,b,c, ... )    INLINE ::CallDllStd( "RMC_ADDLINESERIES", a, b, ::ToDouble(c), ... )
   METHOD SetWaterMark( ... )            INLINE ::CallDllStd( "RMC_SETWATERMARK", ... )
   METHOD WriteRMCFile( ... )            INLINE ::CallDllStd( "RMC_WRITERMCFILE", ... )
   METHOD ToDouble( c )
   METHOD ToDecimal( c )                 INLINE c + 1.01 - 1.01

ENDCLASS

METHOD RMChart:ToDouble( c )

   LOCAL cDouble := "", oElement

   FOR EACH oElement IN c
      cDouble += FToC( oElement )
   NEXT

   RETURN cDouble

RMChart

Enviado: 19 Mai 2016 10:32
por JoséQuintas
Usei DO CASE no segundo, porque estava testando uma parte de cada vez.
No final se tiver que dar GPF, dá com ou sem DO CASE... rs
Mas permitia eu selecionar até onde executar: coloquei um CASE .T. pra sair fora, e ia movendo isso uma linha de cada vez, pra poder enxergar qual linha causava GPF.

Código: Selecionar todos

DO CASE
CASE .....
CASE .T. // deste jeito, executava só até aqui
CASE ...
ENDCASE

RMChart

Enviado: 19 Mai 2016 13:45
por JoséQuintas
Como eu pensava, o RMChart não é compatível com ele mesmo kkkkkk
Ele gera exemplos errados.
Tá aí, gerado pela classe.
grafico.png

RMChart

Enviado: 19 Mai 2016 14:44
por asimoes
Quintas,

Você tentou (?) fazer uma impressão usando :

oGrafico:Draw2Printer( nIdChart, RMC_LANDSCAPE, 10, 10, 250, 150, RMC_BMP )

Eu tenho uma impressora hp laserjet pro mfp 125 não imprime , mas para uma impressora pdf cutepdf writer gerou o pdf

RMChart

Enviado: 19 Mai 2016 15:50
por JoséQuintas
HP Laserjet CP1215, precisando de 4 toners novos.... rs
Impresso assim

Código: Selecionar todos

      oGrafico:Draw2Printer( ID_RMC1, 0, 0, 0, 0, 0, RMC_BMP )
IMG_20160519_154707654_HDR.jpg

RMChart

Enviado: 19 Mai 2016 16:08
por JoséQuintas
Quando apareceu esta pergunta:
O que foi usado pra fazer o gráfico?
relacionei com uma pergunta sua anterior:
Será que ninguém vai ajudar?
Ainda estou rindo.
Apesar de não ser pra rir...

RMChart

Enviado: 19 Mai 2016 17:45
por asimoes
Quintas,

A tua impressora é jato de tinta?
A minha é uma hp laserjet pro mpf 125, não imprime nada de win_printfileraw e descobri que também imprime arquivos tipo de dados EMF que é o caso da função
RMC_DRAW2PRINTER

RMChart

Enviado: 19 Mai 2016 17:46
por asimoes
Quintas,

Muita gente que ajudou no tópico vai se beneficiar com as nossas descobertas. rs

RMChart

Enviado: 19 Mai 2016 18:13
por asimoes
Consegui imprimir, com oGrafico:Draw2Printer( nIdChart, 0, 0, 0, 0, 0, RMC_BMP ), RMC_EMF , não.

Mas a qualidade da impressão é fraca