COMPOSANT GRAPHIQUE DESSIN AVEC ANIMATION

cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010 - 13 août 2006 à 21:58
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013 - 12 oct. 2008 à 12:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39102-composant-graphique-dessin-avec-animation

blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
12 oct. 2008 à 12:28
Si tu veux gérer ton scintillement, il y a la technique dîte du buffering :

Dans l'évènement OnPaint (ou en surchargeant Paint;), au lieu de dessiner sur le Canvas du TControl ou de la TForm, dessine le sur un TBitmap séparé, et ensuite dessine le TBitmap... : plus de scintillement !
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
14 août 2006 à 19:31
une petite idée de d'une des procédures réentrente de gestion du GRAFCET

Function TDrawGrafcet.ActiveSuivante(NCol,NRow,PCol,PRow :Integer):boolean;
var test1,test2 :boolean ; x,y: integer;
Begin
result := false;
Case TableauType[NCol,NRow].Gtype of
0: // Rien
result := false;
1..2: // Etape
Begin
TableauType[NCol,NRow].AActive := true;
result := true;
End;
3: // Transition
Begin
if ValideTransition(NCol,NRow)and (TableauType[NCol,NRow -1].Gtype < 16 )then result := ActiveSuivante(NCol,NRow+1,NCol,NRow) else if
ValideTransition(NCol,NRow)and (TableauType[NCol,NRow -1].Gtype > 15 )and VerifierPrecedentes(NCol,NRow-1,NCol,NRow-1)then result := ActiveSuivante(NCol,NRow+1,NCol,NRow) else result := false;

End;
4: // Depart
Begin
For x := 0 to ColCount - 1 do
for y := 0 to RowCount- 1 do
If ((TableauType[x,y].Gtype = 1) or (TableauType[x,y].Gtype = 2)) and (TableauType[x,y].Numero = TableauType[NCol,NRow].Numero) then
Begin
ActiveSuivante(x,y,NCol,NRow);
Result := true;
Exit;
End;
End;
5: // Arrivée
Begin
result := true;
End;
6: // Coude droit bas
Begin
if NCol = PCol Then result := ActiveSuivante(NCol+1,NRow,NCol,NRow)else if NRow = PRow
then result := ActiveSuivante(NCol,NRow +1,NCol,NRow);
End;
7: // Coude gauche bas
Begin
if NCol = PCol Then result := ActiveSuivante(NCol-1,NRow,NCol,NRow)else if NRow = PRow
then result := ActiveSuivante(NCol,NRow+1,NCol,NRow);
End;
8: // Coude droit haut
Begin
if NCol = PCol Then result := ActiveSuivante(NCol+1,NRow,NCol,NRow)else if NRow = PRow
then result := ActiveSuivante(NCol,NRow -1,NCol,NRow);
End;
9: // Coude gauche haut
Begin
if NCol = PCol Then result := ActiveSuivante(NCol-1,NRow,NCol,NRow)else if NRow = PRow
then result := ActiveSuivante(NCol,NRow-1,NCol,NRow);
End;
10: // Horizontale haut
Begin
if NRow > PRow Then
Begin
Test1 := (ActiveSuivante(NCol-1,NRow,NCol,NRow));
Result := (ActiveSuivante(NCol+1,NRow,NCol,NRow)) or Test1;
End Else
If PCol > NCol Then
Begin
result := (ActiveSuivante(NCol-1,NRow,NCol,NRow));
End Else
If PCol < NCol Then
Begin
result := (ActiveSuivante(NCol+1,NRow,NCol,NRow));
End;
end;
11: // Horizontale bas
Begin
If PCol > NCol Then
Begin
Test1 := (ActiveSuivante(NCol-1,NRow,NCol,NRow));
Result := (ActiveSuivante(NCol,NRow+1,NCol,NRow)) or Test1;
End Else
If PCol < NCol Then
Begin
Test1 := (ActiveSuivante(NCol+1,NRow,NCol,NRow));
Result := (ActiveSuivante(NCol,NRow+1,NCol,NRow)) or Test1;
End;
end;
12,13: // Simple descente et Simple montée
Begin
if NRow > PRow Then result := ActiveSuivante(NCol,NRow+1,NCol,NRow)else if NRow < PRow
then result := ActiveSuivante(NCol,NRow-1,NCol,NRow);
End;

