Ortaklarımız: Ant Mekanik , Teknova Shop , Taliasoft

AutoCAD Gunlugu

Üye Girişi

RSS

Autocad Günlüğü RSS besleyicisine üye ol.


Eyl 08
Pazartesi
AutoCAD, Programlama
Autocad .NET API içinde Transaction (İşlem Yığını) kullanımı.

Merhaba,

Öncelikle Transaction'ın ne olduğunu açıklamakla başlayalım. Transaction,  veri tabanı işlemlerinde işlemsel bir bütünlüğü temsil eden ve daha küçük parçalara ayrılamayan en küçük  işlem yığını (transaction) olarak tanımlanabilir. Bu tanımı gereği de her  işlem yığını atomsal, tutarlı, yalıtılmış ve sürekli olmalıdır. İşlem yığını içsel süreçlerinde oluşacak bir hata işlem bütünlüğünün geri sarılmasını (rollback), bu süreçlerin başarıyla tamamlanması ise bu bütünlüğün onaylanmasını (commit) gerektirir.

Her AutoCAD .dwg dosyası grafik ve grafik olmayan bilgilerin yada nesnelerin tanımlarını  içeren bir veritabanı dosyasıdır. Bu nedenle yukarda anılan tüm öğeleri içerir. AutoCAD.Net programlamada da İşlem yığını (transaction) diğer veritabanlarında olduğu gibi veritabanı işlemlerinin doğru sıra ve yetkiyle yapılıp yapılmadığını kontrol etmek için kullanılır.

Basit bir AutoCAD.Net işlem yığınının işleyişi aşağıdaki gibidir:

  1. İşlem yığının başlatılması (StartTransaction)
  2. Veritabanı okuma/yazma işlemlerinin gerçekleştirilmesi (Nesne ekleme/silme gibi)
  3. Eğer bir hata oluşmazsa işlem yığınının onaylanması (Commit)
  4. Eğer bir hata oluşursa işlem yığınının iptal edilmesi (Abort)

AutoCAD .Net programlamada kullanılan TransactionManager ve Transaction sınıfları ise Autodesk.AutoCAD.DatabaseServices isim uzayında bulunmaktadır.

İşlem yığını örneklerini vermeden önce uzun değişken bildirimlerinin önüne geçmek için aşağıdaki  isim uzaylarını projemize eklemek faydalı olacaktır.

C:
  1. using Autodesk.AutoCAD.Geometry;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.ApplicationServices;

Aşağıdaki iki örnek birbirinin aynısı olmakla beraber, ikinci örnek using anahtar sözcüğü kullanımının, Transaction.Dispose() fonksiyonunun çağrılmasında yarattığı farkı göstermek amacıyla seçilmiştir. Ayrıca Autocad.Net API'si ile gerçekleştirilen işlemler, bilgi satırlarıyla işlemin hemen öncesinde açıklanmıştır.

ÖRNEK-1:

C:
  1. [CommandMethod("TrSmp1")]
  2. static public void TransactionSampleWithoutUsingKeyword()
  3. {
  4. // 1. Autocad aktif belgesine erişim
  5. Document doc = Application.DocumentManager.MdiActiveDocument;
  6.  
  7. // 2. Aktif belgeye ait işlem yığın yöneticisine erişim
  8. Autodesk.AutoCAD.DatabaseServices.TransactionManager transactionManager =
  9. Application.DocumentManager.MdiActiveDocument.TransactionManager;
  10.  
  11. // 3. İşlem yığının başlatılması
  12. Transaction transaction = transactionManager.StartTransaction();
  13.  
  14. // 4. Belge veritabanının okuma amaçlı açılması
  15. BlockTable blockTable =
  16. (BlockTable)doc.Database.BlockTableId.GetObject(OpenMode.ForRead);
  17.  
  18. // 5. Model uzayının (modelspace) yazma amaçlı açılması
  19. BlockTableRecord blockTableRecord =
  20. (BlockTableRecord)transactionManager.GetObject(blockTable[BlockTableRecord.ModelSpace],
  21. OpenMode.ForWrite);
  22.  
  23. // 6. Autocad daire nesnesinin oluşturulması
  24. Circle circle = new Circle();
  25. circle.Center = new Point3d(0.0, 0.0, 0.0);
  26. circle.Radius = 10.0;
  27.  
  28. // 7. Model uzayı blok tablosuna daire nesnesinin eklenmesi
  29. ObjectId circleId = blockTableRecord.AppendEntity(circle);
  30.  
  31. // 8. Daire nesnesinin işlem yığınına eklenmesi
  32. transaction.AddNewlyCreatedDBObject(circle, true);
  33.  
  34. // 9. İşlem yığınının onaylanması
  35. transaction.Commit();
  36.  
  37. // 10. Sırasıyla işlem yığınını ve işlem yığın yöneticisini sonlandırılması
  38. transaction.Dispose();
  39. transactionManager.Dispose();
  40.  
  41. }

C:
  1. <strong>ÖRNEK-2:</strong>
  2. [CommandMethod("TrSmp2")]
  3. static public void TransactionSampleWithUsingKeyword()
  4. {
  5. // 1. Autocad aktif belgesine erişim
  6. Document doc = Application.DocumentManager.MdiActiveDocument;
  7.  
  8. // 2. İşlem yığının başlatılması
  9. Transaction transaction =                 Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
  10.  
  11. using (transaction)
  12. {
  13.  
  14. // 3. Belge veritabanının okuma amaçlı açılması
  15. BlockTable blockTable =
  16. (BlockTable)doc.Database.BlockTableId.GetObject(OpenMode.ForRead);
  17.  
  18. // 4. Model uzayının (modelspace) yazma amaçlı açılması
  19. BlockTableRecord blockTableRecord =                    (BlockTableRecord)Application.DocumentManager.MdiActiveDocument.TransactionManager.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  20. // 5. Autocad daire nesnesinin oluşturulması
  21. Circle circle = new Circle();
  22. circle.Center = new Point3d(0.0, 0.0, 0.0);
  23. circle.Radius = 10.0;
  24.  
  25. // 8. Model uzayı blok tablosuna daire nesnesinin eklenmesi
  26. ObjectId circleId = blockTableRecord.AppendEntity(circle);
  27.  
  28. // 9. Daire nesnesinin işlem yığınına eklenmesi
  29. transaction.AddNewlyCreatedDBObject(circle, true);
  30.  
  31. // 10. İşlem yığınının onaylanması
  32. transaction.Commit();
  33. }

Yukardaki örneklerden de kolayca  anlaşılacağı üzere, okuma yada yazma amaçlı tüm Autocad veritabanı işlemlerinde, işlem yığınlarının (transactions) kullanılmasının zorunlu olduğudur. Veritabanı okuma amaçlı erişimlerinin yazma amaçlı erişimlerden farkı ise işlem yığınının onaylanması gerekliliğinin olmamasıdır.

İşlem yığınını sonlandırma/Dispose() fonksiyonunun kullanımı ile ilgili birkaç önemli noktaya değinerek bu konuyla ilgili söyleyeceklerimi bitirmek istiyorum.

Öncelikle AutoCAD.Net içerisinde IDisposable nesnelerle (DbObject, Transaction gibi) çalışırken dikkatli olmak gerekir.  Çünkü nesneleri sonlandırma ( dispose) işleminin, .Net gereksiz nesne toplayıcısına (garbage collector) hangi durumlarda bırakılmaması gerektiğini bilmek önemlidir.

AutoCAD nesne türlerine göre aşağıdaki önerilere uyulması faydalı olur:

İlk olarak, veritabanında kalıcı olmayan yada olmayacak, DBObject nesnesinden türememiş geçici nesneler kodla sonlandırılabileceği gibi, bu nesneleri .Net gereksiz nesne toplayıcısının sonlandırmasına da izin verilebilir.

İkinci olarak, DBObject nesnesinden türemiş geçici  (vertitabanına eklenmesi düşünülmeyen) nesneler .Net gereksiz nesne toplayıcısına bırakılmaksızın mutlaka kodla sonlandırılmalıdır.

Üçüncü ve son olaraksa, veritabanında kalıcı olan ve işlem yığını tarafından yönetilen AddNewlyCreatedDBObject() ya da GetObject() aracılığıyla sahiplenilmiş) nesneler,  işlem yığını yöneticisi sonlandırıldığında sonlandırılacağı için ayrıca kodla sonlandırılmalarına gerek yoktur.

Verilen örneklere ait MS Visual Studio 2005 projesini buradan indirebilirsiniz.

Şimdiye kadar 286 kere okunmus. Bu hafta: 26 Bu gun: 5 En son: 4 January 2009, 12:53

Yazı Etiketleri: , ,
Beğendin mi? Abone ol

  • Yorum bırakın:



    All content and source © 2008 Autocad Günlüğü | News Plus wordpress theme brought to you by Zidalgo.