Curlygoth Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 moi j'ai écrit ça : Quote Sub TEST_POLYLIGNE() Dim returnobj As AcadLWPolyline Dim points() As Double Nombre_de_POINTS = 10000 ReDim Preserve points(Nombre_de_POINTS * 2 - 1) For i = 0 To UBound(points) points(i) = RAMDON 'générer des coordonnées aléatoires Next i Set returnobj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points) returnobj.Update '''Pollyligne aléatoire tracé Dim T As Single T = Timer ''Top chrono ! retcoord = returnobj.Coordinates Dim POINT(0 To 1) As Double Dim LISTPOINT() As Variant NOMBREPOINT = (UBound(retcoord) + 1) / 2 ReDim Preserve LISTPOINT(NOMBREPOINT) k = LBound(retcoord) L = UBound(retcoord) For B = k To L Step 2 POINT(0) = retcoord(B) POINT(1) = retcoord(B + 1) LISTPOINT(cpt) = POINT cpt = cpt + 1 Next B '''La liste de point est remplit je stop le chrono Dim strduree As String strduree = Format(Timer - T, "00:00:00.00") MsgBox strduree End Sub Function RAMDON() RAMDON = Rnd() * 100000 End Function ça me fait tout inférieur à 1s... c'est bizzarre... j'ai oublié quelque chose ? Mon site Web (en cours de construction) : Site DA-CODE de @didier
(gile) Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 Il faut bien penser à prendre un peu de recul avec ces benchmarks (et en faire plusieurs pour faire une moyenne). Le benchmark double le nombre d'itérations jusqu'à ce que, pour la plus rapide des routine, on dépasse les 1000 millisecondes. Donc, si on considère les résultats avec la polyligne de 10 000 sommets, par exemple, on a 32 itérations. Autrement dit les résultats doivent être divisé par 32 pour avoir le temps moyen pour une exécution, soit, pour les 3 premiers 43, 44 et 50 (la différence entre le premier et le troisième est de moins de 10 millisecondes). D'après les résultats en .NET que donne Olivier, pour la même polyligne de 10000 sommets, on est autour 0.4 millisecondes, soit 100 fois plus rapide que les meilleurs LISP... @Curlygoth On parle de millisecondes, et pour avoir un chiffre conséquent, on répète le traitement plusieurs fois. Pour une polyligne de 10000 points il faut au moins 32 ou 64 itérations. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Curlygoth Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 OK interréssant ! Donc moyenne pour 128 itérations d'une polyligne de 10.000 sommets (car je l'ai fait plusieurs fois) 1170 milisecond / 9.14 milisecond Attention je pense que le vba tiens compte aussi de la config pc (j'ai rééllement une bonne config, je le ferais sur mon pc perso pour comparé ^^) 292 millisecond pour 32 itération sur polyligne de 10.000 sommets Sub TEST_POLYLIGNE() Dim returnobj As AcadLWPolyline Dim points() As Double Nombre_de_POINTS = 10000 ReDim Preserve points(Nombre_de_POINTS * 2 - 1) Dim T As Single T = Timer For ite = 1 To 100 cpt = 0 For i = 0 To UBound(points) points(i) = RAMDON Next i Set returnobj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points) returnobj.Update retcoord = returnobj.Coordinates Dim POINT(0 To 1) As Double Dim LISTPOINT() As Variant NOMBREPOINT = (UBound(retcoord) + 1) / 2 ReDim Preserve LISTPOINT(NOMBREPOINT) k = LBound(retcoord) L = UBound(retcoord) For B = k To L Step 2 POINT(0) = retcoord(B) POINT(1) = retcoord(B + 1) LISTPOINT(cpt) = POINT cpt = cpt + 1 Next B returnobj.Delete Next ite Dim strduree As String strduree = Format(Timer - T, "00:00:00.00") MsgBox strduree End Sub Mon site Web (en cours de construction) : Site DA-CODE de @didier
(gile) Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 J'ai modifié la commande TEST pour qu'elle renvoie un résultat similaire au Benchmark de Mickael Puckket. [CommandMethod("TEST")] public static void Test() { var ed = AcAp.DocumentManager.MdiActiveDocument.Editor; var entOpts = new PromptEntityOptions("\nSélectionnez une polyligne: "); entOpts.SetRejectMessage("\nL'objet séléctionné n'est pas une polyligne."); entOpts.AddAllowedClass(typeof(Polyline), true); var entRes = ed.GetEntity(entOpts); if (entRes.Status != PromptStatus.OK) return; var id = entRes.ObjectId; long elapsedMilliseconds = 0; int iterations = 1; while (elapsedMilliseconds < 1000) { var sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (int i = 0; i < iterations; i++) { GetPlinePoints(id); } sw.Stop(); elapsedMilliseconds += sw.ElapsedMilliseconds; iterations *= 2; } ed.WriteMessage($"\nElapsed milliseconds {elapsedMilliseconds} for {iterations} iterations"); } Un exemple de résultats avec la polyligne 10000 points : TEST Sélectionnez une polyligne: Elapsed milliseconds 1794 for 4096 iterations Commande: TEST Sélectionnez une polyligne: Elapsed milliseconds 1806 for 4096 iterations Commande: TEST Sélectionnez une polyligne: Elapsed milliseconds 1795 for 4096 iterations Commande: TEST Sélectionnez une polyligne: Elapsed milliseconds 1805 for 4096 iterations GetPointListChallenge.zip Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 @Luna ta routine 'get-pt-list-curve' comme celle de @VDH-Bruno renvoie un sommet de trop en cas polyligne fermée (le premier sommet ajouté à la fin de la liste). 'vlax-curve-getPolylineCoordinates' traite correctement les polylignes fermées, ceci explique pourquoi il est légèrement moins rapide dans les benchmark. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Luna Posté(e) le 30 avril 2021 Auteur Posté(e) le 30 avril 2021 Une polyligne fermée n'est-elle pas justement une polyligne dont le sommet de début et le sommet de fin sont strictement identiques ? Auquel cas il me paraît plus que naturel de conserver ce dernier point dans la liste pour mieux illustrer les segments visibles de la polyligne. Ainsi fait, on peut travailler avec les segments si on le souhaite et pour cela, on a besoin du dernier sommet (même s'il s'agit du sommet de début) car on peut spécifier un bulge pour ce segment également... Ou alors je n'ai pas bien saisi ta remarque... >w< Bisous, Luna
(gile) Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 30 minutes ago, Luna said: Une polyligne fermée n'est-elle pas justement une polyligne dont le sommet de début et le sommet de fin sont strictement identiques ? Non, une polyligne fermée est une polyligne qui a sa propriété Closed égale à true ou le code binaire 1 dans son code de groupe DXF 70. C'est ce qui la différencie d'une polyligne qui a le dernier sommet confondu avec le premier . Je voulais juste dire qu'avant de couper les cheveux en quatre avec de histoires de quelques millisecondes de différence entre telle et telle routine, il faut d'abord qu'elle renvoient des résultats similaires si ce n'est identiques. Toutes les autres routines qui utilisent la liste DXF ou la propriété Coordinates renvoient les sommets de la polyligne sans en ajouter un si elle est fermée. On peut préférer récupérer des segments comme le fait zebulon_ mais ce n'est plus la même chose et ce n'est pas comparable en terme de rapidité d'exécution (idem pour la routine bonuscad qui effectue une opération de plus pour chaque sommet en le convertissant du SCO vers le SCG). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 30 minutes ago, Luna said: on peut travailler avec les segments si on le souhaite cela dépend effectivement de ce qu'on veut en faire de cette liste. si on à pas besoin des courbures cela ne sert à rien d'avoir le 1er point en derniers. il suffit de la clore. par contre avec les courbures, il faut le derniers segment. Gile vient de me devancer de quelque secondes et aussi des fonctions qui traite la liste en aval. si il faut une autre fonction pour formater la liste, c'est qu'on c'est trompé de méthode pour construire cette dernière. https://github.com/Fraiddd
zebulon_ Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 8 hours ago, Curlygoth said: Tellement de méthodes pour un même résultat ! c'est très instructif ! Je gères les courbes différemment mais je pense que je vais m'inspirer de la méthode de Zebulon ! d'ailleurs pour ceux qui comme moi ne connaissais ce "mot" (bulge) on le retrouve sur le site de Didier ici : https://www.da-code.fr/bulge-theorie/ Donc merci @zebulon_ & Merci @didier je me suis largement inspiré de ceci, qui est très instructif également par rapport aux bulges, si on maitrise un peu l'anglais Amitiés Vincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Luna Posté(e) le 30 avril 2021 Auteur Posté(e) le 30 avril 2021 Vui j'ai également connu et apprivoisé les bulges via ce cours, mais en effet il faut pratiquer un peu l'anglais :3 Le cours de didier est certainement plus abordable pour tout le monde 😜 Bisous, Luna
Curlygoth Posté(e) le 30 avril 2021 Posté(e) le 30 avril 2021 Ok merci beaucoup ! J'adore les maths, donc ça va aller !! J'ai trouvé l’équivalent pour le VBA c'est nikel ! je vais revoir certain de mes codes pour avoir des arcs plus jolie sur mes polylignes ^^ Mon site Web (en cours de construction) : Site DA-CODE de @didier
didier Posté(e) le 1 mai 2021 Posté(e) le 1 mai 2021 Bonjour Je ne pense pas qu'il y ait plus d'information sur AfraLisp (ceci dit sans forfanterie ou vantardise bien sûr). Ça ne retire aucune qualité à ce site précurseur pour bien des apprentis il y a quelques années Je vous remercie de me faire part d'éventuels manques sur da-code, je me ferai, le cas échéant, un devoir de le mettre à jour pour les francophones d'aujourd'hui. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Curlygoth Posté(e) le 1 mai 2021 Posté(e) le 1 mai 2021 Quote Je vous remercie de me faire part d'éventuels manques sur da-code, je t'ai envoyé un e-mail j'ai vu que tu avais écris sur du VBA ! Je t'ai laissé mon numero de téléphone si besoin Mon site Web (en cours de construction) : Site DA-CODE de @didier
Fraid Posté(e) le 2 mai 2021 Posté(e) le 2 mai 2021 On 30/04/2021 at 15:48, (gile) said: une polyligne fermée est une polyligne qui a sa propriété Closed égale à true ou le code binaire 1 dans son code de groupe DXF 70. C'est ce qui la différencie d'une polyligne qui a le dernier sommet confondu avec le premier On 30/04/2021 at 15:24, Luna said: Une polyligne fermée n'est-elle pas justement une polyligne dont le sommet de début et le sommet de fin sont strictement identiques ? Je revient sur ce détail. Vous avez tout les deux raisons. Ce qui fait que les fonctions de test "Close" ne sont pas valables puisque qu'une polyligne peut être fermée sans avoir la propriété "closed". Pour savoir si une polyligne est fermée (close ou pas) (if (vl-every '= (vlax-curve-getStartPoint obj)(vlax-curve-getEndPoint obj)) ... Cela vient essentiellement d'une erreur du dessinateur. Quand on finis une polyligne censée être fermée, on a tendance à cliquer sur le derniers point et echap -> polyligne fermée non close. plutôt que faire C puis entrée après l'avant derniers point -> polyligne fermée close. Pour "réparer" les polylignes fermées non closes (defun closepolclose nil (vlax-for obj (vla-get-modelspace(vla-get-activedocument (vlax-get-acad-object))) (and (= (vla-get-ObjectName obj) "AcDbPolyline") (vl-every '= (vlax-curve-getStartPoint obj)(vlax-curve-getEndPoint obj)) (vla-put-Closed obj :vlax-true) ) ) ) https://github.com/Fraiddd
zebulon_ Posté(e) le 4 mai 2021 Posté(e) le 4 mai 2021 On 01/05/2021 at 20:08, didier said: Bonjour Je ne pense pas qu'il y ait plus d'information sur AfraLisp (ceci dit sans forfanterie ou vantardise bien sûr). Ça ne retire aucune qualité à ce site précurseur pour bien des apprentis il y a quelques années Je vous remercie de me faire part d'éventuels manques sur da-code, je me ferai, le cas échéant, un devoir de le mettre à jour pour les francophones d'aujourd'hui. Amicalement Bonjour, il n'y a effectivement pas plus à propos des bulges. C'est simplement là que j'ai trouvé les informations quand j'en ai eu besoin, à une époque à laquelle da-code n'était pas encore né. Par ailleurs et comme je le disais en amont, j'ai bien aimé la façon d'exploiter les polylignes, sous forme de segments, qu'on trouve sur AfraLisp. Amitiés Vincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant