Как получить указатель на все объекты чертежа

Автор Иван Ю., 22.04.13, 12:44:07

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

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

Иван Ю.

Подскажите пожалуйста, нужно повернуть все объекты чертежа, даже те которые находятся в невидимых слоях, то есть все существующие объекты чертежа.
Поворачивать я так понимаю нужно с помощью функции
RotateObj.
Как мне получить указатель на все объекты чертежа, для использования в этой RotateObj. Спасибо


Иван Ю.

так селект груп же не выделит непоказываемые объекты и нужно обязательно область задавать? IDrawingContainer.Objects[0] - это и будут указатель? и какую библиотеку подключить чтобы использовать его

Для IDrawingContainer, модуль KsAPI7.pas, получите вариантный массив указателей всех объектов.
Для SelectGroup указатель на группу ноль, т.е. группа селектирования, а координаты габаритного прямоугольника стремящиеся к точке, selectMode=2 - объекты снаружи прямоугольника-"ловушки".
По поводу SelectGroup, что он не вернёт невидимые объекты нужно проверять, а IDrawingContainer - вернёт всё, что есть.
+ Благодарностей: 1

Иван Ю.

То есть мне нужно перебрать все элементы массива и повернуть их, верно? при использовании IDrawingContainer.Objects[0]?

Зачем, перебирать?
Air:=IDrawingContainer.Objects[0]; - получаем массив
ISelectionManager.Select(Air); - выделяем все объекты
RotateObj (0,xc,yc,ang); - поворачиваем группу селектирования
+ Благодарностей: 1

Иван Ю.

Честно говоря, работал только с automation и тут не понимаю как работать. Подключил нужные библиотеки и дальше не знаю как.А SelectGroup поворачивает только видимые объекты((

В папке ...\SDK\Pascal\Delphi\ есть примеры API7, можете посмотреть.

+ Благодарностей: 1

Иван Ю.

23.04.13, 10:02:38 #8 Последнее редактирование: 23.04.13, 10:14:24 от Иван Ю.
Написал вот так. Не поворачивает. Access Violation. Что я неправильно делаю?

var
  newKompasAPI : IApplication;


function GetViews : IViews;

var
   pKompasDocument2D : IKompasDocument2D;
   pViewsAndLayersManager : IViewsAndLayersManager;
begin
  Result := nil;
  pKompasDocument2D := newKompasAPI.ActiveDocument As IKompasDocument2D; - ТУТ ВЫЛЕТАЕТ
  if ( pKompasDocument2D <> nil) then
  begin
    pViewsAndLayersManager := pKompasDocument2D.ViewsAndLayersManager;

    if ( pViewsAndLayersManager <> nil ) then
    begin
      Result := pViewsAndLayersManager.Views;
    end;
  end;
end;


procedure Rotate (MainForm : TMainForm);
var
ppViews : IViews;
ppView  : IView;
Air: integer;
pDrawingContainer : IDrawingContainer;
pSelectionManager : ISelectionManager;
begin
ppViews := GetViews();
  if( ppViews <> nil ) then
  begin
    ppView := ppViews.ActiveView;
          pDrawingContainer := ppView As IDrawingContainer;
           if (  pDrawingContainer <> nil ) then
             begin
             Air:=pDrawingContainer.Objects[0];
             pSelectionManager.Select(Air);
             iDocument2D.ksRotateObj(0,500,800,-72);
             end;
  end;

end;

pSelectionManager у Вас равен nil, нужно получить интерфейс на него, поэтому не поворачивает и не подсвечивает зелёным цветом.
K7Doc2D1:=pKompasDocument2D as IKompasDocument2D1;
if K7Doc2D1<>nil then pSelectionManager:=K7Doc2D1.SelectionManager;
ЦитироватьpKompasDocument2D := newKompasAPI.ActiveDocument As IKompasDocument2D; - ТУТ ВЫЛЕТАЕТ
newKompasAPI=nil или активный документ не является 2D документом.

//-------------------------------------------------------------------------------
// Получить доступ к новому API
// ---
procedure GetNewKompasAPI;
var
  Disp : IDispatch;
begin
   if newKompasAPI = nil then
    begin
       Disp := IDispatch(CreateKompasApplication);
       newKompasAPI := Disp as IApplication;
    end;
end;
+ Благодарностей: 1

Иван Ю.

Спасибо огромное. Глупые ошибки - получается забыл проинициализировать 2 интерфейса) Теперь заработало все)