In Corel Draw gibt es ab Version 17 eine bequeme Möglichkeit, Add-Ons nicht nur in VBA, sondern auch in C # VSTA zu erstellen. Lassen Sie uns dies nutzen und den Traum von einem Make Nice- Button näher bringen .
Haftungsausschluss
Für Programmierer - seit 2002 arbeite ich als Druckvorstufeningenieur in einer Druckerei. Programmieren ist für mich ein Hobby: Sowohl der Code als auch die Beschreibung sind nicht perfekt. Daher werde ich gerne Korrektur lesen und kritisieren.
Für Drucker - Ich verstehe, dass Pisten in speziellen Programmen gesammelt werden, aber in der Realität meiner Stadt ist dies nicht ratsam. Auflagen sind klein, aber die Anzahl der Layouts ist im Gegensatz dazu groß und 95% der Layouts werden in CorelDraw erstellt.
Was Sie brauchen, damit die Magie funktioniert:
Visual Studio Tools für Anwendungen (optional, wenn Sie einfache Makros schreiben möchten)
Grundkenntnisse in C #
Grundkenntnisse in WPF
Zum Vereinfachen des Schreibens verwenden wir Add-Ons für Visual Studio von " Bonus360 ":
Lassen Sie uns das Studio als Administrator ausführen, damit Sie beim Kompilieren die Dateien in die Systemordner kopieren. Erstellen Sie ein neues Projekt, indem Sie "CorelDRAW Docker Addon" als Vorlage auswählen. Wir vergeben einen Namen, zum Beispiel "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); //
});
}
.
.
Im nächsten Artikel möchte ich beschreiben, wie ein Docker erstellt wird, um beim Schnitt automatisch Schnittmarken zu zeichnen.
Bei dieser Gelegenheit empfehle ich sehr coole und kostenlose interaktive Online-Programmierkurse von Kontur . Ich empfehle auch den WPF- Kanal von Pavel Shmachilin. Dies ist der beste, den ich zu diesem Thema auf YouTube gesehen habe.