Delphi и Corel Draw

Источник: mdelphi
Грабец Олег

Надеюсь, многие сталкивались с corel draw? А у многих слюнки текли, что это мощнейший графический редактор и хотелось бы под него свои программы писать, к примеру, чертежи выводить? Я один из вас :)

Формат файлов *.cdr конечно, не представлю, т.к. сам его не знаю :), но как с этим зверем работать расскажу. Вычитал, что с corel draw можно работать только через скрипт, причем изначально я готовил файлы скриптов *.csc, а затем их запускал в самом редакторе. Рабочий инструмент для освоения - corel script editor. Если Вы хотите действительно что-то написать, то он вам просто необходим, хотя бы ради того, что смотреть как corel draw их сам создает, ну и самое главное - дока по языку и функциям. Все замечательно, только вот скрипты медленно работают т.к. они эмитируют работу человека - т.е. кнопочки сами нажимаются, панельки меняются и т.д.
А чертеж, к примеру на котором около 3000 объектов мог загружаться и исполнятся до часу! Нет, когда это утомляет, то можно и самому посидеть - глядишь за неделю сделаешь :)

И тут я "чисто случайно" наткнулся на статейку http://www.djpate.freeserve.co.uk/autocdrw.htm. Оказывается можно и через ole этот corel draw дергать, и как оказывается, не так уж оно и сложно. Да, совершенно верно, нужно использовать coreldraw.automation.xx. Я возился с 8-й версией. Забегая на перед, скажу, что тот же чертеж выводился в течении 5-10 минут.

Ну что, начнем?

var
coreldraw: variant;

coreldraw := createoleobject('coreldraw.automation.8');
// цифирку можете свою поставить
coreldraw.filenew;
// или coreldraw.fileopen(filename);
coreldraw.setdocvisible(true);
// можно и не показывать, что он там делает, но ведь интересно! :)
// кстати, можно нарисовать, а потом показать - будет на 30% быстрее
... // ну и в конце
coreldraw.filesave('newname', 0, false, 0, false);
coreldraw.fileexit(false); // можно не писать, если не надо закрывать
coreldraw := unassigned;

Формат функций доступным английским языком описан в draw_scr.hlp. Ну а дальше, чего душа (или начальство :) ) желает:

coreldraw.setpageorientation(0);
coreldraw.setpagesize(pagew, pageh);
coreldraw.newlayer('newlayer1');
coreldraw.selectlayer('newlayer1');
coreldraw.createellipse(calcy(y1)), calcx(x1), calcy(y2), calcx(x2), 0, 0, 0);
// ничего я не перепутал!!! именно так у них координаты!
coreldraw.createrectangle(calcy(y1)), calcx(x1), calcy(y2), calcx(x2), calcx(radius));
...

Все ясно? За дело!
Да, чуть не забыл о самом главном - как и у любой системы в corel draw есть свои "заморочки" :)
Ноль координат находится в середине листа бумаги (оригинально, правда?)
Положительная ось y направлено вверх, а x - в право.
Координаты - целые числа в микронах. Для удобства я писал функцию:
function calcx(x_mm:double):longint;
begin
result := round(x_mm*10000);
end;

Углы не знаю в чем, но 90 градусов надо записать как 90000000. Положительные против часовой стрелки.
Принцип прорисовки таков: создается объект, а затем ему присваиваются различные свойства, такие как цвет, тип заливки, толщина линий и пр. По умолчанию эти значения через автоматизацию выставить нельзя - не поддерживается.
Выше упомянутое наглядно видно на прорисовке текста:

coreldraw.createartistictext( text, calcx(x), calcy(y));
// создаем текст. x,y - левый нижний
// как видите, нет параметров шрифта, размера и пр.
with font do
begin
if (italic) and (bold) then fsk:=14 else
if (italic) then fsk:=8 else
if (bold) then fsk:=13 else fsk:=7;
end;
coreldraw.setcharacterattributes( 0, 0, font.name, fsk, abs(font.size)*10,
0, 0, 0, 0, 0, 1000, 1000, halign);
// присваиваем атрибуты шрифта.
// halign имеет значения 1,2,3 - влево, по центру, вправо соответственно
colortocmyk(font.color, c,m,y,k);
// это моя функция для преобразования tcolor в составляющие в модели cmyk
coreldraw.storecolor(2, c,m,y,k, 0,0,0,0); // создание цвета
coreldraw.applyuniformfillcolor; // применяем цвет к объекту

Тоже самое относится к трансформации объектов - сперва создаете, а затем изменяете как хотите.
Работают функции для получения информации.

coreldraw.getsize(xsize, ysize); // получили размеры объекта
coreldraw.moveobject(0, -ysize); // сдвинули его вниз на свой размер

Можно "проверить" все существующие объекты. За круглым столом спрашивали, как это делается, а делается это так:

var objid, firstobjid:longint;
begin
coreldraw.selectallobjects;
coreldraw.selectnextobject(true);
// true для "захода" в сгруппированный объект
firstobjid := coreldraw.getobjectscdrstaticid;
repeat
...
// работа с объектом coreldraw.selectnextobject(true);
objid := coreldraw.getobjectscdrstaticid;
until objid = firstobjid; ...

Вот теперь вроде все. Пишите, если что не понятно


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=2487