gvSIG bugs #3190

Exporting diagonal, straight lines to PDF produces some weird distortion of the lines

Added by Cesar Martinez Izquierdo about 9 years ago. Updated about 4 years ago.

Status:Closed% Done:

0%

Priority:NormalSpent time:-
Assignee:Cesar Martinez Izquierdo
Category:Document layout
Target version:-
Severity:Minor Add-on version:
gvSIG version:2.1.0 Add-on build:
gvSIG build: Add-on resolve version:
Operative System: Add-on resolve build:
Keywords: Proyecto:
Has patch: Hito:
Add-on name:Unknown

Description

Reported by Alvaro Cañete Amorós on gvsig_usuarios list:

"Hola a todos: al exportar un mapa a pdf en gvsig 2.1 final ( y también me ocurría en las versiones de desarrollo), el trazado de líneas que tienen una longitud alrededor de un metro aparecen zigzagueantes. Esto mismo no me ocurría con la versión 1.12 o apenas es imperceptible. Es la salida a pdf la que me da problemas. En cambio la salida ps aparecen correctamente trazadas. Igualmente aparece bien la impresión del mapa directamente en la impresora. (también he probado a imprimir el fichero pdf y lógicamente lo que se ve en pantalla es lo que se imprime, es decir, líneas quebradas o en zig-zag). Si las líneas son horizontales o verticales el trazado en pdf es correcto. Así por ejemplo si tenemos una curva de un camino y está dibujada por polilíneas con segmentos de línea de alrededor de un metro, el trazado en pdf aparece como he descrito de modo que llegan a cruzarse entre si las líneas de ambas orillas del camino.
No sé si abrir otro hilo pero otro error que sucede y por si tuviera el mismo origen, es que la cuadrícula no aparece en el lugar que debiera, me explico: he adjuntado dos ficheros pdf, uno creado con gvsig1.12 y otro con gvsig2.1 para que podáis observar como las líneas diagonales aparecen quebradas en la versión 2.1.
He adjuntado además un fichero comprimido zip con los tres ficheros shape del dibujo para que intentéis reproducir el error, a ver si es que sólo me sucede a mi.
El shape como podéis ver es un cuadrado y una línea diagonal, tiene una longitud de 100 metros pero está formado por segmentos de un metro de longitud. Los otros dos cuadrados son una copia del primero pero les he dado una escala de 2 y 5 de modo que mediran doscientos metros y quinientos pero los segmentos serán de 2 y 5 metros respectivamente.
Respecto a la cuadrícula, fijaos que el cuadrado de 100x100 (el de la izquierda) tiene su origen en el punto (0,0) y viene fielmente representado en el mapa generado con gvsig1.12 pero incorrectamente en la versión 2.1.
La impresión está a escala 1:5000, si la hubiera hecho a escala inferior 1:1000 el error se minimiza. También he intentado cambiar el grosor de la línea, píxeles, metros, etc. y no se corrige.
Muchas gracias a todos."

See attachments.

ZIGZAG.zip - test shapefile (9.2 KB) Cesar Martinez Izquierdo, 02/15/2015 08:58 PM

zigzag2_1_5000.pdf - exported pdf gvsig 2.1 (42.1 KB) Cesar Martinez Izquierdo, 02/15/2015 08:59 PM

zigzag1_12_5000.pdf - exported pdf gvsig 1.12 (108 KB) Cesar Martinez Izquierdo, 02/15/2015 08:59 PM

History

#2 Updated by Cesar Martinez Izquierdo about 9 years ago

  • Status changed from New to In progress

#3 Updated by Cesar Martinez Izquierdo about 9 years ago

  • Category deleted (Document layout)

This is not a printing-specific problem: the same effect can be seen on the View document.

