¿Cómo crear símbolos svg que tengan color de relleno modificable, color de trazo y ancho de trazo?

33

Quiero crear algunos símbolos svg para Qgis usando Inkscape, esos símbolos deben tener atributos como se describe en la pregunta. Durante los últimos dos días, he estado experimentando según las instrucciones de Sourcepole y se hizo imitar Algunos símbolos vienen con QGIS que tienen atributos deseados sin ningún éxito.

Finalmente experimenté con la forma más simple de símbolo: creé un svg que solo contiene un círculo en Inkscape y traté de modificarlo.

El archivo original ( circle.svg ) tiene esta línea:

<path
   sodipodi:type="arc"
   style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.01988637;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"

Lo modifiqué en:

<path
   sodipodi:type="arc"
   style="fill:param(fill) #ffffff;fill-opacity:1;stroke:param(outline) #000000;stroke-width:param(stroke-width) 1.01988637;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"

Se guardó como circle_modified.svg y lo seleccioné como símbolo de punto, pero Qgis no pudo cambiar los tres parámetros de la misma manera tiempo.

¿Qué hice mal o debería hacer diferente?

Mi sistema: Qgis 1.8.0 en Ubuntu 12.04 64 bit, Inkscape 0.48, editor de texto Gedit 3.4.1.

    
pregunta Cao Minh Tu 04.01.2013 - 10:04

7 respuestas

37

Para crear símbolos SVG con color de relleno , color de trazo y ancho de trazo modificables en QGIS, debe reemplazar el estilo atributo del elemento ruta con estos 3 atributos:

  • fill="param (fill) #FFF"
  • trazo="param (contorno) # 000"
  • stroke-width="param (outline-width) 1"

Si está utilizando InkScape, después de escribir el nuevo archivo SVG, edite el archivo y reemplace toda la línea que comienza con estilo:

style="fill:#00a000;fill-opacity:1;stroke:#000000;stroke-width:1;(...)"

con la siguiente línea:

fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1"
    
respondido por el jgrocha 13.11.2013 - 21:31
4

También quise hacer esto desde que descubrí cómo agregar símbolos SVG ayer , pero todos eran negros. La respuesta dada por jgrocha funciona. Quería votar, pero acabo de unirme al foro de GIS, ¡primero tengo que conseguir algo de reputación!

También encontré esta página que confirma la respuesta: SÍMBOLOS SVG EN QGIS CON COLORES MODIFIABLES

  

Para tener la posibilidad de cambiar los colores del marcador, debemos agregar los marcadores de posición 'param (relleno)' para el color de relleno, 'param (contorno)' para el color del contorno y 'param (contorno-ancho)' para anchura del trazo. Estos marcadores de posición pueden ir seguidos opcionalmente por un valor predeterminado:

<svg width="100%" height="100%">
  <rect fill="param(fill) #ff0000" stroke="param(outline) #00ff00" stroke-width="param(stroke-width) 10" width="100" height="100">
  </rect>
</svg>'

¡Gracias!

    
respondido por el Gonja 30.07.2014 - 15:27
3

También tuve el mismo problema, pero después de algunos intentos finalmente funcionó. Estoy escribiendo aquí el procedimiento esperando que sea de alguna ayuda. Creé una espiral simple en inkscape y la guardé como svg. Luego lo abrí en un editor de texto (por ejemplo, Notepad ++) y la entrada "estilo" apareció dos veces en mi código svg. Primero en este trozo:

<linearGradient
   id="linearGradient6172"
   osb:paint="solid">
  <stop
     style="stop-color:#000000;stop-opacity:1;"
     offset="0"
     id="stop6174" />
</linearGradient>

Y luego aquí:

<path
   sodipodi:type="spiral"
   style="fill:none;fill-rule:nonzero;opacity:1;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:35;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
   id="path4686" />

Para hacer que el código funcione con el fin de tener una espiral svg editable en qgis, eliminé completamente la primera entrada de "estilo" de la primera porción de código:

<linearGradient
   id="linearGradient6172"
   osb:paint="solid">
</linearGradient>

Y sustituya la segunda entrada de "estilo" en el segundo fragmento de código de la siguiente manera:

<path
   sodipodi:type="spiral"
   fill="param(fill) #000" stroke="param(outline) #FFF" stroke-  width="param(outline-width) 1"
   id="path4686" />

