Membuat Addon (Docker) untuk Corel Draw

Di Corel Draw, mulai dari versi 17, ada peluang mudah untuk membuat add-on tidak hanya di VBA, tetapi juga di C # VSTA. Jadi mari kita manfaatkan ini dan mendekatkan impian tombol Make Nice .





Penolakan

Untuk programmer - sejak 2002 saya telah bekerja sebagai insinyur pracetak di sebuah percetakan. Bagi saya, pemrograman adalah hobi: kode dan deskripsinya tidak sempurna. Oleh karena itu, dengan senang hati saya akan mengoreksi dan mengkritik.





Untuk printer - Saya memahami bahwa lereng dikumpulkan dalam program khusus, tetapi dalam realitas kota saya hal ini tidak disarankan. Sirkulasinya kecil, tetapi jumlah tata letak, sebaliknya, besar dan 95% tata letak dibuat di CorelDraw.





Apa yang Anda butuhkan untuk membuat keajaiban itu berhasil:

Corel Draw





Studio visual





Alat Visual Studio untuk Aplikasi (opsional jika Anda ingin menulis makro sederhana)





Pengetahuan dasar tentang C #





Pengetahuan dasar tentang WPF









Untuk kenyamanan penulisan, kami akan menggunakan add-on untuk Visual Studio dari " bonus360 ":





Template Addons CorelDraw





CorelDraw Addons Packer






Mari kita jalankan studio sebagai administrator, sehingga saat mengompilasi, salin file ke folder sistem. Buat proyek baru dengan memilih "CorelDRAW Docker Addon" sebagai template. Kami menetapkan nama, misalnya "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); //    
  });
}
      
      



.






.





Pada artikel berikutnya saya ingin menjelaskan cara membuat buruh pelabuhan untuk secara otomatis menggambar tanda potong pada keturunan.






Mengambil kesempatan ini, saya merekomendasikan kursus pemrograman online interaktif yang sangat keren dan gratis dari Kontur . Saya juga merekomendasikan saluran WPF Pavel Shmachilin , ini adalah yang terbaik yang pernah saya lihat di YouTube tentang topik ini.








All Articles