Как изменить шрифт спецсимвола в нижнем индексе надписи на чертеже?

Автор Akew, 13.03.18, 20:36:00

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

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

Akew

Здравствуйте!

На чертеже требуется создать надпись - букву (например, "W") с символом прописной греческой буквы "дельта" в нижнем индексе. При этом размер шрифта у "дельты" должен быть уменьшен (2.5 вместо 3.333 по умолчанию).

Я исследовал структуру требуемой надписи, созданной вручную. Она состоит из пяти компонент:
1 - ksTItString - текст (буква "W")
2 - ksTItUpperDeviation - верхний индекс
3 - ksTItLowerDeviation - нижний индекс
4 - ksTItFontSymbolW - спецсимвол (параметры шрифта заданы в этой же компоненте)
5 - ksTItDeviationEnd - конец отклонений (обозначений индексов)

Но программно создать ее не удалось: кол-во компонент получается больше, они добавляются автоматически. А попытка удалить (очистить) их - приводит к неудовлетворительному результату.
При этом удалось изменить шрифт у индексов, представляющих собой обычный текст (не спецсимвол).

Требуемую надпись пытался создать на основе примера Step2_API7_2D.cpp двумя способами, но до конца пока не удалось довести ни один из них.
В обоих буква с "дельтой" создается, но нерешенным остается следующее:
- в обоих способах - не удается удалить посторонний пробел слева от "дельты";
- во втором - не удается изменить параметры шрифта у "дельты"; сообщений об ошибках нет, но и изменения шрифта тоже не происходит.

Изменение шрифта по 1-му способу у меня вызывает сомнение: я устанавливаю его не на отдельный требуемый компонент ("дельту"), а на весь нижний индекс - до того как добавляю "дельту". Тем не менее, пока это лучшее из того, что требуется получить.

Прилагаю код обоих способов.
В коде, для наглядности, установлено изменение не только размера шрифта "дельты", но и его цвета - на красный. Т.е., если цвет "дельты" на чертеже получится красным, значит, требуемые параметры шрифта установлены успешно.

Перед вызовом функций необходимо открыть (создать) чертеж, на котором будет создаваться надпись.

Спасибо!

