• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

[C#] Выбор объектов определенного вида

Автор asyaka, 13.07.14, 01:54:57

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

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

asyaka

Нужно выбрать выделенные объекты, которые являются линеей-выноской. Создаю итератор:
iter.ksCreateIterator(ldefin2d.SELECT_GROUP_OBJ, 0).
Подскажите, пожалуйста, как определить какой объект какого вида?

От полученного функцией ksMoveIterator указателя Obj получаете базовый интерфейс для всех графических объектов и смотрите тип объекта.
pDrawingObject:=IUnknown(ksTransferReference(Obj,ksGetCurrentDocument(0))) as IDrawingObject;
pDrawingObject.DrawingObjectType - тип графического объекта.
+ Благодарностей: 1

asyaka

Спасибо.
На шарпе как-то так, может надо кому:
           if (iter.ksCreateIterator(ldefin2d.SELECT_GROUP_OBJ , 0))
            {
                if (doc.ksExistObj(obj_number = iter.ksMoveIterator("F")) == 1)
                {
                    do
                    {
                        if (doc.ksGetObjParam(obj_number, 0) == ldefin2d.POSLEADER_OBJ)
                        {
                           //делаем что-нибудь
                        }
                    }
                    while (doc.ksExistObj(obj_number = iter.ksMoveIterator("N")) == 1); //переходим к следующему объекту
                 }
          }



PavelTLT

Возникла проблема с итератором по SELECT_GROUP_OBJ

Delphi 7, Компас V13

var
  kompas : KompasObject;
  doc    : ksDocument2D;
  pObj, pObj2, pAttr: Reference;
  iter,iter2: ksIterator;
  D:IInterface;
begin
  try
   Kompas := GetActiveOleObject('KOMPAS.Application.5') as KompasObject;
  except
   exit;
  end;

  if kompas <> nil then begin
   doc:= ksDocument2D( kompas.Document2D);

  iter := ksIterator( kompas.GetIterator() );
   if iter = nil then exit;
   if (iter.ksCreateIterator(SELECT_GROUP_OBJ,0)) then // Создать итератор
   begin
    pObj := Iter.ksMoveIterator('F'); // переместить итератор в начало списка
    repeat
     if doc.ksExistObj(pObj)=1 then
      ListBox1.Items.Add('!!!!!!!!!!!!!!!!!!!!!!');
     pObj := Iter.ksMoveIterator('N'); // переместить итератор к следующему элементу списка
    until pObj=0;
   end;
  end;

Объекты pObj получаются (ровно столько, сколько выделил объектов на чертеже)
Но проверку doc.ksExistObj(pObj) ни один объект не проходит! ksExistObj всегда возвращает 0.
Пробовал выводить pObj - представляет собой числа типа 583039832

Зачем мне это нужно?
Я выделяю в компасе объекты кучей, хочу одной кнопкой убрать у них все атрибуты (или только часть, по выбору программы).

Пробую по именованным группам - то же самое:
   iter := ksIterator( kompas.GetIterator() );
  iter2 := ksIterator( kompas.GetIterator() );
   if iter = nil then exit;
   if (iter.ksCreateIterator(NAME_GROUP_OBJ,0)) then // Создать итератор
   begin
    pObj := Iter.ksMoveIterator('F'); // переместить итератор в начало списка
    repeat
     LightObj( pObj, 1 );   //подсветим группу

Ничего не подсвечивает, хотя именованные группы перебирает.
Пробовал перебирать внутри каждой именованной группы iter2.ksCreateIterator(ALL_OBJ,pObj)
Перебирает, количество объектов правильное (как я и создал в группах на чертеже). Но эти объекты не проходят проверку ksExistObj

Как с ними работать?

ЦитироватьНо проверку doc.ksExistObj(pObj) ни один объект не проходит! ksExistObj всегда возвращает 0.
И не пройдёт ни один объект проверку, т.к. их в документе нет.
if kompas <> nil then begin
   doc:= ksDocument2D( kompas.Document2D);
Если замените строку выше, на строку ниже, то тогда проверку объекты пройти должны.
if kompas <> nil then begin
   doc:= ksDocument2D( kompas.ActiveDocument2D);
+ Благодарностей: 1

PavelTLT

Ур-р-а-а!
Заработало!

И другие проблемы (типа "группа не выбиралась по имени") тоже решились сами собой.

Спасибо вам большое! (кнопку "поблагодарить" нажал, но хотел добавить от себя) :)