RUS  ENG 

Рисование линии

Страницы: 1
RSS
Рисование линии
 
Здравствуйте, подскажите пожалуйста, как нарисовать линию? Написал функцию, в которой успешно выполняется отрисовка типового символа, а вот с отрисовкой типовой линии или типового площадного объекта есть затруднения...
Код
procedure TfrmTopoGraf.zmp_GetPicture(iLay:ILayer;cMode:IObjectMode);
var
  iSym:ISymbol;
  iLineDef:ILineStyleDef;
  pict:TPicture;
  SymID:integer:
  LineID:Integer;

begin
       pict := TPicture.Create;
       SymId := ElemStyle.SymbolID;
       LineID := cMode.ElemStyle.LineStyle;

       //типовой символ 
       iSym := iLay.Symbols.ItemById[SymId]; 
       SetOlePicture(pict,iSym.Picture);
       Image1.Picture.Assign(pict); //Картинка добавляется 
       
       //типовая линия  
       iLineDef := iLay.LineStyles.ItemById[LineID]; 

      //А дальше тупик: какой метод дальше вызвать, чтобы в итоге на выходе получить картинку - полилинию 
      Image2.Picture.Assign(pict); 
end;
 
У LineStyleDef в описании нет, но в браузере объектов должен быть метод:

Function DrawSampleImage(Stream As Unknown, Width As Long, Height As Long, SpaceX As Long, SpaceY As Long, Format As Long, ImageBkColor As Long, ImageTransparent As Boolean, Scale As Double, LineColor As Long, LineWidth As Double) As Boolean
 
Понятно, функцию в браузере увидел, а подскажите пожалуйста, какие параметры эта функция принимает? Stream As Unknown это обычный TStream?
 
Stream - это IStream: https://msdn.microsoft.com/en-us/library/windows/desktop/aa380034(v=vs.85).aspx

Параметры из названия понятны, но нужно описать и потестировать.

