Не могу получить интерфейс IDrawingObject1 у экземпляра IDrawingObject

Автор rusty_cat, 14.04.19, 13:56:57

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

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

rusty_cat

Уважаемые форумчане, подскажите!

Пытаюсь обработать список выделенных фигур и получить список ограничений каждой, для этого, если верить SDK, необходимо получить интерфейс IDrawingObject1 фигуры. Выделенные получаю при помощи selectedObjects, обхожу массив и получаю доступ к данным фигур через IDrawingObject, но при попытке получить IDrawingObject1 возникает ошибка "Could not convert variant of type (Array Dispatch) into type (Dispatch)".
В чем может быть проблема. Код такой:

ole:= sel.SelectedObjects;

if (varIsArray(ole))then
   begin
       for i:=varArrayLowBound(ole,1) to varArrayHighBound(ole,1) do
            begin
                p:= ole;
                de:= p as iDrawingObject;
                // здесь работа со свойствами DrawingObject
                de1:= p as iDrawingObject1; // либо de as iDrawingObject1 - одно и то же, => ошибка
            end;
   end;

DesignЯR

Там походу был выделен один объект - поэтому он распознается не как SAFEARRAY.Может поможет такая ссылка.
Как пользоваться массивом SAFEARRAY

http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294

вместо гиперссылки такая вот хрень
http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294
+ Благодарностей: 1

DesignЯR


rusty_cat

Цитата: DesignЯR от 14.04.19, 15:11:11
Там походу был выделен один объект - поэтому он распознается не как SAFEARRAY.Может поможет такая ссылка.
Как пользоваться массивом SAFEARRAY

http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294

вместо гиперссылки такая вот хрень
http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294

Спасибо! Буду ковырять массивы. Происходит что-то вообще загадочное.
Если ограничений на фигурах нет - в цикле без проблем на каждую дает интерфейс IDrawingObject, получаю тип и другие свойства, но стоит добавить ограничения - все падает

rusty_cat

Интерфейс получил(-ся). Сначала у всего набора фигур вида (через view.Objects[ksAllObj] ), потом и через ISelectionManager. Как заработало, сам не понял :)
Появилась еще пара вопросов:
- В SDK у IDrawingObject1 описано свойство Id. Насколько я могу судить, свойство появилось в версии 15.
можно ли найти более подробную информацию об этом свойстве, является ли оно временным (меняется при каждом открытии) или постоянным?

- Можно ли обойти выделенные фигуры при помощи итератора? Читал, что итераторы можно создать для документа, слоя, группы и др. Нет ли такой возможности в случае выделения?

ТрындецЪ

Цитата: rusty_cat от 30.04.19, 11:57:48
... итераторы можно создать для документа, слоя, группы и др. Нет ли такой возможности в случае выделения?
SELECT_GROUP_OBJ  127 группа выделенных объектов
+ Благодарностей: 1

DesignЯR

Цитироватьможно ли найти более подробную информацию об этом свойстве
Найти - нет. Получить - да. Путем проведения экспериментов по удалению и созданию объектов и чтению этого свойства. Это может быть и уникальный номер, а может и задаваться при перечитывании документа. Будем ждать результатов эксперимента.
Можно ли обойти выделенные фигуры при помощи итератора?
Итераторы  это пережиток из API5. Если как результат нужен IDrawingObject1, то лучше сделать так
kompas = (KompasObject)kompas_;
  KompasApp = (IApplication)kompas.ksGetApplication7();
  kompasDocument = KompasApp.ActiveDocument;
  kompasDocument2D = (IKompasDocument2D)kompasDocument;
  kompasDocument2D1 = (IKompasDocument2D1)kompasDocument2D;
  selectionManager = (ISelectionManager)kompasDocument2D1.SelectionManager;

//проверяем случай когда выбран один объект
  try { IDrawingObject drawingObject = (IDrawingObject)selectionManager.SelectedObjects;
        //выводим в Компас сообщение о типе выбранного объекта или своя процедура обработки объекта
        Kompas.Instance.Baloon("IDrawingObject.ObjectType="+drawingObject.DrawingObjectType.ToString()); }
  catch { Kompas.Instance.Baloon("IDrawingObject не получен"); }
 
  //проверяем случай когда выбрана группа объектов
  try{
        Array Selection = (Array)selectionManager.SelectedObjects;
//перебираем весь массив объектов
        foreach (Object obj in Selection) //ну чем не итератор???
         {
          IDrawingObject drawingObject = (IDrawingObject)obj;
  //выводим в Компас сообщение о типе выбранного объекта или своя процедура обработки объекта
          Kompas.Instance.Baloon("IDrawingObject.ObjectType=" + drawingObject.DrawingObjectType.ToString());
          }
         }
   catch { Kompas.Instance.Baloon("IDrawingObjects не получен"); }
+ Благодарностей: 1

rusty_cat

Цитата: DesignЯR от 01.05.19, 07:41:44
Найти - нет. Получить - да. Путем проведения экспериментов по удалению и созданию объектов и чтению этого свойства. Это может быть и уникальный номер, а может и задаваться при перечитывании документа. Будем ждать результатов эксперимента.
Провел ряд экспериментов. Id в рамках текущего фрагмента у каждой фигуры уникальный. Если удалять элементы, значения Id у других фигур не изменяются. При сохранении и открытии файлов Id значение сохраняют.
При вставке скопированных элементов из одного эскиза в другой Id сохраняются, однако, при вставке в тот же чертеж или эскиз - перенумеруются.
ЦитироватьИтераторы  это пережиток из API5. Если как результат нужен IDrawingObject1, то лучше сделать так
Насчет итераторов у меня была такая мысль: если API возвращает массив, значит один цикл внутри Компаса обошел все элементы, чтобы его сформировать, второй цикл - в моем коде будет обходить возвращенный массив. Грамотно организованный итератор, наверное, позволяет обойтись одним циклом.
Но тут ничего утверждать не буду, может оказаться, что обращение к подпрограммам API самое узкое в плане производительности место, и тогда цикл по массиву в приложении, как и цикл по списку элементов в Компасе. За пример спасибо, буду разбираться!