Creación de un complemento (Docker) para Corel Draw

En Corel Draw, a partir de la versión 17, existe una oportunidad conveniente para crear complementos no solo en VBA, sino también en C # VSTA. Aprovechemos esto y acerquemos el sueño de un botón Make Nice .





Descargo de responsabilidad

Para programadores: desde 2002 trabajo como ingeniero de preimpresión en una imprenta. Para mí, programar es un hobby: tanto el código como la descripción no son perfectos. Por lo tanto, estaré encantado de revisar y criticar.





Para impresores - Entiendo que las pendientes se recogen en programas especializados, pero en la realidad de mi ciudad esto no es aconsejable. Las circulaciones son pequeñas, pero el número de diseños, por el contrario, es grande y el 95% de los diseños se realizan en CorelDraw.





Qué necesitas para que la magia funcione:

Dibujo de Corel





Estudio visual





Visual Studio Tools para aplicaciones (opcional si desea escribir macros simples)





Conocimientos básicos de C #





Conocimientos básicos de WPF









Para la conveniencia de escribir, usaremos complementos para Visual Studio de " bonus360 ":





Plantillas de complementos de CorelDraw





Paquete de complementos de CorelDraw






Ejecutemos el estudio como administrador, de modo que al compilar, copie los archivos en las carpetas del sistema. Cree un nuevo proyecto seleccionando "Complemento de Docker de CorelDRAW" como plantilla. Asignamos un nombre, por ejemplo “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); //    
  });
}
      
      



.






.





En el siguiente artículo, quiero describir cómo crear una ventana acoplable para dibujar automáticamente marcas de corte en el descenso.






Aprovechando esta oportunidad, recomiendo cursos de programación en línea interactivos muy interesantes y gratuitos de Kontur . También recomiendo el canal WPF de Pavel Shmachilin , este es el mejor que he visto en YouTube sobre este tema.








All Articles