Invité Papouet Posté(e) le 2 mai 2011 Posté(e) le 2 mai 2011 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.
(gile) Posté(e) le 5 mai 2011 Posté(e) le 5 mai 2011 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) le 5 mai 2011 Posté(e) le 5 mai 2011 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 ?
(gile) Posté(e) le 5 mai 2011 Posté(e) le 5 mai 2011 Par hasard, es-tu le même Gile que celui qui est sur le site d'AcadLabs ? À ton avis ? ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didier Posté(e) le 6 mai 2011 Posté(e) le 6 mai 2011 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 sitesje 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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
Invité Papouet Posté(e) le 6 mai 2011 Posté(e) le 6 mai 2011 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=18Aprè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.
(gile) Posté(e) le 7 mai 2011 Posté(e) le 7 mai 2011 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
bazoul Posté(e) le 7 mai 2011 Posté(e) le 7 mai 2011 étrange ma réponse n'a pas apparu,dommage yavais tous ce qui fallait avec les arcs et tous le toutim !
Invité Papouet Posté(e) le 8 mai 2011 Posté(e) le 8 mai 2011 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.
VtKp Posté(e) le 31 mai 2011 Posté(e) le 31 mai 2011 Bonjour a tousJ'ai une liste de points sous Excel du type numéro X Y ZComment 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
VtKp Posté(e) le 5 juin 2011 Posté(e) le 5 juin 2011 Up !!! Je crois Que person a Vu ce message non ???
(gile) Posté(e) le 5 juin 2011 Posté(e) le 5 juin 2011 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
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