//-------------------------------------------------------------------------------
// Создать текстовую надпись: W с уменьшенным символом "дельта" в нижнем индексе - 1-й способ
// ---
void CallCreateTextNoteDelta_1( ksAPI7::IKompasDocument2DPtr pKompasDocument2D ) {
CString titleDialog = _T( "Функция CallCreateTextNoteDelta_1" );
CString tmpstr;

if ( !pKompasDocument2D ) {
MessageBox(NULL, _T("Не задан pKompasDocument2D. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return;
}

ksAPI7::IViewsAndLayersManagerPtr pViewsAndLayersManager( pKompasDocument2D->GetViewsAndLayersManager() );
if ( !pViewsAndLayersManager ) {
MessageBox(NULL, _T("pViewsAndLayersManager не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return;
}

ksAPI7::IViewsPtr pViews( pViewsAndLayersManager->GetViews() );
if ( !pViews ) {
MessageBox(NULL, _T("pViews не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return;
}

ksAPI7::IViewPtr pView( pViews->GetActiveView() );
if ( !pView ) {
MessageBox(NULL, _T("pView не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return;
}

ksAPI7::IDrawingContainerPtr pDrawingContainer( pView );
if ( !pDrawingContainer ) { MessageBox(NULL, _T("pDrawingContainer не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

ksAPI7::IDrawingTextsPtr pDrawingTexts( pDrawingContainer->GetDrawingTexts() );
if ( !pDrawingTexts ) { MessageBox(NULL, _T("pDrawingTexts не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

ksAPI7::IDrawingTextPtr pDrawingText( pDrawingTexts->Add() );
if ( !pDrawingText ) { MessageBox(NULL, _T("pDrawingTexts не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

// Координаты угла, где будет создана надпись
pDrawingText->PutX( 100.0 );
pDrawingText->PutY( 200.0 );

ksAPI7::ITextPtr pText( pDrawingText );
if ( !pText ) { MessageBox(NULL, _T("pText не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

ksAPI7::ITextLinePtr pTextLine( pText->GetTextLine( 0 ) );
if ( !pTextLine ) { MessageBox(NULL, _T("pTextLine не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

// Создать (получить) 1-й компонент - для буквы "W" (тип ksTItString)
ksAPI7::ITextItemPtr pTextItem1( pTextLine->GetTextItem( 0 ) );
if ( !pTextItem1 ) { MessageBox(NULL, _T("pTextItem1 не получен"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

pTextItem1->PutItemType( ksTItString );
pTextItem1->PutNewLine( VARIANT_TRUE );
pTextItem1->PutSizeFactor( ksTextDefault );
pTextItem1->PutStr( _T("W") ); // Текст (буква), который будет отображен
pTextItem1->Update();

// Создать 2-й компонент - тип ksTItLowerDeviation (нижний индекс)
ksAPI7::ITextItemPtr pTextItem2( pTextLine->Add() );
if ( !pTextItem2 ) { MessageBox(NULL, _T("pTextItem2 не получен"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

pTextItem2->PutItemType( ksTItLowerDeviation );
pTextItem2->PutNewLine( VARIANT_FALSE );
pTextItem2->PutSizeFactor( ksTextDefault );

// Изменить цвет и размер шрифта
ksAPI7::ITextFontPtr pTextFont2( pTextItem2 );
if( pTextFont2 ) {
pTextFont2->PutHeight( 2.5 );
pTextFont2->PutColor( RGB( 255, 0, 0 ) );
}

pTextItem2->Update();

// Создать 3-й компонент - тип ksTItFontSymbolW, для символа "дельта"
ksAPI7::ITextItemPtr pTextItem3( pTextLine->Add() );
if ( pTextItem3 ) {
pTextItem3->PutItemType( ksTItFontSymbolW );
pTextItem3->PutNewLine( VARIANT_FALSE );
pTextItem3->PutSizeFactor( ksTextDefault );
pTextItem3->PutSymbolFontName( _T("Courier New") );
pTextItem3->PutNumber(916); // Код символа "дельта"
pTextItem3->Update();
}

if( !pDrawingText->Update() ) {
MessageBox(NULL, _T("Не удалось pDrawingText->Update()"), titleDialog, MB_OK|MB_ICONWARNING ); return;
}

// В этом месте - создана надпись (буква с индексом-символом "дельта"), но с посторонними пробелами слева и справа от "дельты".
// Эти пробелы нужно удалить. Пробелы принадлежат 4 и 6-м компонентам надписи (отсчет с 1).
// Попытка удалить (очистить) эти компоненты.
ksAPI7::ITextItemPtr pTextItem05( pTextLine->GetTextItem( 5 ) ); // Получить 6-й компонент
if ( pTextItem05 ) pTextItem05->Delete(); // Пробел справа удаляется нормально.

ksAPI7::ITextItemPtr pTextItem03( pTextLine->GetTextItem( 3 ) ); // Получить 4-й компонент
if ( pTextItem03 ) {
pTextItem05->Delete(); // Удаление приводит к тому, что настройки шрифта на "дельте" сбиваются
// pTextItem03->PutStr(_T("")); // Очистка строки компоненты - тоже (компонента удаляется автоматически)
pTextItem03->Update();
}

pDrawingText->Update();

MessageBox(NULL, _T("Работа закончена"), titleDialog, MB_OK|MB_ICONINFORMATION );
return;
}


//-------------------------------------------------------------------------------
// Создать текстовую надпись: W с уменьшенным символом "дельта" в нижнем индексе - 2-й способ
// ---
void CallCreateTextNoteDelta_2( ksAPI7::IKompasDocument2DPtr pKompasDocument2D ) {
CString titleDialog = _T( "Функция CallCreateTextNoteDelta_2" );
CString tmpstr;

. . .
(аналогично 1-му способу)

// Создать W с 2 в нижнем индексе, с уменьшенным шрифтом
// 1-й компонент - буква (тип ksTItString)
ksAPI7::ITextItemPtr pTextItem1( pTextLine->GetTextItem( 0 ) );
if ( !pTextItem1 ) { MessageBox(NULL, _T("pTextItem1 не получен"), titleDialog, MB_OK|MB_ICONWARNING ); return; }
pTextItem1->PutItemType( ksTItString );
pTextItem1->PutNewLine( VARIANT_TRUE );
pTextItem1->PutSizeFactor( ksTextDefault );
pTextItem1->PutStr( _T("W") );
pTextItem1->Update();

// 2-й компонент - тип ksTItUpperDeviation
ksAPI7::ITextItemPtr pTextItem2( pTextLine->Add() );
if ( !pTextItem2 ) { MessageBox(NULL, _T("pTextItem2 не получен"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

pTextItem2->PutItemType( ksTItLowerDeviation );
pTextItem2->PutNewLine( VARIANT_FALSE );
pTextItem2->PutSizeFactor( ksTextMiddle );
pTextItem2->Update();
pDrawingText->Update();

// В этом месте создана надпись - буква "W" и заготовка для верхнего и нижнего индексов (с пустыми полями) - всего четыре компоненты.
// Типы компонент следующие
// 1 - ksTItString - текст (буква "W")
// 2 - ksTItUpperDeviation - верхний индекс
// 3 - ksTItLowerDeviation - нижний индекс
// 4 - ksTItDeviationEnd - конец отклонений (обозначений индексов)

// Для того чтобы создать символ "дельта", по идее, нужно добавить компонент "ksTItFontSymbolW" перед 4-м компонентом (он окажется между компонентами типов "ksTItLowerDeviation" и "ksTItDeviationEnd")
ksAPI7::ITextItemPtr pTextItem4( pTextLine->AddBefore( 3 ) );
if ( !pTextItem4 ) { MessageBox(NULL, _T("pTextItem4 не получен"), titleDialog, MB_OK|MB_ICONWARNING ); return; }

pTextItem4->PutItemType( ksTItFontSymbolW );
pTextItem4->PutNewLine( VARIANT_FALSE );
pTextItem4->PutSizeFactor( ksTextDefault );
pTextItem4->PutSymbolFontName( _T("Courier New") );
pTextItem4->PutNumber(916); // Код символа "дельта"

// Изменить цвет и размер шрифта у этой компоненты
ksAPI7::ITextFontPtr pTextFont4( pTextItem4 );
if( pTextFont4 ) {
pTextFont4->PutHeight( 2.5 );
pTextFont4->PutColor( RGB( 255, 0, 0 ) );
} else {
MessageBox(NULL, _T("pTextFont4 не получен"), titleDialog, MB_OK|MB_ICONWARNING );
}
pTextItem4->Update();

pDrawingText->Update();

// Требуемая надпись - буква W с нижним индексом-символом "дельта" создается, но с обычным шрифтом. Т.е., пользовательский шрифт не устанавливается.
// Слева от "дельты" - также находится посторонний пробел

MessageBox(NULL, _T("Работа закончена"), titleDialog, MB_OK|MB_ICONINFORMATION );
return;
}



Slaviation

ЦитироватьНа чертеже требуется создать надпись - букву (например, "W") с символом прописной греческой буквы "дельта" в нижнем индексе. При этом размер шрифта у "дельты" должен быть уменьшен (2.5 вместо 3.333 по умолчанию).
Пример на Python во вложении. Запускать на активном чертеже.
+ Благодарностей: 1

ТрындецЪ

Цитата: Slaviation от 14.03.18, 07:53:29
Запускать на активном чертеже.
Код рисует не в активном документе, а самом первом из открытых. И опять же не у всех установлен греческий шрифт (у меня, например, его нет).
Отредактировал код на рисование в активном документе и вставку дельты спецзнаком.
+ Благодарностей: 1

Akew

Спасибо всем за подсказки - разобрался.
Фрагмент готового кода прилагаю.
// 1-й компонент - буква (тип ksTItString)
ITextItemPtr pTextItem1(pTextLine->GetTextItem(0));
if (!pTextItem1) { MessageBox(NULL, _T("pTextItem1 не получен"), titleDialog, MB_OK | MB_ICONWARNING); return; }

pTextItem1->PutItemType(ksTItString);
pTextItem1->PutNewLine(VARIANT_TRUE);
pTextItem1->PutSizeFactor(ksTextDefault);
pTextItem1->PutStr(_T("W"));
pTextItem1->Update();

// 2-й компонент - тип ksTItLowerDeviation
ITextItemPtr pTextItem2(pTextLine->Add());
if (!pTextItem2) { MessageBox(NULL, _T("pTextItem2 не получен"), titleDialog, MB_OK | MB_ICONWARNING); return; }

pTextItem2->PutItemType(ksTItLowerDeviation);
pTextItem2->PutNewLine(VARIANT_FALSE);
pTextItem2->PutSizeFactor(ksTextMiddle);

pTextItem2->PutStr(_T("^(Courier New)916")); // Указать символ с кодом 916 шрифта Courier New (по сути, спецсимвол)
ITextFontPtr pTextFont2(pTextItem2); // Изменить высоту и цвет шрифта спецсимвола
if (pTextFont2) {
pTextFont2->PutHeight(2.5);
pTextFont2->PutColor(RGB(255, 0, 0));
}
else {
MessageBox(NULL, _T("pTextFont3 не получен"), titleDialog, MB_OK | MB_ICONWARNING);
}

pTextItem2->Update();

pDrawingText->Update();


ded_yagyn

Требуется написать дробь с индексами.
Создаю дробь вручную А1(нижний индекс) дробь (наверху Б2(нижний индекс)- В3(нижний индекс) / C4(нижний индекс)


Средствами АПИ7 программно смотрю результат и копирую значение строки
А$m;1$$dБ$m;2$-B$m;3$;C$m;4$$

(пишу по памяти, а не вставляю копипастой, так что могут быть опечатки).

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

Как с этим бороться?

ded_yagyn


ded_yagyn

Как используя API7, и именно разбивку TextLine на Item сделать текст в рамочке?

Надо именно так, тк в рамочке будет вставляться сслыка на переменную.

Те "@40~текст "не устраивает :-(