Тема: Как изменить "textstyle"?

Нужно написать программу изменения textstyle (из одного 1.shx в другой 1.shx) у выбранной строки текста или у всего текста с данным стилем. Проблема в том, что коды в 1.shx не совпадают с кодами второго, т.е. если например 122 в первом соответствует отрисовке литеры "z" то во втором это "n".
Если не лень, алгоритм в самых общих чертах?

Re: Как изменить "textstyle"?

> mihael
Хммм... Ничего не понял. Имя shx-файла одно и тоже? Так не получится, т.к. AutoCAD будет использовать только один из них. Да и вообще похоже на то, что нужно текст перекодировать, а не менять текстовые стили. Это очень похоже на мою утилиту DWGCONVERT (https://www.caduser.ru/forum/topic20384.html) только таблицу перекодировки нужно составить (на DOS<->WINDOWS это не очень смахивает).

Re: Как изменить "textstyle"?

> Александр Ривилис
Ето ошибка 1.shx и 2.shx

Re: Как изменить "textstyle"?

> mihael
Ага. Ну тогда все значительно проще.
1) Составляешь таблицу перекодировки из одного текста в другой.
2) Допустим текстовый стиль на основе 1.shx имеет имя "style1", а на основе 2.shx - "style2".
3) В таблице текстовых стилей AcDbTextStyleTable находишь AcDbObjectId id1 для "style1" и AcDbObjectId id2 для "style2". Если ты знаешь только имена shx-файлов, а не имена стилей, то можно все равно найти пройдясь по всей таблице текстовых стилей и проверяя для каждой из записей таблицы fileName()
4) Выбираешь строку и проверяешь совпадает ли для нее textStyle() с id1. Если да, то меняешь его на id2 при помощи setTextStyle(id2).
5. Перекодируешь текст согласно таблице перекодировки.
6. Всё.
Если нужно не для одной выделенной строки, а для всего чертежа, то проходишься итератором по всем текстам внутри всех блоков и выполняешь с п.п. 4) по п.п. 6)

Re: Как изменить "textstyle"?

Грубо говоря, так: есть некая текстовая строка с текстовым стилем 1.shx, если я меняю  свойства этой строки на использование 2.shx, получаю что-то непонятное. (пример: мнеяю строку из myril.shx to simpheb.shx) к сожалению не могу прикрепить декомпелированные в shp файлы :((

Re: Как изменить "textstyle"?

> Александр Ривилис
Спасибо!!! Разжевали!!!!

Re: Как изменить "textstyle"?

> mihael
Ну тогда это проблема со шрифтами и ObjectARX тут врядли поможет. Нужно или исправлять шрифты или перекодировать текст строк для которых они меняются. Первый способ мне кажется более правильным.

Re: Как изменить "textstyle"?

может кому пригодится!
таблицу перекодировки из одного текста в другой можно сделать с использованием одномерного массива где индексом массива будет код в одной кодировке а содержимое кодом из другой, очень удобно не надо делать поиск по массиву!!!!

Re: Как изменить "textstyle"?

> Александр Ривилис
еще раз спасибо работает на ура!!!!

Re: Как изменить "textstyle"?

> mihael
У меня в DWGCONVERT именно так и реализовано. Только есть еще нюанс: в строках возможны и такие "уникодовские" последовательности "\U+XXXX". С ними нужно поосторожнее!

> mihael
Пожалуйста! :)

Re: Как изменить "textstyle"?

Родился вопрос, а как быть с текстом, который является аттрибутом болока?

Re: Как изменить "textstyle"?

> mihael
Точно так же:
1) Находишь все вставки блока AcDbBlockReference
2) Проходишься итератором по атрибутам (AcDbAttribute)
3) Перекодируешь их текст и если нужно меняешь стиль (textstyle).
В действительности кроме атрибутов могут быть еще и определения атрибутов (AcDbAttributeDefinition), мтексты (AcDbMtext) и еще куча разного добра, где может понадобится перекодировка.

Re: Как изменить "textstyle"?

> Александр Ривилис
Ok!!! А что за "и еще куча разного добра" ("димменшоны"?), мне "нужно" всё добро где используется данный стиль?! Дело в том, что обработанный файл будет использоваться в GIS на базе ArcIfo и мне нужен текст строго определённого стиля.

Re: Как изменить "textstyle"?

