Criação de um complemento (Docker) para Corel Draw

No Corel Draw, a partir da versão 17, há uma oportunidade conveniente de criar complementos não apenas em VBA, mas também em C # VSTA. Então, vamos aproveitar isso e trazer o sonho de um botão Make Nice para mais perto .





aviso Legal

Para programadores - desde 2002 trabalho como engenheiro de pré-impressão em uma gráfica. Para mim, programar é um hobby: tanto o código quanto a descrição não são perfeitos. Portanto, terei prazer em revisar e criticar.





Para impressores - entendo que as pistas são recolhidas em programas especializados, mas na realidade da minha cidade isso não é aconselhável. As circulações são pequenas, mas o número de layouts, ao contrário, é grande e 95% dos layouts são feitos em CorelDraw.





O que você precisa para fazer a mágica funcionar:

Corel Draw





Estúdio visual





Ferramentas do Visual Studio para aplicativos (opcional se você quiser escrever macros simples)





Conhecimento básico de C #





Conhecimento básico de WPF









Para a conveniência de escrever, usaremos complementos para Visual Studio de " bonus360 ":





Modelos de complementos do CorelDraw





Pacote de complementos do CorelDraw






Vamos rodar o studio como administrador, para que ao compilar copie os arquivos para as pastas do sistema. Crie um novo projeto escolhendo “CorelDRAW Docker Addon” como modelo. Atribuímos um nome, por exemplo “MagicUtilites”.





,   “MagicUtilites”, CorelDraw, . “Done” .





. , Extensions.cs, .





F5 CorelDraw - Window - Dockers . , .






DockerUI.xaml



XAML .





<Grid Margin="0,0,0,0">
	<StackPanel>
		<Button Content="Text Convert to Curves" Height="25" Margin="4" Click="Button_Click"/>
	</StackPanel>
</Grid>
      
      



MVVM ( WPF), . , .






DockerUI.xaml.cs







private corel.Application corelApp;
      
      



corel.Application



, . .





Button_Click



.





, CorelDraw . , .





private void Button_Click(object sender, RoutedEventArgs e)
{
  if (corelApp.ActiveDocument == null)
		return;
}
      
      



ActiveDocument



corel.Application



.





.





private void Button_Click(object sender, RoutedEventArgs e)
{
	if (corelApp.ActiveDocument == null)
		return;

	corelApp.BeginDraw();

	corelApp.EndDraw();
}
      
      



. BeginDraw()



, corel . EndDraw()







. corel .





private void Button_Click(object sender, RoutedEventArgs e)
{
  if (corelApp.ActiveDocument == null)
    return;

  corelApp.BeginDraw();

  foreach (corel.Page page in corelApp.ActiveDocument.Pages)
  {
    foreach (corel.Shape shape in page.Shapes.All())
    {
      if (shape.Type == corel.cdrShapeType.cdrTextShape)
        shape.ConvertToCurves();
    }
  }

  corelApp.EndDraw();
}
      
      







, ConvertToCurves()



, corel .





. “Text Convert to Curves” . corel , PowerClip . 





, Corel Draw .





corel.Shape



corel . Type



corel . corel.Shape



corel , Type



cdrGroupShape



. Shapes



, corel .





corel . Type



cdrBitmapShape



, Bitmap



. Type



cdrGuidelineShape



, Guide







corel – PowerClip . corel PowerClip-, PowerClip



null.





.





corel . 





private void MakeToAllPages()
{
  if (corelApp.ActiveDocument == null)
    return;
  corelApp.BeginDraw();
  foreach (corel.Page page in corelApp.ActiveDocument.Pages)
  {
    MakeToShapeRange(page.Shapes.All());
  }
  corelApp.EndDraw();
}
      
      



MakeToAllPages



.





private void MakeToShapeRange(corel.ShapeRange sr)
{
  foreach (corel.Shape shape in sr)
  {
    if (shape.Type == corel.cdrShapeType.cdrGroupShape)
      MakeToShapeRange(shape.Shapes.All());

    if (shape.PowerClip != null)
      MakeToShapeRange(shape.PowerClip.Shapes.All());

    if (shape.Type == corel.cdrShapeType.cdrTextShape)
      shape.ConvertToCurves();
  }
}
      
      



MakeToShapeRange



corel .





corel , corel . corel PowerClip- , corel . corel , .





private void Button_Click(object sender, RoutedEventArgs e)
{
  MakeToAllPages();
}
      
      



Button_Click



MakeToAllPages



.





. PowerClip.






, , .

