Błąd vlax-ldata w wersji 2017


Recommended Posts

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.... :( :( 

Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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!!

Link to comment
Share on other sites

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. 

 

 

Link to comment
Share on other sites

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ą...

Link to comment
Share on other sites

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" :(

Edited by 2P
Link to comment
Share on other sites

  • 1 month later...

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...