Изменение номера слоя

Автор Vishar, 01.09.15, 16:13:07

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Vishar

Здравствуйте!
Можно ли через API изменить номер слоя или создать слой с заданным номером? Если приводить слой к IDrawingObject, то номер получить можно, но он не меняется.


Vishar

Получилось сделать - изменять номер слоя надо было до вызова метода Update. Если он уже добавился, то поменять его уже почему-то не получается. А метод Add, к сожалению, не имеет входных параметров. Было бы конечно удобнее.

Всё правильно, Вы создаёте пока Update не вызвано, можно менять, после фактическое создание и менять уже нельзя, слой - это не вид, и может распространятся на несколько видов.
Чтобы поменять номер нужно создать новый слой и скопировать тот, который нужно поменять, затем удалить ненужный.
+ Благодарностей: 1

Vishar

Спасибо за подробное объяснение!

detrin

Подскажите, пожалуйста, слои получается создать. Вроде бы как при создании они становятся активными, но все примитивы чертятся только на системном слое. Как создавать примитивы на активном слое?

Активным слой становится после вызова IDrawingObject.Update.
Можно установить свойство ILayer.Current - состояние слоя - текущий.

detrin

Что-то у меня никак не получается. Посмотрите, пожалуйста, где ошибка?

var
    newKompasAPI : IApplication;
    pDocs        : IDocuments;
    pDoc         : IKompasDocument;
    pKompasDocument2D : IKompasDocument2D;
    pViewsAndLayersManager : IViewsAndLayersManager;
    ppViews      : IViews;
    ppView       : IView;
    ppDrawingContainer  : IDrawingContainer;
    Rectangle1 : IRectangle;
    KonturLayer : ILayer;
    ppLayers : ILayers;
begin
  if newKompasAPI = nil then
    begin
      disp := IDispatch(CreateKompasApplication);
      newKompasAPI := disp As IApplication;
    end;

  Kompas := KompasObject (CreateKompasObject);
  if kompas = nil then Exit;
  pDocs := newKompasAPI.Documents;
  if ( pDocs = nil) then Exit;
  pDoc := pDocs.Add( ksDocumentFragment, TRUE );

  pKompasDocument2D := newKompasAPI.ActiveDocument As IKompasDocument2D;
  if ( pKompasDocument2D <> nil) then
  begin      //Получить указатель на интерфейс менеджера видов и слоёв
    pViewsAndLayersManager := pKompasDocument2D.ViewsAndLayersManager;
    if ( pViewsAndLayersManager <> nil )
    then ppViews := pViewsAndLayersManager.Views;
  end;
  if( ppViews = nil ) then Exit;
  ppView := ppViews.ActiveView;
  if( ppView = nil ) then Exit;
  ppDrawingContainer  := ppView As IDrawingContainer;
  if( ppDrawingContainer = nil ) then Exit;
  Rectangles := ppDrawingContainer.Rectangles;
  if( Rectangles = nil ) then Exit;

   ppLayers := ppView.Layers;
   KonturLayer := ppLayers.Add;
   KonturLayer.LayerNumber :=3;
   KonturLayer.Name := 'Kontur';
   KonturLayer.Visible := True;
   KonturLayer.Current := True;
   KonturLayer.Update;


      // Рисуем контур
      Rectangle1 := Rectangles.Add;
      Rectangle1.X := 0;
      Rectangle1.Y :=  0;
      Rectangle1.Angle := 0;
      Rectangle1.Height := Height;
      Rectangle1.Width := Width;
      Rectangle1.Style := 0;
      Rectangle1.LayerNumber := KonturLayer.LayerNumber;
      Rectangle1.Update;

Попробуйте обновить слой KonturLayer.Update и вид ppView.Update.

detrin

Не помогает(
По трассировке слой KonturLayer остаётся активным, но прямоугольник строится только на системном слое.

Golovanev

А надо ли для таких простых построений использовать API7.... ?

Uses
     LibTool, LtDefine;
   

Var
doc : Ltdefine.DocumentParam;
pDoc : reference;
RectParam : Ltdefine.PRectangleParam;
pLayerContour : Reference;
LayPar: Ltdefine.LayerParam;
begin

  stFileName := 'c:\test.frw';

FillChar( doc,  sizeof(doc), 0 );
    StrPCopy(doc.fileName,stFileName);
    StrPCopy(doc.comment,'');
    StrPCopy(doc.author,'');
    StrPCopy(doc.layoutName,'');
    doc.regim :=                1;
    doc._type :=                3;

    if FileExists(stFileName) then SysUtils.DeleteFile(stFileName);
    pDoc := CreateDocument ( Addr(doc) );

    pLayerContour := Layer(3);
    FillChar( LayPar,  sizeof(LayPar), 0 );
    LayPar.name := 'Contour' ;
    SetObjParam(pLayerContour, @LayPar, sizeof(LayPar), ALLPARAM);


    FillChar( RectParam,  sizeof(pRectParam), 0 );

// Рисуем контур
      RectParam.X := 0;
      RectParam.Y :=  0;
      RectParam.Angle := 0;
      RectParam.Height := Height;
      RectParam.Width := Width;
      RectParam.Style := 0;
   
      ksRectangle(pRectParam,0);

end;


detrin

Спасибо за пример.  Буду пробовать.
А API7 начал использовать т.к. некоторые вещи есть только там. Да и самый главный помощник этой ветки форума подсказывает только по API7))