Compartir a través de


Método IXpsOMGeometryFigure::SetSegments (xpsobjectmodel.h)

Establece la información del segmento y los puntos de datos de los segmentos de la ilustración.

Sintaxis

HRESULT SetSegments(
  [in] UINT32                 segmentCount,
  [in] UINT32                 segmentDataCount,
  [in] const XPS_SEGMENT_TYPE *segmentTypes,
  [in] const FLOAT            *segmentData,
  [in] const BOOL             *segmentStrokes
);

Parámetros

[in] segmentCount

Número de segmentos.

Este valor también es el número de elementos de las matrices a los que hacen referencia segmentTypes y segmentStrokes.

[in] segmentDataCount

Número de puntos de datos de segmento.

Este valor también es el número de elementos de la matriz a los que hace referencia segmentData.

[in] segmentTypes

Matriz de variables de XPS_SEGMENT_TYPE . El valor de segmentCount especifica el número de elementos de esta matriz.

[in] segmentData

Matriz de valores de datos de segmento. El valor de segmentDataCount especifica el número de elementos de esta matriz.

[in] segmentStrokes

Matriz de valores de trazo de segmento. El valor de segmentCount especifica el número de elementos de esta matriz.

Valor devuelto

El método devuelve un valor HRESULT. Entre los valores posibles se incluyen, entre otros, los de la tabla siguiente. Para obtener información sobre los valores devueltos de la API de documentos XPS que no aparecen en esta tabla, vea Errores del documento XPS.

Código devuelto Descripción
S_OK
El método se ha llevado a cabo de forma correcta.
E_INVALIDARG
segmentTypes contiene un valor de tipo no reconocido.

Como alternativa, el número de entradas de la matriz segmentData es mayor que el número de entradas de la matriz segmentTypes .

E_POINTER
segmentTypes, segmentData o segmentStrokes es NULL.
XPS_E_INVALID_FLOAT
segmentData contiene un valor FLOAT que es infinito o no es un número (NAN).
XPS_E_MISSING_SEGMENT_DATA
La matriz que se pasa en segmentData tiene menos entradas que la matriz pasada en segmentTypes.
XPS_E_NEGATIVE_FLOAT
Una entrada de la matriz que se pasa en segmentData contiene un valor negativo, pero debe contener un valor no negativo.

Comentarios

Un segmento de geometría se describe mediante el punto inicial, el tipo de segmento y parámetros adicionales cuyos valores están determinados por el tipo de segmento. Las coordenadas del punto inicial del primer segmento son una propiedad de la figura de geometría y se establecen llamando a SetStartPoint. El punto inicial de cada segmento posterior es el punto final del segmento anterior.

El número de valores de datos que definen un segmento de línea depende del tipo de segmento. En la tabla siguiente se describe el conjunto específico de valores de datos necesarios que se deben usar para cada tipo de segmento. Los valores de la matriz de datos de segmento que se pasa en el parámetro segmentData deben corresponder con los valores de XPS_SEGMENT_TYPE de la matriz que se pasa en el parámetro segmentTypes . Por ejemplo, si el primer segmento de línea tiene un valor de tipo de segmento de XPS_SEGMENT_TYPE_LINE, los dos primeros valores de datos de la matriz segmentData serán las coordenadas x e y del punto final de ese segmento; si el siguiente segmento tiene un valor de tipo de segmento de XPS_SEGMENT_TYPE_BEZIER, los seis valores siguientes de la matriz segmentData describirán las características de ese segmento; y así sucesivamente para cada segmento de línea de la figura geometry.

