Получение значений координат графических примитивов

Автор Ливанов, 10.12.05, 18:51:08

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

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

Ливанов

Доброго времени суток!
У меня такой вопрос:
   Имеется Компас V6 и VB6.
   Рисуем (вручную) в активном окне компаса несколько графич. примитивов (скажем линию, квадрат, круг).
   Далее необходимо написать библиотеку, которая выполняла бы след. действия:
   "Пробегаемся" по всему активному окну, считываем все объекты (нарисованные нами примитивы).
   Идентифицируем их соответственно как линия, квадрат, круг.
   Записываем соответствующие их координаты в соответствующие массивы данных. (Т.е. появляются массивы для линий, квадратов, кругов).
   Далее выводим на экран координаты из массивов...
---------------
Вот такая задача.
Был бы очень признателен, если бы кто-нибудь помог это реализовать.
Сам сижу разбираюсь, но очень мало времени дано, скоро сдавать... Боюсь не успеть.
С уважением, Ливанов А.

IrоnМаxxx

В КОМПАС-Мастер есть такой интерфейс - ksIterator для перебора элементов одного типа (или любого типа) в чертеже. Пример Delphi:

procedure Iterator();
var doc : ksDocument2D;
     Iter : ksIterator;
     r : reference;
     i : integer;
begin
  doc := ksDocument2D(kompas.ActiveDocument2D);
  Iter := ksIterator(kompas.GetIterator);
  Iter.ksCreateIterator(ALL_OBJ, 0); // Создать итератор
                                                    // тип объектов - ALL_OBJ (все объкты)
  i := 0;
  r := Iter.ksMoveIterator(’F’); // переместить итератор в начало списка
  if doc.ksExistObj(r)=1 then
    repeat
      ... // неоюходимые действия с объектом
      r := Iter.ksMoveIterator(’F’); // переместить итератор к следующему элементу списка
    until doc.ksExistObj(r)=0;
  Iter.ksDeleteIterator; // удалить итератор
end;

Для получения координат объекта можно воспользоваться методом ksDocument2D::ksGetObjParam. Во входных параметрах функции как раз и следует задавать указатель (reference) на объект, полученный в цикле итерации. В качестве типа параметров объекта лучше задавать ALLPARAM (все параметры) - так Вы сможете получить координаты начала и конца отрезка, центр и радиус окружности и пр.
Эта функция возвращает тип объекта, который передан через reference. В зависимости от этого можно сортировать и выводить данные в определенном порядке. Как именно - решать уже вам...

IrоnМаxxx

Только сейчас обратил внимание, что Вы написали VB6... Но ничего, думаю с Delphi не сложно будет разобраться, а потом то же реализовать в Basic.

Ливанов

Спасибо.
Более или менее разобрался, но все же не могли бы вы привести пример на VB6?
Еще один момент: Когда происходит передача обьекта  методу ksDocument2D::ksGetObjParam - не могли бы вы по-подробнее расписать на VB6?
Заранее благодарен...

333

В SDK есть примеры использования функции ksDocument2D::ksGetObjParam
можно посмотреть там.
Функция ksGetObjParam возвращает тип объетка
по нему можно определить какой интерфейс нужен
Dim type As Integer
 type = doc.ksGetObjParam( objRef, Nothing, ALL_PARAM )
 далее в зависимости от типа запрашиваем нужный интерфейс
 Select Case type
   case LINESEG_OBJ:
      Dim param As Kompas6API5.LineSegParam
      param = kompas.GetParamStruct(  ko_LineSegParam )  
      If Not param Is Nothing Then
        doc.ksGetObjParam( objRef, param , ALL_PARAM )

Ливанов А.

Здравствуйте...
И все же я как-то не могу разобраться.
Кто-нибудь может привести код готовой библиотеки, желательно на VB6, которая бы пробегалась по окну. Там нарисована линия. Далее скрипт записывал ее координаты в массив?
Очень нужно, кто может помочь?
Спасибо.

Ливанов

Здравствуйте!
Чуть разобрался, но....
Надеюсь на помощь!

333

Создание итератора можно посмотреть в Step 7 функция WalkFromView
только нужно будет добавит получение параметров
Если нужны только отрезки то итератор можно создать только по отрезкам т.е. по LINESEG_OBJ

ЛОП