"# 000" y "#FFF" son dos colores predeterminados para el relleno y el contorno, mientras que "1" es el ancho del contorno predeterminado si no se especifica de manera diferente. Después de guardar estos cambios, puede guardar el svg en la ruta correcta, la especificada por QGis (dependiendo de la versión que se puede encontrar en Configuración - > Opciones - > rutas SVG). Finalmente, su nuevo objeto svg aparecerá entre los otros objetos predeterminados y será editable.

Espero que pueda ayudar

    
respondido por el Martina 10.01.2017 - 15:49
3

Parece que vale la pena proporcionar una respuesta simple sobre los conceptos básicos de los SVG para ir junto con los detalles proporcionados aquí sobre detalles específicos del software ...

Un archivo SVG es solo un archivo de texto. El final del archivo será .svg, pero se puede abrir en un editor de texto de la misma forma que un archivo con el .txt finalizado

Un simple archivo svg se parece a esto:

<svg width="580" height="400" xmlns="http://www.w3.org/2000/svg">
<!-- This is a comment -->

<g id="group1">
<title>My group</title>
<rect id="rectangle1" height="29" width="27" y="50" x="57" stroke-width="1.5" stroke="#000" fill="#ff0"/>
<ellipse ry="17" rx="16" id="circle1" cy="64" cx="113.5" stroke-width="1.5" stroke="#999" fill="#aaa"/>
<path id="path1" d="m56.5,97l51.5,1l5,25l-29,-5l-27.5,-21z" stroke-width="1.5" stroke="#f00" fill="#fff"/>
</g>
</svg>

En esto puedes ver que los colores están definidos por los parámetros (donde los puntos se reemplazan con caracteres entre 0-9 o A-F):

stroke=#...
fill=#...

Y el ancho del trazo está definido por

stroke-width="..."

Se puede agregar lo siguiente, usando el editor de texto, para reemplazar los valores definidos que elija en el SVG ... haciendo posible que QGIS establezca los valores. QGIS entiende un valor para 'param (relleno)' y los otros valores 'param (...)', ya que estos son establecidos por QGIS.

Color de relleno: fill="param(fill) #FFF"

Color del contorno / línea: stroke="param(outline) #000"

Esquema / ancho de línea: stroke-width="param(outline-width) 1"

Opacidad de relleno: fill-opacity="param(fill-opacity)"

Opacidad de contorno / línea: stroke-opacity="param(outline-opacity)"

Tenga en cuenta que no hay nada que le impida utilizar los valores 'param (...)' en lugares ligeramente impares. Por ejemplo, podría usar el valor 'param (opacidad de relleno)' para definir un color de relleno en uno. bit del archivo SVG, pero un trazo / color de línea en otro bit del SVG.

En el diálogo del compositor de QGIS o del símbolo de estilo, las configuraciones para los colores SVG son bastante obvias. La opacidad de relleno y trazo / línea se establece como parte de la configuración de color. La configuración de trazo / ancho de línea es obvia.

Por último dos puntos

Primero, tenga en cuenta que mientras esté en un SVG, es válido definir los colores como una colección de atributos así:

style="fill:none;fill-opacity:1;stroke:#000000;"

Esto parece no funcionar correctamente si está incluyendo los parámetros como se describe aquí.

En segundo lugar, al usar software como Illustrator o Inkscape, este software puede agregar muchos atributos adicionales al texto SVG. Si sabe lo que está haciendo y comprende los conceptos básicos de un SVG, como lo anterior, puede simplificarle la vida si se deshace de este texto adicional. En particular, puede encontrar que los colores se establecen a través de la definición de estilos en lugar de artículo por artículo.

    
respondido por el Rostranimin 13.06.2017 - 16:40
2

Voy a ampliar esto porque me tomó un tiempo hacerlo funcionar. Cree su símbolo y guárdelo como Inkscape SVG y ábralo en el editor de texto. En el bloque de código inferior verá; style="fill: # 00a000; fill-opacity: 1; stroke: # 000000; stroke-width: 1; (...)" Reemplace esta línea con; fill="param (fill) #FFF" stroke="param (outline) # 000" stroke-width="param (outline-width) 1" En mis archivos SVG, la línea de estilo aparece para cada entidad o forma en el svg y reemplazar esas líneas no funcionó para mí; pero hacerlo en la parte inferior de un SVG de Inkscape funcionó. Probé mi solución y las instrucciones aquí en formatos SVG optimizado y simple, pero no funcionó, espero que esto ayude. Inkscape 0.48, QGIS 2.12.0, NotePad ++

    
respondido por el Tyler Veinot 25.11.2015 - 14:35
1

