Как сделать слой текущим

Автор YURI, 13.02.03, 11:35:05

« предыдущая - следующая »

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

YURI

Здравствуйте!

Элементарный кусок кода

procedure TfrmInitialPoint.btnPointClick(Sender: TObject);
var hndLayer: Integer;
begin
     hndLayer:= iDoc.ksLayer( 1 );
end;

НЕ РАБОТАЕТ!

Тут вроде как хотелось бы сделать текущим слой номер 1.
Но в дескрипторе он возвращает 0, типа происходит ошибка. В чем тут дело, кто-нибудь знает? Может, тут есть какая-то тонкость?

Очень жду комментариев и, желательно, что лучше всего, исходные коды, где подобная ерунда работала бы, на адрес

kruglov@permonline.ru


Alik

У меня работает просто Layer(1);

Zashibuka

это синтаксис Automation ...

YURI

Блин, на самом деле какая-то лажа!

Этот вариант тоже не работет. Тоже возвращает ноль!

В чем дело? Может ли влиять на это тот, факт, что в Компасе еще болтаются формы Дельфовые? Он может там как-то по дескриптору окна верхнего, хрен его знает, эту функцию выполняет?

И вообще, есть какая-то служба техподдержки, где разработчики АПИшника КОМПАСА? Никакой инфы ваще нет ни по одному вопросу!

Все описания в секции Даунлоад не покрывают всех тонкостей программирования.


Zashibuka

А работающий пример - в поставке AppTools\Pascal\DELPHIAUTO\step7>step7.dpr
Xождение по слоям

Zashibuka

у тебя активный документ открыт лист или фрагмент ?

iDoc проинициализирован ? Отзывается ?

кроме проблем с ksLayer  все другие инструкции
iDoc...  выполняются ?

YURI

Тут какая ситуация.
Вначале у меня работает прога. Далее юзер нажимает кнопку, далее типа CreateOLEObject (...) Запускается КОМПАС, загружается библиотека (это тоже все через COM). Потом само приложение закрывается, остается Компас, выводится форма Дельфи с параметрами документа: масштаб, угол поворота, в общем все стандартное, вводим параметры, далее создаем с помощью команд АПИшника документ, вид и четыре слоя, прияем слои создаются при помощи iDoc.ksLayer без проблем.


Но потом в какой-то момент подьзователь должен нажать кнопку "Выбрать точку", после чего должен сать активным слой номер 1, и тут , в этом фрагменте, не работает.

Вот такие пироги.

YURI

Да, кстати говоря, вот какая интересная деталь.
Я при создании слоев в начале программы iDoc запоминаю в глобальной переменной, так что он инициализирован. Но однако если в этом месте, где не работает моя многострадальная функция, вставить инициализацию iDoc заново, то он получает NULL!

С чем это связано? Мне кажется, с тем , что формы болтаются поверх окна чертежа КОМПАС.

Я помню, такая же фигня с MapInfo  у меня была.

Slaviation

iDoc.ksLayer(1) создаёт слой №1 и возвращает его указатель.
Если дальше планируется изменять свойства этого слоя, то этот указатель надо запомнить:
var
  refLayer1:Reference;  //Указатель на слой
  iLayerParam: ksLayerParam; //Интерфейс параметров слоя
begin
   ...
   //Создаём слой №1 и запоминаем на него указатель.
   refLayer1:=iDoc.ksLayer(1);
   ...
   //Далее создаём слой №2 (он становится активным)
  iDoc.ksLayer(2);
   ...
   //Далее делаем слой №1 активным (что вам нужно)
   iLayerParam:=ksLayerParam(iKompasObject.GetParamStruct          (ko_LayerParam));
   if iLayerParamnil then
   begin
     iDoc.ksGetObjParam(refLayer1,iLayerParam,ALLPARAM);
     iLayerParam.state:=stACTIVE;
     iDoc.ksSetObjParam(refLayer,iLayerParam,ALLPARAM);
   end;
   ...

  Можно конечно запоминать указатели на все создаваемые слои, но можно и нет, а при надобности создать итератор для поиска нужного слоя и найдя его, менять его свойства (но это уже другая тема).
 
   

YURI

И такой номеро тоже не проходит.
Собственно говоря, с некоторыми вариациями я его уже пробовал.

Вот код дословно.

procedure TfrmInitialPoint.btnPointClick(Sender: TObject);
var iLayerParam: ksLayerParam;
begin

     iLayerParam:= ksLayerParam( iKompas.GetParamStruct( ko_LayerParam ) );

     if not Assigned( iLayerParam )
     then begin
               iDoc.ksGetObjParam( refLayers[ 1 ], iLayerParam, ALLPARAM );
               iLayerParam.state:= stACTIVE;
               iDoc.ksSetObjParam( refLayers[ 1 ], iLayerParam, ALLPARAM );
          end
     else begin
               iLayerParam.state:= stACTIVE;
               iDoc.ksSetObjParam( refLayers[ 1 ], iLayerParam, ALLPARAM );
          end;
end;

Ни черта не происходит, как был 4-й слой активный, так и остался.

Может, вообще надо вручяную переключать слои?
типа так в инструкции пользователю и написать, нажмите такую-то кнопку.

Короче, это уже начинает потихоньку раздражать.

YURI

Народ!

Дайте, если есть, работающий пример.

Я вижу, разобраться можно только так.

В доках ничего нет, вернее есть, но как приходится убеждаться, ничего не работает.

В стандартной поставке КОМПАС в примерах слои только создаются, но потом в процессе работы чтобы сделать слой активным, нигде такого нет.




Sergey

Чтобы установить текущий надо использовать константу stCURREN, а не stACTIVE и все заработает.

YURI

В общем, все заработало, вся проблема была, как оказалось, в том, что поверх КОМПАСа действительно не должно быть никаких окон, а окно КОМПАСа должно быть активным. Тогда будет все окей.

Zashibuka