Aller au contenu

Créer une polyligne


Messages recommandés

Invité Papouet
Posté(e)

Bonsoir, je suis à la recherche d'un exemple de code simple en DotNet pour créer une polyligne dont on ne connait pas à l'avance le nombre de sommets mais avec cet effet d'élasticité comme on peut le voir avec la commande polyligne d'autocad.

En vous remerciant par avance.

Posté(e)

Salut,

 

 

J'ai essayé de faire au plus simple (que des segments droits)

 

 

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;

namespace PolylineJigSample
{
   public class Commands
   {
       class PlineJig : EntityJig
       {
           Point3d _drag;
           Polyline _pline;
           Plane _plane;
           int _index;

           public PlineJig(Polyline pline, Plane plane)
               : base(pline)
           {
               _pline = pline;
               _plane = plane;
               _index = pline.NumberOfVertices - 1;
               _drag = pline.GetPoint3dAt(_index);
           }

           protected override bool Update()
           {
               _pline.SetPointAt(_index, _drag.Convert2d(_plane));
               return true;
           }

           protected override SamplerStatus Sampler(JigPrompts prompts)
           {
               JigPromptPointOptions jppo = new JigPromptPointOptions("\nPoint suivant: ");
               jppo.UserInputControls =
                   (UserInputControls.Accept3dCoordinates | UserInputControls.NullResponseAccepted);
               PromptPointResult ppr = prompts.AcquirePoint(jppo);
               if (ppr.Status == PromptStatus.OK)
               {
                   if (ppr.Value.IsEqualTo(_drag))
                       return SamplerStatus.NoChange;
                   else
                   {
                       _drag = ppr.Value;
                       return SamplerStatus.OK;
                   }
               }
               return SamplerStatus.Cancel;
           }
       }

