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

AutoCAD Gunlugu

Üye Girişi

RSS

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


Eyl 12
Cuma
AutoCAD, Download, Programlama, e-Kitaplar
Autocad .NET API Sembol Tabloları

Merhaba,

Bu makalede amacım AutoCAD.Net API sınıflarını kullanarak sembol tablo kayıtlarının nasıl oluşturulacağını göstermek. AutoCAD veritabanı yapısı hakkında biraz bilgi vererek başlamak istiyorum.

Hepinizin bildiği gibi AutoCAD çizim dosyası, görünür (grafik)  ve görünmez (grafik olmayan) nesnelere ait tablo ve kayıtları içeren bir veritabanı dosyasıdır ve aşağıdaki yerleşik (built-in) sembol tablo kayıtlarını mutlaka içerir:

-"0" adlı bir katman,

- "Standart" adlı metin, ölçülendirme ve tablo stilleri

-ACAD_GROUP, ACAD_MLINESTYLE vb. sözlük kayıtlarını içeren Adlandırılmış Nesne Sözlüğü (NOD: Named Object Dictionary)

- *MODEL_SPACE, *PAPER_SPACE ve *paper_space0 kayıtlarını içeren blok tablosu

-CONTINUOS, BY_LAYER ve BY_BLOCK kayıtlarını içeren çizgi tipi tablosu

-ACAD kaydını içeren kayıtlı uygulamalar tablosu.

AutoCAD, bu nesnelerin sembol tablo kayıtlarını oluştururken, önce her nesnenin ait olduğu sembol tablosunu açar, yeni nesneyi tabloya kaydeder ve daha sonra sırasıyla tabloyu ve çizim veritabanını kapatır. Bizde AutoCAD.Net API'si ile çalışırken aynı yolu izleyeceğiz.

Yeni bir çizim dosyasının içerdiği tablolardan da anlaşılacağı üzere AutoCAD birçok sembol tablosu içerir. Ama bu sembol tablolarına yeni bir tane eklemek mümkün değildir; sadece yeni kayıtlar eklenebilir ya da var olan kayıtlar silinebilir.

Her AutoCAD.NET programcısı, yazdığı uygulamaya özgü birtakım verileri (ayarlar gibi) çizim veritabanında saklama ihtiyacını hisseder. Bu ihtiyacı ise AutoCAD.NET API'sinin NOD nesnesi karşılar.  Sembol tabloları ve NOD arasındaki en temel fark, sembol tablolarının sadece kendi türlerine ait kayıtları saklayabilmesi (örneğin Metin Stil Tablosu sadece Metin Stil Kayıtlarını içerebilir), NOD'unsa DBObject nesnesinden türemiş her nesneyi barındırabilmesidir.  (Sembol tablolarına yoğunlaşan ilgimizin dağılmaması için, kullanıcı tanımlı verilerin genişletilmiş kayıtlar (XRecord) kullanılarak, AutoCAD nesnelerinde ve sözlüklerde (DBDictionary) nasıl saklanacağını göstermeyi şimdilik başka bir yazıya bırakıyorum.)

AutoCAD sembol tablolarının adlarını verip işlevlerini özetleyerek devam edelim.

Tablo.1

Örneklere geçmeden önce çizim veritabanında saklı NOD ve sembol tablo kayıt anahtarlarına nasıl erişilebileceğine bir bakalım. NOD kayıtları ile başlıyoruz:

C:
  1. public static void NODKayitListele()
  2. {
  3. // Çizim veritabanına erişim
  4. Document doc = Application.DocumentManager.MdiActiveDocument;
  5. Database db = doc.Database;
  6. // Komut editörüne erişim
  7. Editor ed = doc.Editor;
  8. ed.WriteMessage("\nAdlandırılmış Nesne Sözlüğü (NOD) Kayıtları:");
  9. ed.WriteMessage("\n--------------------------------------------");
  10. using (Transaction tr = db.TransactionManager.StartTransaction())
  11. {
  12. // Veritabanı sözlüğünün (NOD'un) okuma amaçlı açılması
  13. DBDictionary NOD = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId,
  14. OpenMode.ForRead);
  15. // Sözlük içerisinde dolaşmak için
  16. // veritabanı sözlük numaralandırıcısının eldesi
  17. DbDictionaryEnumerator eNOD = NOD.GetEnumerator();
  18. while (eNOD.MoveNext())
  19. {
  20. // Sözlük kayıt anahtarlarının AutoCAD
  21. // komut satırına yazdırılması
  22. ed.WriteMessage("\n{0}", eNOD.Current.Key);
  23. }
  24. // Numaralandırıcının sonlandırılması
  25. eNOD.Dispose();
  26. }
  27. }
  28. [CommandMethod("NODListe")]
  29. static public void NODKayitlar()
  30. {
  31. NODKayitListele();
  32. }

