Na
lição 12, introduzimos as linhas compostas e analisamos uma maneira não documentada de criá-las. Na
lição 13 , foram apresentados parágrafos. Hoje vamos ver como usá-los para criar seqüências compostas. Primeiro, vamos pegar linhas que incluem desvios e frações e nos familiarizarmos com componentes de linhas compostas, como sobrescrito, substring e caracteres especiais.

O conteúdo da série de lições “Trabalhando com a API KOMPAS-3D”
- O básico
- Desenho de desenho
- Conexão correta com o KOMPAS
- Inscrição principal
- Primitivas gráficas
- Salvando um documento em vários formatos
- Conhecendo as configurações
- Métodos de escrita mais sofisticados no bloco de título
- Lendo células de legenda
- Caracteres especiais, incluindo uma sequência
- Etiquetas de texto simples
- Cordas compostas
- Parágrafos
- Texto de várias linhas
- Linhas compostas baseadas em parágrafos
Desvios superiores e inferiores
A seguir, um fragmento de um programa que demonstra a saída de uma linha com desvios superiores e inferiores usando parágrafos. Para fazer isso, os sinalizadores
END_DEVIAT ,
LOWER_DEVIAT e
UPPER_DEVIAT , mencionados na
lição 12, são usados .
Snippet de código do programa// DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(UPPER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(LOWER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
Comparado com o exemplo de construção de desvios da
lição 12, o programa atual tem duas vantagens importantes:
- Ele usa os recursos documentados do sistema COMPASS.
- Não há necessidade de recalcular a posição das linhas. O KOMPAS determina todas as compensações necessárias.
Observe o uso do sinalizador
END_DEVIAT . Ele conclui a geração de desvio e cancela os
sinalizadores LOWER_DEVIAT e
UPPER_DEVIAT . Se não o tivéssemos usado, a linha "Texto após desvios" seria exibida como o desvio mais baixo.
Os sinalizadores
LOWER_DEVIAT e
UPPER_DEVIAT se cancelam. Quando usada simultaneamente, a sequência é exibida como seria exibida sem especificar esses sinalizadores.
Como o sinalizador
NEW_LINE não
é usado em nosso exemplo, todas as linhas podem ser exibidas com uma chamada para o método
ksTextLine . Para fazer isso, eles são pré-formados na forma da interface
ksTextLineParam .
O resultado do programa é mostrado na figura abaixo.

Fração
A seguir, é apresentado um exemplo de um programa que demonstra a saída de uma string que inclui uma fração.
Exemplo de programa // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
Construir frações não é muito diferente de construir desvios. A única diferença são os sinalizadores usados. O sinalizador
END_FRACTION cancela os sinalizadores
NUMERATOR e
DENOMINATOR e age da mesma forma que o sinalizador
END_DEVIAT em relação aos desvios.
A figura abaixo mostra o resultado deste programa.

Essa linha parece mais limpa em comparação com o mesmo texto da
lição 12 .
Controle de tamanho de frações
A fração exibida pode ter um tamanho diferente, que é controlado usando a interface
ksTextItemParam . Se a propriedade
type for
FRACTION_TYPE , essa interface, entre outras coisas, define o tamanho da fração. O tamanho em si é especificado na propriedade
iSNumb . Seus valores válidos são mostrados na tabela abaixo.

Se a propriedade
iSNumb especificar um valor inválido, o KOMPAS utilizará a altura padrão.
A seguir, é apresentado um exemplo do uso do sinalizador
FRACTION_TYPE .
Exemplo de uso de sinalizador // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); itemParam->set_type(FRACTION_TYPE); itemParam->set_iSNumb(3); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
Este exemplo difere do anterior, definindo o tipo
FRACTION_TYPE na propriedade
type da interface
ksTextItemParam ao
gerar o numerador. No entanto, isso é suficiente para redimensionar a fração. A figura abaixo mostra o resultado deste programa (compare-o com o resultado do
exemplo anterior ).

Nota: o tamanho da fração é definido quando o numerador é exibido. Como mostram minhas experiências, o tamanho da fração especificado quando o denominador é exibido é ignorado.
Sobrescrito e Substring
A construção de uma subcadeia e subcadeia é controlada pelos sinalizadores listados na tabela abaixo.

