_

[LISP] Czy napisanie takiego lispa jest trudne?

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez kojacek » kwi 07, 2016 14:17

Po tej swoistej grze wstępnej (z plikami ini), czas zacząć coś oprogramować. Tworzymy plik o nazwie LayPropConverter.lsp, a w nim definiujemy polecenie LPCON. W tej chwili zakładamy że CADPL-Pack i acetutil są załadowane. Ponadto przyjmujemy że plik ini znajduje się w lokalizacji pliku dwg/dxf którym będziemy się zajmować.
Wywołanie polecenia LPCON, wymaga wskazania poprawnego dla naszego programu pliku ini. Po to właśnie jest klucz Name w sekcji General. Definicja polecenia wygląda tak:
Kod: Zaznacz cały
(defun C:LPCON (/ n)
  (if
    (setq n
      (getfiled "Wybierz plik ini" (getvar "DWGPREFIX") "ini" 16)
    )
    (if
      (= (acet-ini-get n "General" "Name") "LayPropConverter")
      (progn
        T
      )
      (alert "\nNie wskazano poprawnego pliku dla LayPropConverter.lsp")
    )
    (princ "\nNie wskazano pliku ini.")
  )
)

Plik w załączeniu. Prześledź jak to działa, sprawdź opis funkcji w help-ie. Pytaj jak masz wątpliwości.
Załączniki
LayPropConverter.lsp
(393 Bajtów) Pobrane 30 razy
Avatar użytkownika
kojacek
 
Posty: 5450
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez Grappa25 » kwi 07, 2016 20:08

dziękuję,
coś chyba robię nie tak, bo pojawia mi się alert "Nie wskazano poprawnego pliku dla LayPropConverter.lsp".
Mam otwarty plik warstwy.dxf, dodałam do pakietu uruchomieniowego CADPack-a, acetutil.arx i LayPropConverter. Plik warstwy.dxf i plik ini mam na pulpicie, LayProp... wrzuciłam do katalogu express w folderze z programem.
pakiet uruchom.jpg
pakiet uruchom.jpg (31.32 KiB) Przeglądane 447 razy

Może są jeszcze jakieś błędy (spacje, taby, literówki) w ini? Jeszcze przejrzę.
A może ma znaczenie, że lisp to LayPropConverter, a w sekcji Name jest LayerPropConverter?
Jak poprawię w ini na "Lay"- to już nie wyrzuca alertu, ale... nic się nie zmienia.
U mnie w cadzie w format-warstwy mam inną kolejność atrybutów- tzn. nazwa wartstwy,kolor, rodzaj linii, szerokość- może w ini powinna być taka kolejność?
Grappa25
 
Posty: 14
Dołączył(a): kwi 06, 2016 17:41

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez kojacek » kwi 07, 2016 20:37

Grappa25 napisał(a):dziękuję,
coś chyba robię nie tak, bo pojawia mi się alert "Nie wskazano poprawnego pliku dla LayPropConverter.lsp".
Mam otwarty plik warstwy.dxf, dodałam do pakietu uruchomieniowego CADPack-a, acetutil.arx i LayPropConverter. Plik warstwy.dxf i plik ini mam na pulpicie, LayProp... wrzuciłam do katalogu express w folderze z programem.
Załącznik pakiet uruchom.jpg nie jest już dostępny

Może są jeszcze jakieś błędy (spacje, taby, literówki) w ini? Jeszcze przejrzę.
A może ma znaczenie, że lisp to LayPropConverter, a w sekcji Name jest LayerPropConverter?
Jak poprawię w ini na "Lay"- to już nie wyrzuca alertu, ale... nic się nie zmienia.
U mnie w cadzie w format-warstwy mam inną kolejność atrybutów- tzn. nazwa wartstwy,kolor, rodzaj linii, szerokość- może w ini powinna być taka kolejność?


Ciepło:
laypropconv.png

ale... to nauka miała być.
1) Jakie wnioski zatem (z ostatniej przygody) wynikające?
2) Co ma się zmieniać - popatrz na kod.
Avatar użytkownika
kojacek
 
Posty: 5450
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez Grappa25 » kwi 07, 2016 20:47

no jakby jest tylko napisane,że jeśli (if)wybiorę plik ini to ma wyświetlić, zrobić (progn) odpowiedni komunikat/alert. Czyba nie ma tam jeszcze wpisu, że ma zamieniać [Layers] na [Layers] z pliku ini.
Dobrze rozumuję?
czy to by była ta funkcja?
(acet-str-replace find replace string [ignoreCase [useRegExp [count]]])
jakoś chyba trzeba odczytać i porównać warstwy, a może?
(IniRead "General", "Layers")
chyba to dla mnie za trudne...
Grappa25
 
Posty: 14
Dołączył(a): kwi 06, 2016 17:41

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez kojacek » kwi 09, 2016 09:58

Grappa25 napisał(a):no jakby jest tylko napisane,że jeśli (if)wybiorę plik ini to ma wyświetlić, zrobić (progn) odpowiedni komunikat/alert. Czyba nie ma tam jeszcze wpisu, że ma zamieniać [Layers] na [Layers] z pliku ini.
Dobrze rozumuję?
czy to by była ta funkcja?
(acet-str-replace find replace string [ignoreCase [useRegExp [count]]])
jakoś chyba trzeba odczytać i porównać warstwy, a może?
(IniRead "General", "Layers")
chyba to dla mnie za trudne...

Spokojnie. Nic nie trzeba zgadywać. Kod jest (póki co) krótki, i można go ogarnąć. Najogólniej:
Mamy wskazać plik ini (getfiled), dodatkowo ma on zawierać w sobie jakieś dane zgodne ze wzorcem (Sekcja General + wartość Name). W przypadku powodzenia - zwraca T, w przeciwnym wypadku daje komunikaty (nie wskazano pliku, nie wskazano poprawnego). Ponadto na poziomie danych wejściowych (plik ini), mamy już wiedzę jak mają być zdefiniowane dane (ogólny format plików ini), i jak ważna jest ich poprawność (spacje tabulatory przejęzyczenia). To na razie tyle podsumowując.
Następny krok (choć krótki), już wiele zrobi. Zwróci nam listę danych (kluczy) sekcji Layers. Kod:
Kod: Zaznacz cały
(defun C:LPCON (/ n l)
  (if
    (setq n
      (getfiled "Wybierz plik ini" (getvar "DWGPREFIX") "ini" 16)
    )
    (if
      (= (acet-ini-get n "General" "Name") "LayPropConverter")
      (if
        (setq l (acet-ini-get n "Layers"))
        l
        (princ "\nBłąd w pliku ini.")
      )
      (alert "\nNie wskazano poprawnego pliku dla LayPropConverter.lsp")
    )
    (princ "\nNie wskazano pliku ini.")
  )
)

Ponownie tworzymy wywołanie warunkowe (if) - zwraca ono listę kluczy (jeśli są) lub informację o błędzie (jeśli nie ma sekcji Layers, albo jest pusta). Do odczytu ini, wykorzystujemy ponownie acet-ini-get
laypropconv2.png
Avatar użytkownika
kojacek
 
Posty: 5450
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez Grappa25 » kwi 09, 2016 14:50

a ten wpis (/n1)w definiowaniu polecenia LPCON to dlatego, że pojawiło się if setq 1? Jeśli będzie więcej warunków if to trzeba też zmieniać n?
Grappa25
 
Posty: 14
Dołączył(a): kwi 06, 2016 17:41

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez kojacek » kwi 09, 2016 14:52

Grappa25 napisał(a):a ten wpis (/n1)w definiowaniu polecenia LPCON to dlatego, że pojawiło się if setq 1? Jeśli będzie więcej warunków if to trzeba też zmieniać n?


To nie 1 tylko L, poczytaj tutaj: https://kojacek.wordpress.com/autolisp/inne/symbole-zmienne/
Avatar użytkownika
kojacek
 
Posty: 5450
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez Grappa25 » kwi 09, 2016 15:00

l- czyli zmienna lokalna
acet-ini-get zwraca listę kluczy (warstw)wszystkich, które są wyszczególnione w ini- to teraz musiałby odczytać jakie klucze są w naszym dxf-ie?
Grappa25
 
Posty: 14
Dołączył(a): kwi 06, 2016 17:41

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez kojacek » kwi 11, 2016 21:32

Grappa25 napisał(a):l- czyli zmienna lokalna
acet-ini-get zwraca listę kluczy (warstw)wszystkich, które są wyszczególnione w ini- to teraz musiałby odczytać jakie klucze są w naszym dxf-ie?


W "naszym" dxf-ie nie ma kluczy. Ponieważ kluczami w ini są nazwy warstw, kolejne działania w uproszczeniu będą wyglądały tak:
- dla każdego klucza (warstwy) pobierz dane z ini, rozczłonkuj je (zmień na listę), a następnie:
- wykonaj kolejne działania na elementach listy (tutaj:) (kolejno) zmień nazwę warstwy, jej rodzaj linii, kolor, oraz szerokość linii zeń przypisaną.
To wszystko wymagać będzie osobnej funkcji, wykorzystującej CADPL-Pack'a. Zmiana tych kilku właściwości, będzie musiała spełniać kilka warunków (nie ma gwarancji że dane w ini są zawsze poprawne). O tym zaś, w następnym odcinku - jak rozumiem, ponieważ nie ma pytań - wszystko do tej pory jest jasne?
Avatar użytkownika
kojacek
 
Posty: 5450
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] Czy napisanie takiego lispa jest trudne?

Postprzez Grappa25 » kwi 12, 2016 08:44

jak dotąd jako tako ogarniam- książka do nauki już idzie, a na razie czytam trochę na stronach www. Dziękuję, że poświęca mi Pan czas- widzę, że na moje szczęście ma Pan zacięcie dydaktyczne ;) Postaram się opisać sobie obok kodu wyjaśnienie do każdej linijki-będzie mi łatwej go "czytać".
Grappa25
 
Posty: 14
Dołączył(a): kwi 06, 2016 17:41

Poprzednia stronaNastępna strona

Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników