X

Como Criar um Extra para a QrCode Docker, CorelDraw Addon Parte 1

Como Criar um Extra para a QrCode Docker, CorelDraw Addon

Publicado: Modificado:

Bonus630

Como Criar um Extra para a QrCode Docker, CorelDraw Addon.

Neste artigo estarei utilizando o Visual Studio 2019, mas fica a criteria de cada um a IDE que vai utilizar ou se não for utilizar nenhuma.

Primeiramente precisamos ter instalado alguma versão do CorelDraw, apartir da versão X7. É preciso o CorelDraw para realizarmos testes em nosso Extra.

Agora precisamos instalar o QrCode Docker, ou baixa o código fonte.

https://bonus630.com.br/file/QrCodeDocker.exe link para baixar o instalador.

https://github.com/bonus630/QrCodeDocker link do código fonte

Caso você esteja utilizando o código fonte, abra o arquivo de solução da QrCode Docker, no "solution explorer" adiciona um novo projeto na pasta "plugin"

Adicionando Novo Projeto

Crie um projeto do Tipo Wpf (UserControl) .NET Framework, está etapa é para ambos os casos, código fonte ou instalado.

tipo do projeto

Escolha um nome, e finalize.

No editor de xaml, defina a largura(width) do UserControl para 280 e se preferir remova a propriedade altura(height) ou sete um valor que quiser.

Agora adione a referência ao projeto "PluginLoader" se estiver utilizando o código fonte, caso tenho instalado o QrCode Docker navegue até a pasta Addons e adiciona a DLL "PluginLoader".

Os próximos passo são para ambos os casos.

Crie uma class no projeto, está class será utilizada pela QrCodeDocker como ponte entre a interface e o motor de seu Extra, se for algo simples podemos realizar todo processamento nela. Para seguir uma padronização é recomendado criar a class com o nome seguro do seu Extra mais "Core", por exemplo, estou criando o plugin chamado "Extra Test", então vou utilizar o nome dessa class de "ExtraTestCore".

Após criada a class adicione a diretiva para o PluginLoader, "using br.corp.bonus630.PluginLoader", agora precisamos extender nossa classe de "PluginCoreBase", está é uma classe abstrata e generica, passe o tipo da sua classe como parametro para a classe PluginCoreBase, "PluginCoreBase<ExtraTestCore>" e implemente a classe abstrata.

 

Agora precisamos definir uma constante com nome de nosso Extra, essa constante é indispensável para o processo de carregamento do Extra, sem ela nada irá funcionar.

public const string PluginDisplayName = "Extra Test";

Neste ponto teremos algo do tipo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
using System;
using br.corp.bonus630.PluginLoader;
namespace ExtraTest
{
    class ExtraTestCore : PluginCoreBase<ExtraTestCore>
    {
        public const string PluginDisplayName = "Extra Test";
        public override string GetPluginDisplayName { get { return ExtraTestCore.PluginDisplayName; } }

        public override void DeleteConfig()
        {
            Properties.Settings.Default.Reset();
        }
    }
}

Voltaremos a classe Core em breve, vamos trabalhar em nossa classe da nossa UI.

Nós podemos ter muitas ui em nosso projeto com muitos usercontrol e windows, mas somente uma poderá ser a principal, e para marcar qual UI será a principal devemos assinar a interface "IPluginMainUI" em uma UI do tipo UserControl. Como já temos um UI criada do tipo UserControl, vamos utiliza-lá, vamos implementar a interface nela.

Primeiro adicione a diretiva "using br.corp.bonus630.PluginLoader;" depois assine a class com a interface "IPluginMainUI" e implemente a interface.

Pode-se notar que temos uma propriedade com referencia a uma interface chamada "IPluginCore", com esse objeto você pode enviar e receber dados da sua classe Core. Mas não tente acessa-lo no construtor de sua classe de UI, nesse momento ele ainda estará nulo, e é importante que você não crie uma instancia da classe Core, pois essa não terá comunicação com a QrCodeDocker, o processo de instanciar o Core e a MainUI é feito por ela.

