Aller au contenu

Messages recommandés

Posté(e) (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é par PECTO99
Posté(e)

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

Posté(e)

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

Posté(e)

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.

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é