Проблема со вставкой текста в поля штампа спецификации

Автор PDM_гуру, 30.03.06, 12:55:39

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

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

PDM_гуру

Используется групповая спец ф. Б с большим количесвтом исполнений. У каждого исполнения есть Код и Наименование (вместо номера исполнения). Писать одно и тоже на 50 листах неудобно, поэтому  :?:пишу библиотечку под КОМПАС, которая сама из некоего источника всталяет коды и наименования исполнений в нужные ячейки, но столкнулся с проблемой, когда я не могу из библиотеки вставить текст в поля Код спецификации, где до этого не было чего-нибудь написано. Т.е. если чел руками что-то вписал в поле Код, то библиотечка вставляет другой текст в это поле, если никто эту ячейку не трогал - не вставляет.

В чем дело, подскажите господа программисты?

PDM_гуру

Поправка: такая ерунда возникает только с полями "Код"

ink

С помощью какой функции Вы меняете текст в ячейке?

PDM_гуру

Вообще пробовал по разному. Самое простое:
    OpenStamp
    ColumnNumber( 2001 );  // первое поле Код
    TextLine( NEW_LINE, 0, nil, 'Код1' );
    CloseStamp();        // Закрыть штамп

Пробовал через Kompasobject. Но там скрипт намного длиннее и сложнее, но результат тот же. Самое прикольное, что несмотря на то, что текст не виден, при переборе всех полей штампа выясняется, что тескт в этой ячейки все таки есть.

111

У меня была схожая проблема.
Она решилась следующим образом. Ниже приведен текст функции для установки значения ячейки по определенному адресу (index):

void SetText(char* buf,int index)
{
   unsigned int numb;
   if (OpenStamp())
   {
   ColumnNumber(index);
   TextLineParam parLine;
   TextItemParam parItem;
   reference p=GetStampColumnText(&numb);

   if (p && GetArrayCount(p))
       {
       GetArrayItem(p, 0, &parLine, sizeof(TextLineParam));

       if (parLine.pTextItem)
           {
           GetArrayItem(parLine.pTextItem, 0, &parItem, sizeof(TextItemParam));
           strcpy(parItem.s,buf);
           SetArrayItem(parLine.pTextItem, 0, &parItem, sizeof (TextItemParam));
           GetArrayItem(parLine.pTextItem, 0, &parItem, sizeof(TextItemParam));
           SetArrayItem(p , 0, &parLine, sizeof(TextLineParam));
           SetStampColumnText(index, p);
           }
       }
   else
       TextLine(NEW_LINE,0,0,buf);

   CloseStamp();
   }
}

Вначале определяем есть ли массив компонент текста и не пустой ли он.
Если в ячейке что-нибудь есть, то просто переопределяем компоненту (в примере первую). Если же нет, то просто создаем строку с помощью функции TextLine.

Если это не поможет то можно попытаться изменить индекс ячейки на 0x10000.
Возможно индекс ячейки в документе не соответсвует описанию в стиле основной надписи. Такой глюк был замечен в версии 5.11R03.

Чтобы проследить ошибку полезно прочитать все доступные ячейки в документе с помощью итератора и определить их индексы, может выясниться, что Вы задаете просто не тот индекс (см. выше).


PDM_гуру

Спасибо за подробный ответ. Переложил на Дельфи - не помогло.

В том то и дело, при проверке всех полей штампа с помощью итератора, нужная мне ячейка есть и стоит там именно тот текст, который я задал, но он не виден на экране. Можно предположить, что да, действительно, не тот индекс. Ан нет -пишу туда текст ручками - текст виден, проверяю итератором - всё правильно текст лежит в ячейке с нужным индексом.
Заметил, что такой косяк только с полями, текст в которых в итоге расположены вертикально. Сделал свои поля, аналогичные полям "Код" - таже ерунда.
Может кто имел опыт обработки вертикального текста?