Gambas France BETA


Pas de compte ? Incription

Ligne de rondsdans une drawarea

Ce sujet est résolu.

12
AuteurMessages
spheris#1 Posté le 20/1/2012 à 18:46:40
Bonsoir,
J'ai realisé un logiciel pour creer des typons d'electronique.

page projet ici : http://gambaslinux.eg2.fr/articles.php?lng=fr&pg=1989

Il est bientôt fonctionnel mais je suis confronté à quelques petits soucis de mise au point.

pour dessiner les pistes, j'utilise la fonction draw.circle puis je l'insere dans une boucle for next.

Avec ce procédé, je trace des horizontales et verticale sans souci.
Comment puis-je tracer des diagonales ?

le code pour horizontal paar exemple:

1
2
3
FOR a = coordy1 TO mouse.y
Draw.Circle(X1, a, taillepiste)
NEXT

Merci pour votre réponse
Prokopy#2 Posté le 21/1/2012 à 16:31:55
Kinder PinguiSalut spheris,

Pourquoi n'utilises-tu pas tout simplement la fonction Draw.Line() pour dessiner tes pistes ?
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
spheris#3 Posté le 21/1/2012 à 20:54:56
A) Je ne trouve pas comment régler l'epaisseur des lignes. Si tu peux me le dire alors c top !
B) regarde ce screenshot :
Les bouts de la ligne sont arrondis :


Prokopy#4 Posté le 21/1/2012 à 23:58:43
Kinder PinguiAvec Draw il n'y a pas de moyen de faire des angles arrondis (enfin pas automatiquement).
Pour l'épaisseur des lignes utilise la propriété LineWidth :

1
2
Draw.LineWidth = 20 'Épaisseur de 20 pixels
Draw.Line(X, Y, X2, Y2)

;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
jeanyvon#5 Posté le 22/1/2012 à 10:23:49
Gambas? Ma! Et gustoEt peut être rajouter une fin de ligne ronde!
Vieillir? On peut retarder mais pas y échapper!
gambix#6 Posté le 22/1/2012 à 16:58:14
Faire simple !C'est pas très clean ton truc la :/

Tu dois dessiner des lignes ou des rect pour les lignes droites... et des cercles en bout pour l'arrondit



Moins de texte dans une signature c'est agrandir son espace.
spheris#7 Posté le 22/1/2012 à 21:29:50
Merci prokopy.
Derniere chose. comment comme paint tracer une ligne en maintenant la souris appuyé?
j'ai retrouvé le post, mis tracking a true et pourtant j'ai plein de lignes..
Comprends pas...

le post : http://gambasforge.org/sujet-79-dessiner-une-ligne-dans-drawarea-avec-la-souris-page-1.html#m1

J'ai mis le meme code avec tracking a true et cached a true.

voila ce que cela donne :



Prokopy#8 Posté le 22/1/2012 à 21:38:23
Kinder PinguiIl ne faut pas mettre cached. Sinon les anciens traits sont sauvegardés. :)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
spheris#9 Posté le 23/1/2012 à 08:48:21
Prokopy,
Idem avec ou sans Cached, j'ai des traits aussi.
;)
Prokopy#10 Posté le 23/1/2012 à 20:34:14
Kinder PinguiEn fait le problème c'est que tu ne fais qu'ajouter des lignes, mais que jamais la DrawArea n'est rafraîchie (donc effacée).
Il faudrait que tu fasses comme cela :

Dans une Picture, stocker l'image de fond (les petits pointillés) :

1
2
3
4
5
6
7
PRIVATE PictureFond AS Picture

PUBLIC SUB Form_Open()

PictureFond = NEW Picture(DrawingArea1.Width, DrawingArea1.Height)

END


Tu ne la redessineras que lorsque le DrawArea est redimensionné.

Ensuite, crée une classe Piste par exemple (tu ajouteras d'autres classes de composants électroniques), dans laquelle tu stockeras les données de la piste et la routine de dessin :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
' Gambas class file

PUBLIC X1 AS INTEGER 'Ces coordonnées sont relatives à la grille
PUBLIC Y1 AS INTEGER 'Ce sont les coordonnées de début et de fin de la piste
PUBLIC X2 AS INTEGER
PUBLIC Y2 AS INTEGER

PUBLIC SUB Draw() 'Dessinne l'image

Draw.LineWidth = mcomponent.taillepiste * FMain.facteur
Draw.FillColor = FMain.lcouche.Background
Draw.Foreground = FMain.lcouche.Background
Draw.Line(X1 * FMain.zoom, Y1 * FMain.zoom, X2 * FMain.zoom, Y2 * FMain.zoom)

END


Ensuite, dans ton FMain tu ajoutes un tableau qui va contenir toutes les pistes ajoutées, et une variable faisant référence à la piste en cours de placement :

1
2
3
PRIVATE PisteEnPlacement AS Piste

PRIVATE ListePistes AS NEW Object[]


Maintenant, la magie opère. :)

