[Delphi]Работа с векторными изображениями

TaisBee

Есть изображение нарисаваное в corel draw. Нужно работать с этим избражением в делфи (масштабирование и т.д.). Кто нить может посоветовать хороший компонент для этого (всмысле для работы с векторными изображениями). В нете нашел компонент flexgraphiks, в принципе подходит, но у него свои формат f, а конверторов я ненашел.

0000

Одна из статей с FAQ по Delphi (www.drkb.ru)
Ключевой момент то, что Corel позволяет работать через COM.
Delphi и Corel Draw.
Надеюсь, многие сталкивались с 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; ...

TaisBee

я уже гуглил =). Только мне нужно чтобы прога открывалась и у других юзеров, то есть у них может и не быть корела. Для примера есьт программы ГИС, мне хотя бы такое

0000

У Корела формат же скорее всего закрытый, да и в любом случае пока сам разберешься околеешь (версионность же то ж нужна).
Как вариант пошушукать у них на сайт Corel OLE-библиотеку для просмотра их файлов (для Word например есть бесплатный WordView).
А вообще если ГИС открывает их фаилы, то надо посмотреть как у них сделано :) (посмотреть dll, инишники и другую косвенную инфу).

yolki

некоторые ГИС предоставляют интерфейсы для своих карт. например, мы в дельфёвую прогу нормально интегрировали карты от Ингита. www.ingit.ru
ессно, компонент и сами карты покупаются.

shem_62

а что использовали для работы с картами? вручную или какието компоненты типа флексграфикс

yolki

ещё раз: ингит поставлял собственный компонент. (за деньги)

kill-still

посмотреть dll
ЭЭэ научи меня тоже их смотреть, а? :confused: :confused: :smirk:

apl13

Заходишь в каталог, где она лежит - и смотришь на нее, смотришь на нее! СМОТРИШЬ НА НЕЕ! :zombi:

yolki

вероятно, эта dll реализует доступ к данным и предоставляет какой-нибудь COM-интерфейс. можно попытаться вытянуть из неё хотя бы библиотеку типов, а там уже разбираться. Я тут пытался одну базу раскорячить - там экспортнутые классы оказались с японскими идентификаторами - Bonkai, Kuidzu, Shikaka - хер разберёшься, что какая функция/метод делают :lol:
забил в результате

durka82

ЭЭэ научи меня тоже их смотреть, а?

У меня ТС по Ф3 показывает список вызовов.
Или это не то?

kill-still

Не, я имею в виду что исходник, имея длл никак не получшиь. Ведь так?

pitrik2

так
ну дык про исходники никто и не говорил
Оставить комментарий
Имя или ник:
Комментарий: