Longueur totale en direct d'une polyligne

Longueur totale en direct d'une polyligne

bob_in
Contributor Contributor
9 398 Visites
18 Réponses
Message 1 sur 19

Longueur totale en direct d'une polyligne

bob_in
Contributor
Contributor

Bonjour à tous,

j'aimerais savoir si il est possible d'afficher à coté du curseur la longueur en direct d'une polyligne ?

Je vous remercie

0 J'aime
Solutions acceptées (1)
9 399 Visites
18 Réponses
Replies (18)
Message 2 sur 19

-didier-
Advisor
Advisor

Bonjour @bob_in 

 

Telle que la question est posée la réponse est OUI

Par contre on ne sait dans ce simple libellé si les solutions "lisp" seront acceptées

Car ça dépend de la version utilisée

Si c'est une LT il ne faut pas y compter

Dans le cas contraire on peut essayer quelque chose

 

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

DA

EESignature

0 J'aime
Message 3 sur 19

braudpat
Mentor
Mentor

Hello

 

+1 avec Didier !

 

En attendant voici deja une routine Lisp LONGT (de notre regrette Patrick_35) qui affiche sur l ecran texte (F2) le total lineaire de tous les objets selectionnes ... Cette routine traite "tous" les objets lineaires, voir ci-apres ...

 

