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

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

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

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

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

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

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

Работа с текстом

Автор KVV, 08.10.07, 12:00:36

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

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

KVV

08.10.07, 12:00:36 Последнее редактирование: 10.10.07, 10:05:16 от KVV
Компас-график V8.(Delphi)
Задача - пройти по документу, найти координаты простой строки
и получить ее содержание.
Пытаюсь сделать это следующим образом:

procedure TfmDrRC.Button3Click(Sender: TObject);
var
   m:integer;
x,y:double;
  st:string;
  parte:ksTextParam;
  parp :ksParagraphParam;
  iLine:ksTextLineParam;
  iItem:ksTextItemParam;
  iter: ksIterator;
  arr1 :ksDynamicArray;
  arr2 :ksDynamicArray;
  pObj,p: Reference;
begin
  parte  := ksTextParam( kompas.GetParamStruct(ko_TextParam) );   
  parp  := ksParagraphParam( kompas.GetParamStruct(ko_ParagraphParam));
  iLine  := ksTextLineParam( kompas.GetParamStruct(ko_TextLineParam));
  iItem := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam)); 
  iter := ksIterator( kompas.GetIterator() );
  if iter = nil then exit;
  if iter.ksCreateIterator( ALL_OBJ, 0 ) then //итератор
  begin
    pObj := iter.ksMoveIterator( 'F' );
    while pObj <> 0 do
      begin
        doc.ksLightObj( pObj, 1 );
        m:=doc.ksGetObjParam(pObj,nil,ALLPARAM);
        if m=4 then begin
           m:=doc.ksGetObjParam(pObj,parte,ALLPARAM);
           parp:=ksParagraphParam(parte.GetParagraphParam());   // Paragraph
           x:=parp.x; y:=parp.y;

           p:=doc.ksParagraph(parp);  //Ptr

           arr1 := ksDynamicArray( parte.GetTextLineArr );   //массив по строкам
           arr2 := ksDynamicArray( iLine.GetTextItemArr );   //массив по компонентам строки

           doc.ksGetObjParam(p,iLine,ALLPARAM);//

           arr2.ksGetArrayItem( 0, iItem );

           st:=copy(iItem.s,1,30);
           Application.MessageBox(PChar('Tm='+inttostr(m)+'  x='+Floattostr(x)+
           '  y='+Floattostr(y)+'  Str='+st),
                         PChar(Application.Title),MB_YESNO + MB_ICONEXCLAMATION);
           end;
       doc.ksLightObj( pObj, 0 );
       pNameGrp := iter.ksMoveIterator( 'N' )
      end;
      iter.ksDeleteIterator();
  end;
end.

Результат - координаты выводит верно, а содержание - строки пусто.
Не могу понять в чем ошибка.

Убедительная просьба, пожалуйста, если есть возможность подскажите.

В Step'ax объекты создаются и сразу проверяются их параметры,
а здесь проверка в ранее созданном документе.

С уважением,заранее благодарен. KVV.

Извините за беспокойство.
Стоило пожаловаться и ответ нашелся :).
Пример работы для этой задачи, если кому интересно, выложу позже.
С уважением KVV.

sorockinalex

Ну и где же примерчик????

kolomboss

Таже проблема. В примере создаются, а мне надо уже на существующем обьекте. Вообще конечно сижу уже два вечера и так ничего и не добился. Непонятно как это вообще всё работает. Сто тыщ параметров, у них сто тыщ массивов, напрямую никак ничего не сделать, всё через какойто зад нужно пройти...
Добился что выдаёт количество строк у текста - и всё. Пытаюсь прочесть его через всякие хитрые циклы и тд - строка пустая и всё тут...

Slaviation

 
Цитироватьarr1 := ksDynamicArray( parte.GetTextLineArr );   //массив по строкам
           arr2 := ksDynamicArray( iLine.GetTextItemArr );   //массив по компонентам строки

           doc.ksGetObjParam(p,iLine,ALLPARAM);//

           arr2.ksGetArrayItem( 0, iItem );

Ты взял массив по строкам (arr1). Но далее нужно брать каждый элемент (iLine) этого массива и от него брать массив типа TEXT_ITEM_ARR (arr2). И уже потом пробежать по каждому элементу массива arr2 и взять от него item, в котором тебя ждет не пустой .s :^)
+ Благодарностей: 1

kolomboss

Все это звучит конечно как одна большая шутка))
Готовый код дал бы больше понятия и представления...
Сегодня думаю с апи7 попробывать это сделать, но опять же по апи 7 есть только справка и никаких тебе примеров, книжек и тд... Сухое описание функций и все.

Примеры есть.

kolomboss

У меня нет таких примеров, я поставил себе 10 компас, ибо на работе стоит именно он. Сегодня скачаю 14 компас и гляну там примеры по апи7. Может и справка там получше даже... Кто знает...

kolomboss

Разобрался. Спасибо Slaviation. Вдумался в каждую строчку твоего сообщения и написал нужный код. Ни на что не претендую, выкладываю свою версию кода. Может сыровато но общий принцип должен быть понятен. Если что не так - говорите, ибо писал уже ночью...
С#

public static void FindAndPrintAllTextParams()
{
    reference obj;
    KompasObject kompas = KompasInstance.getInstace();
    ksIterator iterator = (ksIterator)kompas.GetIterator();
    ksDocument2D doc = (ksDocument2D)kompas.ActiveDocument2D();
    if (iterator == null || doc == null)
        return;
    if (iterator.ksCreateIterator(ldefin2d.ALL_OBJ, 0) && doc.ksExistObj(obj = iterator.ksMoveIterator("F")) == 1)
    {
        while (doc.ksExistObj(obj) == 1)
        {
            if (doc.ksGetObjParam(obj, 0, 0) == ldefin2d.TEXT_OBJ)
            {
                ksTextParam textParam = (ksTextParam)kompas.GetParamStruct((short)StructType2DEnum.ko_TextParam);
                ksTextLineParam textLineParam = (ksTextLineParam)kompas.GetParamStruct((short)StructType2DEnum.ko_TextLineParam);
                ksTextItemParam textItemParam = (ksTextItemParam)kompas.GetParamStruct((short)StructType2DEnum.ko_TextItemParam);
                textParam.Init();
                textLineParam.Init();
                textItemParam.Init();
                doc.ksGetObjParam(obj, textParam, ldefin2d.ALLPARAM);
                ksDynamicArray linesArray = (ksDynamicArray)textParam.GetTextLineArr();
                int linesCount = linesArray.ksGetArrayCount();
                Debug.WriteLine(string.Format("Text has {0} lines", linesCount));
                string text = string.Empty;
                for (int j = 0; j < linesCount; j++)
                {
                    linesArray.ksGetArrayItem(j, textLineParam);
                    ksDynamicArray itemArray = (ksDynamicArray)textLineParam.GetTextItemArr();
                    Debug.WriteLine(string.Format("{0}-st line has {1} items", j, itemArray.ksGetArrayCount()));
                    for (int i = 0; i < itemArray.ksGetArrayCount(); i++)
                    {
                        itemArray.ksGetArrayItem(i, textItemParam);
                        Debug.WriteLine(string.Format("{0}-st line of text: {1}", j, textItemParam.s));
                        text = text + textItemParam.s;
                    }
                    text = j + 1 < linesCount ? text + "\n" : text;
                }
                Debug.WriteLine(string.Format("Full text: {0}", text));
                Debug.WriteLine("--------------");
            }
            obj = iterator.ksMoveIterator("N");
        }
    }
    iterator.ksDeleteIterator();
}
+ Благодарностей: 1