Błąd vlax-ldata w wersji 2017


Rekomendowane odpowiedzi

Trafiłem na poważny błąd w działaniu vlax-ldata-put / get. Poważny dla mnie bo totalnie rozwalił mi działanie mojej nakładeczki i nie mam pomysłu jak to obejść.

Proponuję wykonać taki kod na v2015 i potem v2017

(vlax-ldata-put "TEST" "T" (list "String1 String2"))
(setq s (vlax-ldata-get "TEST" "T"))
(print s)
(print (car s))
(print (type (car s)))

 

Efekt działania v2017 poniżej:

Cytuj

(STRING1 STRING2) 
STRING1 
SYM 

 

Efekt działania v2015 poniżej:

Cytuj

("String1 String2")
"String1 String2"
STR



Problem w tym, że w starej wersji gdy zapisywaliśmy listę złożoną ze stringów do rysunku za pomocą vlax-ldata-put i potem odczytywaliśmy dane za pomocą vlax-ldata-get to otrzymywaliśmy taką samą listę stringów. W v2017 po odczytaniu, ZWcad zmienia typ danych w liście i stringi przerabia na symbole. Mało tego jeśli w stringu jest spacja, to otrzymamy dwa elementy listy (dwa symbole). I do tego zmienia wielkość liter na duże! Dane odczytane z rysunku nie mają za dużo wspólnego z tym co zapisaliśmy :(

Problem dotyczy tylko sytuacji gdy zapisujemy listę ze stringami, bo gdy zapisujemy same stringi to jest wszystko OK.

Czy jest jakaś szansa że to zostanie naprawione szybko, bo bez tego nakładka nie działa i nie ma jak tego za bardzo obejść. Tym bardziej, że wersją 2017 nie mogę odczytać poprawnie danych zapisanych wcześniej w rysunku za pomocą wersji 2015.... :( :( 

Odnośnik do komentarza
Udostępnij na innych stronach

Trzeba sprawdzić czy błąd występuje przy zapisie czy przy odczycie LDATA. Zróbmy tak: odczytamy zapisane dane nie mechanizmem LDATA, tylko zwykłym dostępem do obiektów niegraficznych. Dla uproszczenia warto wykorzystać CADPL-Pack'a, dostępnego tutaj: http://forum.cad.pl/cadpl-pack-v1-lsp-t78161.html . O Packu, możesz też poczytać tutaj: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ .  LDATA to nic innego jak dane zgromadzone w obiekcie VLO_VL, w zadanym słowniku. Zatem:

Wykorzystamy funkcję o nazwie cd:DCT_GetDict. Zatem:

  1. Ściągnij CADPL-Pack'a i go załaduj.
  2. Wywołaj: 
    (cdr (assoc 300 (entget (cd:DCT_GetDict (cd:DCT_GetDict (namedobjdict) "TEST") "T"))))

    oczywiście dla wcześniej zapisanych danych.

  3. Podaj (zacytuj) co zwróciło. Wtedy zobaczymy co się da zrobić (jeśli błąd jest przy odczycie, da się to obejść, jeśli przy zapisie... to raczej nie)

Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem test zapis - odczyt, ale bez CADPL-Pack'a.

1. Na początek w v2015 zapisałem dane LDATA. Potem ten plik otworzyłem w v2017 i odczytałem LDATA - wynik prawidłowy, dane nie zmienione.

2. W v2017 zapisałem dane LDATA, a potem ten plik otworzyłem w v2015 i odczytałem dane LDATA - wynik błędny, dane zmienione....

 

Jednym słowem niestety błąd jest przy zapisie :(  nie odczycie danych.
A nakładka działająca pod v2017 wręcz może uszkodzić bezpowrotnie dane!!

Odnośnik do komentarza
Udostępnij na innych stronach

Plik_1 - dane LDATA zapisane w v2017

Plik_2 - dane LDATA zapisane w v2015

Efekt działania (vlax-ldata-list "TEST") w obu wersjach ZW:

v2017, Plik_1:

Cytuj

(("T" STRING1 STRING2))

v2017, Plik_2:

Cytuj

(("T" "String1 String2"))

v2015, Plik_1:

Cytuj

(("T" STRING1 STRING2))

v2015, Plik_2:

Cytuj

(("T" "String1 String2"))

 

Jak widać błąd tkwi w procedurze zapisu LDATA w v2017. 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Spróbujmy jednak to naprawić - nieco naokolo. Zrób teraz tak:

  1. Załaduj CADPL-Pack'a
  2. Zapisz w 2017 LDATA - tak aby były zapisane źle
  3. Wywołaj: 
    (cd:ENT_SetDXF (cd:DCT_GetDict (cd:DCT_GetDict (namedobjdict) "TEST") "T") 300 "(\"Abc Xyz\")")

    i następnie odczytaj dane.

  4. Jeżeli będzie ok, to w ten sposób będziesz mógl obejść ten problem, do czasu gdy żółte rączki go nie naprawią...

Odnośnik do komentarza
Udostępnij na innych stronach

Chylę przed Tobą czoła kojacek! WIELKIE DZIĘKI!

" do czasu gdy żółte rączki go nie naprawią" jest to rozwiązanie problemu i to bez konieczności grzebania w całym kodzie nakładki. Dołączyłem CADPL-Pack'a i dopisałem taką definicję funkcji, co załatwiło ten problem.

(defun vlax-ldata-put (dict key data)
	(cd:ENT_SetDXF (cd:DCT_GetDict (cd:DCT_GetDict (namedobjdict) dict) key) 300 (vl-prin1-to-string data))
)

Załatwiło ten problem, ale oczywiście już znalazłem kolejne niekompatybilności v2017 (nie tylko w LISPie)... o czym w innych wątkach...

Pozdrawiam :)

Edit: Niestety rozwiązanie powyższe nie działa z listami typ pary "kropkowe" :(

Edytowane przez 2P
Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie