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);
Résolu ! Accéder à la solution.
Résolu par _gile. Accéder à la solution.
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(); }
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.
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.
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.