Width, Height - размер картинки
SpaceX , SpaceY, - отступы
Format - формат картинки (https://politerm.com/zuludoc/zuluax/MapDoc_DrawToRaster.html)
ImageBkColor - цвет фона
ImageTransparent - прозрачность фона

то же что и в настройках zulu
Scale - масштаб линии,
LineColor - цвет линии,
LineWidth - толщина
 
Понятно, а чтобы нарисовать типовой площадной элемент, тоже нужно воспользоваться методом DrawSampleImage?
 
Только от FillStyleDef
 
Здравствуйте. У меня получилось нарисовать линию. Есть код
Код
procedure zmp_Image(var pict:TPicture);
var
    olestr:TOleStream;
    strg:IStorage;
    iStrm:IStream;
    Stm: TMemoryStream;
begin
       StgCreateDocFile(pWideChar(wPath),STGM_READWRITE or STGM_SHARE_EXCLUSIVE ,0,Strg);//хранилище
       strg.CreateStream(pWideChar(wPath),STGM_READWRITE or STGM_SHARE_EXCLUSIVE,0,0,iStrm);//поток
       oleStr := TOLESTream.Create(iStrm);//поток
       ................
       Stm:=TmemoryStream.Create;
       iLnDef := iLay.LineStyles.ItemById[LId];//нужная типовая линия
       ...............
       iLnDef.DrawSampleImage(iStrm,24,24,1,1,0,clDefault,false,50,clRed,2);//место возникновения исключения
       stm.LoadFromStream(oleStr);
       pict.Bitmap.LoadFromStream(stm);
end;
Функция выполняется, но почему фон получается черным? Подскажите пожалуйста в как изменить цвет фона?.
Подскажите еще пожалуйста, как получить интерфейс LineStyle для типовой лини, чтобы можно было рисовывать картинку цветом, который определен в режиме?
Изменено: Kostya_LeoG - 17.11.2017 13:52:56
 
Он не черный. Он clDefault
 
С линиями вроде бы разобрался, спасибо, подскажите еще пожалуйста по отрисовке типового площадного объекта.

Код
var
  iSqre:IFillStyleDef;
  iLnDef:ILineStyleDef;
begin
...
  Fid := ObjType.id;//правильно ли так получать идентификатор типового площадного объекта?
  iSqre := iLay.FillStyles.ItemById[Fid];
  Lid := ObjectMode.ElemStyle.LineStyle;//правильно ли получен стиль линии для типового площадного объекта?
  iLnDef := iLay.LineStyles.ItemById[LId];
  //дальше что-то рисует, но не совсем понятно тот ли площадной объект отрисовывается
  iSqre.DrawSampleImage(iStrm,48,32,1,1,0,clDefault,true,50,lnColor,clWhite,false,iLnDef,lnWidth,clRed);
...
end;

Подскажите еще описание параметров используемой функции

DrawSampleImage(

const Stream: IUnknown; Width: Integer; Height: Integer; SpaceX: Integer; SpaceY: Integer; Format: Integer; //-эти параметры как для линии

ImageBkColor: Integer; ImageTransparent: WordBool; // как получить эти свойства

Scale: Double;

Color: Integer; //цвет чего

BackColor: Integer;

Transparent: WordBool;

const BorderStyle: ILineStyleDef;

BorderWidth: Double;

BorderColor: Integer):

WordBool; safecall;

Изменено: Kostya_LeoG - 17.11.2017 15:30:14
 
Обновите версию. Там сплошная заливка выводилась.
 
ImageBkColor: цвет фона картинки
ImageTransparent: если true, то без фона (если формат прозрачность поддерживает)

Color - цвет узора заливки
BackColor - цвет фона заливки
 
Понятно, вопрос остался по получению некоторых данных
Код
ObjType := Layer.ObjectTypes.item[tid];
Fid := ObjType.id;
FillStyleDef := iLay.FillStyles.ItemById[Fid];//правильно ли так получать идентификатор типового площадного объекта?
Lid := ObjectMode.ElemStyle.LineStyle;//правильно ли получен стиль линии для типового площадного объекта?
LineStyleDef := Layer.LineStyles.ItemById[LId];

т.е. у площадного типового объекта свой тип линии и LineStyleDef как правильно его получить. При получении FillStyleDef нужно правильно задать ID, а как этот идентификатор получить? В ObjectMode и ObjectType явно не указано.
В примере отрисовки типового площадного объекта, который я приводил выше, помимо заливки, еще и линия площадного объекта выводилась, но не та, что описана была в структуре слоя.
Изменено: Kostya_LeoG - 17.11.2017 17:28:48
 
У типового объекта есть режим. У режима стиль. В стиле все и записано. https://www.politerm.com/zuludoc/zuluax/ObjectMode_ElemStyle.html
 
Все понятно, спасибо.
 
Здравствуйте, у меня остались вопросы по отображению площадных объектов:
1. Для некоторых линий (разные ID и их начертание) получается различными отображения в образце структуры и на получающемся рисунке. В получающемся рисунке выступы у линии рисуются снаружи от границы, а в образце для этого же типового элемента рисунок выступов у линии, как правило, направлен к центру фигуры. Хотелось бы видеть отображение линий на получающейся картинке такой же, как и на образце в структуре слоя.
2. У площадных объектов задается разным узор, насколько я понял, это параметр хранится ElementStyle.FillStyle, но в какой параметр в функции FillStyleDef.DrawSampleImage() его передать я так и не понял. Получается картинка с одинаковым рисунком заливки.
3. Можно ли получить доступ напрямую к картинке, которая рисуется в поле "Образец", для всех режимов типовых элементов?

Версия zulu 8.0.0.6531u от 17.11.2017
Изменено: Kostya_LeoG - 20.11.2017 09:12:46
 
1. Стиль границы задается стилем линии. Направление выступов зависит от ориентации контура (по\против часовой). Либо "мехом" наружу, либо вовнутрь. А для самого стиля линии нет понятия "снаружи".
2. FillStyleDef.DrawSampleImage() - рисует уже содержащийся в нем стиль. Туда некуда что-то подставлять. Разные стили - это разные объекты из коллекции FillStyles
3. Такой картинки, как объекта, к которому мог быть получен доступ не существует.

Предлагаю связываться по skype, чтобы ускорить обсуждение.
Страницы: 1