Trabalhar com a API KOMPAS-3D → Lição 15 → Linhas compostas com base no parágrafo

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”


  1. O básico
  2. Desenho de desenho
  3. Conexão correta com o KOMPAS
  4. Inscrição principal
  5. Primitivas gráficas
  6. Salvando um documento em vários formatos
  7. Conhecendo as configurações
  8. Métodos de escrita mais sofisticados no bloco de título
  9. Lendo células de legenda
  10. Caracteres especiais, incluindo uma sequência
  11. Etiquetas de texto simples
  12. Cordas compostas
  13. Parágrafos
  14. Texto de várias linhas
  15. 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:

  1. Ele usa os recursos documentados do sistema COMPASS.
  2. 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ão

Nesta 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".

Source: https://habr.com/ru/post/pt449706/


All Articles