       [CommandMethod("Test")]
       public void Test()
       {
           Document doc = AcAp.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;
           PromptPointResult ppr = ed.GetPoint("\nPoint de départ: ");
           if (ppr.Status != PromptStatus.OK)
               return;
           Matrix3d ucs = ed.CurrentUserCoordinateSystem;
           Point3d pt = ppr.Value;
           if (pt.Z != 0.0)
           {
               Vector3d disp = new Vector3d(0.0, 0.0, pt.Z).TransformBy(ucs);
               ed.CurrentUserCoordinateSystem = ucs.PreMultiplyBy(Matrix3d.Displacement(disp));
           }
           pt = pt.TransformBy(ucs);
           double elev = pt.TransformBy(Matrix3d.WorldToPlane(ucs.CoordinateSystem3d.Zaxis)).Z;
           Plane plane = new Plane(Point3d.Origin, ucs.CoordinateSystem3d.Zaxis);
           int i = 0;
           try
           {
               using (Transaction tr = db.TransactionManager.StartTransaction())
               using (Polyline pline = new Polyline())
               {
                   pline.Normal = ucs.CoordinateSystem3d.Zaxis;
                   pline.Elevation = elev;
                   pline.AddVertexAt(0, pt.Convert2d(plane), 0.0, 0.0, 0.0);
                   while (true)
                   {
                       i++;
                       pline.AddVertexAt(i, Point2d.Origin, 0.0, 0.0, 0.0);
                       PlineJig jig = new PlineJig(pline, plane);
                       PromptResult pr = ed.Drag(jig);
                       if (pr.Status != PromptStatus.OK)
                       {
                           pline.RemoveVertexAt(i);
                           i--;
                           break;
                       }
                   }
                   if (i == 0)
                       return;
                   BlockTableRecord btr =
                       (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                   btr.AppendEntity(pline);
                   tr.AddNewlyCreatedDBObject(pline, true);
                   tr.Commit();
               }
           }
           catch (System.Exception e)
           {
               ed.WriteMessage("\nErreur: {0}", e.Message);
           }
           finally
           {
               ed.CurrentUserCoordinateSystem = ucs;
           }
       }
   }
}

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Invité Papouet
Posté(e)

Je suis désolé de répondre aussi tardivement. Je voyais bien que quelqu'un m'avais répondus, mais impossible de faire afficher la réponse.

Je te remercie beaucoup pour cet exemple, je vais tenter d'en comprendre le fonctionnement.

 

Par hasard, es-tu le même Gile que celui qui est sur le site d'AcadLabs ?

Posté(e)

coucou

 

là je biche les garçons

 

quelqu'un qui demande est-ce que tu es celui d'AcadLabs ?

 

connaissant la chronologie de création des sites

je suis rose de confusion, ça me va pas mal le rose, non ?

 

c'est vrai qu'au niveau "prog" sur AcadLabs les discussions volent haut

 

longue vie à CadXP, le soleil brille pour tout le monde

 

amicalement

 

Invité Papouet
Posté(e)

Bonsoir. Je suis confus et je ne sais pas trop comment m'expliquer.

 

Pour ce qui est du code, j'en suis seulement à la phase "j'essaie de comprendre".

Mes questions principales pour le moment sont :

1/ Peut-on se passer de ce "Jig" pour faire ce que je cherche à faire ?

2/ Ton code fonctionne parfaitement mais est-ce normal qu'on n'arrive pas à accrocher des points sur la polyligne en cours de création ?

 

Je me demandais si tu étais le même Gile que celui qui est sur le site d'AcadLabs, car :

Je me suis inscrit sur le site et posé la même question, par deux fois. Ne voyant pas mes messages je me demandais si j'avais bien fais les choses. Pour laisser mes messages j'étais allés à cette adresse : http://www.acadlabs.com/viewforum.php?f=18

Après la connexion, je me suis rendus sur "VB et DotNet", ensuite dans "Demande d'aide" et finalement sur NewTopic.

Ne voyant pas ma question affichée, je suis venus ici, mais apparemment il y a aussi des problèmes...

 

Je suppose que Didier est le même que celui d'AcadLabs :red:

 

Pourriez-vous me dire ce que j'ai mal fais ?

 

Merci.

Posté(e)

Salut,

 

L'utilisation d'une classe héritant de EntityJig permet d'afficher à l'écran une entité "fantôme" et de la modifier en fonction de la position du curseur.

C'est parce que cette entité n'est pas ajouté à la base de donnée via une Transaction que l'accrochage ne fonctionne pas.

Pour en savoir plus sur les 'Jigs' voir le nouveau 'tuto' AutoCAD .NET Training.

 

J'avais utilisé ce procédé parce que je pensais que c'est ce que tu voulais et qu'il permettait d'évoluer : faire (et afficher dynamiquement) des segments en arc ou de largeur différente.

 

Sans utiliser de 'Jig', on ne peut avoir que la 'ligne élastique' rectiligne pour la saisie d'un point avec un point de base.

 

L'exemple suivant utilise ce procédé et utilise un nouvelle transaction pour chaque nouveau segment ajouté. C'est "moins propre" et ne pourra guère évoluer.

 

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;

namespace PolylineJigSample
{
   public class Commands
   {
       [CommandMethod("Test")]
       public void Test()
       {
           Document doc = AcAp.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;

           // Saisie du premier point
           PromptPointOptions ppo = new PromptPointOptions("\nPoint de départ: ");
           PromptPointResult ppr = ed.GetPoint(ppo);
           if (ppr.Status != PromptStatus.OK)
               return;

           // Déplacement du SCU si le Z du point est différent de 0.0
           Matrix3d ucs = ed.CurrentUserCoordinateSystem;
           Point3d p0 = ppr.Value;
           if (p0.Z != 0.0)
           {
               Vector3d disp = new Vector3d(0.0, 0.0, p0.Z).TransformBy(ucs);
               ed.CurrentUserCoordinateSystem = ucs.PreMultiplyBy(Matrix3d.Displacement(disp));
           }

           // Elevation de la polyligne
           double elev = p0
               .TransformBy(ucs)
               .TransformBy(Matrix3d.WorldToPlane(ucs.CoordinateSystem3d.Zaxis))
               .Z;

           // Plan de construction
           Plane plane = new Plane(Point3d.Origin, ucs.CoordinateSystem3d.Zaxis);

           // Saisie du second point
           ppo.Message = "\nPoint suivant: ";
           ppo.BasePoint = p0;
           ppo.UseBasePoint = true;
           ppo.AllowNone = true;
           ppr = ed.GetPoint(ppo);
           if (ppr.Status != PromptStatus.OK)
               return;
           Point3d pt = ppr.Value;
           try
           {
               // Création de la polyligne à 2 sommets
               ObjectId plId = ObjectId.Null;
               int i = 1;
               using (Transaction tr = db.TransactionManager.StartTransaction())
               {
                   Polyline pline = new Polyline();
                   pline.Normal = ucs.CoordinateSystem3d.Zaxis;
                   pline.Elevation = elev;
                   pline.AddVertexAt(0, p0.TransformBy(ucs).Convert2d(plane), 0.0, 0.0, 0.0);
                   pline.AddVertexAt(1, pt.TransformBy(ucs).Convert2d(plane), 0.0, 0.0, 0.0);
                   BlockTableRecord btr =
                       (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                   plId = btr.AppendEntity(pline);
                   tr.AddNewlyCreatedDBObject(pline, true);
                   tr.Commit();
               }

               // Ajout des points suivants
               while (true)
               {
                   ppo.BasePoint = pt;
                   ppr = ed.GetPoint(ppo);
                   if (ppr.Status != PromptStatus.OK)
                       break;
                   pt = ppr.Value;
                   i++;
                   using (Transaction tr = db.TransactionManager.StartTransaction())
                   {
                       Polyline pl = (Polyline)tr.GetObject(plId, OpenMode.ForWrite);
                       pl.AddVertexAt(i, pt.TransformBy(ucs).Convert2d(plane), 0.0, 0.0, 0.0);
                       tr.Commit();
                   }
               }
           }
           catch (System.Exception e)
           {
               ed.WriteMessage("\nErreur: {0}", e.Message);
           }
           finally
           {
               ed.CurrentUserCoordinateSystem = ucs;
           }
       }
   }
}

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Invité Papouet
Posté(e)

Je vais étudier tout ça.

Merci encore

 

Invité Papouet
Posté(e)

Effectivement, j'avais vu que tu avais laissé une réponse et je suis également surpris de ne pouvoir lire ta réponse.

Peux-tu ré-essayer car je suis toujours preneur d'infos.

Merci.

