Aller au contenu


Photo

Comment dessiner des lignes et écrire du texte sur une image


  • Please log in to reply
71 réponses à ce sujet

#41 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 21 juillet 2017 - 11:22

À la place d'enregistrer une image, je te conseillerais d'enregistrer les données.

 

D'abord il faut que tous les types se conforme à NSCoding :

class Ligne : NSCoding
{
  var point1  : NSPoint
  
  var point2  : NSPoint
  
  var width   : CGFloat
  
  var couleur : NSColor
  
  required init?(coder aDecoder: NSCoder)
  {
    guard let couleur = aDecoder.decodeObject(forKey: "couleur") as? NSColor else
    {
      return nil
    }
    
    self.point1 = aDecoder.decodePoint(forKey: "point1")
    
    self.point2 = aDecoder.decodePoint(forKey: "point2")
    
    width = CGFloat(aDecoder.decodeDouble(forKey: "width"))
    
    self.couleur = couleur
  }
  
  func encode(with aCoder: NSCoder)
  {
    aCoder.encode(point1)
    
    aCoder.encode(point2)
    
    aCoder.encode(Double(width), forKey: "width")
    
    aCoder.encode(couleur, forKey: "couleur")
  }
}

class Texte : NSCoding
{
  var point   : NSPoint
  
  var text    : String
  
  var police  : NSFont
  
  var couleur : NSColor
  
  required init?(coder aDecoder: NSCoder)
  {
    guard let text = aDecoder.decodeObject(forKey: "text") as? String,
          let police = aDecoder.decodeObject(forKey: "police") as? NSFont,
          let couleur = aDecoder.decodeObject(forKey: "couleur") as? NSColor else
    {
      return nil
    }
    
    self.point = aDecoder.decodePoint(forKey: "point")
    
    self.text = text
    
    self.police = police
    
    self.couleur = couleur
  }
  
  func encode(with aCoder: NSCoder)
  {
    aCoder.encode(point, forKey: "point")
    
    aCoder.encode(text, forKey: "text")
    
    aCoder.encode(police, forKey: "width")
    
    aCoder.encode(couleur, forKey: "couleur")
  }
}


class TrucData : NSCoding
{
  var lignes1 : [Ligne]?
  
  var lignes2 : [Ligne]?
  
  var lignes3 : [Ligne]?
  
  var textes1 : [Texte]?
  
  var textes2 : [Texte]?
  
  var textes3 : [Texte]?
  
  var image1  : NSImage?
  
  var image2  : NSImage?
  
  var image3  : NSImage?
  
  init() { }
  
  required init?(coder aDecoder: NSCoder)
  {
    lignes1 = aDecoder.decodeObject(forKey: "lignes1") as? [Ligne]
    
    lignes2 = aDecoder.decodeObject(forKey: "lignes2") as? [Ligne]
    
    lignes3 = aDecoder.decodeObject(forKey: "lignes3") as? [Ligne]
    
    textes1 = aDecoder.decodeObject(forKey: "textes1") as? [Texte]
    
    textes2 = aDecoder.decodeObject(forKey: "textes2") as? [Texte]
    
    textes3 = aDecoder.decodeObject(forKey: "textes3") as? [Texte]
    
    image1 = aDecoder.decodeObject(forKey: "image1") as? NSImage
    
    image2 = aDecoder.decodeObject(forKey: "image2") as? NSImage
    
    image3 = aDecoder.decodeObject(forKey: "image3") as? NSImage
  }
  
  func encode(with aCoder: NSCoder)
  {
    aCoder.encode(lignes1, forKey: "lignes1")
    
    aCoder.encode(lignes2, forKey: "lignes2")
    
    aCoder.encode(lignes3, forKey: "lignes3")
    
    aCoder.encode(textes1, forKey: "textes1")
    
    aCoder.encode(textes2, forKey: "textes2")
    
    aCoder.encode(textes3, forKey: "textes3")
    
    aCoder.encode(image1, forKey: "image1")
    
    aCoder.encode(image2, forKey: "image2")
    
    aCoder.encode(image3, forKey: "image3")
  }
}

Puis tu peux l'enregistrer  en fichier comme :

  {
    let trucData = TrucData()
    
    // initialiser data
    
    …
    
    // pour le stocker comme fichier
   
    guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else
    {
      return
    }
    
    let fileURL = documentsURL.appendingPathComponent("TrucData.dat")

    NSArchiver.archiveRootObject(trucData, toFile: fileURL.path)
    
    …
  }


#42 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 86 messages

Posté 21 juillet 2017 - 11:39

Ok, la transformation en image marche, cool.

Je suis en train de jongler avec le temps, je suis dans le Lot et cà claque pas mal depuis 2 jours avec une pluie d'enfer. C'est vachement rare aussi fort et dans la durée dans le coin. Alors, je branche la box, je la débranche et ainsi de suite, c'est devenu mon quotidien.

 

Il ne me reste plus que l'enregistrement mais çà je sais faire mais pour tout à l'heure.



