Чтение спецзнаков, содержащих текст

Автор #programmer, 16.09.14, 11:48:55

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

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

#programmer

Доброго времени суток.

Подскажите пожалуйста, как при помощи интерфейса IText (ITextLine, ITextItem) прочитать текст содержащий сложные спецзнаки (квадратный корень, знаки шероховатости и т.д.).

Если считывать текст при помощи свойств IText.Str и ITextLine.Str, то получается строка, содержащая спецзнаки с текстом, входящим в них, но при этом неизвестно, где заканчивается сам спецзнак. (Та же история с файлом пользовательского меню: нельзя определить конец спецзнака, содержащего текст, например: MENUITEM "Корень из одной третьей|Это корень @+98~$b1;3$ = 0.333" при вставке = 0.333 тоже попадёт под знак корня).

Если же использовать свойство ITextItem.Str, то как написано в справке: свойство не используется для компонент типа ksTItSpecialSymbol и ksTItFontSymbol.

Как поступить?


#programmer

К сожалению, ITextItem.Str, при использовании спецзнака, возвращает пустую строку или null.
А в теме http://forum.ascon.ru/index.php/topic,23519.msg165505.html#msg165505, опять же, нет символа, ограничивающего спецзнак :(
В то же время, ТТ из детали можно прочитать только при использовании IText, полученного от ITechnicalDemand3D.


#programmer

Нет, я смотрел все свойства ITextItem. При использовании спецсимвола можно получить только ItemType, Number, SymbolFontName и NewLine, но это ничего не даёт.

Если использовать КОМПАС-Макро, сделать запись в ТТ (в чертеже рис1), а потом выполнить полученный макрос, то получим рис2.

Рисунки хорошо, но тут не выставка, текст2 скорее всего указатель на текст3.

#programmer

Сейчас попробую написать библиотечку (rtw) для детального разбора ТТ и выложу с исходным кодом.
Так должно быть понятнее.

Да, когда будете писать rtw не забудьте сначала получить ITextLine, а от каждой ITextLine получить набор ITextItem.

#programmer

16.09.14, 15:43:27 #8 Последнее редактирование: 16.09.14, 16:51:47 от #programmer
Вот проект с rtw для детального разбора ТТ. Пароль к архиву: 111


#programmer

Ну вот хотя бы здесь: как прочитать значение шероховатости?
Через ITextItem не получится.

16.09.14, 17:15:19 #11 Последнее редактирование: 16.09.14, 18:26:38 от Sabahs
Я уже посмотрел на корнях, Вам придётся коды спец символов просто записать, а структура чётко с рекомендациями, но Вы их проигнорировали.
http://forum.ascon.ru/index.php?topic=23519.msg165572#msg165572
~ - символ конца специального знака.

Код символа шероховатости 171.

PS. Сообщайте, что файл сделан в хомяке, я им редко пользуюсь.

PS

ЦитироватьЕсли считывать текст при помощи свойств IText.Str и ITextLine.Str, то получается строка, содержащая спецзнаки с текстом, входящим в них, но при этом неизвестно, где заканчивается сам спецзнак. (Та же история с файлом пользовательского меню: нельзя определить конец спецзнака, содержащего текст, например: MENUITEM "Корень из одной третьей|Это корень @+98~$b1;3$ = 0.333" при вставке = 0.333 тоже попадёт под знак корня).
Знак шероховатости нужно заканчивать @$
выглядит это так @+171~ XXX@$
где ХХХ - строка значения шероховатости, перед ней я делаю пробел, иначе она залезает на знак шероховатости
+ Благодарностей: 1

#programmer

Спасибо, PS. Я этого не знал.

По поводу чтения ТТ: в прочитанных строках НИЧТО не указывает на то, где заканчивается спецзнак (~ указывает на окончание номера спецзнака, а не текста в нём).

Из моего примера, если попытаться обратно записать прочитанные строки,
например так:
     for I := 0 to memo2.Lines.Count-1 do
         begin
            line:=tdtext.Add;
            line.Str:=memo2.Lines(i);
         end;

         if(td<>nil)then td.Update;
         if(td3d<>nil)then td3d.Update;

то получим рис1. А если обратно записывать прочитанные Item'ы, то получим пустой спецзнак.

Нужно указывать при создании ksTextItemEnum – Тип компонента текста, я использую следующую функцию.
//==============================================================================
// Задать компоненту текста
procedure AddTextItem(Line:ITextLine;Str:WideString;tType:ksTextItemEnum);
var
Item:ITextItem;
begin
if Line<>nil then
   begin
      Item:=Line.Add();
      if Item<>nil then
       begin
         Item.Str:=Str;
         Item.ItemType:=tType;
         Item.Update;
       end;
   end;
end;
//==============================================================================
AddTextItem(pTextLine,'А',ksTItString)

#programmer

Это поможет записать, понятно.

Но суть в том, чтобы прочитать (при необходимости внести свои изменения в прочитанное),
а потом записать прочитанное обратно, а это не получается.

Кто Вам мешает прочитать, убираете "шероховатость " и всё, что находится до  ". Допускается утопание не более ", является спецзнаком с текстом, убираете спецзнак @171~ и остаётся текст спецзнака "Ra2,5".

#programmer

Согласен с вами. Но это лишняя работа (например через API5 ksTextItemParam можно получить всё сразу: и текст, и номер спецзнака).

Через API5 такие действия (получение текста из под спецзнака, чтение ТТ, редактирование их и запись обратно) делается гораздо проще, но не работает для 3D. Также через API5 нельзя получить ссылки (IHypertextReferenceParam), чтобы потом их записать(применить) обратно.
В примере присутствует всего одно ТТ, а у нас в чертежах их может быть больше 50 и каждый раз производить такой анализ (выяснять где начинается спецзнак, потом что идёт после него и только потом, что именно было в спецзнаке) очень трудоёмко, да и не всегда правильно получится. Шероховатость - это только пример, но далеко не единственный спецзнак содержащий текст (обозначения сварных швов, корни и т.д.).

Тогда, обращайтесь в СТП, я считаю, что это глюк API7 и текст спецсимвола должен передаваться в свойство Str.

#programmer