Tipo de segmento Valores de datos necesarios
XPS_SEGMENT_TYPE_LINE Diagrama que muestra un ejemplo de un segmento de figura de XPS_SEGMENT_TYPE_LINE Dos valores de datos:
Coordenada x del punto final de la línea de segmento.
Coordenada y del punto final de la línea de segmento.
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE Diagrama de un segmento de figura de XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE. Cinco valores de datos:
Coordenada x del punto final del arco.
Coordenada y del punto final del arco.
Longitud del radio de la elipse a lo largo del eje X.
Longitud del radio de la elipse a lo largo del eje Y.
Ángulo de giro.
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Diagrama que muestra un ejemplo de un segmento de figura de XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Cinco valores de datos:
Coordenada x del punto final del arco.
Coordenada y del punto final del arco.
Longitud del radio de la elipse a lo largo del eje X.
Longitud del radio de la elipse a lo largo del eje Y.
Ángulo de giro.
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE Diagrama de un segmento de figura de XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE. Cinco valores de datos:
Coordenada x del punto final del arco.
Coordenada y del punto final del arco.
Longitud del radio de la elipse a lo largo del eje X.
Longitud del radio de la elipse a lo largo del eje Y.
Ángulo de giro.
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Diagrama que muestra un ejemplo de un segmento de figura de XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Cinco valores de datos:
Coordenada x del punto final del arco.
Coordenada y del punto final del arco.
Longitud del radio de la elipse a lo largo del eje X.
Longitud del radio de la elipse a lo largo del eje Y.
Ángulo de giro.
XPS_SEGMENT_TYPE_BEZIER Diagrama que muestra un ejemplo de un segmento de figura de XPS_SEGMENT_TYPE_BEZIER Seis valores de datos:
Coordenada x del primer punto de control de la curva Bezier.
Coordenada y del primer punto de control de la curva Bezier.
Coordenada x del segundo punto de control de la curva Bezier.
Coordenada y del segundo punto de control de la curva Bezier.
Coordenada x del punto final de la curva Bezier.
Coordenada y del punto final de la curva Bezier.
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Diagrama que muestra un ejemplo de un segmento de figura de XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Cuatro valores de datos:
Coordenada x del punto de control de la curva Quad Bezier.
Coordenada y del punto de control de la curva Quad Bezier.
Coordenada x del punto final de la curva Quad Bezier.
Coordenada y del punto final de la curva Quad Bezier.
 

Para obtener los tipos de segmento de la ilustración, llame a GetSegmentTypes.

En los ejemplos de código siguientes se muestra una manera de crear y rellenar los búferes requeridos por SetSegments.

En el primer ejemplo de código, el método AddSegmentDataToArrays toma los puntos de datos que describen un único segmento y los almacena en los tres búferes de datos diferentes requeridos por el método SetSegments . Los búferes de datos que se pasan como argumentos a AddSegmentDataToArrays se administran mediante el método que realiza la llamada como se muestra en el ejemplo de código que sigue AddSegmentDataToArrays.

