Corel Drawでは、バージョン17以降、VBAだけでなくC#VSTAでもアドオンを作成できる便利な機会があります。それでは、これを利用して、MakeNiceボタンの夢を近づけましょう。
免責事項
プログラマー向け-2002年以来、私は印刷所でプリプレスエンジニアとして働いています。私にとって、プログラミングは趣味です。コードと説明の両方が完璧ではありません。したがって、私は校正と批判を喜んでします。
印刷業者の場合-傾斜は特殊なプログラムで収集されることを理解していますが、私の都市の現実では、これはお勧めできません。流通量は少ないですが、逆にレイアウト数が多く、95%がCorelDrawで作られています。
魔法を機能させるために必要なもの:
アプリケーション用のVisualStudioツール(単純なマクロを作成する場合はオプション)
Cの基礎知識#
WPFの基礎知識
記述の便宜のために、「bonus360」からVisualStudioのアドオンを使用します。
スタジオを管理者として実行して、コンパイル時にファイルをシステムフォルダーにコピーしてみましょう。テンプレートとして「CorelDRAWDockerAddon」を選択して、新しいプロジェクトを作成します。「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); //
});
}
.
.
次の記事では、降下にカットマークを自動的に描画するドッカーを作成する方法について説明します。
この機会を利用して、Konturの非常にクールで無料のインタラクティブなオンラインプログラミングコースをお勧めします。Pavel ShmachilinのWPFチャンネルもお勧めします。これは、このトピックに関してYouTubeで見た中で最高のものです。