VBA : Ellipse (et plus si affinité...)
Bonjour,
le code est sympa ! C'est vrai que de calculer les différentes coordonnées du modèle pour faire les test après c'est super !
Je vais travailler sur ce point au niveau de mon code : toujours essayer de mutualiser les codes et d'éviter les répétition de calcul !
Je n'ai toujours pas compris l'histoire de la réduction...
Par contre avec une taille de 60 par exemple, on perd la symétrie de la MAP...
@ bientôt
LouReeD
re,
bon, cette reduction est supprimée, LRD ne change pas de dimensions (la macro est maintenant un petit peu plus vite
J'ai juste copié vos changements pour le "textrange", mais je suppose que j'ai pas tout fait, parce que ce n'est pas bien centré
re,
maintenant avec les coordinates du tableau "tData" et ...
PS. le texte dans le hexa, je suppose que LouReeD résoudra ce problème ...
Bonsoir,
un fichier avec remplissage d'un tableau de données comprenant :
- le nom du Shape sur 6 digits
- le Left
- le Top
- l'IDLC correspondant à sa position sur la MAP.
- numéro de ligne de la MAP
- numéro de colonne de la MAP
- IDLC du shape théorique au Nord Ouest (NO)
- IDLC du shape théorique au Nord Est (NE)
- IDLC du shape théorique au Est (E)
- IDLC du shape théorique au Sud Est (SE)
- IDLC du shape théorique au Sud Ouest (SO)
- IDLC du shape théorique au Ouest (O)
Comme cela lorsqu'un shape est cliqué, grâce à son nom on connait ses voisins.
Le fichier :
En effet il est difficile de connaitre les voisin d'un shape, on peut essayer de jouer avec les CellTopLeft et autre mais c'est lourd. Le fait d'avoir un tableau, on a les réponses à nos questions.
@ bientôt
LouReeD
Je suis bien moins réactif que toi parce que je travaillais sur une des propositions de Bart, qui est très rapide malheureusement j'ai perdu la symétrie et je patauge un peu...
Ta dernière proposition : Oui bien sûr, c'est ce que j'avais compris. Tu maitrises toujours parfaitement la symétrie, mais le temps de construction est rédhibitoire !
Ça m'a malgré tout permis de me rendre compte que de travailler avec un zoom masquait les défauts de construction.
Une fois le Tableau construit n'irait-on pas plus vite en lisant seulement le tableau mémorisé et en construisant en conséquence ?
En dehors de cette période de réflexion ou il faut que je trouve une disposition de jeu optimale, je n'ai pas besoin de variables d'ajustement. Donc dès qu'on aura un tableau de coordonnées acceptable avec son niveau de zoom, ce qui m'intéresse dans ta solution c'est la possibilité de construire les hexagones en lisant simplement les coordonnées enregistrées. YORAPUKA tirer au sort le caption de chaque hexa et le tour sera joué.
Cela faciliterait certainement la construction (d'autant qu'un ou plusieurs espaces libres au centre ne seraient pas pour me déplaire) car j'aurais besoin d'un espace libre au centre plus ou moins rectangulaire voir modèle.
En revanche connaitre les coordonnées des voisins ne m'intéresse pas particulièrement (sauf la première fois quand on aura choisi une Ellipse et un format d'Hex définitifs). Par contre ce qui m'intéressera dans ce tableau sera de connaitre (Leurs nombres de voisins, le N° iD) et la valeur lettre de chaque voisin). Ainsi on pourra avant le dessin tirez au sort les lettre dans le tableau puis d'afficher chaque Hexa.
Il y aura enfin une dernière colonne (Tag) qui permettra de décoder TOUSSA selon le nombre de voisins. (de 2 à 6) mais ça je sais faire...
Ça risque d'être le plus chiant mais je me réserve de le faire au besoin par la lecture du Tableau
Confection du Tag : Chaque côté d'un Hex à une Valeur : 1 pour le coté vertical gauche, puis dans le sens des aiguilles d'une montre 2,4, 8 16,32 ensuite on travaille selon les sommes de contrôle. Un Hex qui aurait un Tag de 3 à 2 voisins, un tag de 63 c'est 6 voisins... L'avantage de cette méthode c'est qu'elle donne en même temps la position relative de chaque voisin....
Malheureusement ce dont je ne suis pas encore tout à fait certain (parce que vous travaillez trop vite !) c'est qu'on peut difficilement travailler avec des Shapes : Elles n'ont malheureusement aucune propriété.
Dans le fichier joint je n'ai pas finaliser la suppression des Hexagones centraux et je n'ai pas encore tenté la reconstruction à partir de la seule table de données. Par contre j'ai mémorisé la position et le dimension de l'ellipse dans le code. Je pense qu'on peut également figer le zoom à 90 et la taille des Hex à 47,5…
A+
Bonsoir,
Attention ne vous y tromper pas, je ne demande pas d'utiliser "mon application" elle ne sert que de support à des idées.
La finalité est bien de construire une MAP avec des hexagones qui "survole" une ellipse, avec une taille ajustée et une symétrie dans le placement. Ce que je ne comprend pas c'est l'idée de travailler avec un zoom : si vous le mettez à 90% alors pourquoi ne pas réduire la taille des shapes ?
Ensuite, une fois le tableaux de la MAP créer, si ces données ne doivent plus bouger, il suffit de supprimer les lignes de codes qui les supprime et modifie, et modifier le code afin que les shapes soient créés avec ces données et non plus "par mathématique", car une fois créés ces shapes peuvent être invisibles et rendu visible en fonction de votre jeu...
Pour ce qui est de la lenteur, vu que c'est pour une création "figée" il suffit d'attendre une fois et après tout est bon.
Pour ce qui est de la symétrie de BsAlv, il ne calcul pas de "décalage" vertical, j'ai l'impression qu'il part du Top de l'ellipse, hors il ne faut pas !
il faut trouver le décalage en vertical qui fait en sort que la ligne centrale soit centrée sur l'axe horizontal de l'ellipse, c'est pourquoi dans mon code je part systématiquement avec un nombre de ligne impair c'est plus simple pour calculer ce décalage, mais c'est surtout nécessaire car dès qu'il y a un nombre de shape pair en hauteur, du fait du pavage, il y a un décalage, du coup avec ce décalage horizontal de la demi largeur des pavés, certains sont dans le cercle et d'autres non !
Il faut donc faire comme j'ai fait, un DL et un DV !
' on calcule le nombre de shape en largeur par rapport à la largeur de Gc
NbL = Gc.Width / L
' on calcul le décalage harizontal afin de centrer la MAP sur Gc
DL = (Gc.Width - (NbL * L)) / 2
' on calcule le nombre de shape en hauteur en sachant qu'il y a un décalage de 0.25 vers le haut à chaque colonne
' c'est comme ci que le shape faisait 0.75 !
NbH = Gc.Height / (H * 3 / 4)
' pour le centrage il faut un nombre de ligne impaire
If NbH Mod 2 = 0 Then NbH = NbH - 1
DH = (Gc.Height / 2) - ((((NbH - 1) / 2) * (H * 3 / 4)) + (H * 1 / 2))Pour info la lenteur est essentiellement du au remplissage du tableau, retirer cette "option" en mettant en commentaire et sur le fichier fourni j'arrive à 0.8 secondes :
Le remplissage du tableau se faisant cellule par cellule je multiplie (les 6 cellules par lignes + la création de ligne) x (342 shapes) x (temps d'accès feuille) ce qui explique l'extrême lenteur du code.
Mais la technique d'un tableau VBA, puis injecter ce dernier en une fois sur la feuille vous connaissez, non ?
Voilà pour mes réflexions...
@ bientôt
LouReeD
Oui, oui tout à fait d'accord je n'ai pas encore eu le temps de tester la construction à partir du tableau. Mais je compte bien le faire ! Pour le zoom, Je n'en ai pas besoin. Mais ton dernier fichier apparemment était zoomé donc j'ai joué le jeu puis j'ai essayé de le recaller dans mes normes de départ c'est là que j'ai vu de petits défauts d'affichages. Mais ces défauts n'étant pas obligatoires Je compte bien revenir au fichier d'origine. Peut être en diminuant d'un poil mon ovale mais là ça me va très bien. Tu peux te reposer maintenant.
D'ailleurs ça me permettra de baisser le pied un peu... Le we arrive je vais faire un peu le tour de la famille !
A+
re,
vous aviez raison, si le nombre de lignes horizontales étaient paires, il y avait un décalage. Maintenant je prends la ligne centrale (rouge) comme référence (je le mets au dessus des cellules après l'exécution de la macro) pour le centre des hexagones. Donc tous les coordinates Y des centres des hexagones sont à une distance un multiple de la hauteur du hexagone *.75 de cette ligne rouge. A droite, vous voyez les coordinates Y, le premier chiffre est le vrai Y, le 2eme est la distance vers cet axe central.
PS. C'est bien possible que l'ellipse s'est déplacé un peu depuis le début, c'est peut-être pourquoi les hexagones "Galopin" ne sont pas bien centrés
Bonsoir,
Pour info mes temps d'exécutions c'était suppression des shapes et des données du tableau compris... La création des shapes dans le cercle centré en hauteur et largeur prend 0,42 s !
Et j'ai 360 shapes alors que BsAlv, vous en avez 358, petite erreur de symétrie mais je ne vois pas de quoi elle peut venir :
cercle identique, taille demandée de 47,5... Sur ma machine il manque celui en vert et celui en symétrie en bas ce qui correspond aux deux manquants :
Ce peut être due à quoi ? J'ai mis l'épaisseur du trait de hexagone à 0 mais cela ne change rien... Une idée ?
Et pour l'histoire des défauts suite au zoom là je suis à 400%
@ bientôt
LouReeD
re, @LouReeD, elle est où votre dernière macro ? J'ai pris le dernier fichier, mais je suppose que vous avez modifié encore des choses pour accèlerer tout. Maintenant moi, je suis aussi bien symetrique sur les 2 axes et j'ai encore un écart de 1 hexa, mais je ne l'ai pas encore trouvé. Mais c'est pour cette après-midi. Quand je regarde les chiffres des colonnes CA:CR de Prm, cela se trouve dans la première ligne ??? Bizarre.
Bonjour,
Oui elle est très bien aussi celle là me convient parfaitement, c'est exactement le même résultat que moi... en 10 fois plus rapide ! Et parfaitement symétrique. Sauf que c'est le bordel pour y retrouver ses petits entre les bribes de macros à tout le monde, j'en ai encore pour toute la nuit à plancher dessus pour la synthèse...
J'ai définitivement finalisé la macro de construction ainsi :
With ActiveSheet.Shapes("PJeu")
.Top = 8
.Left = 8
.Width = 1190
.Height = 622
End With
Et la [Taille] à 47
Je vais essayer de la modifier en pompant ton code...
J'ai un petit problème de Protection. Les macros fonctionnent tant qu'on ne protège pas.
Si on protège la feuille, la macro bloque sur sh.Duplicate !
Quand à On Error Goto (ou Resume Next) il a carrément déclaré forfait... Ça fait plusieurs fois maintenant que je suis obligé de virer mes gestionnaire d'erreurs... Une idée ?
A+
BsAlv,
je n'ai rien modifié mais pour comparer vos 0.44 secondes pour créer les shapes, j'ai seulement déplacer mon "Tempo = Timer" après la suppression des shapes existant sur la feuille et après la suppression des lignes de données du tableau TabSRC afin de comparer avec votre "t1". Bon sinon mon code est en dessous de la seconde malgré tout...
Et comme je disais, en remplissant un tableau sous VBA puis injection, cela devrait être rapide !
Pour ce qui est de vos shapes manquants je ne sait quoi dire, j'ai copié collé votre ellipse, mais de toutes façon la mienne était de la même taille, j'ai supprimé l'épaisseur du trait des hexagones... rien à faire il en manque deux... Le seul truc peut-être est un minuscule décalage en horizontal qui fait que les hexagones sont plus sur la droite de l'écran et du coup il y a deux shapes qui sortent de l'ellipse, je ne voit que ça.
@ bientôt
LouReeD
BsAlv je n'avais pas téléchargé la dernière version !
l'écart de 1 est une erreur de mon code, sur le Cpt=Cpt+1 je pense car si on réfléchie :
Une ligne horizontal des shapes qui sépare en deux zones identiques les autres shapes. Si chaque zone est impaire alors l'addition est paire, et si chaque zone est paire alors l'addition est paire, donc le nombre de shapes est impair ou pair en fonction du nombre de la ligne de symétrie, dans l'exemple la ligne est impaire : 27 donc votre compte de 359 doit être le bon par rapport au mien de 360 !
@ bientôt
LouReeD
re,
@LouReeD,
Je voudrais surtout montrer à Galopin comment procéder avec la protection (voir au debut de la macro "Init" (Drawingobjects:=false)
@Galopin, je regarderai demain matin à votre dernier fichier ... . Une pause.
Autant pour moi !
J'ai 28 shapes sur la ligne centrale ! Vous en avez 27 !
Mon ellipse sous Excel fait : 22,23 x 41,98, mes hexagones sous Excel font : 1.68 x 1,45
Votre ellipse sous Ecxel fait : 22,02 x 43,21, et vos hexagones sous Excel font : 1,66 x 1,49...
Mince il y a du zoom !
Mise à 100% : votre ellipse fait 22,23 x 41,98 ! Et vos shapes : 1.68 x 1,45
Je relance le code... 359 !
Bon j'ai vu que je n'utilisais pas "Pi", alors j'ai fait comme vous avec WorkSheetFunction, et je suis toujours à 361 !
La seule différence du coup c'est le fait que j'utilise des coordonnées "150" en X et en Y pour créer la shape modèle...
@ bientôt
LouReeD
Bonsoir,
Je suis en train de convertir Toussa en Mode Bart, mais je suis obligé de m'arrêter : Il distribue ses Shapes verticalement : Pour moi c'est inexploitable ! J'ai besoin que les Shapes soit crées horizontalement. Si ce n'est pas trop compliqué à faire supprimez également les lignes qui sont maintenant sans intéret.
Alors je serais preneur sinon je resterai sur le code de Lou qui me va bien également bien bien qu'un peu lent.
A noter qu'avec les mêmes dimensions et zoom à et 100 %
With ActiveSheet.Shapes("PJeu")
.Top = 8
.Left = 8
.Width = 1190
.Height = 622
End With
Et la [Taille] à 47Chez moi es résultat finaux sont très différents !
Bon Dimanche... Je ne suis pas pressé !
Bonsoir,
Mise en place des hexagones sur l'ellipse tout en empêchant de le faire sur une zone rectangulaire centrale (invisible), Avec attribution d'une action sur le clic, avec inscription d'une lettre au hasard dans les shapes, avec inscription dans le "Tag" et le remplissage du tableau de données par l'intermédiaire d'un tableau VBA :
Et "tout ceci" pour : 0.32 secondes !
@ bientôt
LouReeD
re,
je pense "on ne peut pas comparer des pommes et des oranges", donc je fais toutes les choses "commun" dans un module "commun" et le reste dans un module "BSALV" et un autre "LOUREED". Comme çà, tout sera égal
Bon, en temps, les 2 macros sont comparable pour la partie "ajouter les hexas", les 2 sont à 200-250 msec, mais le nombre de hexagones, pfffffffff, un écart de 7 et pourtant tout semble bien symètrique ...
Cette après-midi, je mets les 2, l'un dessus l'autre et transparant pour mieux comparer les 2
à droite du shape "Suppr", moi, j'ai 1+3+3+4+4 hexas, LouReeD a 2+2+2+4+4, donc pfffffffffffffffff