#43 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 21 juillet 2017 - 11:49

Si tu enregistres une image, qu'est-ce tu fasses lors d'une mise jour des données ?



#44 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 86 messages

Posté 21 juillet 2017 - 12:41

Je te rassure, une les images crées je ne reviens plus dessus et si vraiment je dois rajouter un élément, je dois le faire sur toutes les images de mon dossier et là je recommence tout le calcul, c'est hyper rapide. Donc j'efface tout et je recalcule.

 

C'est bon je l'ai enregistrée, mon code :

 // Enregistrement totale de l'image
        if let imageDef = imageVue.image?.imagePNGRepresentation() {
            let chemin = "/Users/PATRICK/Documents/APP-SAISIE/"
            imageDef.write(toFile: "\(chemin)ImageGraph3.png", atomically: false)
        }


extension NSView {
    var snapshot: NSImage {
        guard let bitmapRep = bitmapImageRepForCachingDisplay(in: bounds) else { return NSImage() }
        bitmapRep.size = bounds.size
        cacheDisplay(in: bounds, to: bitmapRep)
        let image = NSImage(size: bounds.size)
        image.addRepresentation(bitmapRep)
        return image
    }
    
    
}

Bon çà marche mais j'avoue qu'il y a certaines instruction que je ne comprends pas dans le "snapshot".


Modifié par Patyom, 21 juillet 2017 - 13:29 .


#45 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 21 juillet 2017 - 13:26

Donc, après que tu as enregistré les images, tu fait quoi pour les afficher à la place du "ViewAvecCalque" ?

 

Forcément, c'est plus facile d'enregistrer les données et de "rafraîchir" la vue lors d'un mise à jour dans le didSet de la var "representedObject" ?

 

Les données occuperont beaucoup moins d'espace sur le disque et tu pourrait changer "l'image" dans une seule ligne de code :

  {
    viewCalque.representedObject = chargerFichier(de url: …)
    
    …
  }

et dans la vue :

    override var representedObject: Any?
    {
      didSet
      {
        view.setNeedsDisplay(view.bounds)
      }
    }



#46 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 21 juillet 2017 - 14:35

 

Bon çà marche mais j'avoue qu'il y a certaines instruction que je ne comprends pas dans le "snapshot".

Moi non plus, je ne comprend pas tout. J’ai juste recopié un code venant d’internet. Tu peux regarder dans la doc Apple pour comprendre ces instructions. Pour ma part, cela ne m’intéresse pas, c’est trop spécifique à macOS, alors que ma tasse de thé c’est iOS. Il serait temps qu’Apple unifie certaines API. Cocoa est vraiment en retard par rapport à UIKit.

 

 

 

 


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#47 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 86 messages

Posté 23 juillet 2017 - 08:41

Quelle flopée d'instruction dans la doc en ligne d'Apple, je m'y perd.

 

Tiens une autre, dans une boucle "for in" je voudrais sauter ne pas traiter une ligne, comment fait-on pour sauter une ligne dans ce genre de boucle.



#48 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 23 juillet 2017 - 08:53

continue

https://developer.ap...14097-CH9-ID121

Premier paragrapfh et en-dessous la rubrique Control Transfer Statements - comme attendu

#49 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 86 messages

Posté 23 juillet 2017 - 08:55

Oh Yes, merci



#50 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 23 juillet 2017 - 09:31

L’exemple d’Apple me parait un brin tiré par les cheveux. Bon d’accord c’est juste un exemple pédagogique pour illustrer l’instruction continue, mais quand même.

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]
for character in puzzleInput {
    if charactersToRemove.contains(character) {
        continue
    } else {
        puzzleOutput.append(character)
    }
}
print(puzzleOutput)

En plus il ne FONCTIONNE PAS ! Le type qui l’a tapé ne l’a pas testé, ou alors cela correspond à une vieille syntaxe de Swift 1, abandonnée par la suite .. La doc Apple manque souvent de mise à jour, surtout dans les exemples.  

// Mauvaise syntaxe (le compilateur hurle à la compilation)
for character in puzzleInput {
}

On ne peut pas énumérer des characters à partir d’un String comme ça. Il faut ajouter l’opérateur d’énumération .characters pour que Xcode comprenne qu’il doit interpréter le String comme un tableau de characters.

// Bonne syntaxe (pour Swift 3.1)
for character in puzzleInput.characters {
} 

On peut faire la même chose sans l'instruction continue, pour alléger le code.

let puzzleInput = "great minds think alike"
        var puzzleOutput = ""
        let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]
        
        for character in puzzleInput.characters {
            if !charactersToRemove.contains(character) {
                puzzleOutput.append(character)
            }
        }
        print(puzzleOutput)
 

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#51 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 23 juillet 2017 - 09:36

Désolée Draken, c'est pas les docs qui ne sont pas à jour, c'est toi  ::)

 

La syntaxe est bien à jour pour Swift 4  8--)

 

Il faut regarder le haut de la page



#52 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 23 juillet 2017 - 09:42

