PhilBat Posté(e) le 29 mai 2017 Posté(e) le 29 mai 2017 Bonjour à tous,ayant redéfini la commande 'copier',est-il possible lors de la demande d'un point de destination (avec PromptPointResult)d'avoir les propriétés (angle d'une ligne) d'un objet que l'on survole avec la souris afin d'adapterl’aperçu (SelectionJig) de l'objet copié :blink: .Merci d'avance...Philippe.
(gile) Posté(e) le 29 mai 2017 Posté(e) le 29 mai 2017 salut, Peux-tu reformuler, voire donner un extrait de code, parce que là, je ne comprends pas. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PhilBat Posté(e) le 29 mai 2017 Auteur Posté(e) le 29 mai 2017 Ok pas simple mon affaire...Par exemple je veux copier un texte et lors de la demande du deuxième point de destinationsi je survole avec la souris une ligne avec un angle de 90° je veux que l’aperçu du texte au droit du curseur de la souris face une rotation de 90° comme la ligne, si je valide ce pointle texte sera copier avec un angle de 90°.... Philippe.
PhilBat Posté(e) le 30 mai 2017 Auteur Posté(e) le 30 mai 2017 Voici un extrait de mon code qui me permet de copier des entités (version maison) auquelje voudrais rajouter la fonctionnalité suivante : adaptation automatique de l'angleen fonction de l'entité située sous le curseur de la souris à l'écran lors de la saisie du deuxième point. Option Explicit On Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports AcApp = Autodesk.AutoCAD.ApplicationServices.Application Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Geometry Imports Autodesk.AutoCAD.GraphicsInterface Imports Autodesk.AutoCAD.Interop Imports Autodesk.AutoCAD.Interop.Common Namespace CopyBloc Public Class Commands Private NameBloc As String Private ptB As Point3d <CommandMethod("CopyBloc", CommandFlags.UsePickSet)> _ Public Sub CopyBloc() Dim adoc As Document = AcApp.DocumentManager.MdiActiveDocument Dim db As Database = adoc.Database Dim ed As Editor = adoc.Editor Dim idArray() As ObjectId Dim blkRef As BlockReference Dim ucs As Matrix3d = ed.CurrentUserCoordinateSystem Dim ents As New List(Of Entity)() Dim acBlkTbl As BlockTable Dim acBlkTblRec As BlockTableRecord Using tr As Transaction = db.TransactionManager.StartTransaction() Dim res As PromptSelectionResult = ed.GetSelection() ' ------ sortie boucle si pas trouvé If (res.Status <> PromptStatus.OK) Then ed.WriteMessage(vbLf & "Failed to select entity [Lg..-CopyBloc]") Return End If Dim acSSet As SelectionSet = res.Value idArray = acSSet.GetObjectIds ' Constituer une liste des objets sélectionnés et les mettre en surbrillance For Each blkId As ObjectId In idArray Dim ent As Entity = DirectCast(tr.GetObject(blkId, OpenMode.ForWrite), Entity) ent.Highlight() ents.Add(ent) Next tr.Dispose() End Using Dim pprB As PromptPointResult = ed.GetPoint(vbLf & "Point de Base de copie : ") If pprB.Status = PromptStatus.OK Then ptB = pprB.Value.TransformBy(ucs) ' Créer une nouvelle instance de SelectionJig Dim jig As New SelectionJig(ents, ptB) Do ' Inviter l'utilisateur à spécifier le second point Dim pprD As PromptPointResult = DirectCast(ed.Drag(jig), PromptPointResult) If pprD.Status <> PromptStatus.OK Then Exit Do Dim ptD As Point3d = pprD.Value ' ---- Dim acPt3d As Point3d = New Point3d(ptB.X, ptB.Y, ptB.Z) Dim acVec3d As Vector3d = acPt3d.GetVectorTo(New Point3d(ptD.X, ptD.Y, ptD.Z)) Using tr As Transaction = db.TransactionManager.StartTransaction() '' Open the Block table for read acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) '' Open the Block table record for write acBlkTblRec = tr.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite) ' ---- Dim mat As Matrix3d = Matrix3d.Displacement(ptB.GetVectorTo(ptD)) If ents.Count > 1 Then ' entitée > 1 sélectionnée For Each ent As Entity In ents ' l'entitée est un bloc Dim acEntClone As Entity acEntClone = ent.Clone acEntClone.TransformBy(mat) acBlkTblRec.AppendEntity(acEntClone) tr.AddNewlyCreatedDBObject(acEntClone, True) Next 'OutilsGpO.OutilsGpO.ThisDrawing.Regen(AcRegenType.acActiveViewport) Else ' une seule entitée sélectionnée .... End If tr.Commit() End Using Loop End If ' supprimer la surbrillance For Each ent As Entity In ents ent.Unhighlight() Next End Sub End Class End Namespace SalutationsPhilippe
(gile) Posté(e) le 30 mai 2017 Posté(e) le 30 mai 2017 Salut, Je ne sais pas si ce que tu veux faire est possible (je n'ai jamais essayé).En tous cas, il me semble que c'est dans la surcharge de la méthode WorlDraw() de ton SelectionJig que ça devrait se passer. D'autre part, le code que tu as posté ne me semble pas très robuste. Tu utilises des instances de Entity hors de la portée de la transaction qui a servi a les ouvrir.Quand tu appelles tr.Dispose() (ce qui, par ailleurs est redondant avec le End Using suivant), tu appelles aussi Dispose sur tous les objets ouverts avec cette transaction (les entités contenues dans ents). Utiliser ces objets après cela risque de provoquer une exception (voire une erreur fatale) si le Garbage Collector a libéré leurs ressources entre temps. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PhilBat Posté(e) le 31 mai 2017 Auteur Posté(e) le 31 mai 2017 Merci Gile pour ces précisions.Effectivement le code ne semble pas être optimisé,je vais essayer de rectifier cela dès que possible :huh:
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