Dans Corel Draw, à partir de la version 17, il existe une opportunité pratique de créer des modules complémentaires non seulement en VBA, mais également en C # VSTA. Alors profitons de cela et rapprochons le rêve d'un bouton Make Nice .
Avertissement
Pour les programmeurs - depuis 2002, je travaille comme ingénieur prépresse dans une imprimerie. Pour moi, la programmation est un passe-temps: le code et la description ne sont pas parfaits. Par conséquent, je serai heureux de relire et de critiquer.
Pour les imprimeurs - je comprends que les pentes sont collectées dans des programmes spécialisés, mais dans les réalités de ma ville, ce n'est pas conseillé. Les circulations sont petites, mais le nombre de mises en page, au contraire, est important et 95% des mises en page sont réalisées dans CorelDraw.
Ce dont vous avez besoin pour faire fonctionner la magie:
Visual Studio Tools for Applications (facultatif si vous souhaitez écrire des macros simples)
Connaissance de base de C #
Connaissance de base de WPF
Pour faciliter l'écriture, nous utiliserons des modules complémentaires pour Visual Studio de « bonus360 »:
Modèles de modules complémentaires CorelDraw
Packer des modules complémentaires CorelDraw
Commençons le studio en tant qu'administrateur afin que lors de la compilation, copiez les fichiers dans les dossiers système. Créez un nouveau projet en choisissant «CorelDRAW Docker Addon» comme modèle. Nous attribuons un nom, par exemple «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); //
});
}
.
.
Dans l'article suivant, je souhaite décrire comment créer un menu fixe pour dessiner automatiquement des marques de coupe lors de la descente.
Profitant de cette opportunité, je recommande des cours de programmation en ligne interactifs très cool et gratuits de Kontur . Je recommande également la chaîne WPF de Pavel Shmachilin , c'est la meilleure que j'ai vue sur YouTube sur ce sujet.