You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
La classe Transaction est le mécanisme fondamental pour accéder et modifier en toute sécurité les objets de base de données AutoCAD. Les transactions garantissent l'intégrité des données en fournissant des opérations atomiques - soit tous les changements réussissent, soit tous sont annulés.
Concept Clé: Dans l'API .NET AutoCAD, vous devez ouvrir les objets de base de données dans une transaction pour les lire ou les modifier. Cela empêche la corruption et assure la sécurité des threads.
Obtient/définit si la transaction se supprime automatiquement après commit/abort
TransactionManager
TransactionManager
Obtient le gestionnaire de transactions qui a créé cette transaction
Méthodes Clés
Cycle de Vie de la Transaction
Méthode
Type de Retour
Description
Commit()
void
Valide tous les changements effectués pendant la transaction
Abort()
void
Annule tous les changements effectués pendant la transaction
Dispose()
void
Dispose la transaction (appelle Abort si non validée)
Accès aux Objets
Méthode
Type de Retour
Description
GetObject(ObjectId, OpenMode)
DBObject
Ouvre un objet de base de données en lecture ou écriture
GetObject(ObjectId, OpenMode, bool)
DBObject
Ouvre un objet avec option d'ouvrir les objets effacés
AddNewlyCreatedDBObject(DBObject, bool)
void
Ajoute un objet nouvellement créé à la transaction
Modèles d'Utilisation Courants
1. Modèle de Transaction de Base
usingAutodesk.AutoCAD.ApplicationServices;usingAutodesk.AutoCAD.DatabaseServices;usingAutodesk.AutoCAD.Runtime;[CommandMethod("BASICTRANS")]publicvoidBasicTransactionExample(){Documentdoc=Application.DocumentManager.MdiActiveDocument;Databasedb=doc.Database;using(Transactiontr=db.TransactionManager.StartTransaction()){try{// Ouvrir l'espace modèle en écritureBlockTablebt=tr.GetObject(db.BlockTableId,OpenMode.ForRead)asBlockTable;BlockTableRecordbtr=tr.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite)asBlockTableRecord;// Créer un cercleCirclecircle=newCircle(newPoint3d(0,0,0),Vector3d.ZAxis,10.0);// Ajouter à la base de donnéesbtr.AppendEntity(circle);tr.AddNewlyCreatedDBObject(circle,true);// Valider les changementstr.Commit();}catch(System.Exceptionex){doc.Editor.WriteMessage($"\nErreur : {ex.Message}");// La transaction s'annulera automatiquement dans Dispose si non validée}}}
2. Lecture des Propriétés d'Objets
[CommandMethod("READLAYERS")]publicvoidReadLayersExample(){Documentdoc=Application.DocumentManager.MdiActiveDocument;Databasedb=doc.Database;Editored=doc.Editor;using(Transactiontr=db.TransactionManager.StartTransaction()){// Ouvrir la table des calques en lectureLayerTablelt=tr.GetObject(db.LayerTableId,OpenMode.ForRead)asLayerTable;ed.WriteMessage("\n=== Calques dans le Dessin ===");foreach(ObjectIdlayerIdinlt){LayerTableRecordltr=tr.GetObject(layerId,OpenMode.ForRead)asLayerTableRecord;ed.WriteMessage($"\nCalque : {ltr.Name}, Couleur : {ltr.Color.ColorIndex}");}tr.Commit();// Bonne pratique même pour les opérations en lecture seule}}
3. Modification d'Objets Existants
[CommandMethod("MODIFYENTITY")]publicvoidModifyEntityExample(){Documentdoc=Application.DocumentManager.MdiActiveDocument;Databasedb=doc.Database;Editored=doc.Editor;// Demander à l'utilisateur de sélectionner une entitéPromptEntityOptionspeo=newPromptEntityOptions("\nSélectionner un cercle à modifier : ");peo.SetRejectMessage("\nDoit être un cercle.");peo.AddAllowedClass(typeof(Circle),true);PromptEntityResultper=ed.GetEntity(peo);if(per.Status!=PromptStatus.OK)return;using(Transactiontr=db.TransactionManager.StartTransaction()){// Ouvrir le cercle en écritureCirclecircle=tr.GetObject(per.ObjectId,OpenMode.ForWrite)asCircle;// Modifier les propriétéscircle.Radius=circle.Radius*2.0;circle.ColorIndex=1;// Rougeed.WriteMessage($"\nRayon du cercle doublé à {circle.Radius}");tr.Commit();}}
Meilleures Pratiques
Toujours utiliser l'instruction using: Assure que la transaction est disposée même si des exceptions se produisent
Valider explicitement: Appeler Commit() lorsque toutes les opérations réussissent
Laisser Dispose gérer l'annulation: Ne pas appeler Abort() explicitement; Dispose() annulera si non validé
Ouvrir les objets avec permissions minimales: Utiliser OpenMode.ForRead lorsque possible
Minimiser la portée de la transaction: Garder les transactions courtes pour réduire le verrouillage
Gérer les exceptions: Envelopper le code de transaction dans des blocs try-catch
Ne pas franchir les limites de document: Chaque document a son propre gestionnaire de transactions
Erreurs Courantes
Erreur
Cause
Solution
eNoActiveTransactions
Accès à l'objet sans transaction
Démarrer une transaction d'abord
eOnLockedLayer
Modification d'objet sur calque verrouillé
Déverrouiller le calque ou ouvrir en lecture seule