I have done several tests but I have not been able to solve it for the moment, but I see some potential sources of this defect:
- getShapeType() method in org.gvsig.fmap.geom.generalpath.primitive.curve.line.Line2D returns TYPES.CURVE. Should it return TYPES.LINE??
- the geometries are being printed using the DrawInts operation. Should we use plain Draw instead?
- the DrawInts operation truncates the coordinates from double to int (e.g. antX = (int) ptDst.getX()). Probably we should use round to get more accurate results (e.g. antX = (int) Math.round(ptDst.getX())).

#4 Updated by Cesar Martinez Izquierdo about 9 years ago

I've tried using Draw operation instead of DrawInts, but it gets eventually rounded to integers anyway so the problem still happens.

Draw operation calls to geom.getShape(affineTransform), which creates a DrawGeometryShape which finally creates a DrawGeneralPathXIterator to simplify the general path for drawing.

I've tried modifying DrawGeneralPathXIterator to produce float points instead of integers and then the error does not happen any more (the lines are correctly visualized in the PDF).

The question is whether this change on DrawGeneralPathXIterator behaviour could be valid for all the scenarios or we need to create a different strategy for printing (such as creating a Print operation which overrides the default pathIterator).

#5 Updated by Cesar Martinez Izquierdo about 9 years ago

Seguramente en la vista (en pantalla) es inevitable porque es un efecto del redondeo de double a int, pero para exportación a PDF se puede evitar este defecto ya que permite coordenadas en float (he hecho una prueba de concepto que funciona).

El caso es cómo implementarlo limpiamente en el core. Por lo que he visto, se acaba llamando al método print de la simbología (en este caso SimpleLineSymbol), que a su vez llama a la operación DrawInts.

Se me ocurre que para impresión debería usarse la operación Draw, que si su nombre no engaña no debería redondear a enteros. Sin embargo, Draw también redondea a enteros, ya que acaba llamando a
g.draw(geomToDraw.getShape(affineTransform));
que a su vez acaba creando un DrawGeometryShape y un DrawGeneralPathXIterator, y este último redondea a enteros.

Una solución sería que el método Draw crease un wrapper de la geometría de forma que su método getShape use un path iterator que no redondee a enteros. Otra opción sería cambiar el comportamiento general de DrawGeneralPathXIterator para que no redondease a enteros. Según me ha parecido entedner, para dibujado en pantalla se usa DrawInts que usa su propio path iterator y por tanto no le afectaría.

Otra opción es crear una nueva operación Print e implementar allí las soluciones que he comentado para Draw. Esto tendría bastante sentido porque Draw acaba llamando a doc.getSymbol().draw, cuando existe doc.getSymbol().print que sería lo correcto (aunque esto no nos evitaría implementar las soluciones que he comentado antes).

#6 Updated by Cesar Martinez Izquierdo about 9 years ago

Hola, creo que este mensaje de Ruth Esteban en la lista respecto a la calidad de la impresión puede ser un síntoma del mencionado problema del redondeo a enteros:

"
- Y lo más importante porque no se puede exportar el mapa en formato imagen,
solo en PDF, siempre tengo problemas, o las líneas creadas no tienen el
grosor que yo le he dado en los mapas, o la leyenda no esta para nada bien,
o pierde demasiada calidad cuando lo exportas a PDF, y más si luego quieres
incluirlo a un documento, ya pierdes toda la calidad, y yo necesito imagenes
de muy buena calidad. Asi que al final acabo haciendo mapas locales y
caseros a mano, con las imagenes exportadas de la vista, lo que es un gran
fastidio"

#7 Updated by Álvaro Anguix about 4 years ago

  • Status changed from In progress to New

#8 Updated by Álvaro Anguix about 4 years ago

  • Category set to Document layout

#9 Updated by Álvaro Anguix about 4 years ago

  • Status changed from New to Closed

En la 2.5.1 se imprime correctamente y no aparece ninguno de los 2 problemas indicados; ni el desplazamiento ni las diagonales con distorsiones.

Also available in: Atom PDF