Oui, je ne parlais pas du code mais bien des appels !
En gros, quand une fonction de dessin est appelée, il faut que ça soit via un drawRect (ou alors entre "lockFocus", "unlockFocus" sur une image par exemple, mais c'est un cas particulier...)
Le probleme c'est que je dessine (invisiblement) dans ma méthode mouseDown pour savoir si mon curseur se trouve bien dans mon cercle. Ca je peux pas le faire dans drawRect.
Le probleme c'est que je dessine (invisiblement) dans ma méthode mouseDown pour savoir si mon curseur se trouve bien dans mon cercle. Ca je peux pas le faire dans drawRect.
ça veut dire quoi "invisiblement" ? Partout tu peux changer des paramètres de la classe, puis demander un "setNeedsDisplay:YES"
Bah en gros voilà ce que je fais quand je fais un clique gauche sur ma vue
<br />- (void)mouseDown:(NSEvent *)monEvenement<br />{<br /> /* parcours du tableau de sommets */<br /> int i = 0;<br /> <br /> /* enregistrement des coordonnées du curseur */<br /> posSouris = [monEvenement locationInWindow];<br /> <br /> for(i=0;i<nbeSommet;i++)<br /> {<br /> /* définition d'un objet qui prendra a chaque indices les informations de chaque sommet */<br /> Rectangle *objet = [RectArray objectAtIndex:i];<br /> <br /> /* on dessine un rectangle grâce au informations détenu par objet */<br /> NSRect essai = NSMakeRect(objet.abs, objet.ord, objet.largeur, objet.hauteur);<br /> <br /> /* on évalue les coordonnées de la souris par rapport au rectangle dessiné */<br /> /* si le point cliqué est dans le rectangle on autorise le drag */<br /> if(NSPointInRect(NSMakePoint(posSouris.x, posSouris.y), essai))<br /> {<br /> /* on a le droit de drag */<br /> drag = YES;<br /> <br /> /* on précice quel sommet on peut bouger */<br /> indiceRectArray = i;<br /> <br /> /* on change la couleur du sommet selectionné */<br /> objet.couleur = [NSColor yellowColor];<br /> [self setNeedsDisplay:YES];<br /> iSom = objet.infoNoeud;<br /> isFini = YES;<br /> <br /> }<br /> } <br />}<br />
Hum ok je vois. Mais par contre dans ma méthode mouseDragged je fais du setNeedDisplay car je change mes coordonnées de sommet en fonction du la position de ma souris .
Pas un problème non plus... Si tu veux que je regarde, balance ton projet, je te dirai d'où viennent ces warnings. Tu dois faire un "fillRect" à un endroit pas très catholique.
Ouai eu en fait j'ai enlever initRect, il sert a rien lol ^^. Ca marche super comme ca. Merci Schlum ! J'espere en tout cas que c'est pas trop trop mal codé.
Non, pour ce que j'en ai vu (pas grand chose, j'ai juste cherché les fonctions classiques de remplissage de rect et suivi la chaà®ne inverse :P), ça n'a pas l'air crade
Tu me rassures ^^. En plus je me suis fait **** à tout bien commenté. Comme ça on pige tout direct . Eh bien je vais pouvoir faire de beaux rêves. A demain sans doute Merci bcp !
J'ai une autre question. Dans mon projet, le graphe est en fait dans un fichier .txt que je charge directement. Il faut donc que je le mette dans le dossier build. J'aimerai pouvoir charger n'importe quel fichier .txt avec un openDialog. Je sais comment faire mais je ne sais pas comment faire pour ne pas que mon projet plante quand je run alors qu'il n'y a pas de fichier .txt chargé. Et je ne sais pas comment faire quand je veux recharger un autre fichier .txt au milieu de l'utilisation du programme et donc tout redessiner ... Vous auriez quelques idée?
Bon j'ai reussi à charger un fichier text en cours d'utilisation du programme. Je vais tenter maintenant de ne rien afficher dès le run et que l'user puisse charger comme il veut ^^
Bonsoir tout le monde. Voilà , j'ai bien avancé sur mon petit projet de graphes. J'aimerai maintenant redessiner mes arcs de manière plus "subtile". En effet, pour le moment je les traces tous d'un seul coup et je ne peux pas acceder aux propriétés d'un seul arc en particlier. J'ai donc créé un NSObject que je nomme Arc. Je défini deux méthodes : initialisation (avec les coordonnées de départ et d'arrivée, la couleur et le poids) et drawArc (qui me permet donc de le dessiner).
Je rencontre un soucis quand je veux ajouter mes arcs. J'ai créé un tableau dans ma vue qui va recevoir dans chaque case mes différents arcs. Le truc c'est que chaque de mon tableau doit contenir elle même un tableau.
Mon premier tableau donne donc juste le sommet que je traite et les sous case donne les arcs associés. J'ai tenté des truc mais ça ne marche pas. Vous feriez comment pour créer ce tableau sans passer par des tableau temporaires ? ::)
Pas sûr d'avoir tout compris mais bon... Un tableau ne doit pas forcément se créer en un coup ; il y a un classe NSMutableArray qui permet de le remplir au fur et à mesure.
Oui c'est ce que j'ai fait. En variable d'instance je fais un NSMutableArray que j'initWithCapacity du nombre de sommet que j'ai.
Apres je parcours mon graphe avec des boucles. Je traite les sommets un par un. Ces sommets possède des arcs que j'aimerai ajouté à mon NSMutableArray.
Tu vois ? Je vois pas trop comment faire. Car après j'aurai besoin de ce gros tableau pour actualiser mes coordonnée d'arc quand je ferai tout bouger, donc il faut sa construction soit béton.
Bah je sais pas comment faire un tableau de tableau... Au départ je voulais ajouter un tableau temp à mon gros tableau, mais ce tableau temp étant tjs modifié ça me bousille mes tracé d'arc ...
Je met un bout de code. C'est comme ca que j'initialise tous mes arcs.
<br /> /* tant que j n'est pas égal au nombre d'arcs du graphe */<br /> while(j != graph->m)<br /> {<br /> /* on retire un sommet départ */<br /> objet = [RectArray objectAtIndex:l];<br /> /* si l est différent du nombre de sommets-1 (car l commence à un cran inférieur) */<br /> if(l != ((graph->n)-1))<br /> {<br /><br /> /* tant que j est différent du dernier élément de la liste et qu'il est différent du nombre d'arc */<br /> while (j !=graph->tete[l+1] && j!= graph->m) <br /> {<br /> /* on retire notre sommet d'arrivée */<br /> objet2 = [RectArray objectAtIndex:(graph->succ[j]-1)];<br /> <br /> <br /> Arc *ligne = [[Arc alloc]init];<br /> [ligne initArcX1:(objet.abs + objet.largeur/2) withY1:(objet.ord + objet.hauteur/2) withX2:(objet2.abs + objet2.largeur/2) withY2:(objet2.ord + objet2.hauteur/2) withInfoArc:graph->w[j] andColor:[NSColor redColor]];<br /><br /> [temp addObject:ligne];<br /> [ligne release];<br /> j++;<br /> }<br /> [ArcArray addObject:temp]; <br /> l++;<br /> }<br />
ArcArray est mon gros tableau et temp mon petit, tous deux déclarer en variable d'instance.
Mais ça sert à quoi de déclarer un tableau temporaire en variable d'instance ? ??? D'autant plus qu'il faut en allouer un nouveau à chaque fois... NSMutableArray *temp = [NSMutableArray array];
J'ai fait ça la premiere fois, ca marchais presque c'était partait sauf que que je bougeais mes sommet ça me dessinait de nouveaux arcs par dessus les anciens.
J'ai donc remis comme tu me dis avec un temp dans ma méthode. J'ai fais la meme chose pour mettre a jour mes coordonnées quand je bouge mes sommets. Et voici un screen de mon souci ...
Par exempe ici 2 et 3 sont relié en rouge, je bouge 3, mon arc se met d'une autre couleur mais mon rouge reste derrière. Apres si je mouseUp et que je re-bouge le 3 il n'y pas le probleme. C'est juste au début.
J'ai passé des heures sur ce problème sans pouvoir le résoudre... Ne me dis pas que c'est un truc con ... :'(
Réponses
Enfin je me suis mal exprimé... Je voulais dire qu'il ne faut pas " appeler " ces fonctions de dessin en dehors du "drawrect"
Bien sûr que tu peux mettre le code ailleurs
En gros, quand une fonction de dessin est appelée, il faut que ça soit via un drawRect (ou alors entre "lockFocus", "unlockFocus" sur une image par exemple, mais c'est un cas particulier...)
ça veut dire quoi "invisiblement" ?
Partout tu peux changer des paramètres de la classe, puis demander un "setNeedsDisplay:YES"
Je ne peux donc pas faire autrement je pense.
"[self setNeedsDisplay:YES]" ne dessine rien, ça se contente de dire à la vue qu'elle devra se re-dessiner au prochain passage de la runLoop.
Tu dois faire un "fillRect" à un endroit pas très catholique.
J'ai peur ...
initWithFrame -> initGraphe -> initRect -> NSRectFill
C'est lui qui est responsable de tous tes warnings.
Et je dois faire comment pour me débarrasser de ce warning?
Merci bcp !
Vous auriez quelques idée?
etdit : bon bah c'est bon en fait
Donc il y le .app et .txt à charger .
Merci
Graphe.zip
Voilà , j'ai bien avancé sur mon petit projet de graphes.
J'aimerai maintenant redessiner mes arcs de manière plus "subtile". En effet, pour le moment je les traces tous d'un seul coup et je ne peux pas acceder aux propriétés d'un seul arc en particlier.
J'ai donc créé un NSObject que je nomme Arc.
Je défini deux méthodes : initialisation (avec les coordonnées de départ et d'arrivée, la couleur et le poids) et drawArc (qui me permet donc de le dessiner).
Je rencontre un soucis quand je veux ajouter mes arcs.
J'ai créé un tableau dans ma vue qui va recevoir dans chaque case mes différents arcs. Le truc c'est que chaque de mon tableau doit contenir elle même un tableau.
Mon premier tableau donne donc juste le sommet que je traite et les sous case donne les arcs associés.
J'ai tenté des truc mais ça ne marche pas.
Vous feriez comment pour créer ce tableau sans passer par des tableau temporaires ? ::)
Un tableau ne doit pas forcément se créer en un coup ; il y a un classe NSMutableArray qui permet de le remplir au fur et à mesure.
En variable d'instance je fais un NSMutableArray que j'initWithCapacity du nombre de sommet que j'ai.
Apres je parcours mon graphe avec des boucles.
Je traite les sommets un par un.
Ces sommets possède des arcs que j'aimerai ajouté à mon NSMutableArray.
J'ai donc un NSMutableArray de NSMutableArray ...
[Case1 possède {case1.1 ; case1.2 ; ... ; case1.(nombreArcDe sommet1)}]
[Case2 possède {case2.1 ; case2.2 ; ....; case2.(nombreArcDe sommet2)}]
.
.
.
Tu vois ?
Je vois pas trop comment faire. Car après j'aurai besoin de ce gros tableau pour actualiser mes coordonnée d'arc quand je ferai tout bouger, donc il faut sa construction soit béton.
Je ne vois juste pas le problème qu'il y a à le créer...
Au départ je voulais ajouter un tableau temp à mon gros tableau, mais ce tableau temp étant tjs modifié ça me bousille mes tracé d'arc ...
Je met un bout de code. C'est comme ca que j'initialise tous mes arcs.
ArcArray est mon gros tableau et temp mon petit, tous deux déclarer en variable d'instance.
D'autant plus qu'il faut en allouer un nouveau à chaque fois...
NSMutableArray *temp = [NSMutableArray array];
J'ai donc remis comme tu me dis avec un temp dans ma méthode.
J'ai fais la meme chose pour mettre a jour mes coordonnées quand je bouge mes sommets.
Et voici un screen de mon souci ...
Par exempe ici 2 et 3 sont relié en rouge, je bouge 3, mon arc se met d'une autre couleur mais mon rouge reste derrière. Apres si je mouseUp et que je re-bouge le 3 il n'y pas le probleme. C'est juste au début.
J'ai passé des heures sur ce problème sans pouvoir le résoudre... Ne me dis pas que c'est un truc con ... :'(