<StackPanel>
  <Button Content="Text convert to curves" Height="25" Margin="4" Click="ConvertToCurves"/>
  <Separator Margin="4"/>
  <Button Content="Uniform fill to CMYK" Height="25" Margin="4" Click="UniformFillToCMYK"/>
  <Button Content="Outline fill to CMYK" Height="25" Margin="4" Click="OutlineFillToCMYK"/>
  <Button Content="Fountain fill to CMYK" Height="25" Margin="4" Click="FountainFillToCMYK"/>
  <Separator Margin="4"/>
  <Button Content="Bitmap to CMYK" Height="25" Margin="4" Click="BitmapToCMYK"/>
  <Button Content="Resample Bitmap to 300 dpi" Height="25" Margin="4" Click="ResampleBitmap"/>
</StackPanel>
      
      



.





private void ConvertToCurves(object sender, RoutedEventArgs e){}

private void BitmapToCMYK(object sender, RoutedEventArgs e){}

private void UniformFillToCMYK(object sender, RoutedEventArgs e){}

private void OutlineFillToCMYK(object sender, RoutedEventArgs e){}

private void FountainFillToCMYK(object sender, RoutedEventArgs e){}

private void ResampleBitmap(object sender, RoutedEventArgs e){}
      
      



corel MakeToShapeRange



. , corel . MakeToShapeRange



, .





MakeToAllPages()



MakeToAllPages(Action<corel.Shape> action)



. MakeToShapeRange



. MakeToAllPages



.





private void MakeToAllPages(Action<corel.Shape> action)
{
  if (corelApp.ActiveDocument == null)
    return;
  corelApp.BeginDraw();
  foreach (corel.Page page in corelApp.ActiveDocument.Pages)
  {
    MakeToShapeRange(page.Shapes.All(), action);
  }
  corelApp.EndDraw();
}

private void MakeToShapeRange(corel.ShapeRange sr, Action<corel.Shape> action)
{
  foreach (corel.Shape shape in sr)
  {
    if (shape.Type == corel.cdrShapeType.cdrGroupShape)
      MakeToShapeRange(shape.Shapes.All(), action);

    if (shape.PowerClip != null)
      MakeToShapeRange(shape.PowerClip.Shapes.All(), action);

    action(shape);
  }
}
      
      



.





MakeToAllPages



  .





.





private void ConvertToCurves(object sender, RoutedEventArgs e)
{
  MakeToAllPages((s) =>
  {
    if (s.Type == corel.cdrShapeType.cdrTextShape) //  
      s.ConvertToCurves(); //   
  });
}

private void BitmapToCMYK(object sender, RoutedEventArgs e)
{
  MakeToAllPages((s) =>
  {
    if (s.Type == corel.cdrShapeType.cdrBitmapShape) //  
      if (s.Bitmap.Mode != corel.cdrImageType.cdrCMYKColorImage) //    CMYK
        s.Bitmap.ConvertTo(corel.cdrImageType.cdrCMYKColorImage); //   CMYK
  });
}

private void UniformFillToCMYK(object sender, RoutedEventArgs e)
{
  MakeToAllPages((s) =>
  {
    if (s.CanHaveFill) //     
      if (s.Fill.Type == corel.cdrFillType.cdrUniformFill) //  
        if (s.Fill.UniformColor.Type != corel.cdrColorType.cdrColorCMYK) //    CMYK
          s.Fill.UniformColor.ConvertToCMYK(); //   CMYK
  });
}

private void OutlineFillToCMYK(object sender, RoutedEventArgs e)
{
  MakeToAllPages((s) =>
  {
    if (s.CanHaveOutline) //     
      if (s.Outline.Type == corel.cdrOutlineType.cdrOutline) //  
        if (s.Outline.Color.Type != corel.cdrColorType.cdrColorCMYK) //    CMYK
          s.Outline.Color.ConvertToCMYK(); //   CMYK
  });
}

private void FountainFillToCMYK(object sender, RoutedEventArgs e)
{
  MakeToAllPages((s) =>
  {
    if (s.CanHaveFill) //     
      if (s.Fill.Type == corel.cdrFillType.cdrFountainFill) //  
      {
        foreach (corel.FountainColor c in s.Fill.Fountain.Colors) //     
        {
          if (c.Color.Type != corel.cdrColorType.cdrColorCMYK) //    CMYK
            c.Color.ConvertToCMYK(); //   CMYK
        }
      }
  });
}

private void ResampleBitmap(object sender, RoutedEventArgs e)
{
  MakeToAllPages((s) =>
  {
    int resolution = 300;
    if (s.Type == corel.cdrShapeType.cdrBitmapShape) //  
      if (s.Bitmap.ResolutionX != resolution || s.Bitmap.ResolutionY != resolution) //     
        s.Bitmap.Resample(0, 0, true, resolution, resolution); //    
  });
}
      
      



.






.





No próximo artigo, desejo descrever como criar uma janela de encaixe para desenhar automaticamente marcas de corte na descida.






Aproveitando esta oportunidade, recomendo cursos de programação online interativos muito legais e gratuitos da Kontur . Também recomendo o canal WPF de Pavel Shmachilin , é o melhor que já vi no YouTube sobre esse assunto.








All Articles