> mihael
Ну если речь идет только о тех примитивах, которые могут иметь текстовый стиль, то это:
1) Производные от AcDbText (из стандартных AutoCAD'овских - это: AcDbText, AcDbAttribute, AcDbAttributeDefinition
2) Мультитекст (AcDbMtext)
3) Размеры (все производные от AcDbDimension и AcDbFcf)
4) Таблицы (AcDbTable) и стили таблиц (AcDbTableStyle)
Надеюсь ничего не упустил.

Re: Как изменить "textstyle"?

> Александр Ривилис
Александр, Вы - большая поддержка для этого форума и для этого раздела в частности!!!Так держать!!!

Re: Как изменить "textstyle"?

Не понимаю как выловить текстовый стиль в 3 и 4 пунктах?

Re: Как изменить "textstyle"?

3) AcDbDimension::dimtxsty()
4) AcDbTable::textStyle() и AcDbTableStyle::textStyle()

Re: Как изменить "textstyle"?

Александр Ривилис, а можно ли немного поподробнее про AcDbDimension?
Пробовал редактривать стиль текста размера с помощью итератора по блоку (AcDbDimension::dimBlockId)(при изменении свойств блока автокад изменяет все его параметры на стандартные), с помощью AcDbDimension::fieldFromMText и AcDbDimension::setDimStyle. Так ничего и не помогло.

Re: Как изменить "textstyle"?

1. Создай свой текстовый стиль (AcDbTextStyleTableRecord), добавь его в AcDbTextStyleTable.
2. Получи для AcDbTextStyleTableRecord его AcDbObjectId, а из него AcDbHandle.
3. Из AcDbHandle получи строку
4. Для размера (AcDbDimension) получи xData по имени приложения "ACAD" и добавь после группы 1000 с содержимым "DSTYLE" группу 1005 со строкой из пункта 4.
Должно получится что-то подобное:

Command: (entget(car(entsel)) '("*"))
Select object: ((-1 . <Entity name: -4513cfc0>) (0 . "DIMENSION") (5 . "80")
(102 . "{ACAD_XDICTIONARY") (360 . <Entity name: -4513cf50>) (102 . "}") (102 .
"{ACAD_REACTORS") (330 . <Entity name: -4513cf00>) (102 . "}") (330 . <Entity
name: -45147058>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100
. "AcDbDimension") (2 . "*D1") (10 199.369 191.618 0.0) (11 149.235 193.731
0.0) (12 0.0 0.0 0.0) (70 . 32) (1 . "") (71 . 5) (72 . 1) (41 . 1.0) (42 .
100.267) (73 . 0) (74 . 0) (75 . 0) (52 . 0.0) (53 . 0.0) (54 . 0.0) (51 . 0.0)
(210 0.0 0.0 1.0) (3 . "ISO-25") (100 . "AcDbAlignedDimension") (13 99.1013
177.967 0.0) (14 199.369 177.967 0.0) (15 0.0 0.0 0.0) (16 0.0 0.0 0.0) (40 .
0.0) (50 . 0.0) (100 . "AcDbRotatedDimension") (-3 ("ACAD" (1000 . "DSTYLE")
(1002 . "{") (1070 . 340) (1005 . "99") (1070 . 178) (1070 . 256) (1002 .
"}"))))

Re: Как изменить "textstyle"?

Добрый день. Нашел немного более простой способ.

AcDbOrdinateDimension *pDimLine = new AcDbOrdinateDimension(Adesk::kFalse,definingPoint,leaderEndPoint,sHeigth,AcDbObjectId::kNull );
        AcDbObjectId DimLineId;
        AddBlockTable(pDimLine,DimLineId);
        
        AcDbDimStyleTableRecord *pDimSt yle= new AcDbDimStyleTableRecord();
        pDimStyle->setDimtxsty(m_TextStyleID);

        AcDbDimStyleTable *pDimStyleTable;
        acdbHostApplicationServices()->workingDat abase()->getSymbolTable(pDimStyleTable, AcDb::kForWrite);
        pDimStyleTable->add(pDimStyle);
        pDimStyle->close();
        pDimStyleTable->close();

        pDimLine->setDimensionStyle(pDimStyle->id());
        pDimLine->setTextPosition(definingPoint);
        pDimLine->close();

Re: Как изменить "textstyle"?

Мы видимо говорим о разных вещах. Тот метод, который я предложил, меняет текстовый стиль у конкретного примитива-размера. Ты же меняешь текстовый стиль у размерного стиля.

Re: Как изменить "textstyle"?

Александр Ривилис, меня интересовали все возможные методы.
Кстати,

pDimLine->setDimtxsty(m_textstyleID);

вроде бы тоже работает.