Trabajar con la API de KOMPAS-3D → Lección 10 → Caracteres especiales que incluyen una cadena

Ya nos familiarizamos con personajes especiales en la cuarta lección de nuestro ciclo. Su uso más simple se mostró allí. También dijo que si la interfaz ksTextItemParam especifica un carácter especial y una cadena, entonces la cadena se ubica inmediatamente después del carácter especial. Sin embargo, hay caracteres especiales que violan esta regla. Hablaremos de ellos hoy.




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


Caracteres especiales que incluyen una cadena



La tabla de signos especiales se encuentra en el Apéndice V de la ayuda principal de KOMPAS

Los caracteres especiales con los números 78-80 , 83 , 93-99 , 171 y 172 incluyen la cadena. En este caso, la cadena s de la interfaz ksTextItemParam no se encuentra después del carácter especial, sino dentro de él. Por ejemplo, un carácter especial con el número 80 muestra el texto en el cuadro. El siguiente es un ejemplo de un programa que demuestra trabajar con un personaje tan especial.

//    TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //  TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L""); TextItemParam->set_s(str); SysFreeString(str); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextItemParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

Para simplificar, este ejemplo omite el código responsable de la creación y ejecución del documento (este tema se discutió en lecciones anteriores del ciclo). La siguiente figura muestra la etiqueta principal formada por este programa.



Por simplicidad, llenamos solo una celda. El carácter especial con el número 98 define el signo de la raíz cuadrada. Tenga en cuenta que el valor de la propiedad s de la interfaz ksTextItemParam está completamente bajo el signo raíz. Otros caracteres especiales, incluida la cadena, funcionan exactamente de la misma manera.

Caracteres especiales y ksTextLineParam


