Autor Tópico: [RESOLVIDO] Imprimir Retangulo com cantos arredondados TCPDF  (Lida 2114 vezes)

João Carlos TR

  • Iniciante
  • **
  • Mensagens: 50
    • Email
[RESOLVIDO] Imprimir Retangulo com cantos arredondados TCPDF
« Online: Junho 19, 2015, 07:02:22 pm »
Estou tentando imprimir em PDF um retângulo com cantos arredondados e o mesmo não aparece!

No código do Layout PDF, inseri o seguinte:

$pdf = new TCPDF();
//Rect ($x, $y, $w, $h, $style='', $border_style=array(), $fill_color=array())
$pdf->Rect(30, 40, 50, 20, $style4, $border_style=array(4.0), $fill_color=array(400));

//RoundedRect ($x, $y, $w, $h, $r, $round_corner='1111', $style='', $border_style=array(), $fill_color=array())
$pdf->RoundedRect (50, 50, 50, 20, 10.0);
$pdf->RoundedRect(95, 55, 40, 30, 10.0, '1111',null, $border_style=array(4.0), $fill_color=array(400));

O retângulo é impresso perfeitamente, mas o retângulo com bordas arredondadas não aparece.

Obrigado!
« Última modificação: Agosto 12, 2015, 10:48:20 am por joaocarlostr »

FredKeyster

  • Expert
  • *****
  • Mensagens: 1702
  • DEWENNINMEN
    • Email
Re:Imprimir Retangulo com cantos arredondados TCPDF
« Responder #1 Online: Junho 19, 2015, 07:51:46 pm »
Onde você colocou a função RoundedRect() ? Pois salvo me engano, ela não vem nativa da biblioteca.
Explique melhor o que você esta fazendo, se esta desenvolvendo em um Blank, ou se usa o ReportPdf, etc...
F. A.
Analista de Sistemas

FredKeyster

  • Expert
  • *****
  • Mensagens: 1702
  • DEWENNINMEN
    • Email
Re:Imprimir Retangulo com cantos arredondados TCPDF
« Responder #2 Online: Junho 19, 2015, 07:53:31 pm »
Segue abaixo a biblioteca que faz isso:

Código: [Selecionar]
function RoundedRect($x, $y, $w, $h, $r, $style = '')
    {
        $k = $this->k;
        $hp = $this->h;
        if($style=='F')
            $op='f';
        elseif($style=='FD' || $style=='DF')
            $op='B';
        else
            $op='S';
        $MyArc = 4/3 * (sqrt(2) - 1);
        $this->_out(sprintf('%.2F %.2F m',($x+$r)*$k,($hp-$y)*$k ));
        $xc = $x+$w-$r ;
        $yc = $y+$r;
        $this->_out(sprintf('%.2F %.2F l', $xc*$k,($hp-$y)*$k ));

        $this->_Arc($xc + $r*$MyArc, $yc - $r, $xc + $r, $yc - $r*$MyArc, $xc + $r, $yc);
        $xc = $x+$w-$r ;
        $yc = $y+$h-$r;
        $this->_out(sprintf('%.2F %.2F l',($x+$w)*$k,($hp-$yc)*$k));
        $this->_Arc($xc + $r, $yc + $r*$MyArc, $xc + $r*$MyArc, $yc + $r, $xc, $yc + $r);
        $xc = $x+$r ;
        $yc = $y+$h-$r;
        $this->_out(sprintf('%.2F %.2F l',$xc*$k,($hp-($y+$h))*$k));
        $this->_Arc($xc - $r*$MyArc, $yc + $r, $xc - $r, $yc + $r*$MyArc, $xc - $r, $yc);
        $xc = $x+$r ;
        $yc = $y+$r;
        $this->_out(sprintf('%.2F %.2F l',($x)*$k,($hp-$yc)*$k ));
        $this->_Arc($xc - $r, $yc - $r*$MyArc, $xc - $r*$MyArc, $yc - $r, $xc, $yc - $r);
        $this->_out($op);
    }

    function _Arc($x1, $y1, $x2, $y2, $x3, $y3)
    {
        $h = $this->h;
        $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $x1*$this->k, ($h-$y1)*$this->k,
            $x2*$this->k, ($h-$y2)*$this->k, $x3*$this->k, ($h-$y3)*$this->k));
    }

Só implementar!
F. A.
Analista de Sistemas

João Carlos TR

  • Iniciante
  • **
  • Mensagens: 50
    • Email
Re:Imprimir Retangulo com cantos arredondados TCPDF
« Responder #3 Online: Junho 20, 2015, 11:28:16 am »
Fred, obrigado por ajudar.

Estou em Report PDF > Layout PDF > Código
Inseri o código e só aparece o retângulo.