Désolée Draken, c'est pas les docs qui ne sont pas à jour, c'est toi  ::)

 

La syntaxe est bien à jour pour Swift 4  8--)

 

Il faut regarder le haut de la page

 

Oué, oué * ronchonne *

 

N’empêche que Patyom bosse avec Swift 3, lui ! Comme tous les dévs en production .. Xcode 4 c’est dans 2 ou 3 mois, pas avant ..

 

EDIT : Effectivement, ça marche. je viens de tester avec Swift 4 (bêta Xcode 9v3). 


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#53 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 86 messages

Posté 23 juillet 2017 - 09:58

            if textHeure.contains(":") { } else {
                continue // suite de la boucle
            }

Code pour vérifier que l'heure que j'ai extraite est au format "HH:MM", si true je fais le traitement sinon via "continue" je prends la ligne suivante.

Cà vous parait correct ?

 

il y a beaucoup de changements dans Swift 4 par rapport à Swift 3 ?



#54 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 23 juillet 2017 - 10:03

Il existe une autre manière de « sauter » une itération de la boucle for in : le test sur la valeur numérique de l’indice.

 

La boucle for in ne gère pas l’indice de boucle, en fournissant directement les objets lus. Pour moi c’est l’une des principales innovations du langage, qui n’en manque pas pourtant ! Toujours plus simple, toujours plus lisible, en avant vers l’infini ...

 

Voici un petit code affichant une liste de noms :

let liste = ["ZERO", "UN", "DEUX", "TROIS", "QUATRE", "CINQ »]

for nom in liste {
   print (nom)
}

ZERO
UN
DEUX
TROIS
QUATRE
CINQ

On peut utiliser un opérateur d’énumération pour récupérer l’objet ET son indice :

for (index,nom) in liste.enumerated() {
   if index != 3 {
        print (nom)
   }
}

 

ZERO

UN

DEUX

QUATRE

CINQ

 

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#55 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 23 juillet 2017 - 10:06

            if textHeure.contains(":") { } else {
                continue // suite de la boucle
            }

Code pour vérifier que l'heure que j'ai extraite est au format "HH:MM", si true je fais le traitement sinon via "continue" je prends la ligne suivante.

Cà vous parait correct ?

 

 

C’est correct, mais c’est un peu bizarre comme manière de l’écrire. Moi j’aurais utilisé l’opérateur de négation (!) pour alléger l’écriture.

if !textHeure.contains(":") {
   continue // suite de la boucle
}


  • Joanna Carter aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#56 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 23 juillet 2017 - 10:08

il y a beaucoup de changements dans Swift 4 par rapport à Swift 3 ?

 

Beaucoup moins qu’entre Swift 2 et Swift 3 ! Heureusement d’ailleurs. 


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#57 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 86 messages

Posté 23 juillet 2017 - 10:46

Ca y est je me suis lancé sur l'affichage des textes et bien entendu j'ai des questions :

 
    func creerTextes1() -> [TypeTexte] {
        
        let t1 = TypeTexte(point: NSMakePoint(15, 40),
                           text: "VuePersonnalisée 1",
                           police: NSFont.boldSystemFont(ofSize: 17.0),
                           couleur: NSColor.blue)
        
        var tableauTexte = [TypeTexte]()
        tableauTexte.append(t1)
        return tableauTexte
    } 

J'ai donc récupéré le code correspondant et là je dois écrire le long de ces lignes VERTICALES, pas facile l'instruction.

 

"il a toujours quelques chose de compliquer à faire" vous devez vous dire non ?



#58 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 23 juillet 2017 - 11:11

C’est quelque part là-dedans. Bonne chance :

 

https://developer.ap.../uid/TP40005533

 

Sinon, pour éviter d’aller farfouiller dans l’immensité de la doc Apple et la complexité d’utilisation de CoreText, il reste la bonne vieille solution : afficher les caractères un par un, en calculant leurs positions d’affichage à la « main ».


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#59 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 86 messages

Posté 23 juillet 2017 - 13:45

j'ai trouvé çà :

 

https://stackoverflo...-os-cocoa-swift

(le code dans la partie basse)

Qu'en pensez-vous, je n'arrive pas à implanter le code dans le prog.



#60 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 23 juillet 2017 - 14:14

Cela ne résoudra pas ton problème, ce code effectue une rotation à 90° de l’ensemble du texte. Je doute que tes utilisateurs aient envie de tourner la tête à angle droit pour lire les infos de ton application.

 

Essaye plutôt ça :

func drawTexteVertical(texte:String,
                               police:NSFont,
                               couleur:NSColor,
                               position:NSPoint) {
            var posCourante = position
            for char in texte.characters {
                let attrStr = NSAttributedString(string: String(char),
                                                 attributes: [
                            NSFontAttributeName : police,
                            NSForegroundColorAttributeName : couleur])
                attrStr.draw(at: posCourante)
                posCourante.y -= police.capHeight + 1
            }
        }

Je viens de taper ce code et de le tester. Exemple en image :

 

 

 

Fichier(s) joint(s)


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)