NODListe AutoCAD komutunu çalıştırdığımızda NOD kayıtları karşımıza çıkacaktır:


Fig.2

Şimdi de en önemli sembol tablolarından biri olan blok tablosu kayıtlarını araştıralım:

C:
  1. public static void BlokTabloKayitListele()
  2. {
  3. Document doc = Application.DocumentManager.MdiActiveDocument;
  4. Database db = doc.Database;
  5. Editor ed = doc.Editor;
  6. string BlockTableKayitListe = "Blok Tablosu Kayıt Listesi :";
  7. using (Transaction tr = db.TransactionManager.StartTransaction())
  8. {
  9. // Block tablosunun okuma amaçlı açılması
  10. BlockTable blockTable = (BlockTable)tr.GetObject(db.BlockTableId,
  11. OpenMode.ForRead);
  12. // Blok tablosu içerisinde dolaşmak için
  13. // sembol tablo numaralandırıcısının eldesi
  14. SymbolTableEnumerator eBlockTable = blockTable.GetEnumerator();
  15. while (eBlockTable.MoveNext())
  16. {
  17. // Sembol tablo kaydının eldesi
  18. SymbolTableRecord blockTableRec =
  19. (SymbolTableRecord)tr.GetObject(eBlockTable.Current,OpenMode.ForRead);
  20. BlockTableKayitListe += "\n" + blockTableRec.Name;
  21. }
  22. // Numaralandırıcının sonlandırılması
  23. eBlockTable.Dispose();
  24. Application.ShowAlertDialog(BlockTableKayitListe);
  25. }
  26. }
  27. [CommandMethod("BlkTblListe")]
  28. static public void BlokTabloKayitlar()
  29. {
  30. BlokTabloKayitListele();
  31. }

BlkTblListe AutoCAD komutunun sonucuysa aşağıdaki mesaj diyalogu olacaktır:


Fig.3

Uygun sembol tablo kimliklerini kullanarak diğer tabloların içerdikleri kayıtlara da kolayca ulaşabiliriz.

Bunun için BlokTabloKayitListele() fonksiyonundaki,

C:
  1. BlockTable blockTable = (BlockTable)tr.GetObject(db.BlockTableId,OpenMode.ForRead);

satırı yerine aşağıdakilerden birini koymamız yeterli olacaktır:

C:
  1. DimStyleTable symTable = (DimStyleTable)tr.GetObject(db.DimStyleTableId, OpenMode.ForRead);
  2.  
  3. LayerTable symTable = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
  4.  
  5. LinetypeTable symTable = (LinetypeTable)tr.GetObject(db.LinetypeTableId, OpenMode.ForRead);
  6.  
  7. RegAppTable symTable = (RegAppTable)tr.GetObject(db.RegAppTableId, OpenMode.ForRead);
  8.  
  9. TextStyleTable symTable = (TextStyleTable)tr.GetObject(db.TextStyleTableId, OpenMode.ForRead);
  10.  
  11. UcsTable symTable = (UcsTable)tr.GetObject(db.UcsTableId, OpenMode.ForRead);
  12.  
  13. ViewportTable symTable = (ViewportTable)tr.GetObject(db.ViewportTableId, OpenMode.ForRead);
  14.  
  15. ViewTable symTable = (ViewTable)tr.GetObject(db.ViewTableId, OpenMode.ForRead);

Fark ettiğiniz gibi, Transaction nesnesinin, sembol tablo kimliğini ve tabloya erişim türünü parametre olarak kabul eden GetObject(…) metodunu farklı tablolar için tekrarlamaktan başka bir şey yapmadık.

Artık sembol tablo kayıtlarının nasıl ekleneceğini gösteren örneklere geçebiliriz. Ama önce, bu tablolarla çalışmamızı kolaylaştıracak birkaç yardımcı fonksiyon yazmak yerinde olacaktır.

