Aller au contenu

[Challenge] Get-pt-list


Luna

Messages recommandés

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 ?

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

@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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)
      )
  )
)

 

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité