SVG vers CGContext
Bonjour,
suite à ce post, voici donc la deuxième question.
Comment récupérer un SVG dans un contexte, pour pouvoir appliquer les fonctions CGContextaddCurve, etc.
Parce que, tout ce que j'ai trouvé, donne un path, mais si on veut dessiner avec les méthodes CGContext..., on ne part pas d'un path...
Je met ici les liens que j'ai conservé.
http://www.w3schools.com/svg/svg_path.asp
http://robb.is/working-on/a-hamburger-button-transition/
http://www-igm.univ-mlv.fr/~dr/XPOSE2009/SVG/dessin.html
http://​http://pilatinfo.org/learnsvg/html/chapitre04/page04-1.htm
http://www.liafa.jussieu.fr/~carton/Enseignement/XML/Cours/SVG/index.html
https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths
http://ponderwell.net/2011/05/converting-svg-paths-to-objective-c-paths/
Merci d'avance
Réponses
J'ai trouvé ça https://itunes.apple.com/us/app/qwarkee/id498340809?mt=12
Et ça
QwarKee qui convertit un svg en CGContext
Et
PaintCode qui convertit un svg en path
Je suis tenté par QwarKee. J'ai besoin de récupérer les controlPoints dans les CGContext pour ensuite les manipuler à l'aide de poignées sur les tangentes.
Est-ce le bon choix ?
Et j'ai des doutes sur la conversion en swift !!!
Pas d'idée -
Je trouve ce que tu essaie de faire un peu étrange. Je m'explique: un SVG peut décrire un tas d'objets, avec des attributs très divers, donc il paraà®t relativement logique de le rendre directement, dans une layer ou un CGContext.
Maintenant, effectivement, si tu veux juste rendre une seule figure géométrique, tu peux utiliser PaintCode qui va prendre le SVG et te générer le code Core Graphics correspondant.
Ce que je désire, c'est récupéré un tracé illustrator, dans Xcode, sous forme de code (en swift), qui implémente les méthode CGContext, et non pas récupérer un path (ça, j'y parviens), car je ne pourrais pas avoir les coordonnées des points et ne pourrait donc pas les manipuler.
PaintCode, ça fait cher ?
Y'a pas moyen à partir d'un xml du code svg, de fabriquer du CoreGraphic ?
Qwarkee semble le faire, mais 40$ et objC seulement, apparemment
Si, bien sûr, tu peux le parser. Le parseur SAX d'Apple est trop limité, utilise un parseur DOM, comme KISSxml. Tant que le SVG ne contient qu'un simple tracé, ça reste très faisable.
PaintCode est bien plus complet. ça me semble un meilleur investissement.
Je commence à utiliser XMLParser pour parser un flux RSS.
Pourquoi tu dis que c'est limité Céroce ?
Ca m'a l'air pas trop mal...
Un peu Old School mais ça fonctionne...
Ca vaut pas XMLDocument d'OSX mais c'est déjà pas mal.
XMLParser permet-il de traduire du svg
en swift
?
Merci
M176.655,287.241c0.862,90.518,168.103,100.862,165.517,14.655S176.655,287.241,176.655,287.241z
Ca, aucun parseur XML ne pourra l'interpréter pour toi. Mais sur NSHipster il y a un excellent article sur NSScanner, avec un exemple tout prêt pour parser ce genre de chaine: http://nshipster.com/nsscanner/
Pour parser les path (<path d="...">) utilise NSScanner. NSHipster a justement écrit un article sur leur blog pour expliquer NSScanner et l'exemple qu'ils prennent... c'est le parsing d'un path SVG justement ! (En Swift qui plus est)
Ouaaaah, j'en frémis d'avance.
J'y cours de ce pas.
(Par ailleurs, il peut même t'appeler la méthode déléguée qui renvoie le contenu plusieurs fois pour la même balise).
Dès que tu dois gérer une hiérarchie d'objets de plus d'un niveau, ça devient casse-pied. Il faut un parseur DOM.
Donc du coup autant partir tout de suite vers un parseur DOM c'est moins prise de tête à utiliser.
[EDIT] Grillé par Céroce
ça a l'air super, mais j'ai un bug dans le "case "c":", et je ne trouve rien sur offset
Une idée ?
L'erreur :
D'ac. Mais y a pas de parser DOM natif... J'imagine qu'il faut chercher une bibliothèque tierce.
Vous en connaissez une bonne pour iOS ?
(Si c'est pas là qu'on en a discuté y'a pléthore d'articles sur le net à ce sujet)
This one look great : https://github.com/graetzer/GDataXML-HTML
buster : path.currentPoint est un CGPoint. Et un CGPoint est une simple strucutre avec x et y. Pas d'offset...
A mon avis ce qu'il a fait pour rajouter cette méthode "offset" sur CGPoint doit donner un truc dans le genre (pas testé) :
Qu'est-ce qu'il a voulu dire alors, par ça ?
dans http://nshipster.com/nsscanner/
dans le chapitre Example: Parsing SVG Path Data
Ah ok, Aligator,
j'ai donc modifié la ligne comme ça
et ça fonctionne mieux, sauf que je n'ai pas la deuxième moitié de mon rond. Mais je vais creuser, ça se précise.
Merci à vous tous...
En plus, y'a un pb de taille - C'est plus petit.
Voir la copie d'écran ici
La forme noire est le rendu dans Xcode, et le reste est la forme dans illustrator.
Et ou est passé la seconde partie du path ?
Voici le code complet, modifié, à partir de celui de http://nshipster.com/nsscanner/
J'ai ça
width="768px" height="1024px"
Mais de toute façon le parseur de Nate est incomplet: Il ne fait rien quand il décode un "S" (smooth curve to d'apres le standard SVG 1.1, cf. http://www.w3.org/TR/SVG11/paths.html), alors que ce caractère apparait dans ta chaine (mais pas dans celle qu'il utilise pour dessiner la moustache).
Donc son code est une base de départ. A toi de l'enrichir pour couvrir l'ensemble des codes possibles...
J'ai trouvé un truc génial.
Un plugin que l'on met sur illustrator, et qui encode le tracé (le path) en objC (pour swift, ils ont l'air en retard), et en plein d'autres formats intéressant - Notamment en svg, mais faut rajouter les commandes (M, C, c, etc.).
Moi, ça m'a bien aidé.