Bu fonksiyonlardan ilki, üzerinde çalışacağımız tablonun veritabanı nesne kimliğini (ObjectId), tablo kayıt türüyle elde etmemizi sağlayacak SembolTabloNesneKimlikAl(…) statik fonksiyonu:

C:
  1. public static ObjectId SembolTabloNesneKimlikAl(Database db, Type SinifTip)
  2. {
  3. if (SinifTip == typeof(BlockTableRecord))
  4. return db.BlockTableId;
  5. if (SinifTip == typeof(DimStyleTableRecord))
  6. return db.DimStyleTableId;
  7. if (SinifTip == typeof(LayerTableRecord))
  8. return db.LayerTableId;
  9. if (SinifTip == typeof(LinetypeTableRecord))
  10. return db.LinetypeTableId;
  11. if (SinifTip == typeof(TextStyleTableRecord))
  12. return db.TextStyleTableId;
  13. if (SinifTip == typeof(RegAppTableRecord))
  14. return db.RegAppTableId;
  15. if (SinifTip == typeof(UcsTableRecord))
  16. return db.UcsTableId;
  17. if (SinifTip == typeof(ViewTableRecord))
  18. return db.ViewTableId;
  19. if (SinifTip == typeof(ViewportTableRecord))
  20. return db.ViewportTableId;
  21. return ObjectId.Null;
  22. }

İkincisi, tablo kaydının veritabanı nesne kimliğini, kayıt türü ve adıyla elde etmemizi sağlayacak SembolTabloKayitNesneKimlikAl(…) fonksiyonu:

C:
  1. public static ObjectId SembolTabloKayitNesneKimlikAl(Database db, Type SinifTip, string SymAd)
  2. {
  3. ObjectId symbolTableId = SembolTabloNesneKimlikAl(db, SinifTip);
  4. ObjectId recId = ObjectId.Null;
  5. using (Transaction transaction = db.TransactionManager.StartTransaction())
  6. {
  7. SymbolTable table = (SymbolTable)transaction.GetObject(symbolTableId,
  8. OpenMode.ForRead);
  9. if (table.Has(SymAd))
  10. {
  11. recId = table[SymAd];
  12. }
  13. }
  14. return recId;
  15. }

Üçüncüsü, adını bildiğimiz bir tablo kaydının sembol tablosunda var olup olmadığını sorgulamakta kullanacağımız SembolTabloKaydiMevcutMu(…) fonksiyonu:

C:
  1. public static bool SembolTabloKaydiMevcutMu(Database db, Type SinifTip, string SymAd)
  2. {
  3. bool mevcut = false;
  4. ObjectId symbolTableId = SembolTabloNesneKimlikAl(db, SinifTip);
  5. using (Transaction transaction = db.TransactionManager.StartTransaction())
  6. {
  7. mevcut = ((SymbolTable)transaction.GetObject(symbolTableId,
  8. OpenMode.ForRead)).Has(SymAd);
  9. }
  10. return mevcut;
  11. }

Dördüncüsü ve sonuncusu ise herhangi bir çizgi tipini, verili çizgi tipi dosyasında arayan ve bulduğunda çizgi tipi nesne kimliğini döndüren CizgiTipiKimlikAdAlYadaYükle(…) fonksiyonu (katman kaydı oluştururken kullanacağız):

C:
  1. public static ObjectId CizgiTipiKimlikAlYadaYukle(string CizgiTipDosya,
  2. string CizgiTipAd)
  3. {
  4. Document doc = Application.DocumentManager.MdiActiveDocument;
  5. Database db = doc.Database;
  6.  
  7. ObjectId id = SembolTabloKayitNesneKimlikAl(db, typeof(LinetypeTableRecord),
  8. CizgiTipAd);
  9. if (!id.IsNull)
  10. return id;
  11. try
  12. {
  13. db.LoadLineTypeFile(CizgiTipAd, CizgiTipDosya);
  14. id = SembolTabloKayitNesneKimlikAl(db, typeof(LinetypeTableRecord),
  15. CizgiTipAd);
  16. if (!id.IsNull)
  17. return id;
  18. else
  19. return db.ContinuousLinetype;
  20. }
  21. catch
  22. {
  23. return db.ContinuousLinetype;
  24. }
  25.  
  26. }

