Como Criar um Extra para a QrCode Docker, CorelDraw Addon Parte 1
Como Criar um Extra para a QrCode Docker, CorelDraw Addon
Publicado: Modificado:
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"
Crie um projeto do Tipo Wpf (UserControl) .NET Framework, está etapa é para ambos os casos, código fonte ou instalado.
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.
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.
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
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