Jump to content

[Challenge] Get-pt-list


Recommended Posts

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 ?

 

Link to post
Share on other 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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other 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

 

Link to post
Share on other 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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other 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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other 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

Link to post
Share on other 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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other 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.

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other 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)

Link to post
Share on other sites

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

Link to post
Share on other 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

Link to post
Share on other 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)
      )
  )
)

 

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other 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)

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...