Dans DrawArea_MouseDown(), on crée une nouvelle piste, on définit les premières coordonnés, et on l'ajoute :

1
2
3
4
5
6
PisteEnPlacement = NEW Piste 'Nouvelle Piste
PisteEnPlacement.X1 = Mouse.X / zoom
PisteEnPlacement.Y1 = Mouse.Y / zoom
PisteEnPlacement.X2 = PisteEnPlacement.X1
PisteEnPlacement.Y2 = PisteEnPlacement.Y1
ListePistes.Add(PisteEnPlacement)


Je te laisse mettre ça au bon endroit dans le select Case. ;)

Maintenant, on s'occupe de MouseMove(). Si une piste est en placement, on définit les nouvelles coordonnées et on rafraîchit le DrawArea :

1
2
3
4
5
6
7
8
9
IF mcomponent.famille = 1 AND Mouse.Left AND PisteEnPlacement <> NULL THEN 'Si une piste est en placement
lbx.Text = CInt(Mouse.X / zoom) * zoom
lby.Text = CInt(Mouse.y / zoom) * zoom
PisteEnPlacement.X2 = Mouse.X / zoom
PisteEnPlacement.Y2 = Mouse.Y / zoom
DrawingArea1.Refresh()
ELSE
'Autres
ENDIF


Puis on passe à MouseUp(). C'est simple, il suffit de dire qu'il n'y a plus de piste en placement :

1
2
3
4
5
6
7
8
PUBLIC SUB DrawingArea1_MouseUp()

IF PisteEnPlacement.X1 = PisteEnPlacement.X2 AND PisteEnPlacement.Y1 = PisteEnPlacement.Y2 'La piste est nulle, on l'enlève
ListePistes.Remove(PisteEnPlacement)
ENDIF
PisteEnPlacement = NULL 'La piste est placée

END


Et enfin pour finir, on s'occupe de DrawArea_Draw() :

1
2
3
4
5
6
7
8
9
PUBLIC SUB DrawingArea1_Draw()

DIM tPiste AS Piste
Draw.Picture(PictureFond, 0, 0) 'On dessine le fond
FOR EACH tPiste IN ListePistes
tPiste.Draw()
NEXT

END


Note que pour le fond tu dois faire Draw.Begin(PictureFond) avant de dessinner la grille bien sûr. ;)

Et voilà, c'est tout. J'ai essayé directement dans ton code et ça marche très bien. Toutes les pistes sont correctement affichées et mémorisées.

Tu n'auras plus qu'à accéder au tableau pour déplacer les pistes, les supprimer ... etc. ;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
gambix#11 Posté le 24/1/2012 à 20:50:20
Faire simple !spheris tu devrais regarder ça :

http://gambasforge.org/code-42-dessin-vectoriel-utilisation-du-modele-donneesvues.html
http://gambasforge.org/code-48-demonstration-de-dessin-vectoriel.html
Moins de texte dans une signature c'est agrandir son espace.
spheris#12 Posté le 25/1/2012 à 11:47:18
Malheuresement gambix, ton exemple est en GB3 qui n'est pas présent sur mon ordi.
Merci quand même.

Prokopy, Ca marche nickel !
Quelques ptites adaptations pour remodeler tout ca et je le mets en ligne.
Merci pour votre aide.
;)
gambix#13 Posté le 25/1/2012 à 12:25:42
Faire simple !Et tu fais quoi encore avec un gb2 ???

gb3 est sorti !
Moins de texte dans une signature c'est agrandir son espace.
spheris#14 Posté le 25/1/2012 à 17:37:15
Comme des centaines de gens dans le monde qui restent sur unbuntu, je programme.
;)
gambix#15 Posté le 25/1/2012 à 21:27:26
Faire simple !ya pas de paquet gb3 ?
Moins de texte dans une signature c'est agrandir son espace.
12