Bu fonksiyonların yardımıyla artık ilk sembol tablo kaydımızı yaratabiliriz. Bir katman(layer) kaydı oluşturarak başlayalım. Aşağıda kodunu bulacağınız KatmanOlustur(…) fonksiyonu, içerdiği bilgi satırlarından da kolayca takip edebileceğiniz gibi; adı, çizgi tipi ve rengi verili bir katmanı çizim veritabanına ekleyecektir.

C:
  1. public static ObjectId KatmanOlustur(Database db, string KatmanAdi,
  2. string KatmanCizgiTipiAdi, short KatmanRengi)
  3. {
  4. ObjectId id = ObjectId.Null;
  5. using (Transaction trans = db.TransactionManager.StartTransaction())
  6. {
  7. // Eklemek istediğimiz katmanının varlığını sorgulamak için
  8. // katman tablosunu okuma amaçlı açalım.
  9. LayerTable tbl = (LayerTable)trans.GetObject(db.LayerTableId,
  10. OpenMode.ForRead);
  11. // Eklemek isteğimiz katman mevcutsa
  12. // kayıt kimliğini fonksiyon geri dönüş değerine atayalım.
  13. if (tbl.Has(KatmanAdi))
  14. id = tbl[KatmanAdi];
  15. else
  16. {
  17. // Eklemek istediğimiz katmanın varolmadığına artık eminiz.
  18. // Yeni katman tablo kaydını oluşturalım.
  19. LayerTableRecord rec = new LayerTableRecord();
  20. rec.Name = KatmanAdi;
  21. rec.Color = Color.FromColorIndex(ColorMethod.ByAci, KatmanRengi);
  22. ObjectId lineId = CizgiTipiKimlikAlYadaYukle(KatmanCizgiTipiAdi,
  23. "acadiso.lin");
  24. if (lineId != ObjectId.Null) rec.LinetypeObjectId = lineId;
  25. // Daha önce okuma amaçlı açtığımız katman tablosunu
  26. // yeni kaydı eklemek için yazma amaçlı açalım.
  27. tbl.UpgradeOpen();
  28. //Katman tablosuna kaydı ekleyelim.
  29. id = tbl.Add(rec);
  30. // İşlem yığınının kaydı sahiplenmesini sağlayalım.
  31. trans.AddNewlyCreatedDBObject(rec, true);
  32. // İşlem yığınını onaylayalım.
  33. trans.Commit();
  34. }
  35. }
  36. return id;
  37. }
  38. [CommandMethod("KtmEk")]
  39. static public void KatmanEkle()
  40. {
  41. KatmanOlustur(Application.DocumentManager.MdiActiveDocument.Database,
  42. "AutoCAD Günlüğü", "HIDDEN", 1);
  43. }

KtmEk AutoCAD komutunu çalıştırdığınızda, “AutoCAD Günlüğü” katmanının çizim veritabanı katman listesine eklendiğini göreceksiniz.

Katman oluşturmak için izlediğimiz yolu diğer tablo kayıtlarını oluşturmakta da izleyebilirsiniz. Bir metin stil kaydının (TextStyleTableRecord) çizim veritabanına nasıl ekleneceğini gösteren bir örnekle geriye kalan diğer sembol tablolarını araştırmayı sizlere bırakıyorum:

C:
  1. public static ObjectId MetinBicemOlustur(Database db, string MetinDosyaAdi,
  2. string MetinStilAd, double MetinYks, double GenislikFaktor)
  3. {
  4. ObjectId id = ObjectId.Null;
  5. using (Transaction trans = db.TransactionManager.StartTransaction())
  6. {
  7. // Eklemek istediğimiz metin biçeminin varlığını
  8. // sorgulamak için metin biçem tablosunu okuma amaçlı açalım.
  9. TextStyleTable tbl = (TextStyleTable)trans.GetObject(db.TextStyleTableId,
  10. OpenMode.ForRead);
  11. // Eklemek isteğimiz metin biçemi mevcutsa
  12. // kayıt kimliğini fonksiyon geri dönüş değerine atayalım.
  13. if (tbl.Has(MetinStilAd))
  14. id = tbl[MetinStilAd];
  15. else
  16. {
  17. // Eklemek istediğimiz metin biçeminin varolmadığına artık eminiz.
  18. // Yeni metin biçemi tablo kaydını oluşturalım.
  19. TextStyleTableRecord rec = new TextStyleTableRecord();
  20. rec.Name = MetinStilAd;
  21. rec.FileName = MetinDosyaAdi;
  22. rec.BigFontFileName = "";
  23. rec.ObliquingAngle = 0.0;
  24. rec.TextSize = MetinYks;
  25. rec.XScale = GenislikFaktor;
  26. // Daha önce okuma amaçlı açtığımız metin biçem tablosunu
  27. // kaydı eklemek için yazma amaçlı açalım.
  28. tbl.UpgradeOpen();
  29. //Metin biçem tablosuna kaydı ekleyelim.
  30. id = tbl.Add(rec);
  31. // İşlem yığınının kaydı sahiplenmesini sağlayalım.
  32. trans.AddNewlyCreatedDBObject(rec, true);
  33. // İşlem yığınını onaylayalım.
  34. trans.Commit();
  35. }
  36. }
  37. return id;
  38. }
  39.  
  40. [CommandMethod("TxtStyEk")]
  41. static public void MetinBicemEkle()
  42. {
  43. MetinBicemOlustur(Application.DocumentManager.MdiActiveDocument.Database,
  44. "Txt.shx", "Metin", 0.00, 1.00);
  45. }

Son olarak, AutoCAD içerisindeki tüm grafik nesneleri barındıran blok tablosuna yeni kayıtların nasıl ekleneceğinden bahsedeceğim.

Yeni bir AutoCAD çizimi blok tablosu, daha önce de gördüğümüz gibi, *MODEL_SPACE, *PAPER_SPACE , *paper_space0 başlangıç kayıtlarını içerir. Çizime yeni bir layout eklediğimizde ise AutoCAD, *paper_space1 adlı yeni bir kaydı blok tablosuna ekleyecektir. Yukarda tanımladığımız BlkTblListe AutoCAD komutunu kullanarak bu durumu gözlemleyebilirsiniz.

AutoCAD nesneleri, model uzayında yaratılabileceği gibi kağıt uzaylarından (layout’lar) herhangi birinde de yaratılabilir. Model uzayında çizim yapmak istediğimizde model uzayı, kağıt uzayında çizim yapmak istediğimizde ise kağıt uzayı blok tablo kaydını kullanacağız. AutoCAD blok nesnelerinin blok tablosuna eklenmesi ise diğer nesnelerinkinden biraz farklıdır; blok tablosunun blok tablo kaydı aracılığıyla yapılır. Bu farkı örnekleyen fonksiyonumuzun kodu ve AutoCAD komutu aşağıda:

C:
  1. public static void YeniBlokTabloOlustur(string blkName)
  2. {
  3. // Çizim veritabanının eldesi
  4. Database db = Application.DocumentManager.MdiActiveDocument.Database;
  5. // İşlem yığınının başlatılması
  6. using (Transaction transaction = db.TransactionManager.StartTransaction())
  7. {
  8. // Blok tablosunun yazma amaçlı eldesi
  9. BlockTable blkTable =
  10. (BlockTable)transaction.GetObject(db.BlockTableId, OpenMode.ForWrite);
  11. // Blok tablosu eklemek istediğimiz blok adını içeriyor mu?
  12. // (Var olan bir bloğun aynı adla tekrar oluşurulmaya çalışılması bir
  13. //  hataya neden olacağından kontrol edilmelidir.)
  14. if (!blkTable.Has(blkName))
  15. {
  16. // Bloğa eklenecek çizginin oluşturulması
  17. Line cizgi =
  18. new Line(new Point3d(0.0, 0.0, 0.0), new Point3d(0.0, 1.0, 0.0));
  19. // Blok tablo kaydı örenğinin oluşturulması
  20. BlockTableRecord blkRec = new BlockTableRecord();
  21. // Blok isminin kayda atanması
  22. blkRec.Name = blkName;
  23. // Blok kaydına daha önce tanımlanan çizgi nesnesini eklenmesi
  24. blkRec.AppendEntity(cizgi);
  25. // Blok kaydının blok tablosuna eklenmesi
  26. blkTable.Add(blkRec);
  27. // Blok kaydının işlem yığını tarafından sahiplenilmesi
  28. transaction.AddNewlyCreatedDBObject(blkRec, true);
  29. // İşlem yığınının onaylanması
  30. transaction.Commit();
  31. }
  32. }
  33. }
  34.  
  35. [CommandMethod("BlkTblEkle")]
  36. static public void BlokTabloEkle()
  37. {
  38. YeniBlokTabloOlustur("*CizgiBlok");
  39. }

