Tracés de courbes [Resolu]

novembre 2012 modifié dans API AppKit #1
Bonjour à  tous.



Comme vous le savez, je développe en ce moment un logiciel d'électronique et je souhaiterai pouvoir afficher une courbe définie par une équation du genre y=f(x). La routine tracerait la courbe point par point, avec une boucle pour des valeurs de x entre deux bornes. Il me faudrait un contrôle dans une fenêtre qui permette d'afficher un point à  des coordonnées précises. Accessoirement, je voudrai aussi tracer une grille permettant de lire plus facilement la courbe. Le problème est que je n'ai aucune piste de départ !



Donc, voilà , si vous avez des éléments d'informations ...

Réponses

  • CéroceCéroce Membre, Modérateur
    octobre 2012 modifié #2
  • Salut,



    Un tuto sympa sur : http://ioslibraries.com/



    A+
  • AliGatorAliGator Membre, Modérateur
    +1 pour CorePlot, très connu et très utilisé, donc à  priori une source sûre pour ce genre d'usage !
  • Pour les courbes, tu peux également utiliser les NSPath...



    J'ai développé un logiciel de dessin (dans un autre domaine) qui peux être modifié pour ce genre de dessin...

    Il est sur github : https://github.com/macintoshplus/XML-Print-Model-Creator

    Cela peux te donner des idées sur comment organiser ton projet et comment gérer l'affichage et les objets...



    En soit, en dessin de circuit électronique tu as en gros uniquement des combinaisons de dessin simple : trait, cercle (plus ou moins complet), rectangle, etc... Le tout est ensuite de savoir les combiner pour générer les objets plus complexes utile à  la réalisation des schémas.









    Note : attention à  la licence de mon logiciel ;-)
  • tabliertablier Membre
    octobre 2012 modifié #6
    Pour du dessin d'électronique, j'en utilise deux:

    DesignWorks que je trouve performant, mais il est payant et assez cher et il faut ajouter un logiciel de dessin de CI.

    Eagle bien connu sur PC mais (je pense) moins performant et avec une version gratuite pour les étudiants.



    Grosso-modo dans DWorks, un dessin est une base de donnée dont chaque élément peut être trouvé dans une bibliothèque et dont les propriétés sont réglées pour le dessin courant. Les bibliothèques sont des bases de données dont chaque élément comporte des propriétés: footprint, liste des connexions, image dans les schémas, ...etc



    Il existe une version d'essai de DesignWorks ici.
  • Attention : le but n'est pas de créer un logiciel de dessin de schémas ! Le but est de tracer une courbe de réponse d'un filtre RLC, comme on tracerait la courbe d'une fonction du genre y=sin(x) . J'ai regardé un peu sur le web et c'est sûr que Core Plot correspond à  ce que je recherche. Seul petit bémol, tous les tutos trouvés sont pour l'utilisation en environnement iOS. Cela dit, je n'en suis pas encore là . Il faut dans un premier temps que j'arrive à  afficher une fenêtre fille à  partir d'un contrôle sur une feuille mère (je parle un peu VB là  ...). Je débute. Ne brûlons pas les étapes ...
  • MalaMala Membre, Modérateur
    Honnêtement, cette librairie est pas top pour OSX avec ses deux templates typé iOS qui se battent en duel. Moi je surchargerais le drawRect d'une simple NSView pour y dessiner avec les NSBezierPath. C'est pas très sorcier à  faire. Je peux te fournir un exemple à  l'occasion si tu veux. CorePlot était prometteur mais n'a jamais vraiment évolué.



    Pour ouvrir un fenêtre fille, tu as plusieurs solutions. Tout dépend du besoin (modal ou pas). Par exemple:
    [color=#400e81][color=#000000][[/color][color=#7233a9]NSApp[/color][color=#000000] [/color]beginSheet[color=#000000]:[/color][color=#538087]myPanel[/color][/color]<br />
    [color=#400e81][color=#000000]	   [/color]modalForWindow[color=#000000]:myWindow[/color][/color]<br />
    [color=#400e81][color=#000000]		[/color]modalDelegate[color=#000000]:[/color][color=#b81ca2]self[/color][/color]<br />
    [color=#400e81][color=#000000]	   [/color]didEndSelector[color=#000000]:[/color][color=#b81ca2]nil[/color][/color]<br />
    		  [color=#400e81]contextInfo[/color]:[color=#b81ca2]nil[/color]];<br />
    


    Cela va t'ouvrir un panneau modal en le faisant glisser devant ta fenêtre.



    Et pour le fermer:
    [color=#538087][color=#000000][[/color]myPanel[color=#000000] [/color][color=#400e81]orderOut[/color][color=#000000]:[/color][color=#b81ca2]nil[/color][color=#000000]];[/color][/color]<br />
    [color=#400e81][color=#000000][[/color][color=#7233a9]NSApp[/color][color=#000000] [/color]endSheet[color=#000000]:[/color][color=#538087]myPanel[/color][color=#000000] [/color]returnCode[color=#000000]:[/color][color=#3800d7]0[/color][color=#000000]];[/color][/color]<br />
    
  • CéroceCéroce Membre, Modérateur
    Je peux admettre que Core Plot n'est pas la panacée, mais la solution que tu proposes est tout bonnement de reprogrammer tout soi-même.

    Ce n'est pas le tout de dessiner, il faut aussi gérer les échelles et accéder aux données (par un data source). Il faut que ce soit efficace (Core Plot utilise Core Animation). Rien de tout cela n'est faisable par un débutant.
  • Désolé, je n'avais pas bien compris.



    J'ai déjà  fait ça avec NSBezierPath car à  l'époque je n'avais rien trouvé de mieux. La licence BSD te permet d'apporter ta contribution au projet si cela peut être utile ;-)
  • MalaMala Membre, Modérateur
    'Céroce' a écrit:


    Je peux admettre que Core Plot n'est pas la panacée, mais la solution que tu proposes est tout bonnement de reprogrammer tout soi-même.

    Ce n'est pas le tout de dessiner, il faut aussi gérer les échelles et accéder aux données (par un data source). Il faut que ce soit efficace (Core Plot utilise Core Animation). Rien de tout cela n'est faisable par un débutant.


    Pour la datasource, un simple NSArray de NSPoint et c'est réglé. C'est pas un algo de dématérialisation de belle mère non plus. Faut pas pousser. image/biggrin.png' class='bbc_emoticon' alt=':D' />



    En ce qui concerne Core Animation, je l'utilise tous les jours sous OSX depuis plus de cinq ans (première Béta de Léopard). Et malheureusement, c'est loin d'être une référence en terme de perfs. C'est juste une couche d'abstraction 2,5D qui apporte un certain confort mais rien de plus.
  • AliGatorAliGator Membre, Modérateur
    'Mala' a écrit:
    C'est pas un algo de dématérialisation de belle mère non plus. Faut pas pousser.
    Elle m'a bien fait marrer celle-là  image/biggrin.png' class='bbc_emoticon' alt=':D' />
  • Je suis allé consulter la doc Apple sur NSBezierPath et c'est effectivement un truc dans ce genre qui irait bien. Si j'ai bien compris, c'est en fait une collection de tracés élémentaires (segments de droites ou bien segments de courbes cubiques ,c-a-d du troisième degré). Mais la question que je me pose, c'est comment faire que cette collection, constituant un tracé, s'affiche à  l'écran. Je n'ai en effet pas trouvé de méthode pour assigner un conteneur quelconque au tracé. Autrement, créer le tracé en lui même sera je pense assez facile : une boucle qui crée un NSPoint avec les coordonnés données par la fonction à  chaque occurence puis transfert dans la collection. Seulement, après, il faut afficher ....
  • wiskywisky Membre
    octobre 2012 modifié #14
    Regarde la méthode DrawRect dans ce fichier

    https://github.com/m...s/PMCPageView.m

    Le fichier d'entête qui correspond :

    https://github.com/m...s/PMCPageView.h



    Par contre, il me semblerait utile que tu lise un peu sur cocoa avant de te lancer. Le modèle MVC n'est pas évident à  comprendre quant on viens de VB qui est plutôt procédural. Cela reste mon avis image/wink.png' class='bbc_emoticon' alt=';)' />



    EDIT:



    Pour l'affichage d'un NSBezierPath regarde la methode draw de ce fichier :

    https://github.com/m...lass/PMCTrait.m

    Cette méthode est appelée depuis la méthode Drawrect du fichier cité plus haut.
  • AliGatorAliGator Membre, Modérateur
    En fait c'est pas une vue qui affiche un BezierPath (comme tu as une UIImageView qui affiche une UIImage), mais un NSBezierPath qui se dessine sur une vue image/wink.png' class='bbc_emoticon' alt=';)' />



    Typiquement tu crées une sous-classe de NSView, et tu surcharges sa méthode -(void)drawRect:(CGRect)dirtyRect. Dans cette méthode drawRect, tu peux demander à  ton NSBezierPath de se dessiner dans le contexte de dessin courant, avec les méthodes indiquées dans la section "Drawing Paths" de la documentation de NSBezierPath.



    Le mieux est que tu lises la documentation du Quartz 2D Programming Guide sur le sujet, qui t'explique comment créer mais aussi dessiner des NSBezierPath, et plein d'autres concepts (ce qu'est un Graphic Context, etc, etc). Cette doc t'expliquera bien plus en détail pas mal de concepts pour faire du dessin, elle est très riche et tout ça te sera toujours utile si tu as besoin de dessiner des choses à  l'écran de toute façon image/wink.png' class='bbc_emoticon' alt=';)' />
  • MalaMala Membre, Modérateur
    En complément, j'ai réalisé un petit bout de code y a pas longtemps pour dessiner l'histogramme d'une image. Je l'ai pas sous la main présentement tout de suite mais je te le mets ce soir ou demain. Après libre à  toi d'utiliser Core Plot ou du "fait main" mais c'est de toute façon intéressant de comprendre les mécanismes.
  • 'Mala' a écrit:


    En complément, j'ai réalisé un petit bout de code y a pas longtemps pour dessiner l'histogramme d'une image. Je l'ai pas sous la main présentement tout de suite mais je te le mets ce soir ou demain. Après libre à  toi d'utiliser Core Plot ou du "fait main" mais c'est de toute façon intéressant de comprendre les mécanismes.


    C'est même très intéressant car cela peux vite s'avérer très puissant.


  • Par contre, il me semblerait utile que tu lise un peu sur cocoa avant de te lancer. Le modèle MVC n'est pas évident à  comprendre quant on viens de VB qui est plutôt procédural. Cela reste mon avis image/wink.png' class='bbc_emoticon' alt=';)' />




    On est bien d'accord ! Pour VB justement, j'étais parti de deux énormes livres avec des exemples à  foison d'utilisation des contrôles de VB ainsi que le concept d'objet, méthodes, évenements et tutti-quanti sans oublier bien sûr les collections ce qui m'avait permis à  l'époque de faire plein de choses. Pour Cocoa, j'ai seulement ce forum, la doc Apple, et un petit livre des éditions Eyrolles (je ne me souviens plus du titre) qui ne donne que des bases : le concept d'objet, classe, instance, héritage (très vite ...) ainsi que les méthodes d'accès, de classe et d'instance.





    Autrement, le modèle MVC a-t-il un rapport avec l'affichage d'un tableau NSTableView avec les données stockées dans un NSArrayController ?



    Donc, si il existe des livres (que je trouve plus pratiques et plus confortables que le web), je suis preneur ...
  • AliGatorAliGator Membre, Modérateur


    Autrement, le modèle MVC a-t-il un rapport avec l'affichage d'un tableau NSTableView avec les données stockées dans un NSArrayController ?
    Un peu, mais ça va bien plus loin que ça.



    En effet MVC c'est la séparation entre le Modèle (les données) et la Vue (leur représentation à  l'écran). Le Contrôleur dans tout ça fait office d'intermédiaire et de chef d'orchestre. Tu peux très bien imaginer afficher les mêmes données (le même Model) dans une Vue qui dessine un graphique d'un côté, et dans une autre Vue qui affiche ces données dans une NSTableView : ce sont 2 représentations (View) d'un même jeu de données (Model).



    Après je ne rentrerai pas + dans le détail de tous les trucs à  savoir pour bien comprendre de MVC, de comment ça s'applique à  NSTableView (la Vue) vs NSArrayController (qui est là  un Controller, qui va aller chercher ses données dans le Model par binding) : pour cela il serait plus adéquat je pense d'ouvrir un nouveau sujet dans le forum dédié au concept MVC, ou plutôt de faire une recherche (car on a sûrement déjà  causé de ça) pour bien distinguer le sujet de la question actuelle qu'est le "Tracé de courbes". Mais dans l'ensemble c'est ça.
  • CéroceCéroce Membre, Modérateur


    Donc, si il existe des livres (que je trouve plus pratiques et plus confortables que le web), je suis preneur ...


    Programmation Cocoa sous Mac OS X. Malheureusement pas encore adapté à  Xcode 4. Amazon annonce une nouvelle édition pour janvier 2013.
  • Merci pour l'info Céroce ! J'espère que je pourrait l'acheter ;-)
  • MalaMala Membre, Modérateur
    Chose promise, voici un petit bout de code d'exemple montrant comment on dessine un graphique dans une vue...



    Le code du drawRect de la classe "GraphView"a été généré en grande partie avec Paint Code pour gagner du temps.
  • Je suis intéressé par le tout (tracé de courbe), même bibliothèque que sur iOS ?
  • Merci beaucoup ! J'étudie ça dès demain à  tête reposée !
  • MalaMala Membre, Modérateur
    'Larme' a écrit:


    Je suis intéressé par le tout (tracé de courbe), même bibliothèque que sur iOS ?


    NSBeziePath -> UIBezierPath



    A part quelques subtilités dans le genre vu qu'Apple a pas uniformisé ses API, l'esprit est le même.
  • 'Mala' a écrit:


    NSBeziePath -> UIBezierPath



    A part quelques subtilités dans le genre vu qu'Apple a pas uniformisé ses API, l'esprit est le même.


    Merci.
  • Alors, pour le tracé de courbes...



    J'ai ,en combinant un peu toutes les informations trouvées ça et là , trouvé une solution. Je mets dans une fenêtre une Custom View. Je rajoute une classe héritée de NSView (qui contiendra donc les méthodes initWithFrame et drawRect) et je fixe la classe de la Custom View à  cette classe rajoutée. Ensuite, dans la classe rajoutée, je surcharge les méthodes. Je mets dans initWithFrame le code pour préparer les NSBezierPath et dans drawRect, la ou les commande(s) Path Stroke pour faire mes tracés. J'ai réussi à  tracer à  peu près ce que je veux : toutes sortes de courbes mathématiques (des sinusoides bien rondes si on met suffisamment de segments) y compris des systèmes de coordonnés et autres réticules d'oscilloscope, le tout avec des couleurs différentes (fond noir, réticule blanc et courbe verte par exemple). Donc, c'est super. Le seul problème est que, une fois la vue initialisée et la courbe tracée, on ne peut plus y revenir. Or, je souhaiterai que cette courbe puisse se retracer en fonction de données entrées par l'utilisateur. Le but est de faire un module de calcul de filtres RLC avec tracé de courbe de réponse (sur une échelle géométrique et non linéaire) en fonction des valeurs de R,L et C entrées par l'utilisateur.



    J'ai donc essayé la chose suivante : dans la classe personnalisée, j'ai ajouté deux méthodes : sinusEurope et sinusUS traçant des sinusoides respectivement à  50 Hz et 60 Hz. Si ces méthodes sont appelées en interne (dans initWithFrame par exemple), tout marche bien. Pour aller plus loin, j'ai mis une Outlet de la CustomView dans la classe principale de la fenêtre. Puis, deux méthodes d'action qui , sur pression de boutons, invoquent les méthodes des sinus suivis de la méthode pour redessiner la vue (setNeedsDisplay:YES ou un truc comme ça ...). Le résultat est un plantage magistral ! Alors, que faire ?...
  • CéroceCéroce Membre, Modérateur
    C'est la bonne façon de faire.



    Si tu as un plantage, c'est probablement dû à  une erreur de gestion mémoire.

    1) Révise la gestion mémoire

    2) Lance Instruments Zombies (menu Product > Profile).



    (Cherche sur le forum, c'est un sujet traité 1000 fois).
  • J'ai téléchargé un exemple de code sur le site d'Apple. Le programme s'appelle BezierPathLab. Et dans ce code, la remise à  jour de l'affichage se fait en interne. J'ai donc mis la ligne " self setNeedsDisplay:YES" dans la méthode de tracé de la courbe, à  la fin et dans ce cas, tout marche impec ! Je peux, de l'éxterieur en appelant la bonne méthode, lancer l'affichage de la courbe quand je le souhaite. Je pense donc pouvoir passer des paramètres par cette voie pour diriger le tracé. J'ai rajouté également au début la ligne "path removeAllPoints" pour effacer la courbe avant le recalcul d'une nouvelle. Et, bien que mon Mac ne soit plus de la première jeunesse (iMac 24 de 2007), l'effacement et le tracé d'une nouvelle courbe sont instantanés : on voit littéralement l'ancienne se métamorphoser en la nouvelle.



    Donc, je suis content, je pourrai tracer toutes les courbes que je veux(à  condition d'avoir le bon modèle mathématique, mais c'est une autre histoire) , ce qui était mon but en ouvrant ce post. Merci à  tous pour votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.