[Visual Lisp] - obiekt TABLE


Recommended Posts

Witam,

proszę o potwierdzenie błędu, czy braku możliwości edycji obiektu TABLE w ZwCAD2012+ (vernum = "2012.08.30(5622)"), z poziomu Visual Lispa.

Przykładowy kod dodający nowy rekord w ZwCAD:

Command: (cd:ACX_SetProp (car(entsel)) '(("Rows" . 4)))
(("Rows" . #<%catch-all-apply-error%>))

AutoCAD:

Command: (cd:ACX_SetProp (car(entsel)) '(("Rows" . 4)))
(("Rows" . :vlax-true))

Funkcja biblioteczna:

; =========================================================================================== ;
; Zmienia cechy obiektu VLA / Sets the property of VLA-Object
; Obj [ENAME/VLA-Object] - entycja lub obiekt VLA / entity name or VLA-Object
; Lst [list] - lista cech par kropkowych / list of dotted pairs properties
; ------------------------------------------------------------------------------------------- ;
; (cd:ACX_SetProp (entlast) '(("LineType" . "BLA")("Color" . 1)("Layer" . "0")))
; =========================================================================================== ;
(defun cd:ACX_SetProp (Obj Lst)
(if (= (type Obj) (quote ENAME))
(setq Obj (vlax-ename->vla-object Obj))
)
(if (vlax-write-enabled-p Obj)
(mapcar
 (function
 (lambda (% / %1)
	 (cons
	 (car %)
	 (if (vlax-property-available-p Obj (car %) T)
		 (if
		 (setq %1
			 (vl-catch-all-apply
			 (quote vlax-put-property)
			 (list Obj (car %)
				 (if (vl-symbolp (cdr %))
				 (eval (cdr %))
				 (cdr %)
				 )
			 )
			 )
		 )
		 %1
		 :vlax-true
		 )
		 :vlax-null
	 )
	 )
 )
 )
 Lst
)
)
)

Sprawdzając istnienie właściwości "Rows" dla obiektu TABLE, otrzymujemy odpowiedź pozytywną, więc powinno działać:

Command: (vlax-property-available-p (vlax-ename->vla-object (car(entsel))) "Rows" nil)
T

Pozdrawiam,

Assgarth

Link to comment
Share on other sites

Witam

Z ostatniego kontaktu z ZWSOFT, który pamiętam a dotyczył Tabel i dostępu przez LISP wynika, że nie było możliwości pracy na tabelach. Z pewnością było to jeszcze przed wydaniem wersji ZWCAD+. Postaram się ustalić jak sytuacja ma się na chwilę obecną i dlaczego nie działa Pana przykład. Może uda się ustalić jakieś rozwiązanie zastępcze np przez (entmod).

Przy drugim rzucie oka na Pański kod myślę, że lepszym sposobem wstawiania wiersza do Tabeli będzie użycie metody InsertRows. Przykładowy kod, który u mnie zadziałał jest taki:

(setq Tabela (vlax-ename->vla-object (car(entsel)) ) )

(vlax-invoke-method Tabela 'InsertRows 3 2.5 2)

parametry metody są:

  1. Indeks wstawianego wiersza. (tutaj 3)
  2. Wysokość wiersza. (tutaj 2.5)
  3. Ilość wstawionych wierszy. (tutaj 2)

Pozdrawiam

Link to comment
Share on other sites

Dziękuję za podpowiedź.

Teraz inna sprawa - samo tworzenie obiektu TABLE za pomocą VLisp'a.

(vla-Addtable
(vla-get-ModelSpace
(vla-get-ActiveDocument
 (vlax-get-acad-object)
)
)
(vlax-3d-point '(0.0 0.0 0.0))
4
3
20.0
100.0
)
; error: Automation Error. Description was not provided.

Nie rozumiem, dlaczego nie można utworzyć tego obiektu za pomocą Active-X.

Poniżej za pomocą entmakex:

(defun c:addTable (insPt numRows numColumns rowHeight columnWidth)
(entmakex
(append
 (list
 '(0 . "ACAD_TABLE")
 '(100 . "AcDbEntity")
 '(100 . "AcDbBlockReference")
 (cons 10 insPt)
 '(100 . "AcDbTable")
 (cons 91 numRows)
 (cons 92 numColumns)
 )
 ((lambda (l)
	 (repeat numRows (setq l (cons (cons 141 rowHeight) l)))
 )
 nil
 )
 ((lambda (l)
	 (repeat numColumns (setq l (cons (cons 142 columnWidth) l)))
 )
 nil
 )
)
)
)

np.

(c:addTable (getpoint) 12 12 22 22)

i wszystko działa.

Rozumiem, że Active-X jeszcze nie jest dopracowany?

pozdrawiam

Link to comment
Share on other sites

Witam

Sprawdziłem to i rzeczywiście tworzenie tabeli przez VLISP jeszcze w tej wersji nie jest obsługiwane. Tymczasowo pozostaje korzystać z entmakex. Ale mam też dobrą wiadomość: próbowałem utworzyć tabelę przez VLisp na najnowszej wersji ZWCADa i próba zakończyła się powodzeniem. Wersja, która pozwala na tworzenie tabel nie jest jeszcze oficjalnie dostępna.

Pozdrawiam

Link to comment
Share on other sites

Witam,

jeszcze jedna sprawa:

jak utworzyć nowy styl dla Tabeli za pomocą VLispa?

Command:(vl-catch-all-apply 'vla-AddObject (list (vla-Item (vla-get-Dictionaries (vla-get-ActiveDocument (vlax-get-acad-object))) "ACAD_TABLESTYLE") "MyStyle" "AcDbTableStyle"))
#<%catch-all-apply-error%>

a powinno być:

Command: (vl-catch-all-apply 'vla-AddObject (list (vla-Item (vla-get-Dictionaries (vla-get-ActiveDocument (vlax-get-acad-object))) "ACAD_TABLESTYLE") "MyStyle" "AcDbTableStyle"))
#<VLA-OBJECT IAcadTableStyle 0000000038ff21a8>

pozdrawiam

Link to comment
Share on other sites

...

a powinno być:

Command: (vl-catch-all-apply 'vla-AddObject (list (vla-Item (vla-get-Dictionaries (vla-get-ActiveDocument (vlax-get-acad-object))) "ACAD_TABLESTYLE") "MyStyle" "AcDbTableStyle"))
#<VLA-OBJECT IAcadTableStyle 0000000038ff21a8>

Myślę, że raczej

(vl-catch-all-apply 'vla-AddObject (list (vla-item (vla-get-Dictionaries (vla-get-ActiveDocument (vlax-get-acad-object))) "ACAD_TABLESTYLE") "MyStyle" "ZcDbTableStyle"))

Ten sposób działa. prawdopodobnie tutaj jeszcze jest niezgodność

Link to comment
Share on other sites

U mnie nadal występuje błąd:

Command: (vl-catch-all-apply 'vla-AddObject (list (vla-item (vla-get-Dictionaries (vla-get-ActiveDocument (vlax-get-acad-object))) "ACAD_TABLESTYLE") "MyStyle" "ZcDbTableStyle"))
#<%catch-all-apply-error%>

Obstawiam, że sprawdzane było na tej najnowszej wersji, bo na mojej vernum = "2012.08.30(5622)" (read only), nie działa.

pozdrawiam

Link to comment
Share on other sites

  • 2 weeks later...

Kiedy można spodziewać się wersji 2013.01.27(9513) do testów?

Sprawdziłem działanie ACAD_TABLE pod wersją 2012.12.14(8707) i stabilność pracy pozostawia wiele do życzenia...

Albo nie działa w ogóle, albo wywala całego ZwCADa w kosmos bez ostrzeżenia o błędach... wrrrr :???:

Link to comment
Share on other sites

  • 1 month later...

Witam,

sprawdziłem działanie ACAD_TABLESTYLE w najnowszej wersji ZwCAD2012+ SP2:

(vl-catch-all-apply 'vla-AddObject (list (vla-item (vla-get-Dictionaries (vla-get-ActiveDocument (vlax-get-acad-object))) "ACAD_TABLESTYLE") "MyStyle" "ZcDbTableStyle"))

i wygląda, że ta część działa prawidłowo.

Pytanie zatem następujące:

- jak nadać styl tekstom zawartym w tak utworzonym stylu tabeli?

; tName [sTR] - nazwa Stylu Nagłówka
; fTxtT [REAL] - wysokość tekstu nagłówka
; fTxtD [REAL] - wysokość tekstu danych


;; Set the text height for the Title, Header and Data rows
(vla-SetTextHeight custObj acTitleRow fTxtT)
(vla-SetTextHeight custObj (+ acDataRow acHeaderRow) fTxtD)

;; Set the text height and style for the Title row
(vla-SetTextStyle custObj (+ acDataRow acHeaderRow acTitleRow) tName)

Powyższe nie działa.

Jak zatem dostać się do tych ustawień z poziomu VLISPa?

post-94-0-72942200-1366186420_thumb.jpg

Link to comment
Share on other sites

Potwierdzam takie działanie programu, jest to powiązane z błędem, który kiedyś Pan zgłaszał. Nr nadany temu błędowi to T6727. Wówczas po użyciu funkcji nadającej szerokość tabeli i uruchomieniu funkcji stylu tabeli ZWCAD się wieszał. Teraz program jest stabilny, ale problem nie został jeszcze rozwiązany, rozwiązanie jest opracowywane. Na LISPowy dostęp do stylu tabel będziemy musieli jeszcze poczekać

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share