Model ve kağıt uzaylarında çizim yapmak için izleyeceğimiz yolda yukarıdakine benzeyecektir:

  • Önce çizim veritabanına, ardından da işlem yığın yöneticisine erişir
  • İşlem yığınını başlatır
  • Blok tablosunu okuma, nesneyi eklemek istediğiniz uzayı ise yazma amaçlı açar
  • İstediğiniz nesneleri oluşturup uzaya ekler
  • İşlem yığını yöneticisinin nesneleri sahiplenmesini sağlar
  • Ve işlem yığınını onaylarız

Yukarda andığımız işleri yapan fonksiyon ise aşağıdaki gibi olacaktır:

C:
  1. public static void ModelUzayinaNesleEkle(Entity ent)
  2. {
  3. // Çizim veritabanının eldesi
  4. Database db = Application.DocumentManager.MdiActiveDocument.Database;
  5. // İşlem yığını yöneticisinin eldesi
  6. Autodesk.AutoCAD.DatabaseServices.TransactionManager transactionManager =
  7. db.TransactionManager;
  8. // İşlem yığınının başlatılması
  9. using (Transaction transaction = transactionManager.StartTransaction())
  10. {
  11. // Blok tablosunun okuma amaçlı açılması
  12. BlockTable blkTable =
  13. (BlockTable)transactionManager.GetObject(db.BlockTableId,
  14. OpenMode.ForRead, false);
  15. // Model uzayı kaydının yazma amaçlı açılması
  16. BlockTableRecord blkTableRec =
  17. (BlockTableRecord)transactionManager.
  18. GetObject(blkTable[BlockTableRecord.ModelSpace],
  19. OpenMode.ForWrite, false);
  20. // Nesnenin model uzayına eklenmesi
  21. blkTableRec.AppendEntity(ent);
  22. // İşlem yığınınca nesnenin sahiplenilmesi
  23. transactionManager.AddNewlyCreatedDBObject(ent, true);
  24. // İşlem yığınının onaylanması
  25. transaction.Commit();
  26. }
  27. }
  28.  
  29. [CommandMethod("MsEkle")]
  30. static public void MsNesneEkle()
  31. {
  32. Line cizgi = new Line(new Point3d(0.0, 0.0, 0.0),
  33. new Point3d(0.0, 1.0, 0.0));
  34. ModelUzayinaNesleEkle(cizgi);
  35. }
  36.  
  37. public static void KagitUzayinaNesleEkle(Entity ent)
  38. {
  39. // Çizim veritabanının eldesi
  40. Database db = Application.DocumentManager.MdiActiveDocument.Database;
  41. // İşlem yığını yöneticisinin eldesi
  42. Autodesk.AutoCAD.DatabaseServices.TransactionManager transactionManager =
  43. db.TransactionManager;
  44. // İşlem yığınının başlatılması
  45. using (Transaction transaction = transactionManager.StartTransaction())
  46. {
  47. // Blok tablosunun okuma amaçlı açılması
  48. BlockTable blkTable =
  49. (BlockTable)transactionManager.GetObject(db.BlockTableId,
  50. OpenMode.ForRead, false);
  51. // Kağıt uzayı kaydının yazma amaçlı açılması
  52. BlockTableRecord blkTableRec =
  53. (BlockTableRecord)transactionManager.
  54. GetObject(blkTable[BlockTableRecord.PaperSpace],
  55. OpenMode.ForWrite, false);
  56. // Nesnenin model uzayına eklenmesi
  57. blkTableRec.AppendEntity(ent);
  58. // İşlem yığınınca nesnenin sahiplenilmesi
  59. transactionManager.AddNewlyCreatedDBObject(ent, true);
  60. // İşlem yığınının onaylanması
  61. transaction.Commit();
  62. }
  63. }
  64.  
  65. [CommandMethod("PsEkle")]
  66. static public void PsNesneEkle()
  67. {