Aller au contenu

[Résolu] C# Dictionnaire et UNDO


Messages recommandés

Bonjour,

 

J'ai écrit un programme qui stocke des infos dans un dictionnaire. Au chargement de la forme, je lis les infos et à la fermeture je ré-écris les nouvelles infos modifiées.

 

Le problème se pose quand je fais un U qui annule cette commande, car dès que je la relance, la lecture du dictionnaire me renvoie un ResultBuffer nul alors que les ObjectId du nœud principal et du nœud de mon dictionnaire sont les mêmes et toujours valides.

 

J'ai essayé d'implémenter le flag NoUndoMarker dans la définition de la commande , mais pas mieux.

 

J'ai trouvé un solution en vidant la pile du UNDO, mais ça veut dire que l'on ne peut pas remonter plus loin dans les annulations, ce qui n'est pas top.

 

Est-ce qu'il y a un moyen d’empêcher le UNDO uniquement sur cette commande (et tout ce qui a été modifié durant cette commande)?

 

Merci

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

les ObjectId du nœud principal et du nœud de mon dictionnaire sont les mêmes et toujours valides.

 

Après une annulation, le noeud de ton dictionnaire devrait avoir un ObjectId avec la propriété Erased à true.

 

Je ne suis pas sur de comprendre exactement ce que tu veux faire, mais quand on annule une commande, les objets qui ont été créés durant cette commande sont effacés. Donc leur ObjectId a la propriété Erased à true et il faut utiliser la version de Transaction.GetObject qui prend en troisième argument un booléen qui permet d'ouvrir les objets effacés :

 

DBObject dbo = tr.GetObject(id, OpenMode.ForRead, true);

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Un petit exemple qui fonctionne pour moi.

Le formulaire (Dialog) a un TextBox (internal) et deux boutons OK et Annuler (respectivement DialogResult.Ok et DialogResult.Cancel).

La commande Test crée une instance de Dialog, remplit le TextBox avec le contenu du Xrecord du dictionnaire (ceux-ci sont créés s'ils n'existaient pas), puis ouvre le formulaire.

Si le résultat est DialogResult.OK, le Xrecord est modifié.

 

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;

[assembly: CommandClass(typeof(DictionaryUndoSample.CommandMethods))]

namespace DictionaryUndoSample
{
   public class CommandMethods
   {
       [CommandMethod("Test")]
       public void Test()
       {
           Document doc = AcAp.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;

           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               var NOD = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead);
               DBDictionary dict;
               if (NOD.Contains("GILE"))
                   dict = (DBDictionary)tr.GetObject(NOD.GetAt("GILE"), OpenMode.ForRead);
               else
               {
                   dict = new DBDictionary();
                   NOD.UpgradeOpen();
                   NOD.SetAt("GILE", dict);
                   tr.AddNewlyCreatedDBObject(dict, true);
               }

               Xrecord xrec;
               ResultBuffer data;
               if (dict.Contains("Data"))
               {
                   xrec = (Xrecord)tr.GetObject(dict.GetAt("Data"), OpenMode.ForWrite);
                   data = xrec.Data;
               }
               else
               {
                   dict.UpgradeOpen();
                   xrec = new Xrecord();
                   dict.SetAt("Data", xrec);
                   tr.AddNewlyCreatedDBObject(xrec, true);
                   data = new ResultBuffer(new TypedValue(1, "default"));
                   xrec.Data = data;
               }

               string text = (string)data.AsArray()[0].Value;

               Dialog dlg = new Dialog();
               dlg.textBox.Text = text;
               if (AcAp.ShowModalDialog(dlg) == System.Windows.Forms.DialogResult.OK)
               {
                   data = new ResultBuffer(new TypedValue(1, dlg.textBox.Text));
                   xrec.Data = data;
               }
               tr.Commit();
           }
       }
   }
}

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é