AutoLISP ve ActiveX ile bir Tablo Yaratma ve Değiştirmek için Hücre Seçme

Tablolar ölçülerden sonra AutoCAD’in sunduğu APIler ile yaratılması ve düzenlenmesi en karmaşık nesnelerden bir tanesidir. Tablonun görünüşü tablonun özellikleri ve tabloya atanmış olan tablo stili tarafından kontrol edilmektedir. Tablolar metin, öbek ve ilave biçimlendirmeye sahip formüller içerebilen hücrelerden oluşmaktadır.

 Sekil-1

Bir önceki, AutoLISP ve ActiveX API ile Tablo Stili Yaratma başlıklı makalemde, özel tablo stilinin nasıl yaratılacağı örnek kod ile birlikte anlatmıştım.

Bu makalemde ise, bir tablo yaratmayı ve tablo hücresinin içerisinde bir noktaya tıklayarak o hücrenin içindeki veriyi değiştirmeyi (düzenlemeyi) anlatacağım. Başında ;; (çift ; olan satırlar ve [ ] arasında yazılı olan metinler açıklama niteliğindedir)

(vl-load-com)

;; [Modele satır yüksekliği 10 birim ve sütun genişliği 30 birim olan]
;; [3 sütun, 5 satırlı tablo ekleme örneği]
(defun c:AddTable( / acadObj curDoc insPt mSpaceObj tableObj)
(setq acadObj (vlax-get-acad-object))
(setq curDoc (vla-get-ActiveDocument acadObj))

(setq insPt (vlax-3d-point 0 0 0))

(setq mSpaceObj (vla-get-ModelSpace curDoc))
(setq tableObj (vla-Addtable mSpaceObj insPt 5 3 10 30))

(vla-put-StyleName tableObj “MyTableStyle”)
)

;; [Bu örnek kod ekranda tek bir hücreye nasıl tıklanacağını veo hücrenin değerinin nasıl değiştirileceğini göstermektedir.]
;; [Bu örnek kod the ActiveX özellikler/metotlar Tıklama testini göstermektedir.]
;; GetCellType, GetText and SetText.
(defun c:SelectTableCell ( / pick vHeight vWidth lwrLeft uprRight vector
SS_TABLES cnt eMax tableObj row col cellValueOrg)

;; [Kullanıcıya ekran üzerinde bir nokta sorma]
(if (/= (setq pick (vlax-3d-point (getpoint “\nSelect Cell to edit: “))) nil)
(progn

;; [Seçim setimizi oluşturmak için, ekranın görüntülenen köşe noktaları bilgisini alma]
(setq vHeight (getvar “viewsize”))
(setq vWidth (* (/ (nth 0 (getvar “screensize”)) (nth 1 (getvar “screensize”))) vHeight))

(setq lwrLeft (list (- (nth 0 (getvar “viewctr”)) (/ vWidth 2)) (- (nth 1 (getvar “viewctr”)) (/ vHeight  2)) 0))
(setq uprRight (list (+ (nth 0 (getvar “viewctr”)) (/ vWidth 2)) (+ (nth 1 (getvar “viewctr”)) (/ vHeight  2)) 0))

;; [O anki (Aktif) görüntüleme yönü bilgisini alma]
(setq vector (vlax-make-safearray vlax-vbDouble ‘(0 . 2)))
(vlax-safearray-fill vector ‘(1 1 1))
(setq vector (vlax-make-variant vector))

;; [Ekranda görünür olan tüm tablo nesnelerini seçme]
(if (setq SS_TABLES (ssget “C” lwrleft uprright (list (cons 0 “ACAD_TABLE”))))
(progn

(setq cnt 0
eMax (sslength SS_TABLES)
)

;; [Seçim setindeki tüm öğeleri tek tek inceleme]
(while (> eMax cnt)
;; Geta table object from the selection set
(setq tableObj (vlax-ename->vla-object (ssname SS_TABLES cnt)))

;; [Hangi hücrenin içine tıklandığı bilgisinin değişken değerinin geri dönmesi]
(setq row 0
col 0)

;; [Aşağıdaki kod satırı, şayet geçerli bir hücre tıklanıp tıklanmadığını görmeniz için örnektir.]
;; (vla-select table pick vector vector 5 5 :vlax-false ‘row ‘col)

;; [Geçerli bir hücrenin tıklanıp tıklanmadığının kontrolü]
(if (= (vla-hittest tableObj pick vector ‘row ‘col) :vlax-true)
(progn

;; [Döngüyü kurma]
(setq cnt (1+ eMax))

;; [Hücre tipinin (metin veya öbek “block”)ne olduğunu kontrol etme]
(if (= (vla-GetCellType tableObj row col) acTextCell)
(progn
;; [Hücrenin değer bilgisini alma]
(setq cellValueOrg (vla-GetText tableObj row col))

;; [Hücrenin o anki (aktif) değerini değiştirme]
(vla-SetText tableObj row col “Revised Text”)
(vla-Update tableObj)
(alert “Cell text was changed.”)

;; [Orijinal değeri geri getirme]
(vla-SetText tableObj row col cellValueOrg)
(vla-Update tableObj)
(alert “Cell text was changed back to the original value.”)
(setq cnt eMax)
)
)
)
)
(setq cnt (1+ cnt))
)
)
)
)
)
(princ)
)