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:
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.