Код для массового перименования позиций

Автор Sprinter500, 22.03.13, 20:25:41

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

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

Sprinter500

Что то я не могу найти в этих примерах, как работать с многострочным текстом. Везде только для одной строки пример, пускай и с интерфейсами IText, ITextLine.
А мне надо провести замену части текста в одно- или многострочном тексте в: линиях-выносках, позиционных линиях выносках, в тексте на чертеже и в таблицах.
Например: двух строчный текст АБВ
                                                       БКЕ, надо заменить букву Б на М и получить: АМВ
                                                                                                                                     МКЕ.   

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

Sprinter500

С многострочными текстами разобрался - без всяких массивов - многострочный текст читается как обычный только с символами переноса, замена участка текста (функцией StringReplace) работает без проблем. Код для замены текста в линиях-выносках и позиционных линиях-выносках готов. А как быть обычным с текстом на чертеже? Есть примеры?

+ Благодарностей: 1

Sprinter500


Sprinter500

Остался не решенным вопрос - как организовать замену текста в объектах с названием "Текст на чертеже" средствами API7.

IDrawingContainer.IDrawingTexts - Интерфейс коллекции текстов на чертеже.
+ Благодарностей: 1

Sprinter500

IDrawingContainer содержит IDrawingTexts который в свою очередь содержит IDrawingText, имеющий свойства:
Allocation - размещение относительно точки привязки
Angle - угол наклона
Height - высота блока форматирования
HFormat - признак гориз. форматирования
Height -  во втрой раз высота блока форматирования :)
VFormat - признак. вертки. форматирования
Width - ширина блока форматирвоания
X
Y - координаты точки приявзки

Где тут текст считывать и задавать? Или я чего то не понимаю?

Открываем справку и смотрим иерархию, получаем текст.
plText:=pDrawingText as IText;
+ Благодарностей: 1

Sprinter500

Я сейчас далеко от компа где Delphi, проверить не могу, но на всякий случай спрошу заранее:
Вот это строчки будет достаточно: plText:=pDrawingText as IText; ?
Не надо ли еще дополнительно писать непонятную процедуру: IUnknown::QueryInterface (const GUID far& iid, void** pif)?
А если надо то как?

Вы уж простите меня, что столько много вопросов - я не волшебник, а только учусь :)

plText:=pDrawingText as IText; - этого достаточно.
+ Благодарностей: 1

Sprinter500

Я так понял когда применяется "AS" работет метод: IUnknown::QueryInterface (const GUID far& iid, void** pif)?
Просто встречаются два случая, где наподобе plText:=pDrawingText as IText;  и другой где (условно) ABC:=KLM.XYZ;
Пока не понятно когда что сразу ставить заранее.

Да As для приведения интерфейсов от одного типа к другому.
ЦитироватьПока не понятно когда что сразу ставить заранее.
Смотреть на типы объектов.
+ Благодарностей: 1

Sprinter500

Спасибо, теперь и замена в "тексте на чертеже" работает.

Sprinter500

Еще вопрос появился: как организовать перебор открытых в КОМПАСе чертежей, с целью произвести замену в каждом из них?


Sprinter500

Уж думал больше вопросов не будет, еще появился:
Как организовать работу с основной надписью средствами API7 ? Существующие примеры нашел только на API5. Поначалу когда я не мог подключить API7 у меня подключалась и API5, наверно они конфликтуют - после того как убрал подключение к API5 все заработало в API7. Теперь у меня весь код на API7 и подключать API5 не вариант. Хотя может я ошибаюсь.

Нашел в SDK по API7 интерфейс IStamp. У него крайне скудный набор свойств и методов. Что делать? Или так же как с таблицей?

В штампе текст, картинки скорее всего, тоже реализованы через текст, а жаловаться на интерфейс IText, что у него мало свойств и возможностей, как то не получается.
+ Благодарностей: 1

Sprinter500

В SDK написано что в штампе IText доступен только для чтения. Наверно неправильно понял. Буду пробовать.

Sprinter500

Написал процедуру:

procedure TForm1.Button2Click(Sender: TObject);
var
pStamp: IStamp;
pLayoutSheets : ILayoutSheets;
pLayoutSheet : ILayoutSheet;
pStampText: IText;
I : INTEGER;
begin
  pLayoutSheets:= pKompasDocument2D.LayoutSheets;
  pLayoutSheet:=pLayoutSheets.ItemByNumber[1];
  pStamp:= pLayoutSheet as IStamp;
  for I := 0 to 200 do
    begin
      pStampText:= pStamp.Text[pStamp.GetNextColumnId(1)];
      if pStampText.Str='zz' then pStampText.Str:='dd';
    end;
end;


Вылазит такая же ошибка на строке pStamp:= pLayoutSheet as IStamp; как при  ....2D1. Хотя может что то не то написал в коде? Что делать?