HRESULT
AddSegmentDataToArrays(
    XPS_SEGMENT_TYPE        segmentType,
    BOOL                    segmentStroke,
    FLOAT                   *segmentPoints,
    UINT32                  *segmentsAvailable,
    UINT32                  *segmentPointsAvailable,
    XPS_SEGMENT_TYPE        **segmentTypeBuffer,
    BOOL                    **segmentStrokeBuffer,
    FLOAT                   **segmentPointBuffer
)
/*
Description:

Populates the buffers required by IXpsOMGeometryFigure::SetSegmentData
using data and buffers provided by the calling method.

Parameters:

segmentType
    IN: XPS_SEGMENT_TYPE value that specifies the segment type for
        the current segment.

segmentStroke
    IN: BOOL value that specifies whether the current segment 
        is stroked.

*segmentPoints
    IN: pointer to an array of FLOAT values that specify the 
        segment's data points. The number of values in the array
        depend on the value of the segmentType parameter.

*segmentsAvailable
    IN: the number of values that remain unused in the
        segmentTypeBuffer and the segmentStrokeBuffer.
        This value must be >= 1 when calling the method.
    OUT:  the number of values that remain unused in the
        segmentTypeBuffer and the segmentStrokeBuffer after
        segmentType and segmentStroke have been added. If the 
        method was successful, the returned value is one less 
        than the value passed in to the method.

*segmentPointsAvailable
    IN: the number of values that remain unused in the
        segmentPointBuffer.    This value must be greater-than or equal
        to the number of points required by the segmentType value.
    OUT:  the number of values that remain unused in the
        segmentPointBuffer after the segmentPoints have been added.
        The returned value depends on the segmentType value.

**segmentTypeBuffer
    IN: the first free element in the buffer that receives the segment
        type values.
    OUT: the first free element in the buffer that receives the segment
        type values. If the method is successful, this will be the element
        after the element pointed to by this value before the method 
        was called.

**segmentStrokeBuffer
    IN: the first free element in the buffer that receives the segment
        stroke values.
    OUT: the first free element in the buffer that receives the segment
        stroke values. If the method is successful, this will be the element
        after the element pointed to by this value before the method 
        was called.

**segmentPointBuffer
    IN: the first free element in the buffer that receives the segment
        point values.
    OUT: the first free element in the buffer that receives the segment
        point values. If the method is successful, the element referenced
        by this value will depend on the segment type.

Remarks.
1) the buffers and values passed into this method are managed by
    the calling method.

2) if the value returned in segmentsAvailable is 0, segmentTypeBuffer
    and segmentStrokeBuffer point to invalid memory.

3) if the value returned in segmentPointsAvailable is 0, segmentPointBuffer
    point to invalid memory.

*/
{
    HRESULT hr = S_OK;

    // test to see if there is sufficient space in the 
    // segmentTypeBuffer and the segmentStrokeBuffer before
    // proceeding
    if (*segmentsAvailable == 0)
    {
        hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
    }

    if (SUCCEEDED(hr))
    {
        // process the data based on the segment type
        switch (segmentType) 
        {
            case    XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE:
            case    XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE:
            case    XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE:
            case    XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE:
                if (*segmentPointsAvailable >= 5) 
                {
                    // 5 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc end point (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc radius (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc radius (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc angle
                    *segmentPointsAvailable -= 5;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_BEZIER:
                if (*segmentPointsAvailable >= 6) 
                {
                    // 6 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 1 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 1 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 6;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_LINE:
                if (*segmentPointsAvailable >= 2) 
                {
                    // 2 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 2;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_QUADRATIC_BEZIER:
                if (*segmentPointsAvailable >= 4) 
                {
                    // 4 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 4;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            default:
                // unrecognized segment type
                hr = E_UNEXPECTED;
                break;
        }

    }

    if (SUCCEEDED(hr))
    {
        // Copy segment type and segment stroke values
        // to array and decrement number of array values
        // that remain unused.
        //
        // The space available for these operations was
        // tested at the beginning of the method.
        *(*segmentTypeBuffer)++ = segmentType;
        *(*segmentStrokeBuffer)++ = segmentStroke;
        *segmentsAvailable--;
    } 

    return hr;
}

En este ejemplo de código, UpdateSegmentData crea los búferes de datos requeridos por el método SetSegments y llama al método AddSegmentDataToArrays del ejemplo de código anterior para rellenarlos con los datos de segmento. Una vez rellenados los búferes, se llama a SetSegments para agregar estos datos a la figura de geometría.

Nota Los datos de segmento reales no se muestran en estos ejemplos de código.

 
HRESULT
UpdateSegmentData (
    IXpsOMGeometryFigure    *geometryFigure,
    UINT32                  segmentCount,
    UINT32                  segmentDataCount
)
/*
    Note that this method is not complete and only includes
    the code necessary to show how the SetSegments call is used.

    In this sample, the geometryFigure, segmentCount, and
    segmentDataCount values are assumed to have been initialized
    outside of this example.
*/
{
    HRESULT             hr = S_OK;
    XPS_SEGMENT_TYPE    segmentType = (XPS_SEGMENT_TYPE)0;
    BOOL                segmentStroke = FALSE;
    FLOAT               segmentPoints = 0;
    UINT32              segmentsAvailable = 0;
    UINT32              segmentPointsAvailable = 0;
    // these buffers are sized and allocated based on 
    //    the segment data to store.
    XPS_SEGMENT_TYPE    *segmentTypeBuffer = NULL;
    BOOL                *segmentStrokeBuffer = NULL;
    FLOAT               *segmentPointBuffer = NULL;

    XPS_SEGMENT_TYPE    *nextSegmentTypeValue = NULL;
    BOOL                *nextSegmentStrokeValue = NULL;
    FLOAT               *nextSegmentPointValue = NULL;

    // segment data is created outside of this example

    // allocate buffers as required using information 
    // from segment data. This can be dynamic or static
    // depending on how the segment information is managed.
    // This example assumes that the segment information 
    // does not change during this method.

    // initialize "next" pointers to point to the first
    // element in each array.
    nextSegmentTypeValue = segmentTypeBuffer;
    nextSegmentStrokeValue = segmentStrokeBuffer;
    nextSegmentPointValue = segmentPointBuffer;

    // for each segment in the figure, add the 
    // segment data to the buffers

        hr = AddSegmentDataToArrays(
                segmentType,
                segmentStroke,
                &segmentPoints,
                &segmentsAvailable,
                &segmentPointsAvailable,
                &nextSegmentTypeValue,
                &nextSegmentStrokeValue,
                &nextSegmentPointValue);
        
    if (SUCCEEDED(hr))
    {
        // set segment data
        hr = geometryFigure->SetSegments (
            segmentCount,
            segmentDataCount,
            segmentTypeBuffer,
            segmentPointBuffer,
            segmentStrokeBuffer);
    }
    // clean up buffers

    return hr;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows 7, Windows Vista con SP2 y Platform Update para Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2008 R2, Windows Server 2008 con SP2 y Actualización de plataforma para Windows Server 2008 [aplicaciones de escritorio | Aplicaciones para UWP]
Plataforma de destino Windows
Encabezado xpsobjectmodel.h

Consulte también

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

Errores del documento XPS

XPS_SEGMENT_TYPE