(if (ssget '((0 . "LINE,POLYLINE,LWPOLYLINE,ARC,CIRCLE,ELLIPSE,SPLINE,MLINE,REGION,MPOLYGON")))

 

Et si tu modifies cette ligne dans le Lisp LONGT comme cela :

(if (ssget '((0 . "POLYLINE,LWPOLYLINE")))
Alors la routine LONGT ne traitera QUE les Polylignes !

 

Chargement par la commande clavier :   APPLOAD  < Entree >

Execution par la commande clavier :   LONGT  < Entree >

 

LA SANTE, Regards, Patrice

 

 

Patrice ( Supporting Troops ) - Autodesk Expert Elite
If you are happy with my answer please mark "Accept as Solution" and if very happy please give me a Kudos (Felicitations) - Thanks

Patrice BRAUD

EESignature


Message 4 sur 19

bob_in
Contributor
Contributor

Merci pour vos réponses à tous les deux,

par contre ça m'a l'air bien compliqué pour une chose qui me semble simple....

dans les paramètres du DYNMODE il n'y a rien qui puisse faire afficher la longueur totale en direct depuis le premier point de la polyligne ?

Je vous ai mis une image en pièce jointe pour être plus clair.

 

Cordialement

0 J'aime
Message 5 sur 19

ml-cad-121
Advocate
Advocate

Bonjour,

Vous pouvez aussi regarder du coté des propriété rapides (CTRL+MAJ+P) qui permettent l'affichage de différentes informations et notamment de la longueur d'une polyligne ou son aire.

0 J'aime
Message 6 sur 19

-didier-
Advisor
Advisor

Bonjour @bob_in 

 

Il serait intéressant de savoir autre chose, pas dit dans la question...

------------------------------------------------------------------

Est-ce que l'affichage doit être une simple "information"

Du genre : au survol d'une polyligne afficher sa longueur

------------------------------------------------------------------

Est-ce que cette "information" doit servir pendant le dessin de la polyligne

Du genre : arrêter le dessin de la polyligne quand une certaine longueur est atteinte

------------------------------------------------------------------

Suivant la réponse le traitement sera radicalement différent

 

Amicalement

 

Éternel débutant.. my site for learning : Programmer dans AutoCAD

DA

EESignature

0 J'aime
Message 7 sur 19

bob_in
Contributor
Contributor

Pour être plus précis, j'aimerais une "information" pendant la création d'une polyligne pour savoir où j'en suis au niveau du métré. 

0 J'aime
Message 8 sur 19

CADaSchtroumpf
Advisor
Advisor

 

Pour être plus précis, j'aimerais une "information" pendant la création d'une polyligne pour savoir où j'en suis au niveau du métré. 

 

Là je pense que tu n'auras à mon avis tu n'auras aucune réponse.

Seul les développeurs d'autosdesk pourraient mettre en place cette fonction.

Pourquoi?

Tant que cette demande et même avec des réacteurs, me semble pas possible tant que la commande n'est pas achevée. Aucune possibilité d'avoir des informations sur l’entité crée avant l'achèvement de celle ci même pour des programmeurs..

Si on me contre-dit tant mieux!

Message 9 sur 19

_Steven_
Mentor
Mentor

@bob_in  a écrit :

Pour être plus précis, j'aimerais une "information" pendant la création d'une polyligne pour savoir où j'en suis au niveau du métré. 


Salut,

 

Est-ce que tu connais par exemple la longueur totale de la polyligne que tu dois dessiner et que tu souhaites en fait savoir combien il te reste à dessiner avant d'arriver au total de ta polyligne à chaque fois que tu tire un segment?

Steven

Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton APPROUVER LA SOLUTION en dessous de la réponse.




« L’homme de bien n’exige pas de l’autre qu’il soit parfait, il l’aide à accomplir ce qu’il a en lui de meilleur. »
Lao Tseu
0 J'aime
Message 10 sur 19

braudpat
Mentor
Mentor

Hello

 

+1 avec @CADaSchtroumpf 

 

En fait a mon avis, le seul "autre" moyen serait un developpement en ARX avec un objet specifique ARX (du genre Polyligne) qui serait interprete en temps reel et controle par le developpement en ARX ... A la fin l'objet ARX en question serait converti en Polyligne ...

 

THE HEALTH (Stay Safe, Stay Home, Stay Live), Regards, Patrice (The Retired Old French EE Froggy)

 

Patrice ( Supporting Troops ) - Autodesk Expert Elite
If you are happy with my answer please mark "Accept as Solution" and if very happy please give me a Kudos (Felicitations) - Thanks

Patrice BRAUD

EESignature


0 J'aime
Message 11 sur 19

_gile
Consultant
Consultant

Salut,

Juste pour montrer à @CADaSchtroumpf  que c'est possible 😉

Un exemple basique (uniquement des segments droits) en .NET (il doit être possible de faire quelque chose en LISP avec grread).

 

Le code (C#) :

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

using AcAp = Autodesk.AutoCAD.ApplicationServices.Core.Application;
using AcGi = Autodesk.AutoCAD.GraphicsInterface;

namespace PolylineLengthJig
{
    public class Commands
    {
        [CommandMethod("PLEN")]
        public static void PlineLength()
        {
            var doc = AcAp.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;
            var ppr = ed.GetPoint("\nPremier point: ");
            if (ppr.Status != PromptStatus.OK)
                return;
            using (var tr = db.TransactionManager.StartTransaction())
            {
                using (var pline = new Polyline())
                {
                    pline.AddVertexAt(0, ppr.Value.Convert2d(new Plane()), 0.0, 0.0, 0.0);
                    pline.AddVertexAt(1, Point2d.Origin, 0.0, 0.0, 0.0);
                    pline.TransformBy(ed.CurrentUserCoordinateSystem);
                    var jig = new PlineLengthJig(pline);
                    while (true)
                    {
                        var pr = ed.Drag(jig);
                        // Echap => annulation
                        if (pr.Status == PromptStatus.Cancel)
                        {
                            return;
                        }
                        // clic gauche on ajoute un sommet
                        if (pr.Status == PromptStatus.OK)
                        {
                            pline.AddVertexAt(pline.NumberOfVertices, Point2d.Origin, 0.0, 0.0, 0.0);
                            db.TransactionManager.QueueForGraphicsFlush();
                        }
                        // clic droit, Entrée ou Espace, on supprime le dernier sommet 
                        // et on ajoute la polyligne à l'espace courant
                        else
                        {
                            pline.RemoveVertexAt(pline.NumberOfVertices - 1);
                            if (1 < pline.NumberOfVertices)
                            {
                                var cSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                                cSpace.AppendEntity(pline);
                                tr.AddNewlyCreatedDBObject(pline, true);
                            }
                            break;
                        }
                    }
                }
                tr.Commit();
            }
        }
    }

    class PlineLengthJig : DrawJig
    {
        Polyline pline;
        Point3d dragPt;
        Plane plane;

        public PlineLengthJig(Polyline pline)
        {
            this.pline = pline;
            plane = new Plane(Point3d.Origin, pline.Normal);
        }

        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            var options = new JigPromptPointOptions("\nPoint suivant: ");
            options.BasePoint = pline.GetPoint3dAt(pline.NumberOfVertices - 2);
            options.UseBasePoint = true;
            options.UserInputControls =
                UserInputControls.Accept3dCoordinates |
                UserInputControls.GovernedByOrthoMode |
                UserInputControls.GovernedByUCSDetect |
                UserInputControls.NullResponseAccepted;
            var result = prompts.AcquirePoint(options);
            if (result.Value.IsEqualTo(dragPt))
                return SamplerStatus.NoChange;
            dragPt = result.Value;
            return SamplerStatus.OK;
        }

        protected override bool WorldDraw(AcGi.WorldDraw draw)
        {
            var geo = draw.Geometry;
            if (geo != null)
            {
                pline.SetPointAt(pline.NumberOfVertices - 1, dragPt.Convert2d(plane));
                geo.Draw(pline);
                var height = (double)AcAp.GetSystemVariable("viewsize") / 50.0;
                geo.Text(dragPt, Vector3d.ZAxis, Vector3d.XAxis, height, 1.0, 0.0, pline.Length.ToString("0.00"));
            }
            return true;
        }
    }
}

 

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 12 sur 19

braudpat
Mentor
Mentor
Hello

YES en ARX tout est possible (voir Covadis par exemple qui représente qq millions de lignes en C++ ARX sans les commentaires)...

Et à priori "presque tout" est possible en Dotnet !

La Santé, Bye, Patrice
Patrice ( Supporting Troops ) - Autodesk Expert Elite
If you are happy with my answer please mark "Accept as Solution" and if very happy please give me a Kudos (Felicitations) - Thanks

Patrice BRAUD

EESignature


0 J'aime
Message 13 sur 19

_gile
Consultant
Consultant
Solution acceptée

 

Débloquer le zip joint et extraire PolylineLengthJig.dll.
Depuis AutoCAD, charger la DLL avec la commande NETLOAD et lancer la commande : PLEN.
 


Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 14 sur 19

braudpat
Mentor
Mentor

Hello @_gile 

 

1) BRAVO pour ta DLL ! ... Testee sur ACAD MAP 2016 et 2021 avec succes !!

 

2) SVP serait il possible de faire une micro-modif : ajouter l option C pour clore ??

 

3) Car on ne peut pas accrocher la PLEN elle meme en cours de route !

Ce qui ne me gene pas mais j aimerais bien quand meme Clore ma PLEN !

 

LA SANTE, Joyeux Noel, Regards, Patrice

 

Patrice ( Supporting Troops ) - Autodesk Expert Elite
If you are happy with my answer please mark "Accept as Solution" and if very happy please give me a Kudos (Felicitations) - Thanks

Patrice BRAUD

EESignature


0 J'aime
Message 15 sur 19

_gile
Consultant
Consultant

@braudpat  a écrit :

SVP serait il possible de faire une micro-modif : ajouter l option C pour clore ??


Parce que c'est toi, et pour montrer comment c'est (relativement) simple avec .NET (en tout cas bien plus qu'en LISP ou ObjectARX/C++).

 

PS : Je ne pense pas aller plus loin dans l'ajout de nouvelles fonctionnalités.

 

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

using AcAp = Autodesk.AutoCAD.ApplicationServices.Core.Application;
using AcGi = Autodesk.AutoCAD.GraphicsInterface;

namespace PolylineLengthJig
{
    public class Commands
    {
        [CommandMethod("PLEN")]
        public static void PlineLength()
        {
            var doc = AcAp.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;
            var ppr = ed.GetPoint("\nPremier point: ");
            if (ppr.Status != PromptStatus.OK)
                return;
            using (var tr = db.TransactionManager.StartTransaction())
            {
                using (var pline = new Polyline())
                {
                    pline.AddVertexAt(0, ppr.Value.Convert2d(new Plane()), 0.0, 0.0, 0.0);
                    pline.AddVertexAt(1, Point2d.Origin, 0.0, 0.0, 0.0);
                    pline.TransformBy(ed.CurrentUserCoordinateSystem);
                    var jig = new PlineLengthJig(pline);
                    while (true)
                    {
                        var pr = ed.Drag(jig);
                        if (pr.Status == PromptStatus.Cancel)
                            return;
                        if (pr.Status == PromptStatus.OK)
                        {
                            pline.AddVertexAt(pline.NumberOfVertices, Point2d.Origin, 0.0, 0.0, 0.0);
                            db.TransactionManager.QueueForGraphicsFlush();
                        }
                        else
                        {
                            pline.RemoveVertexAt(pline.NumberOfVertices - 1);
                            if (pr.Status == PromptStatus.Keyword)
                            {
                                pline.Closed = true;
                            }
                            else if (pline.NumberOfVertices < 2)
                            {
                                return;
                            }
                            var cSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                            cSpace.AppendEntity(pline);
                            tr.AddNewlyCreatedDBObject(pline, true);
                            break;
                        }
                    }
                }
                tr.Commit();
            }
        }
    }

    class PlineLengthJig : DrawJig
    {
        Polyline pline;
        Point3d dragPt;
        Plane plane;

        public PlineLengthJig(Polyline pline)
        {
            this.pline = pline;
            plane = new Plane(Point3d.Origin, pline.Normal);
        }

        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            var options = new JigPromptPointOptions("\nPoint suivant: ");
            options.BasePoint = pline.GetPoint3dAt(pline.NumberOfVertices - 2);
            options.UseBasePoint = true;
            if (3 < pline.NumberOfVertices)
            {
                options.Keywords.Add("Clore");
                options.AppendKeywordsToMessage = true;
            }
            options.UserInputControls =
                UserInputControls.Accept3dCoordinates |
                UserInputControls.GovernedByOrthoMode |
                UserInputControls.GovernedByUCSDetect |
                UserInputControls.NullResponseAccepted;
            var result = prompts.AcquirePoint(options);
            if (result.Value.IsEqualTo(dragPt))
                return SamplerStatus.NoChange;
            dragPt = result.Value;
            return SamplerStatus.OK;
        }

        protected override bool WorldDraw(AcGi.WorldDraw draw)
        {
            var geo = draw.Geometry;
            if (geo != null)
            {
                pline.SetPointAt(pline.NumberOfVertices - 1, dragPt.Convert2d(plane));
                geo.Draw(pline);
                var height = (double)AcAp.GetSystemVariable("viewsize") / 50.0;
                geo.Text(dragPt, Vector3d.ZAxis, Vector3d.XAxis, height, 1.0, 0.0, pline.Length.ToString("0.00"));
            }
            return true;
        }
    }
}

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 16 sur 19

braudpat
Mentor
Mentor

Hello @_gile 

 

1) Magnifique ! C Tip-Top ta routine PLEN (v1.1 avec l'option Clore) en Dotnet ... Retestee sur ACAD MAP 2016 et ACAD MAP 2021 ...

 

2) RAPPEL : je ne suis pas developpeur mais j ai quand deja vu du Source ARX et du source Dotnet ...