  • 4 semaines après...
Posté(e)

Bonjour a tous

J'ai une liste de points sous Excel du type numéro X Y Z

Comment faire pour utiliser ces points et tracer la polyligne correspondante sous Autocad par Vb net ?

Je dois migrer un certain nombre de programme de Vba en Vb. Net D'ou ma question ?

 

Et d'autre part, une autre question qui ne concerne pas ce sujet mais qui demande une réponse simple,

Je lance certains de mes programmes depuis excel pour insérer des blocs, des textes et autres entites, si Vba disparait d'Autocad mais pas d'Excel dans les années futures' dois je quand même migrer toutes mes applis vers le Vb.net ?

Merci par avance de vos réponses.

 

John

Posté(e)

Hola !

Un peu de patience...

Peu nombreux sont ceux qui répondent sur ce forum (et/ou qui s'essayent à la programmation .NET)

J'ai répondu à ton autre message.

 

Je rajouterais que tu trouveras quelques réponses en français sur AcadLabs.com, comme par exemple un programme de liaison AutoCAD/Excel ici.

Cet exemple est écrit en C# mais la conversion est facile (et il existe des convertisseurs) ou encore, si tu n'as pas vraiment commencé ton apprentissage, passer au C# n'est peut-être pas une mauvaise chose dans la mesure où tu t'attaques à quelque chose de nouveau et où la syntaxe n'est qu'un élément mineur dans l'apprentissage de .NET.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é