La acción de los caracteres especiales no se limita a la interfaz ksTextItemParam . Considere el siguiente ejemplo.

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(0); str = SysAllocString(L" 3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

En este ejemplo, se ingresa una línea que consta de tres componentes en el bloque de título. Los dos primeros contienen un carácter especial y una cadena. El tercer componente contiene solo una cadena, sin un carácter especial. Veamos el resultado del programa (la siguiente figura muestra solo la línea generada sin la inscripción principal).



Tenga en cuenta que la línea "Página 2" y la línea "Página 3" se incluyeron en el segundo carácter especial, que planeamos mostrar fuera del carácter especial. Además, ambas líneas se incluyeron en el primer carácter especial (tampoco planeamos esto). Este ejemplo demuestra dos puntos importantes:

  • los caracteres especiales pueden incluir otros caracteres especiales;
  • La acción del carácter especial se extiende a todos los componentes que conforman la interfaz ksTextLineParam .

Surge una pregunta razonable: ¿hay alguna forma de limitar la acción del personaje especial? Si lo hay Pero para comprenderlo, primero debe familiarizarse con la interfaz ksTextItemFont .

Opciones de fuente de componente de texto ( ksTextItemFont )


Según la documentación, la interfaz ksTextItemFont describe los parámetros de fuente del componente de texto. Pero, de hecho, sus capacidades exceden la simple descripción de la fuente utilizada. Esta interfaz le permite crear líneas compuestas (sobre ellas, en las próximas lecciones del ciclo).

Puede obtenerlo de varias maneras. Primero, usando el método GetParamStruct de la interfaz KompasObject : para esto, la constante ko_TextItemFont debe pasarse a este método como el único parámetro. En segundo lugar, utilizando el método GetItemFont de la interfaz ksTextItemParam . Este método no tiene parámetros de entrada y devuelve la interfaz ksTextItemFont ya asociada con el componente de texto.

Considere las propiedades de la interfaz ksTextItemFont .
bitvector : un vector de bits que define las características del texto (se discutirán en detalle en las próximas lecciones del ciclo).
color : color de los caracteres en formato RGB.
fontName : una cadena con el nombre de la fuente.
altura - altura de la fuente en milímetros.
ksu es el factor de estiramiento del texto.
Solo hay tres métodos para la interfaz ksTextItemFont .
Init () restablece todas las propiedades de la interfaz. No tiene parámetros de entrada. Si tiene éxito, devuelve VERDADERO y, en caso de error, FALSO .
GetBitVectorValue devuelve el valor de un indicador individual del conjunto de vectores de bits . Toma una bandera como el único parámetro, cuyo valor queremos determinar. Si está configurado, el método devuelve VERDADERO ; si se restablece, FALSO .
SetBitVectorValue cambia el valor de un solo indicador. El siguiente es un prototipo de este método:

 BOOL SetBitVectorValue ( long bitVector, //  BOOL state //   ); 

Si el valor del parámetro de estado es VERDADERO , el indicador bitVector está activado ; de lo contrario, se restablece.
Si tiene éxito, el método SetBitVectorValue devuelve VERDADERO y, en caso de error, FALSO .
Los métodos GetBitVectorValue y SetBitVectorValue le permiten trabajar con la propiedad bitvector sin acceder directamente a ella.

Limitación especial de caracteres


Dos banderas están diseñadas para controlar caracteres especiales. Se enumeran en la tabla a continuación.



La bandera SPECIAL_SYMBOL que ya consideramos cuando describimos la interfaz ksTextItemParam . Es necesario para indicar: se muestra un carácter especial. El mismo indicador se duplica en la propiedad bitVector de la interfaz ksTextItemFont (como muestran mis experimentos, esta duplicación es opcional).

El segundo indicador ( SPECIAL_SYMBOL_END ) tiene sentido solo para caracteres especiales que incluyen una cadena. Cancela la acción del personaje especial. Las líneas que se muestran después de esta bandera no se incluyen en el carácter especial.

La acción combinada de ambas banderas cancela la acción del personaje especial. En este caso, el carácter especial no se mostrará en el documento.

Ejemplo


A continuación se muestra el código fuente del programa modificado. Usando los indicadores descritos anteriormente, implementa la salida correcta de los componentes.

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemFontPtr TextItemFont; TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont->Init(); TextItemFont.Unbind(); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //      TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); TextItemParam->set_type(0); str = SysAllocString(L"  3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont.Unbind(); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

La única diferencia entre este ejemplo y el anterior es que, después de cada carácter especial, se muestra un componente para el que se establece el indicador SPECIAL_SYMBOL_END en la interfaz ksTextItemFont . Su único propósito es cancelar la acción del personaje especial. En el primer caso, no contiene ningún dato (a excepción de la bandera, por supuesto). Y en el segundo caso, contiene la cadena "Página 3" .

No puede combinar el indicador SPECIAL_SYMBOL_END con la salida del segundo carácter especial. Dado que en este caso esta bandera cancelará la acción de ambos caracteres especiales. La línea "Página 2" se mostrará sin tachado.

La siguiente figura muestra la línea que muestra el programa en el bloque de título.



Como puede ver, ahora la acción de caracteres especiales se aplica solo a "su" componente.

Símbolos especiales anidados


El primer ejemplo de nuestra lección de hoy muestra claramente: los caracteres especiales pueden incrustarse entre sí. El indicador SPECIAL_SYMBOL_END cancela la acción de un (último) personaje especial. Esto le permite construir líneas complejas con caracteres especiales incrustados.

A continuación se muestra el código fuente del ejemplo modificado, en el que la subcadena "Página 2" también se incluye en la expresión debajo del signo de raíz cuadrada.

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemFontPtr TextItemFont; TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); DynamicArray->ksAddArrayItem(-1, TextItemParam); //      TextItemParam->set_type(0); str = SysAllocString(L"  3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont.Unbind(); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

Tenga en cuenta que después de la sustitución de la cadena "Página 2", hacemos doble salida del componente con el indicador SPECIAL_SYMBOL_END (la primera vez se compone de un componente vacío, el segundo es junto con la cadena "Página 3" ). Esto es necesario para cancelar la acción de caracteres especiales. La primera vez que cancelamos el carácter especial 169 (tachado), la segunda vez - 98 (raíz cuadrada). Si mostramos solo un componente con el indicador SPECIAL_SYMBOL_END , esto cancelaría solo el carácter especial 169 , pero no el 98 . En este caso, la línea "Página 3" no se tacharía, sino que se incluiría en la expresión debajo del signo raíz.
La siguiente figura muestra el resultado de este programa.



Conclusión

Como parte de esta lección, nos encontramos con caracteres especiales que incluyen una cadena. Como viste, son significativamente diferentes de los caracteres especiales simples (por ejemplo, letras del alfabeto griego). Aunque los mostramos en el ejemplo de la inscripción principal, esto no debería confundirte. Estos caracteres se pueden usar en otros métodos de salida de texto. Consideraremos uno de estos métodos 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/es414701/


All Articles