Caso necessite acessar o Core no momento do carregamento, para por exemplo atualizar a UI com dados salvos, utilize o event loaded do UserControl.

O objeto Core será o contexto da nossa UI, ele também conterá o objeto de Idiomas, "Lang", para ser utilizados em "Bindings" na UI.

Para acessar as configurações salvas carregadas no Core, pode-se utilizar o evento "LoadConfig" do objeto Core. O momento que ocorre o event vai depender de como for implementado o metodo LoadConfig na sua Core, falaremos disso mais tarde.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using br.corp.bonus630.PluginLoader;

namespace ExtraTest
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class ExtraTestUI : UserControl,IPluginMainUI
    {
        public ExtraTestUI()
        {
            InitializeComponent();
            this.Loaded += UserControl1_Loaded;
        }

        private void UserControl1_Loaded(object sender, RoutedEventArgs e)
        {
            Core.LoadConfigEvent += Core_LoadConfigEvent;
        }

        private void Core_LoadConfigEvent()
        {
            //todo
        }

        public IPluginCore Core { get; set; }
    }
}

 

Agora precisamos definir que tipo de Extra nós queremos construir.

Por enquantos os Extras são de 3 tipos, De configuração(Config), De desenho(Drawer), De Dados(DataBase)
 
Os do tipo de configuração, configura os qrcode, como o próprio nome já diz, no momento exemplo o "Qrcode configuration"
 
Os do tipo de desenho, desenham o qrcode no documento. Exemplos "Simple repeater" e o "Place Here"
 
Os de Dados carregam dados de alguma fonte para serem consumidos pelos de desenho, temos nessa categoria os exemplos. "Auto number Generator", "Data from TextFile" e o "Data from clipboard"
 
Os extras tbm podem ser de tipos combinados, exemplo o "Media Scheme", que é do tipo de desenho e de dados
 
Todos os extras se comunicão entre si, por isso da para combinar o uso deles

Para criar um Extra do tipo configurador temos que assinar em nossa classe Core o interface "IPluginConfig", para criar uma para desenhar nossos qrCodes no CorelDraw temos que assinar a interface "IPluginDrawer" e para criamos um Extra que gere Dados assinamos "IPluginDataSource". Podemos assinar um dois ou as três interfaces em nosso Core.

Para vermos com mais detalhes o uso de cada, vamos criar um exemplo bem simples de cada um.

Vamos adicionar duas "Label" e dois "TextBox" e um Botão em nossa UI.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<UserControl x:Class="ExtraTest.ExtraTestUI"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ExtraTest"
            Width="280">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="32" />
            <RowDefinition Height="32" />
            <RowDefinition Height="32" />
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Content="DE" />
        <Label Grid.Row="1" Grid.Column="0" Content="ATE" />
        <TextBox Grid.Row="0" Grid.Column="1"  />
        <TextBox Grid.Row="1" Grid.Column="1"  />
        <Button Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"  x:Name="btn_gerar" Content="Gerar"/>
    </Grid>
</UserControl>

Vamos usar essa interface para criar um Extra do tipo DataBase  e um do tipo Drawer.

Vamos criar em nosso Core duas propriedades do tipo int, lembrando que nosso Core é o "DataContext" de nossa UI, vamos notificar as mudanças, a classe base do Core já possuie o evento "PropertyChanged".

Vamos adicionar a diretiva "using Corel.Interop.VGCore;", é preciso adicionar a referencia do Coreldraw, como fazemos para criar um addon,  assinar a interface "IPluginDrawer" e implementar a interface.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using br.corp.bonus630.PluginLoader;
using Corel.Interop.VGCore;
namespace ExtraTest
{
    class ExtraTestCore : PluginCoreBase<ExtraTestCore>,IPluginDrawer
    {
        public const string PluginDisplayName = "Extra Test";
        public override string GetPluginDisplayName { get { return ExtraTestCore.PluginDisplayName; } }

        private int start;

        public int Start
        {
            get { return start; }
            set { start = value; OnNotifyPropertyChanged("Start"); }
        }
        private int end;

        public int End
        {
            get { return end; }
            set { end = value;OnNotifyPropertyChanged("End"); }
        }

