Compartir a través de


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

Obtiene los puntos de datos de segmento para la figura de geometría.

Sintaxis

HRESULT GetSegmentData(
  [in, out] UINT32 *dataCount,
  [in, out] FLOAT  *segmentData
);

Parámetros

[in, out] dataCount

Tamaño de la matriz a la que hace referencia el parámetro segmentData .

Si el método devuelve correctamente, dataCount contendrá el número de elementos devueltos en la matriz a la que hace referencia segmentData.

Si segmentData se establece en NULL cuando se llama al método , dataCount debe establecerse en cero.

Si se devuelve un puntero NULL en segmentData, dataCount contendrá el tamaño de búfer necesario como el número de elementos.

[in, out] segmentData

Dirección de una matriz que tiene el mismo número de elementos que se especifican en dataCount. Este valor se puede establecer en NULL si el autor de la llamada requiere que el método devuelva solo el tamaño de búfer necesario en dataCount.

Si la matriz es lo suficientemente grande, este método copia los puntos de datos de segmento en la matriz y devuelve, en dataCount, el número de puntos de datos que se copian. Si segmentData se establece en NULL o hace referencia a un búfer que no es lo suficientemente grande, se devolverá un puntero NULL , no se copiarán datos y dataCount contendrá el tamaño de búfer necesario especificado como el número de elementos.

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_POINTER
dataCount es NULL.
ERROR_MORE_DATA
segmentData es NULL o hace referencia a un búfer que no es lo suficientemente grande como para recibir los datos del segmento. dataCount contiene el número necesario de elementos.

Comentarios

Para determinar el tamaño necesario de la matriz de datos de segmento antes de llamar a este método, llame a GetSegmentDataCount.

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.

Los valores de la matriz devueltas en el parámetro segmentData se corresponderán con los valores de XPS_SEGMENT_TYPE de la matriz devueltas por el método GetSegmentTypes en el parámetro segmentTypes . Para leer correctamente los valores de datos del segmento, deberá conocer el tipo de cada segmento de la figura geometry. 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.

En la tabla siguiente se describe el conjunto específico de valores de datos que se devuelven para cada tipo de segmento. Para obtener un ejemplo de cómo acceder a estos datos en un programa, vea el ejemplo de código siguiente.

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.
 

En el ejemplo de código siguiente se obtiene acceso a los distintos puntos de datos de cada tipo de segmento en una figura de geometría.

    // currentFigure is the pointer to an IXpsOMGeometryFigure
    // that contains the segment data to examine

    HRESULT             hr = S_OK;
    UINT32              numSegments = 0;
    UINT32              numSegmentDataPoints = 0;
    XPS_SEGMENT_TYPE    *segmentTypes = NULL;
    FLOAT               *segmentDataPoints = NULL;
    BOOL                *segmentStrokes = NULL;

    // get number of segments in this figure
    hr = currentFigure->GetSegmentCount (&numSegments);

    if (SUCCEEDED(hr))
    {
        // allocate array for segment data types
        segmentTypes = new (std::nothrow) XPS_SEGMENT_TYPE[numSegments];
        if (segmentTypes == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // allocate array for segment strokes
        segmentStrokes = new (std::nothrow) BOOL[numSegments];
        if (segmentStrokes == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // get array of segment data types
        hr = currentFigure->GetSegmentTypes (&numSegments, segmentTypes);
    }

    if (SUCCEEDED(hr))
    {
        // get size of segment data array
        hr = currentFigure->GetSegmentDataCount (&numSegmentDataPoints);
    }

    if (SUCCEEDED(hr))
    {
        // get array to hold segment data points
        segmentDataPoints = new (std::nothrow) FLOAT[numSegmentDataPoints];
        if (segmentDataPoints == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // get segment data points
        hr = currentFigure->GetSegmentData (
            &numSegmentDataPoints, segmentDataPoints);
    }

    if (SUCCEEDED(hr))
    {
        // process segment data
        UINT32           thisSegment = 0;
        XPS_SEGMENT_TYPE *thisSegmentType = segmentTypes;
        XPS_SEGMENT_TYPE *lastSegmentType = NULL;
        FLOAT            *thisSegmentDataPoint = segmentDataPoints;
        FLOAT            *lastSegmentsDataPoint = NULL;

        // points to element just after valid array
        // valid pointers are < this value and  >= &segmentTypes[0]
        lastSegmentType = &segmentTypes[numSegments]; 
        // points to element just after valid array
        // valid pointers are < this value and >= &segmentDataPoints[0]
        lastSegmentsDataPoint = &segmentDataPoints[numSegmentDataPoints];

        // look at each segment that was returned
        while (thisSegment < numSegments)
        {
            if ((thisSegmentType >= lastSegmentType) || 
                (thisSegmentDataPoint >= lastSegmentsDataPoint))
            {
                // the array data is not correct.
                hr = E_UNEXPECTED;
                break; // out of loop
            } 
            else
            {
                // process the data based on the segment type
                switch (*thisSegmentType) 
                {
                    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:
                        {
                        // 5 data points
                        FLOAT    arcEndPoint_x = *thisSegmentDataPoint++;
                        FLOAT    arcEndPoint_y = *thisSegmentDataPoint++;
                        FLOAT    radius_x = *thisSegmentDataPoint++;
                        FLOAT    radius_y = *thisSegmentDataPoint++;
                        FLOAT    angle = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_BEZIER:
                        {
                        // 6 data points
                        FLOAT    controlPoint1_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint1_y = *thisSegmentDataPoint++;
                        FLOAT    controlPoint2_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint2_y = *thisSegmentDataPoint++;
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_LINE:
                        {
                        // 2 data points
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_QUADRATIC_BEZIER:
                        {
                        // 4 data points
                        FLOAT    controlPoint_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint_y = *thisSegmentDataPoint++;
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    default:
                        // unrecognized segment type
                        break;
                }
                // 
                thisSegment++;
                thisSegmentType++;
            }
        }
    }

    delete[] segmentTypes; segmentTypes = NULL;
    delete[] segmentStrokes; segmentStrokes = NULL;
    delete[] segmentDataPoints; segmentDataPoints = NULL;

Requisitos

   
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

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

Errores del documento XPS