Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Obtenir un point et une entité

3 RÉPONSES 3
RÉSOLU
Répondre
Message 1 sur 4
Anonymous
615 Visites, 3 Réponses

Obtenir un point et une entité

Je désire insérer un bloc. je demande à l'utilisateur d'entrer le point d'insertion. mais je veux m'assurer qu'il a bien sélectionné un point sur une ligne, ligne que je couperai avant d'insérer le bloc. Je cherche peut-être à l'envers, quoi-qu'il en soit je ne trouve pas comment obtenir les deux informations sur un seul clic de l'usager.

 //Ouvre la table des blocs en lecture
                                BlockTableRecord acBlkDef = acBlkTbl[blkName].GetObject(OpenMode.ForRead) as BlockTableRecord;

                                    // Ouvre la table d'enregistrement des blocs et le ModelSpace en écriture
                                    BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                                    //Obtenir un point d'insertion et établir la ligne de commande d'insertion
                                    PromptPointOptions ptOpts = new PromptPointOptions("\nEntrer le point d'insertion");
                                    ptOpts.AllowNone = true; //permet 'Enttrée' et 'clic-droit'
                                    ptRes = acEd.GetPoint(ptOpts);

                                //Si un point est sélectionné ou une coordonnée entrée, continuer; 
                                // autrement sortir de la commande
                                if (ptRes.Status != PromptStatus.OK)
                                    {
                                        acEd.WriteMessage("\nCommande anulée");
                                        return;
                                    }
                                    double X = ptRes.Value.X;
                                    double Y = ptRes.Value.Y;
                                double X1 = X + 6;
                                double X2 = X - 6;

                                //Insérer le bloc à l'endroit sélectionné
                                using (BlockReference acBlkRef = new BlockReference(new Point3d(X, Y, 0), blocId))
                                {
                                    //string blkClr = "";
                                    // Ajouter le bloc au ModelSpace
                                    acBlkTblRec.AppendEntity(acBlkRef);
                                    acTrans.AddNewlyCreatedDBObject(acBlkRef, true);
Balises (2)
Étiquettes (1)
3 RÉPONSES 3
Message 2 sur 4
_gile
en réponse à: Anonymous

Salut,

 

Invite plutôt l'utilisateur à sélectionner une ligne tu récupèrera d'un seul coup le point cliqué et la ligne :

 

 

            var options = new PromptEntityOptions("\nSélectionnez une ligne: ");
            options.SetRejectMessage("Seulement une ligne.");
            options.AddAllowedClass(typeof(Line), true);
            var result = ed.GetEntity(options);
            if (result.Status != PromptStatus.OK)
                return;
            var pickedPoint = result.PickedPoint;
            var lineId = result.ObjectId;
var ucs = ed.CurrentCoordinateSystem; using (var tr = db.TransactionManager.StartTransaction()) { var line = (Line)tr.GetObject(lineId, OpenMode.ForRead); var pointOnLine = line.GetClosestPointTo(pickedPoint.TransformBy(ucs), false);
var insertionPoint = pointOnLine + new Vector3d( 6.0, -6.0, 0.0); // insérer le bloc sur insertionPoint tr.Commit(); }

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 3 sur 4
Anonymous
en réponse à: _gile

merci de la réponse, je travail en c# et je ne trouve pas l'équivalent de : var ucs = ed.CurrentCoordinateSystem;  aussi je me demande pourquoi jouer avec le UCS pour couper une simple ligne.

Message 4 sur 4
_gile
en réponse à: Anonymous


beaulem a écrit :

merci de la réponse, je travail en c# et je ne trouve pas l'équivalent de : var ucs = ed.CurrentCoordinateSystem;


L' expression :

var ucs = ed.CurrentCoordinateSystem;

est bien du C#.

var est un mot clé qui permet de déclarer des variables locales sans en spécifier le type explicitement (appelé typage implicite ou inférence de type).

ed est ici la variable couramment utilisée en C# AutoCAD pour : Autodesk.AutoCAD.DocumentManager.MdiActiveDocument.Editor. J'aurais dû reprendre acEd que tu utilises dans ton code.

 

Il s'agit donc juste d'une manière plus concise pour écrire :

Matrix3d ucs = Autodesk.AutoCAD.DocumentManager.MdiActiveDocument.Editor.CurrentCoordinateSystem;

beaulem a écrit :

aussi je me demande pourquoi jouer avec le UCS pour couper une simple ligne.


Les points retournés (ou utilisés) par les méthodes de la classe Autodesk.AutoCAD.EditorInput.Editor sont toujours exprimés dans les coordonnées du SCU courant (UCS).

Le point d'insertion d'une référence de bloc (propriété Position de l'objet BlockReference) est toujours exprimé dans les coordonnées du SCG (WCS).

Donc convertir le point récupéré par la méthode Editor.GetEntity() du système de coordonnées du SCU courant en coordonnées SCG garanti que la méthode fonctionnera quel que soit le SCU courant (elle n'aura aucun effet si le SCU courant est le SCG).

C'est juste une habitude, un peu rigoureuse certes, mais qui évite les mauvaises surprises.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report