Tracés de courbes [Resolu]
BertrandMartin
Membre
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 ...
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 ...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Un tuto sympa sur : http://ioslibraries.com/
A+
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 ;-)
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.
Pour ouvrir un fenêtre fille, tu as plusieurs solutions. Tout dépend du besoin (modal ou pas). Par exemple:
Cela va t'ouvrir un panneau modal en le faisant glisser devant ta fenêtre.
Et pour le fermer:
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.
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 ;-)
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. /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.
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 /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.
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 /wink.png' class='bbc_emoticon' alt=';)' />
C'est même très intéressant car cela peux vite s'avérer très puissant.
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 ...
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.
Programmation Cocoa sous Mac OS X. Malheureusement pas encore adapté à Xcode 4. Amazon annonce une nouvelle édition pour janvier 2013.
Le code du drawRect de la classe "GraphView"a été généré en grande partie avec Paint Code pour gagner du temps.
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.
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 ?...
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).
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.