A seguir, é apresentado um exemplo de programa que demonstra a saída de uma cadeia de caracteres com uma substring e substring.
Exemplo de programa // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
A figura abaixo mostra o resultado deste programa.
Você não pode criar uma substring e substring usando o método
ksDocument2D :: ksText .
Controle de tamanho da linha principal
A linha principal pode ter um tamanho diferente, que pode ser alterado usando a interface
ksTextItemParam . Para isso, a constante
SUM_TYPE é especificada em sua
propriedade type , e o tamanho necessário da linha principal na propriedade
iSNumb . Os valores válidos são mostrados na tabela abaixo:

Se a propriedade
iSNumb contiver um valor inválido, o KOMPAS utilizará o valor padrão.
A seguir, um trecho de um programa que demonstra o uso da constante
SUM_TYPE .
Snippet do programa // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); itemParam->set_type(SUM_TYPE); itemParam->set_iSNumb(2); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); itemParam->set_type(0); itemParam->set_iSNumb(0); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
A
constante SUM_TYPE é inserida na propriedade
type da interface
ksTextItemParam quando a linha principal é
exibida . Antes da saída do
suplemento , a interface
ksTextItemParam é
restaurada ao seu estado inicial. Essa é a única diferença entre este exemplo e o anterior.
A figura abaixo mostra o resultado do programa (compare-o com o resultado do exemplo anterior).

A
constante SUM_TYPE permite redimensionar a sequência principal, mas não as substrings e substrings. A alteração de tamanhos no KOMPAS não é fornecida.
Caracteres especiais, incluindo uma substring
Um parágrafo pode lidar com caracteres especiais que incluem uma string (eles foram discutidos na
lição 10 do ciclo). A seguir, um fragmento de um programa que demonstra seu uso em um parágrafo.
Snippet do programa // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); DynamicArrayPtr lines; lines = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_LINE_ARR)); lines->ksClearArray(); // TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; // itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(169); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; // itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); // itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(96); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; // itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); // itemFont->set_bitVector(NEW_LINE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; itemParam.Unbind(); lineParam.Unbind(); itemFont.Unbind(); items.Unbind(); // ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); paragraphParam->set_width(60.0); paragraphParam->set_hFormat(2); // TextParamPtr textParam = static_cast<TextParamPtr>(kompas->GetParamStruct(ko_TextParam)); textParam->SetParagraphParam(paragraphParam); textParam->SetTextLineArr(lines); // Document2D->ksTextEx(textParam, 1); lines->ksDeleteArray(); lines.Unbind(); paragraphParam.Unbind(); textParam.Unbind();
O exemplo parece muito complicado, mas se você o observar com atenção, poderá ver que ele consiste em repetir peças. Nele, com a ajuda de caracteres especiais, são exibidos textos riscados e sublinhados. Após cada um desses blocos, uma linha vazia com o sinalizador
SPECIAL_SYMBOL_END é exibida . Sua tarefa é cancelar a ação do caractere especial. Se não for exibido, o parágrafo poderá não ser construído corretamente. A ação do caractere especial se estende a todo o bloco
ksTextLineParam , por todo o seu comprimento, independentemente do seu conteúdo real (esta tese é ilustrada na figura abaixo).

A linha de cancelamento deve fazer parte do bloco
ksTextLineParam . Caso contrário, o parágrafo não poderá ser construído corretamente. O bloco
ksTextLineParam pode conter vários caracteres de controle. Cada um deles deve ter sua própria linha de cancelamento.
O sinalizador
SPECIAL_SYMBOL_END é usado apenas para caracteres especiais que possuem uma subcadeia. Para caracteres especiais comuns, não é necessário.
A figura abaixo mostra o resultado do nosso exemplo.
ConclusãoNesta lição, aprendemos como usar parágrafos para criar linhas compostas, incluindo desvios e frações, e examinamos maneiras documentadas de criar linhas compostas com base em um parágrafo. Esta não é a única e está longe de ser a maneira mais fácil de criá-las. Outra maneira, muito mais simples, consideraremos na próxima lição.
Para continuar, acompanhe as notícias do blog.
Sergey Norseev, Ph.D., autor do livro "Application Development for COMPAS in Delphi".