14: // Branche Horizontale
Begin
if NRow > PRow Then
Begin
Test1 := (ActiveSuivante(NCol,NRow+1,NCol,NRow));
Result := (ActiveSuivante(NCol+1,NRow,NCol,NRow)) or Test1;
End
Else If PCol > NCol Then Result := (ActiveSuivante(NCol,NRow +1,NCol,NRow));
end;
15: // Horizontale simple
Begin
if NCol > PCol Then result := ActiveSuivante(NCol+1,NRow,NCol,NRow)else if NCol < PCol
then result := ActiveSuivante(NCol -1 ,NRow,NCol,NRow);
End;
16: // Double Centre
Begin
if NRow > PRow Then
Begin
Test1 := (ActiveSuivante(NCol-1,NRow,NCol,NRow));
Test2 := (ActiveSuivante(NCol,NRow+1,NCol,NRow));
Result := (ActiveSuivante(NCol+1,NRow,NCol,NRow)) or Test1 or test2;
End Else
If PCol > NCol Then
Begin
test1 := (ActiveSuivante(NCol,NRow+1,NCol,NRow));
result := (ActiveSuivante(NCol-1,NRow,NCol,NRow))or test1;
End Else
If PCol < NCol Then
Begin
test1 := (ActiveSuivante(NCol,NRow+1,NCol,NRow));
result := (ActiveSuivante(NCol+1,NRow,NCol,NRow)) or test1;
End;
end;

17: // Double Haut
Begin
if NRow > PRow Then
Begin
Test1 := (ActiveSuivante(NCol-1,NRow,NCol,NRow));
Result := (ActiveSuivante(NCol+1,NRow,NCol,NRow)) or Test1;
End Else
If PCol > NCol Then
Begin
result := (ActiveSuivante(NCol-1,NRow,NCol,NRow));
End Else
If PCol < NCol Then
Begin
result := (ActiveSuivante(NCol+1,NRow,NCol,NRow));
End;
end;

18: // Double Bas
Begin
If PCol > NCol Then
Begin
Test1 := (ActiveSuivante(NCol-1,NRow,NCol,NRow));
result := (ActiveSuivante(NCol,NRow+1,NCol,NRow))or test1;
End Else
If PCol < NCol Then
Begin
Test1 := (ActiveSuivante(NCol+1,NRow,NCol,NRow));
result := (ActiveSuivante(NCol,NRow+1,NCol,NRow))or test1;
End;
end;

Else result := false; // Autre valeur
End; // fin case of
End;


le nombre de possibilité est assez importants d'autant que
VerifierPrecedentes est aussi réentrentes comme plusieurs autres .. a la fin le cerveau commence a fumer ...
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
14 août 2006 à 19:17
donc pour revenir a nos moutons ...
des composants type interrupteur, lampe, moteurcontacteur etc ... peuvent se placer sur la feuille et on les connecte avec des fils ! quand on ferme l'inter la lampe s'allume ... pas trop difficile a faire sauf si on veut vraiment gerer tous les cas .. alors la l'intelligence de fonctionnement sera pas facile a ecrire ...
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
14 août 2006 à 19:13
oui j'ai ca dans la tete aussi .. j'ai fait un editeur de schema avec des composants electriques mais c'est juste pour faire du dessin .. d'ailleur c'est lié a un editeur de circuits imprimé multicouches (sans routeur celui que j'avais ecris faisait du tricotage ) mais la dedans rien ne bouge tout seul ...
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 août 2006 à 19:04
OH!
ça m'a l'air pas mal du tout! source interressante car j'ai en projet un editeur de shema electrique interactif ... ça pourrait etre lié.
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
14 août 2006 à 15:31
pour avoir une idée le programme est la avec un exemple de GRAFCET

http://diva2440.free.fr/gp.rar
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
14 août 2006 à 15:22
Pour résumé le tapis (avec sa bouteille et ses capteur) est un objet entier le portique , le vérin, et la station d'embouteillage le sont aussi avec des propriétés et des méthodes .... ca se rapprocherai plus de automation studio (qu'elle prétention) si on pouvait les disposer et les assembler sur une page .. mais ce n'est pas le cas! car pas le but recherché ...
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
14 août 2006 à 15:17
rien a voir avec turbocad ! les composants sont uniques et ne peuvent pas etre construits ou assemblés en partie .. ils bougent de maniere définie avec des directions et amplitudes imposées ! ce n'est pas un logiciel de dessin 2D ni 3D ... mais simplement des exemples d'automatismes pouvant etre commandé par un GRAFCET type PL7 que l'on peut ecrire soit même dans un editeur en enchainant des etapes transitions .. peu d'interet pour faire bouger un simple verin ! mais ecrire un GRAFCET pour la station d'embouteillage permettant de remplir les bouteilles poser les bouchons et remplir la palette la ca devient interessant en automatisme ! creer un GRAFCET de tache et / ou de surveillance du niveaux des cuves .. la aussi c'est pas donné au vulgum pecus et c'est un apprentissage ! mais la discution n'est pas la ! l'exemple montre (peut etre maladroitement) comment dessiner afficher et mettre a jour en l'animant un dessin ...
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
14 août 2006 à 13:33
Salut,

aaah... encore quelque chose d'original !

un futur concurrent de Turbocad se prépare sur le site... ;)
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
13 août 2006 à 21:58
Seul le composant tapis a été mis dans le source ! si les autres vous semble interessant ca peux se faire mais le principe et toujours le même donc je vois pas trop l'interet ....surtout que c'est du spécifique pas forcément réutilisable !
Rejoignez-nous