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"
- Los fundamentos
- Diseño de dibujo
- Conexión correcta a KOMPAS
- Inscripción principal
- Primitivas gráficas
- Guardar un documento en varios formatos
- Conociendo la configuración
- Métodos de escritura más sofisticados en el bloque de título
- Lectura de celdas de subtítulos
- Caracteres especiales que incluyen una cadena
- Etiquetas de texto simple
- Cuerdas compuestas
- Los párrafos
- Texto multilínea
- 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:
- Utiliza las capacidades documentadas del sistema COMPASS.
- 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ónEn 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".