CADxp: C# EntityJig sur multiples objets - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

C# EntityJig sur multiples objets

#1 L'utilisateur est hors-ligne   Olivier Eckmann 

  • ceinture noire 2em dan
  • Groupe : Membres
  • Messages : 1168
  • Inscrit(e) : 29-décembre 11
  • LocationLongjumeau (91)

Posté 02 janvier 2019 - 20:31

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
0

#2 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11069
  • Inscrit(e) : 02-septembre 05

Posté 03 janvier 2019 - 08:42

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
Image IPB
0

#3 L'utilisateur est hors-ligne   Olivier Eckmann 

  • ceinture noire 2em dan
  • Groupe : Membres
  • Messages : 1168
  • Inscrit(e) : 29-décembre 11
  • LocationLongjumeau (91)

Posté 04 janvier 2019 - 08:51

Salut Gilles,

merci pour le tuyau, je teste avec un Drawjig et je reviens.

Olivier
0

#4 L'utilisateur est hors-ligne   Olivier Eckmann 

  • ceinture noire 2em dan
  • Groupe : Membres
  • Messages : 1168
  • Inscrit(e) : 29-décembre 11
  • LocationLongjumeau (91)

Posté 07 janvier 2019 - 16:02

Salut Gilles,

Ca fonctionne sans souci avec le DrawJig. Plus de souci de régénération intempestive, c'est vraiment fluide avec une bonne CG.

Merci, Olivier
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)