Delphi и Corel Draw
Delphi и Corel Draw
Delphi и Corel Draw Я тут чисто случайно наткнулся на статейку 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; ...