Drag objet par objet

123578

Réponses

  • schlumschlum Membre
    23:13 modifié #122
    T'as pas des fonctions de dessin en dehors d'un drawRect ? Tu parlais de dessin lors d'un init je ne sais plus où...
  • CeetixCeetix Membre
    23:13 modifié #123
    Eu si j'en ai, il ne faut pas?
  • schlumschlum Membre
    mars 2009 modifié #124
    Non seulement ça ne fera rien, mais en plus ça produira des messages d'erreur de ce genre.

    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  :)
  • CeetixCeetix Membre
    23:13 modifié #125
    bah je vais pas tout mettre dans mon drawRect. J'ai pleins pleins de code et des méthodes . C'est bcp plus clair je trouve.
  • schlumschlum Membre
    23:13 modifié #126
    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...)
  • CeetixCeetix Membre
    23:13 modifié #127
    Ah ok ! Ouf tu me rassures, ca peut s'arranger ça :)

  • CeetixCeetix Membre
    23:13 modifié #128
    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.
  • schlumschlum Membre
    23:13 modifié #129
    dans 1238260142:

    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"
  • CeetixCeetix Membre
    23:13 modifié #130
    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&lt;nbeSommet;i++)<br />	{<br />		/* définition d&#39;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 />
    


    Je ne peux donc pas faire autrement je pense.
  • schlumschlum Membre
    23:13 modifié #131
    Y a pas de dessin là ...
  • CeetixCeetix Membre
    23:13 modifié #132
    bah je dessine bien une zone rectanulaire non?
  • schlumschlum Membre
    23:13 modifié #133
    Si c'est le cas, je ne vois pas où... De toute manière, si tu la dessinais ici, elle n'apparaà®trait jamais !

    "[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.
  • CeetixCeetix Membre
    23:13 modifié #134
    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 .
  • schlumschlum Membre
    23:13 modifié #135
    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.
  • CeetixCeetix Membre
    23:13 modifié #136
    D'accord. Je sens que je vais me faire tirer les oreilles .... Le slider marche pa pour le moment je préviens.
    J'ai peur ...  :'(
  • schlumschlum Membre
    23:13 modifié #137
    Oh non, je vais pas m'amuser à  regarder tout le code voir s'il est crade ou non  :)

    initWithFrame -> initGraphe -> initRect -> NSRectFill

    C'est lui qui est responsable de tous tes warnings.
  • CeetixCeetix Membre
    23:13 modifié #138
    Il a l'air crade pour toi ?

    Et je dois faire comment pour me débarrasser de ce warning? :(
  • CeetixCeetix Membre
    23:13 modifié #139
    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é.
  • schlumschlum Membre
    23:13 modifié #140
    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  :)
  • CeetixCeetix Membre
    23:13 modifié #141
    Tu me rassures ^^. En plus je me suis fait **** à  tout bien commenté. Comme ça on pige tout direct :D . Eh bien je vais pouvoir faire de beaux rêves. A demain sans doute ;)
    Merci bcp !
  • CeetixCeetix Membre
    23:13 modifié #142
    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?
  • CeetixCeetix Membre
    mars 2009 modifié #143
    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 ^^

    etdit : bon bah c'est bon en fait :D
  • CeetixCeetix Membre
    23:13 modifié #144
    Je vous joins ma petite application pour que vous puissiez la tester et me dire ce que vous en pensez ...
    Donc il y le .app et .txt à  charger .
    Merci ;)

    Graphe.zip
  • CeetixCeetix Membre
    23:13 modifié #145
    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 ?  ::)
  • schlumschlum Membre
    23:13 modifié #146
    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.
  • CeetixCeetix Membre
    23:13 modifié #147
    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.

    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.
  • schlumschlum Membre
    23:13 modifié #148
    Oui, je vois, je sais ce qu'est un tableau de tableaux  :P  
    Je ne vois juste pas le problème qu'il y a à  le créer...
  • CeetixCeetix Membre
    23:13 modifié #149
    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&#39;est pas égal au nombre d&#39;arcs du graphe */<br />	while(j != graph-&gt;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&nbsp; (car l commence à  un cran inférieur) */<br />		if(l != ((graph-&gt;n)-1))<br />		{<br /><br />			/* tant que j est différent du dernier élément de la liste et qu&#39;il est différent du nombre d&#39;arc */<br />			while (j !=graph-&gt;tete[l+1] &amp;&amp; j!= graph-&gt;m) <br />			{<br />				/* on retire notre sommet d&#39;arrivée */<br />				objet2 = [RectArray objectAtIndex:(graph-&gt;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-&gt;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.
  • schlumschlum Membre
    23:13 modifié #150
    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];
  • CeetixCeetix Membre
    23:13 modifié #151
    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 ...
    arc.jpg
    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 ... :'(
Connectez-vous ou Inscrivez-vous pour répondre.