Aller au contenu

C# EntityJig sur multiples objets


Messages recommandés

Bonjour,

 

Je ne sais pas si je m'y prends mal, mais ça ne fonctionne pas exactement comme je le souhaite.

J'utilise un Jig (entityJig) pour dessiner une polyligne et afficher en plus au bout de mon curseur d'autres entités (2 polylignes et un texte).

J'ai un doute sur l'utilisation de EntityJig ou DrawJig, mais j'ai lu que l'on ne pouvait pas utiliser/changer les accrochages aux objets pendant un DrawJig, d'où mon utilisation de EntityJig, car j'ai besoin de pouvoir laisser à l'utilisateur le choix de s'accrocher ou pas aux autres entités. Le souci que j'ai, c'est la mise à jour de mes 3 objets supplémentaires.

Dans mon Update() je mettais à jour les objets via les anciennes méthodes id.Open(), puis Close et Dispose. Ca fonctionne parfaitement sous AutoCAD 2010, mais pas sur les versions plus récentes, pour lesquelles les 3 objets ne se mettent à jour que lorsque je clique mon point et pas en temps réel lors des déplacements du curseur.

J'ai modifié la mise à jour de mes objets pour les inclure dans une transaction. Cette fois ça fonctionne quelque soit la version d'AutoCAD, mais à chaque déplacement du curseur, j'ai en ligne de commande le message "Régénération terminée" ce qui me "bouffe" mes options (keyword) proposées pour changer des paramètres de mes objets.

J'espère que c'est assez clair, sinon je poste un bout de code ou un screencast.

Je me perds un peu sur la technique à utiliser entre le Entityjig, le Drawjig, le Inputpointmonitor, le Transient graphic... Peut-être qu'en dérivant à la fois de Entityjig pour mon objet en cours et du Drawjig pour les autres objets ça pourrait fonctionner?

Si quelqu'un peut m'aiguiller un peu sur la bonne solution pour dessiner en dynamique une polyligne et en dessinant en plus d'autres entités qui dépendent de la position de mon curseur en cours d'acquisition.

 

Merci

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

EntityJig est utilisé avec une entité unique, DrawJig avec un ou plusieurs objets Drawable. les deux permettent l'utilisation des accrochages aux objets.

Dans ton cas, je pense donc que tu devrais utiliser une classe héritant de DrawJig.

Ci dessous un exemple simple.

 

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

namespace DragBalloonSample
{
   public class Commandss
   {
       [CommandMethod("BALLOON")]
       public void DragBalloon()
       {
           Document doc = Application.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;

           PromptPointResult ppr = doc.Editor.GetPoint("\nSpecify the first point of line: ");
           if (ppr.Status != PromptStatus.OK)
               return;
           Point3d basePt = ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem);

           using (Transaction tr = db.TransactionManager.StartTransaction())
           using (Circle circle = new Circle(basePt, Vector3d.ZAxis, 3.0))
           using (Line line = new Line(basePt, basePt + Vector3d.XAxis))
           {
               BalloonJig jig = new BalloonJig(circle, line);
               PromptResult pr = ed.Drag(jig);
               if (pr.Status == PromptStatus.OK)
               {
                   ObjectIdCollection ids = new ObjectIdCollection();
                   circle.TransformBy(jig.Displacement);
                   line.TransformBy(jig.RotateScale);
                   BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                   ids.Add(btr.AppendEntity(circle));
                   tr.AddNewlyCreatedDBObject(circle, true);
                   ids.Add(btr.AppendEntity(line));
                   tr.AddNewlyCreatedDBObject(line, true);
               }
               tr.Commit();
           }
       }

       class BalloonJig : DrawJig
       {
           private Circle circle;
           private Line line;
           private double radius;
           private Point3d basePoint, center;

           public Matrix3d Displacement { get; private set; }
           public Matrix3d RotateScale { get; private set; }

           public BalloonJig(Circle circle, Line line)
           {
               this.circle = circle;
               radius = circle.Radius;
               this.line = line;
               basePoint = line.StartPoint;
           }

           protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
           {
               Autodesk.AutoCAD.GraphicsInterface.WorldGeometry geo = draw.Geometry;
               if (geo != null)
               {
                   geo.PushModelTransform(Displacement);
                   geo.Draw(circle);
                   geo.PopModelTransform();
                   geo.PushModelTransform(RotateScale);
                   geo.Draw(line);
                   geo.PopModelTransform();
               }
               return true;
           }

           protected override SamplerStatus Sampler(JigPrompts prompts)
           {
               JigPromptPointOptions opts =
                   new JigPromptPointOptions("\nSpecify the circle center: ");
               opts.UserInputControls = UserInputControls.NullResponseAccepted;
               PromptPointResult ppr = prompts.AcquirePoint(opts);
               if (ppr.Value.IsEqualTo(center))
                   return SamplerStatus.NoChange;
               center = ppr.Value;
               Vector3d disp = basePoint.GetVectorTo(center);
               double angle = Vector3d.XAxis.GetAngleTo(disp, Vector3d.ZAxis);
               double scale = basePoint.DistanceTo(center) - radius;
               Displacement = Matrix3d.Displacement(disp);
               RotateScale =
                   Matrix3d.Rotation(angle, Vector3d.ZAxis, basePoint) *
                   Matrix3d.Scaling(scale, basePoint);
               return SamplerStatus.OK;
           }
       }
   }
}

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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é