Trabaje con la API KOMPAS-3D → Lección 15 → Líneas compuestas basadas en el párrafo

En la lección 12, presentamos las líneas compuestas y observamos una forma indocumentada de crearlas. En la lección 13 , se presentaron párrafos. Hoy veremos cómo usarlos para crear cadenas compuestas. Para comenzar, tomemos líneas que incluyan desviaciones y fracciones, y conozcamos componentes de líneas compuestas como un superíndice, una subcadena y caracteres especiales.



El contenido de la serie de lecciones "Trabajando con la API KOMPAS-3D"


  1. Los fundamentos
  2. Diseño de dibujo
  3. Conexión correcta a KOMPAS
  4. Inscripción principal
  5. Primitivas gráficas
  6. Guardar un documento en varios formatos
  7. Conociendo la configuración
  8. Métodos de escritura más sofisticados en el bloque de título
  9. Lectura de celdas de subtítulos
  10. Caracteres especiales que incluyen una cadena
  11. Etiquetas de texto simple
  12. Cuerdas compuestas
  13. Los párrafos
  14. Texto multilínea
  15. Líneas compuestas basadas en párrafos

Desviaciones superiores e inferiores


El siguiente es un fragmento de un programa que muestra el resultado de una línea con desviaciones superiores e inferiores utilizando párrafos. Para lograr esto, se utilizan los indicadores END_DEVIAT , LOWER_DEVIAT y UPPER_DEVIAT , mencionados en la lección 12 .

Fragmento de código 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(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 con el ejemplo de construir desviaciones de la lección 12, el programa actual tiene dos ventajas importantes:

  1. Utiliza las capacidades documentadas del sistema COMPASS.
  2. No es necesario volver a calcular la posición de las filas. KOMPAS mismo determina todas las compensaciones necesarias.

Tenga en cuenta el uso del indicador END_DEVIAT . Completa la generación de desviación y cancela las banderas LOWER_DEVIAT y UPPER_DEVIAT . Si no lo hubiéramos usado, la línea "Texto después de las desviaciones" se mostraría como la desviación más baja.

Las banderas LOWER_DEVIAT y UPPER_DEVIAT se cancelan entre sí. Cuando se usa simultáneamente, la cadena se emite como se mostraría sin especificar estos indicadores.

Como el indicador NEW_LINE no se usa en nuestro ejemplo, todas las líneas se pueden mostrar con una llamada al método ksTextLine . Para hacer esto, se realizan en forma de interfaz ksTextLineParam .

El resultado del programa se muestra en la figura a continuación.



Fracción


El siguiente es un ejemplo de un programa que muestra la salida de una cadena que incluye una fracción.

Programa ejemplo
 //     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(); 


La construcción de una fracción difiere poco de la construcción de desviaciones. La única diferencia son las banderas utilizadas. El indicador END_FRACTION cancela los indicadores NUMERATOR y DENOMINATOR y actúa igual que el indicador END_DEVIAT con respecto a las desviaciones.
La siguiente figura muestra el resultado de este programa.



Esta línea se ve más ordenada en comparación con el mismo texto en la lección 12 .

Control de tamaño de fracción


La fracción que se muestra puede tener un tamaño diferente, que se controla mediante la interfaz ksTextItemParam . Si su propiedad de tipo es FRACTION_TYPE , entonces esta interfaz, entre otras cosas, establece el tamaño de la fracción. El tamaño en sí se especifica en la propiedad iSNumb . Sus valores válidos se muestran en la tabla a continuación.



Si la propiedad iSNumb especifica un valor no válido, KOMPAS usa la altura predeterminada.

El siguiente es un ejemplo del uso del indicador FRACTION_TYPE .

Ejemplo de uso de marca
 //   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 ejemplo difiere del anterior solo al establecer el tipo FRACTION_TYPE en la propiedad type de la interfaz ksTextItemParam al generar el numerador. Sin embargo, esto es suficiente para cambiar el tamaño de la fracción. La siguiente figura muestra el resultado de este programa (compárelo con el resultado del ejemplo anterior ).



Nota: el tamaño de la fracción se establece cuando se muestra el numerador. Como muestran mis experimentos, se ignora el tamaño de fracción especificado cuando se muestra el denominador.

Superíndice y subcadena



La construcción de una subcadena y una subcadena está controlada por las banderas que se enumeran en la tabla a continuación.



El siguiente es un programa de ejemplo que muestra la salida de una cadena con una subcadena y una subcadena.

Programa ejemplo
 //   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(); 


La siguiente figura muestra el resultado de este programa.



No puede construir una subcadena y una subcadena con el método ksDocument2D :: ksText .

Control de tamaño de fila principal


La línea principal puede tener un tamaño diferente, que se puede cambiar utilizando la interfaz ksTextItemParam . Para esto, la constante SUM_TYPE se especifica en su propiedad de tipo y el tamaño requerido de la fila principal en la propiedad iSNumb . Los valores válidos se muestran en la tabla a continuación:



Si la propiedad iSNumb contiene un valor no válido, KOMPAS usa el valor predeterminado.

El siguiente es un fragmento de un programa que demuestra el uso de la constante SUM_TYPE .

Fragmento 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); 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(); 



La constante SUM_TYPE se ingresa en la propiedad type de la interfaz ksTextItemParam cuando se muestra la línea principal. Antes de la salida del complemento , la interfaz ksTextItemParam se restaura a su estado inicial. Esta es la única diferencia entre este ejemplo y el anterior.

La siguiente figura muestra el resultado del programa (compárelo con el resultado del ejemplo anterior).



La constante SUM_TYPE le permite cambiar el tamaño de la cadena principal, pero no las subcadenas y las subcadenas. No se proporciona el cambio de sus tamaños en KOMPAS.

Caracteres especiales que incluyen una subcadena


Un párrafo puede manejar caracteres especiales que incluyen una cadena (se discutieron en la lección 10 del ciclo). El siguiente es un fragmento de un programa que demuestra su uso en un párrafo.

Fragmento de 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(); 


El ejemplo parece muy complicado, pero si lo miras detenidamente, puedes ver que consiste en repetir piezas. En él, con la ayuda de caracteres especiales, se muestran los textos tachados y subrayados. Después de cada bloque, se muestra una línea vacía con el indicador SPECIAL_SYMBOL_END . Su tarea es cancelar la acción del personaje especial. Si no se muestra, entonces el párrafo puede no estar construido correctamente. La acción del carácter especial se extiende a todo el bloque ksTextLineParam , a toda su longitud, independientemente de su contenido real (esta tesis se ilustra en la figura a continuación).



La línea de cancelación debe ser parte del bloque ksTextLineParam . De lo contrario, el párrafo puede no estar construido correctamente. El bloque ksTextLineParam puede contener varios caracteres de control. Cada uno de ellos debe tener su propia línea de cancelación.

El indicador SPECIAL_SYMBOL_END se usa solo para caracteres especiales que tienen una subcadena. Para caracteres especiales ordinarios, no es necesario.

La siguiente figura muestra el resultado de nuestro ejemplo.



Conclusión

En esta lección, aprendimos cómo usar párrafos para crear líneas compuestas, incluidas las desviaciones y fracciones, y examinamos formas documentadas de crear líneas compuestas basadas en un párrafo. Esta no es la única y lejos de ser la forma más fácil de crearlos. Otra forma, mucho más simple, la consideraremos en la próxima lección.

Para continuar, sigue las noticias del blog.

Sergey Norseev, Ph.D., autor del libro "Desarrollo de aplicaciones para COMPAS en Delphi".

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


All Articles