        public List<object[]> DataSource { get; set; }
        public double Size { get; set; }
        public global::Corel.Interop.VGCore.Application App { get; set; }
        public ICodeGenerator CodeGenerator { get; set; }

        public override void DeleteConfig()
        {
            Properties.Settings.Default.Reset();
        }

        public void Draw()
        {
            
        }
    }
}

 

Vamos adicionar um evento de click no nosso botão e adicionar uns bindings em nossos textbox em nossa UI.

CS

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using br.corp.bonus630.PluginLoader;

namespace ExtraTest
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class ExtraTestUI : UserControl,IPluginMainUI
    {
        public ExtraTestUI()
        {
            InitializeComponent();
            this.Loaded += UserControl1_Loaded;
        }

        private void UserControl1_Loaded(object sender, RoutedEventArgs e)
        {
            Core.LoadConfigEvent += Core_LoadConfigEvent;
        }

        private void Core_LoadConfigEvent()
        {
            //todo
        }

        public IPluginCore Core { get; set; }

        private void btn_gerar_Click(object sender, RoutedEventArgs e)
        {
            (Core as ExtraTestCore).Draw();
        }
    }
}

 

XAML

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<UserControl x:Class="ExtraTest.ExtraTestUI"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ExtraTest"
            Width="280">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="32" />
            <RowDefinition Height="32" />
            <RowDefinition Height="32" />
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Content="DE" />
        <Label Grid.Row="1" Grid.Column="0" Content="ATE" />
        <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Start,Mode=TwoWay}" />
        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding End,Mode=TwoWay}"/>
        <Button Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"  x:Name="btn_gerar" Content="Gerar" Click="btn_gerar_Click"/>
    </Grid>
</UserControl>

Vamos adicionar o seguinte código no método draw em nossa classe Core.

   for (int i = Start; i <= End; i++)
            {
                CodeGenerator.CreateVetorLocal2(App.ActiveLayer, i.ToString(), Size);
            }

Com esse código vamos desenhar n QrCode do valor do campo Start até o valor do campo End.

Podemos também desenhar nossos QrCodes com dados vindos da DataSource, lembrando que esse dados estão em duas dimensões, com colunas e linhas.

Compile o projeto, se estiver usando o Código fonte, mande rodar a solução no visual studio, não esqueça de alterar o caminho do coreldraw no arquivo target para o caminho do seu CorelDraw caso ele seja diferente do arquivo target.

Agora se estiver criando com o QrCode instalado abre seu CorelDraw e clique no botão procurar na sessão Extras da QrCode Docker, selecione a DLL do seu Extra na pasta bin.

Carregando o Extra

Agora vamos voltar nosso código a uns momentos atrás, para ser mais especifico no momento antes de assinarmos e implementarmos a interface "IPluginDrawer" em nosso Core.

Vamos assinar a interface "IPluginDataSource", vamos criar um método publico FillDS e adicionar o código

  this.DataSource = new List();
            for (int i = Start; i <= End; i++)
            {
                this.DataSource.Add(new object[] { i });
            }
           OnFinishJob(dataSource);

Está última linha ira disparar um evento, a UI principal da QrCodeDocker está assinando este evento, então nossa DataSource será carregada e distruibuida para outros Extras do tipo Drawer

Com isso temos um Extra similar ao AutoNumberGen

https://github.com/bonus630/QrCodeDocker/tree/master/AutoNumberGen

No próximo artigo veremos como adicionar idiomas ao nosso Extra
Adicionando idiomas

Demonstração

Boas práticas.

  • Não adicionar altura aos botões e bloco de texto de unica linha.Este valores são carregados do arquivo geral de estilo que define sua altura para 28.
  • Usar Largura fixa para seu Extra de 280.
  • Caso utilize código não gerenciado, favor implementar "IDisposable "
  • Não personalizar cores de modo que quebre o designer padrão dos estilos do CorelDraw

 




Faça doações com o botão do PayPal


Todos direitos reservados | 2003 à 2025 | Copyright © Bonus630 | Vr.:5.0