Após sua resposta criei uma biblioteca (de Projeto) com o código que vc enviou em Ferramentas > Bibliotecas.
No Report PDF > Programação > Bibliotecas, selecionei a biblioteca criada.

O código no Report PDF está assim:

$pdf = new TCPDF();

$style4 = array('L' => 0,
                'T' => array('width' => 0.25, 'cap' => 'butt', 'join' => 'miter', 'dash' => '20,10', 'phase' => 10, 'color' => array(100, 100, 255)),
                'R' => array('width' => 0.50, 'cap' => 'round', 'join' => 'miter', 'dash' => 0, 'color' => array(50, 50, 127)),
                'B' => array('width' => 0.75, 'cap' => 'square', 'join' => 'miter', 'dash' => '30,10,5,10'));


// Rect ($x, $y, $w, $h, $style='', $border_style=array(), $fill_color=array())
$pdf->Rect(30, 40, 50, 20, $style4, $border_style=array(4.0), $fill_color=array(400));

// RoundedRect ($x, $y, $w, $h, $r, $round_corner='1111', $style='', $border_style=array(), $fill_color=array())
$pdf->RoundedRect (50, 50, 50, 20, 10.0);
$pdf->RoundedRect(95, 55, 40, 30, 10.0, '1111',null, $border_style=array(4.0), $fill_color=array(400));


Mesmo assim, só aparece o retângulo.



FredKeyster

  • Expert
  • *****
  • Mensagens: 1702
  • DEWENNINMEN
    • Email
Re:Imprimir Retangulo com cantos arredondados TCPDF
« Responder #4 Online: Junho 21, 2015, 02:25:08 pm »
Não sei usar o ReportPDF... apenas Blank! Desculpa.
F. A.
Analista de Sistemas

Rodrigo Goulart Padovezzi

  • Expert
  • *****
  • Mensagens: 1045
    • Email
Re:Imprimir Retangulo com cantos arredondados TCPDF
« Responder #5 Online: Junho 22, 2015, 08:51:09 am »
Não sei usar o ReportPDF... apenas Blank! Desculpa.
Bom dia Fred, eu também sempre usei blank, precisei alterar um Report PDF antigo e achei na documentação os metódos SC para report PDF que faz os métodos FPDF, como segue:


Metodo FPDF   Macro ScriptCase   Descrição
AcceptPageBreak   sc_pdf_accept_page_break   Aceita ou não quebra de página automática.
AddFont   sc_pdf_add_font   Adiciona uma nova fonte
AddLink   sc_pdf_add_link   Cria um link interno
AddPage   sc_pdf_add_page   Adiciona uma nova página.
AliasNbPages   sc_pdf_alias_nb_pages   Define uma alias para o número de páginas
Cell   sc_pdf_cell   imprime uma célula
Close   sc_pdf_close:    finaliza o documento
Error   sc_pdf_error   Exibir mensagem de erro
Footer   sc_pdf_footer   Rodapé da página
GetStringWidth   sc_pdf_get_string_length   Calcula o tamanho de uma string
GetX   sc_pdf_get_x   Retorna a posição atual de x
GetY   sc_pdf_get_y   Retorna a posição atual de y
Header   sc_pdf_header   Cabeçalho da página
Image   sc_pdf_image   Coloca uma imagem na página
Line   sc_pdf_line   Desenha uma linha
Link   sc_pdf_link   Insere um link
Ln   sc_pdf_ln   Configura a quebra de linha
MultiCell   sc_pdf_multi_cell   imprime um texto com quebra de linhas
Output   sc_pdf_output   Salva ou envia o documento
PageNo   sc_pdf_page_no   Número da página
Rect   sc_pdf_rect   Desenha um retângulo
SetAuthor   sc_pdf_set_author   Define o autor do documento
SetAutoPageBreak   sc_pdf_set_auto_page_break   Ativa ou desativa o modo de quebra de página autom...
SetCompression   sc_pdf_set_compression   Liga / Desliga compressão de página
SetCreator   sc_pdf_set_creator   Define o criador do documento.
SetDisplayMode   sc_pdf_set_display_mode   Alterna o modo display
SetDrawColor   sc_pdf_set_draw_color   Define a cor usada para operações de desenho
SetFillColor   sc_pdf_set_fill_color   Define a cor para operações de preenchimento
SetFont   sc_pdf_set_font   Define as configurações da fonte
SetFontSize   sc_pdf_set_font_size   Define o tamanho da fonte
SetKeywords   sc_pdf_set_keywords   Associa uma palvra chave a um documento
SetLeftMargin   sc_pdf_set_left_margin   Define a margem esquerda
SetLineWidth   sc_pdf_set_line_width   Define a largura da linha
SetLink   sc_pdf_set_link   Define o destino de um link interno
SetMargins   sc_pdf_set_margins   Define as margens
SetRightMargin   sc_pdf_set_right_margin   Define a margem direita
SetSubject   sc_pdf_set_subject   Define o assunto
SetTextColor   sc_pdf_set_text_color   Define a cor do texto
SetTitle   sc_pdf_set_title   Define o título do documento
SetTopMargin   sc_pdf_set_top_margin   Define a margem do topo
SetX   sc_pdf_set_x   Define a posição atual de x
SetXY   sc_pdf_set_xy   Define a posição atual de x e y
SetY   sc_pdf_set_y   Define a posição atual de y
Text   sc_pdf_text   Imrime uma string
Write   sc_pdf_write   Imprime uma string de caracteres

