PECTO99 Posté(e) le 17 mars Posté(e) le 17 mars (modifié) Bonjour, Novice en developpement C# pour AutoCad, j'essaie porter des scripts en Lisp en C#. Je suis confronté à la transcription de certaines commandes (ne trouvant pas les classes ou les objets pour le faire ). Par exemple des commandes Lisp ci-dessous : (command "_UCS" "_WORLD") (command "_UCS" "_3P" point1 point2 "") (command "_PLAN" "") (command "_UCS" "_R" nomscu) (command "_UCS" "_X" -100.00) (command "_DVIEW" "" "_PO" pt-target pt-camera "_CL" "_B" (* -1 section_half_depth) "_CL" "_F" section_half_depth "") Merci d'avance de votre aide. Modifié le 17 mars par PECTO99
(gile) Posté(e) le 17 mars Posté(e) le 17 mars Salut, La réponse simple est de créer une instance de l'éditeur : Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; puis d'appeler les commandes commandes comme en LISP: ed.Command("_UCS", "_WORLD"); ed.Command("_UCS", "_3P", point1, point2, ""); etc. Mais, à mon avis, utiliser .NET pour scripter les commandes natives AutoCAD, c'est un peu comme comme prendre un bazooka pour chasser un moustique. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 18 mars Posté(e) le 18 mars Si on veut éviter d'appeler les commandes natives, on accède au SCU courant par la propriété CurrentCoordinateSystem de la classe Editor. Le type de cette propriété est Matrix3d. Mais généralement en programmation on utilise peu les commandes natives donc on ne s'intéresse au SCU que pour transformer les points récupérés par ou passés aux méthodes Editor.Getxxx. (command "_UCS" "_WORLD") la matrice de transformation correspondant au Système de coordonnées général est la matrice identité. var ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.CurrentUserCoordinateSystem = Matrix3d.Identity; (command "_UCS" "_3P" point1 point2 "") , ici il faut construire la matrice. var ed = Application.DocumentManager.MdiActiveDocument.Editor; var xAxis = point1.GetVectorTo(point2).GetNormal(); var yAxis = Vector3d.ZAxis.CrossProduct(xAxis).GetNormal(); var ucsMatrix = Matrix3d.AlignCoordinateSystem( Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis, point1, xAxis, yAxis, Vector3d.ZAxis); ed.CurrentUserCoordinateSystem = ucsMatrix; Les systèmes de coordonnées nommés sont enregistrés dans la "table des SCUs" : UcsTable. (command "_UCS" "_R" nomscu) var ed = Application.DocumentManager.MdiActiveDocument.Editor; var db = HostApplicationServices.WorkingDatabase; using (var tr = db.TransactionManager.StartTransaction()) { var ucsTable = (UcsTable)tr.GetObject(db.UcsTableId, OpenMode.ForRead); if (ucsTable.Has(nomscu)) { var ucs = (UcsTableRecord)tr.GetObject(ucsTable[nomscu], OpenMode.ForRead); ed.CurrentUserCoordinateSystem = Matrix3d.AlignCoordinateSystem( Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis, ucs.Origin, ucs.XAxis, ucs.YAxis, ucs.XAxis.CrossProduct(ucs.YAxis).GetNormal()); } tr.Commit(); } (command "_UCS" "_X" -100.00) , en admettant que -100.00 correspond bien à -100 grades, soit 1.5 * PI radians, on combine la matrice de rotation autour de l'axe X avec la matrice courante. var ed = Application.DocumentManager.MdiActiveDocument.Editor; var ucsMat = ed.CurrentUserCoordinateSystem; var ucs = ucsMat.CoordinateSystem3d; ed.CurrentUserCoordinateSystem = Matrix3d.Rotation(Math.PI * 1.5, ucs.Xaxis, ucs.Origin) * ucsMat; Pour les vues, on utilise des instances de la classe ViewTableRecord telle que renvoyées par la méthode Editor.GetCurrentView ou passées à la méthode Editor.SetCurrentView. (command "_PLAN" "") var ed = Application.DocumentManager.MdiActiveDocument.Editor; var ucs = ed.CurrentUserCoordinateSystem.CoordinateSystem3d; using (var view = ed.GetCurrentView()) { var dcsToWcs = Matrix3d.Rotation(-view.ViewTwist, view.ViewDirection, view.Target) * Matrix3d.Displacement(view.Target.GetAsVector()) * Matrix3d.PlaneToWorld(view.ViewDirection); var centerPoint = new Point3d(view.CenterPoint.X, view.CenterPoint.Y, 0.0) .TransformBy(dcsToWcs); view.ViewDirection = ucs.Zaxis; view.ViewTwist = ucs.Xaxis.GetAngleTo(Vector3d.XAxis, ucs.Zaxis); var wcsToDcs = Matrix3d.WorldToPlane(view.ViewDirection) * Matrix3d.Displacement(view.Target.GetAsVector().Negate()) * Matrix3d.Rotation(view.ViewTwist, view.ViewDirection, view.Target); centerPoint = centerPoint.TransformBy(wcsToDcs); view.CenterPoint = new Point2d(centerPoint.X, centerPoint.Y); ed.SetCurrentView(view); } (command "_DVIEW" "" "_PO" ptTarget ptCamera "_CL" "_B" (* -1 sectionHalfDepth) "_CL" "_F" sectionHalfDepth "") var ed = Application.DocumentManager.MdiActiveDocument.Editor; using (var view = ed.GetCurrentView()) { view.Target = ptTarget; view.ViewDirection = ptTarget.GetVectorTo(ptCamera); view.BackClipDistance = -sectionHalfDepth; view.BackClipEnabled = true; view.FrontClipDistance = sectionHalfDepth; view.FrontClipEnabled = true; view.FrontClipAtEye = false; var wcsToDcs = Matrix3d.WorldToPlane(view.ViewDirection) * Matrix3d.Displacement(view.Target.GetAsVector().Negate()) * Matrix3d.Rotation(view.ViewTwist, view.ViewDirection, view.Target); var centerPoint = ptTarget.TransformBy(wcsToDcs); view.CenterPoint = new Point2d(centerPoint.X, centerPoint.Y); ed.SetCurrentView(view); } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PECTO99 Posté(e) le 19 mars Auteur Posté(e) le 19 mars Merci Gile, La deuxième solution correspond à ce que je recherchais car je voulais "éviter d'appeler les commandes natives". Merci beaucoup pour ta reponse.
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