Gracias a todos ustedes. Aquí hay algunos consejos excelentes que me indicaron la dirección correcta, pero ninguno abordó mi problema específico, así que agregaré lo que descubrí al pozo. Como no parece haber una respuesta correcta para cada caso, primero me gustaría ofrecer una sugerencia para probar sus resultados lo más rápido posible.

Pruebas de edición rápida

  • Mueva temporalmente todos sus iconos de svg fuera de la carpeta de svg de QGIS.
  • Haga una copia del archivo svg en el que desea trabajar de solo lectura para no sobrescribirlo y coloque una versión editable en la carpeta QGIS svg.
  • Abra QGIS, cargue una capa de puntos para trabajar, abra las propiedades de la capa y seleccione "marcador SVG".
  • También puede hacer clic derecho en un archivo svg y configurar temporalmente el programa "Abrir con" en el Bloc de notas para que pueda hacer doble clic en ellos y editarlos en el Bloc de notas.

Con esta configuración, puede ver de inmediato cómo responde QGIS a sus ediciones. Deje el archivo svg abierto en el Bloc de notas y el panel de propiedades abierto en QGIS. Para probar los resultados de una edición, simplemente presione Ctrl + S para guardarla en el Bloc de notas y cambiar a QGIS. Para volver a cargar el svg, cambie el tipo de capa de símbolo a cualquier otra cosa, luego vuelva a cambiarlo al marcador SVG. También hay uno solo allí, así que no tienes problemas para encontrarlo. Probé docenas de ediciones muy rápidamente como esta. Si tiene algún problema para que el svg vuelva al formulario de origen después de una edición, simplemente puede borrarlo y hacer otra copia.

Cómo hacer que el icono SVG sea editable

El problema que tuve fue que el ícono específico en el que estaba trabajando no tenía las palabras "estilo" o "relleno" en ninguna parte, así que tuve problemas para averiguar dónde colocar la línea de parámetros. El truco de Inkscape descrito por Martina resolvió este problema, pero tengo un montón de cosas que hacer y no quería abrir y guardar cada una en Inkscape, así que decidí intentar la prueba y el error. Al mirar el código, pude ver que la información de la versión y los metadatos estaban en la parte superior y las instrucciones de forma en la parte inferior entre comillas que estaban delimitadas al principio por <g><path d= (algunas tienen <g><g><path d= ) y al final por /></g></svg> . Después de un poco de experimentación, descubrí que poner la línea de parámetros entre path y d= funcionaba, pero el icono era invisible en el panel de selección y el icono en el panel de vista previa en la parte superior estaba completamente en negro. El problema de los iconos invisibles parece haber sido un error. Lo arreglé agregando un parámetro de opacidad que describiré a continuación. Resultó que el relleno negro era solo porque el ícono tenía solo 4 mm y estaba lleno solo con el contorno. Para solucionar este problema, coloqué el tamaño del icono hasta 10 mm (en QGIS) y el contorno bajó a 0.1 (en el Bloc de notas).

Summary

Si su ícono no tiene las palabras "estilo" o "relleno" en ninguna parte, pero sí tiene esta línea <g><path d= (o <g><g><path d= ) justo antes de las instrucciones de forma, debería poder agregar los parámetros de edición reemplazando la línea anterior con <g><path fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1" d=

Si el borde es demasiado grueso, puede reducirlo cambiando el último número a una fracción, por ejemplo. <g><path fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 0.5" d=

Si desea que su icono sea semitransparente, puede hacerlo cambiando la línea anterior a esta <g><path style="opacity:0.5;fill:param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1" d= . El valor de opacidad puede ser de 1 (totalmente opaco) a 0 (totalmente transparente) y puede usar centésimas o incluso milésimas para una precisión adicional (por ejemplo, 0.01). La misma regla se aplica al grosor del borde.

Si tiene muchos de ellos para editar, puede encontrar archivos por lotes aquí en StackExchange para automatizar el proceso de búsqueda y reemplazo.

    
respondido por el James 22.01.2017 - 18:23
1

Parece ser un problema, si usamos un valor exacto. Cada vez que abrimos las opciones, un valor individual para color o trazo se restablece a los que están en el SVG. Esto se puede arreglar estableciendo un valor en las opciones avanzadas. Mis pruebas me mostraron que sería mejor usar fill="param(fill)" en lugar de fill="param(fill) #FFF" y así sucesivamente en el SVG.

Otra solución interesante: Si tiene un SVG con color de fondo y primer plano, puede usar el color del trazo como color de fondo de relleno. Note, entonces no puede usar un color de contorno separado para todo el SVG.

    
respondido por el Martin Lässig 11.12.2017 - 14:00

Lea otras preguntas en las etiquetas