João Carlos TR

  • Iniciante
  • **
  • Mensagens: 50
    • Email
[RESOLVIDO] Imprimir Retangulo com cantos arredondados TCPDF
« Responder #6 Online: Agosto 12, 2015, 10:47:27 am »
Achei a solução para o meu problema.
Vejam como foi resolvido:

Pesquisando sobre Retângulos com Cantos Arredondados na FPDF, encontrei um código nesse link http://www.fpdf.org/~~V/phorum/read.php?f=1&i=59709&t=59709&v=t, na qual fiz algumas alterações que permitiram criar na minha aplicação o Retângulo com Cantos Arredondados.

Em Report PDF > Layout PDF > Código, insira o seguinte código abaixo:


### DESENHA RETANGULOS COM CANTOS ARREDONDADOS ###
$pdf->SetLineWidth(0.5);
$pdf->SetDrawColor(255,0,0);

$x=20;     # Posição X
$y=50;     # Posição Y
$w=100;  # Largura
$h=50;     # Altura
$raio=20; # Tamanho do canto
$r=10;      # Resolução do desenho (melhor entre 0.1 e 10);

$cantoID = 0;
$cantoIE = 90;
$cantoSE = 180;
$cantoSD = 270;

$x+=$raio;
$y+=$raio;
 
# Linha superior
$pdf->Line($x,$y-$raio,$x+$w-($raio*2),$y-$raio);
# Linha inferior
$pdf->Line($x,$y-$raio+$h,$x+$w-($raio*2),$y-$raio+$h);
# Linha esquerda
$pdf->Line($x-$raio,$y,$x-$raio,$y-($raio*2)+$h);
# Linha direita
$pdf->Line($x-$raio+$w,$y,$x-$raio+$w,$y-($raio*2)+$h);

# Canto Superior Esquerda
for($cantoSE=180; $cantoSE<270; $cantoSE+=$r)
{
   $Xse =((cos($cantoSE*pi()/180))*$raio)+$x;
   $Yse =((sin($cantoSE*pi()/180))*$raio)+$y;
   $X1se =((cos(($cantoSE+$r)*pi()/180))*$raio)+$x;
   $Y1se =((sin(($cantoSE+$r)*pi()/180))*$raio)+$y;
   $pdf->Line($Xse,$Yse,$X1se,$Y1se);
}

#  Canto Superior Direito
$x+=$w-$raio-$raio;
for($cantoSD=270; $cantoSD<360; $cantoSD+=$r)
{
   $Xsd =((cos($cantoSD*pi()/180))*$raio)+$x;
   $Ysd =((sin($cantoSD*pi()/180))*$raio)+$y;
   $X1sd =((cos(($cantoSD+$r)*pi()/180))*$raio)+$x;
   $Y1sd =((sin(($cantoSD+$r)*pi()/180))*$raio)+$y;
   $pdf->Line($Xsd,$Ysd,$X1sd,$Y1sd);    
}

# Canto Inferior Direito
$y+=$h-$raio-$raio;
for($cantoID=0; $cantoID<90; $cantoID+=$r)
{
   $Xid =((cos($cantoID*pi()/180))*$raio)+$x;
   $Yid =((sin($cantoID*pi()/180))*$raio)+$y;
   $X1id =((cos(($cantoID+$r)*pi()/180))*$raio)+$x;
   $Y1id =((sin(($cantoID+$r)*pi()/180))*$raio)+$y;
   $pdf->Line($Xid,$Yid,$X1id,$Y1id);    
}

# Canto Inferior Esquerdo
$x-=$w-$raio-$raio; 
for($cantoIE=90; $cantoIE<180; $cantoIE+=$r)
{
   $Xie =((cos($cantoIE*pi()/180))*$raio)+$x;
   $Yie =((sin($cantoIE*pi()/180))*$raio)+$y;
   $X1ie =((cos(($cantoIE+$r)*pi()/180))*$raio)+$x;
   $Y1ie =((sin(($cantoIE+$r)*pi()/180))*$raio)+$y;
   $pdf->Line($Xie,$Yie,$X1ie,$Y1ie);    
}
« Última modificação: Agosto 12, 2015, 10:50:54 am por joaocarlostr »