Je suis d'accord avec toi, le Dotnet semble plus simple / limpide ... Et l'ARX est plus "abscons / mysterieux" ...

Mais je sais que l ARX (que tres peu de gens utilisent et maitrisent a fond !) permet de faire des trucs "delirants"

Et le Dotnet aussi ...

 

3) Encore MERCI pour tes multiples contributions !

 

LA SANTE, Joyeux Noel, Regards, Patrice (The Retired Old French EE Froggy)

 

 

Patrice ( Supporting Troops ) - Autodesk Expert Elite
If you are happy with my answer please mark "Accept as Solution" and if very happy please give me a Kudos (Felicitations) - Thanks

Patrice BRAUD

EESignature


0 J'aime
Message 17 sur 19

CADaSchtroumpf
Advisor
Advisor

@_gile  a écrit :

Salut,

Juste pour montrer à @CADaSchtroumpf  que c'est possible 😉

Un exemple basique (uniquement des segments droits) en .NET (il doit être possible de faire quelque chose en LISP avec grread).

 


Tu interprètes mal mes propos


@CADaSchtroumpf   a écrit :
Seul les développeurs d'autosdesk pourraient mettre en place cette fonction.

Et je te considère comme un développeur d'AutoDesk (même si ce n'est pas officiel)

N’empêche que tu as réécris la commande PLINE (incomplète par ailleurs) pour introduire cette fonctionnalité.

 

Ce que je voulais faire comprendre c'est qu'à partie de la commande POLYLIGN originale on ne pouvait avoir accès à cette information de longueur en temps réel.

 

Mais je te l'accorde C'EST POSSIBLE, mais pas à la portée d'un plus grand nombre et d'une manière simple...

0 J'aime
Message 18 sur 19

patrick.emin
Alumni
Alumni

Bonjour @bob_in 

Si une des réponses résout votre problème ou vous a permis de mieux le comprendre, voulez vous avoir l'amabilité de cliquer sur le bouton  APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Merci de ne pas accepter comme solution le message que vous êtes en train de lire.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
0 J'aime
Message 19 sur 19

bob_in
Contributor
Contributor

Pas mal ! Bravo

0 J'aime