Olivier Eckmann Posté(e) le 22 août 2013 Posté(e) le 22 août 2013 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
Maxence DELANNOY Posté(e) le 22 août 2013 Posté(e) le 22 août 2013 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 DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
(gile) Posté(e) le 22 août 2013 Posté(e) le 22 août 2013 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
Olivier Eckmann Posté(e) le 23 août 2013 Auteur Posté(e) le 23 août 2013 Merci Gilles, ça fonctionne aussi chez moi. Je vais remettre les mains dans le "cambouis" pour voir d'où ça provient exactement. Olivier
Olivier Eckmann Posté(e) le 26 août 2013 Auteur Posté(e) le 26 août 2013 Bonsoir, effectivement, il y avait un problème dans mon code, je créais un nouveau Xrecord au lieu de le mettre à jour lorsqu'il existait déjà. Pb résolu Merci
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