_

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

[LISP] Czy napisanie takiego lispa jest trudne?

Postprzez Metias » lut 16, 2016 11:05

Witam
Potrzebuję "na gwałt" napisać lispa który by wykonywał taką operację:
klikam tekst (liczba real) później drugi tekst (liczba real) po czym na inne warstwie (np "roznica") w miejscu w którym się kliknie wstawiana była by wartość bezwzględna z różnicy tych liczb.
Mam do wykonania około 4000 takich operacji. Ręczna edycja by mnie zabiła ;)
Mógłby ktoś podpowiedzieć gdzie znajdę kurs Lispa, ewentualnie jakich funkcji użyć?
I najważniejsze czy taki Lisp byłby bardzo skomplikowany? Mam pewne doświadczenie w programowaniu (pascal, C++) i wydaje mi się że to nie powinno być skomplikowane.

Z góry dziękuję za wszelką pomoc.
Metias
 
Posty: 3
Dołączył(a): lut 16, 2016 10:51

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

Postprzez Kizior » lut 16, 2016 11:12

Metias napisał(a):Mógłby ktoś podpowiedzieć gdzie znajdę kurs Lispa, ewentualnie jakich funkcji użyć?


http://lmgtfy.com/?q=Kurs+autolisp
Kizior
 
Posty: 177
Dołączył(a): paź 12, 2011 22:01
Lokalizacja: Lublin

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

Postprzez Metias » lut 16, 2016 13:51

Kizior dziękuję za sposób znalezienia kursów. Chodziło mi o jakieś sprawdzone i polecane przez was kursy... A tak BTW kilka więcej pytań zawarłem w mojej wiadomości, kurs jest w tej chwili akurat najmniej istotny.
Metias
 
Posty: 3
Dołączył(a): lut 16, 2016 10:51

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

Postprzez gregi08 » lut 16, 2016 14:31

Skoro potrzebujesz rozwiązania na "gwałt" to trochę za późno na naukę :P

Stąd przedstawiam przykładowe rozwiązanie problemu, które spełnia Twoje oczekiwania. Możesz spersonalizować działanie funkcji w zakresie linijek 4-9.

Dodatkowo zamieściłem kilka komentarzy, które ułatwią zrozumienie co się dzieje.

Kod: Zaznacz cały
(defun c:Roznica ( / tekst1 tekst2 wartosc1 wartosc2 roznica roznicaTxt pktWstawienia)

   ; Zmienna odpowiada za liczbe miejsc po przecinku wyniku odejmowania
   (setq *dokladnosc* 4)
   ; Zmienna odpowiada za wysokość tekstu wyniku odejmowania
   (setq *txtHeight* 10)
   ; Zmienne odpowiadają za wartstwę - nazwę i kolor
   (setq *layerName* "Roznica")
   (setq *layerColor* 3)
   
   ; Utworz/sprawdz warstwe
   (MakeLayer *layerName* *layerColor*)

   ; Pobierz od użytkownika teksty
   (setq tekst1 (SelectText "\nWskaż pierwszy tekst do odczytu wartości: "))
   (setq tekst2 (SelectText "\nWskaż drugi tekst do odczytu wartości: "))
   ; Pobierz wartosci tekstow
   (setq wartosc1 (cdr (assoc 1 (entget tekst1))))
   (setq wartosc2 (cdr (assoc 1 (entget tekst2))))
   
   ; Odejmowanie wraz z przejsciem string -> real
   (setq roznica (- (atof wartosc1) (atof wartosc2)))
   
   ; wartosc bezwzgledna
   (setq roznica (abs roznica))
   
   ; Przejscie z real -> string
   (setq roznicaTxt (rtos roznica 2 *dokladnosc*))
   
   (setq pktWstawienia (getpoint "\nWskaż punkt wstawienia wyniku"));
   
   (InsertText roznicaTxt pktWstawienia *txtHeight* *layerName*)
   
   (princ)   
)

(defun SelectText (monit / ent)
   (while (not ent) ;zabezpieczenie aby zawsze byl tekst
      (setq ent (entsel monit))
      (if (/= ent nil)
         (if (and (/= (cdr(assoc 0(entget(car ent)))) "TEXT")
                 (/= (cdr(assoc 0(entget(car ent)))) "MTEXT"))
            (progn
               (princ "\nPostaraj się trafić w tekst.")
               (setq ent nil)
            )
         )
      )
   )
   (car ent)
)

(defun InsertText (text point height layer)
   (entmakex
      (list
         (cons 0 "TEXT")
         (cons 1 text)
         (cons 8 layer)
         (cons 10 point)
         (cons 40 height)
         (cons 50 0)
      )
   )
)

(defun MakeLayer (Name Color / en)
  (if (setq en (tblobjname "LAYER" Name))
    en
    (entmakex
      (list
        (cons 0 "LAYER")
        (cons 100 "AcDbSymbolTableRecord")
        (cons 100 "AcDbLayerTableRecord")
        (cons 2 Name)
      (cons 62 Color)
        (cons 70 0)
      )
    )
  )
)
gregi08
 
Posty: 7
Dołączył(a): paź 31, 2014 11:20

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

Postprzez Metias » lut 16, 2016 14:36

gregi08 Wielkie dzięki. Tak już trochę późno na naukę. Przyznam że temat mnie bardzo zainteresował. Dziękuję za rozwiązanie problemu już pędzę je analizować :)
Metias
 
Posty: 3
Dołączył(a): lut 16, 2016 10:51

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

Postprzez kojacek » lut 16, 2016 14:55

Miło było by, gdybyż ów lisp sprawdzał czy pobrane teksty liczby reprezentują.
Avatar użytkownika
kojacek
 
Posty: 5450
Dołączył(a): paź 03, 2005 20:17

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

Postprzez gregi08 » lut 16, 2016 15:00

Byłoby miło, to prawda - obniżam swoją poprzeczkę przy dedykowanych narzędziach dla świadomego użytkownika.
Atof w tym przypadku nie zwróci błędu, nawet jeśli we wskazanym tekście nie będzie liczby - zwróci wtedy 0.
gregi08
 
Posty: 7
Dołączył(a): paź 31, 2014 11:20

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

Postprzez kojacek » lut 16, 2016 23:14

A coś takiego? Rzecz jasna potrzebny CADPack tutejszy:

Kod: Zaznacz cały
(defun C:TST (/ a b p e SelDigText)
  (defun SelDigText (Msg / g s d)
    (prompt Msg)
    (setq g (grread nil 4 2))
    (cond
      ( (= (car g) 3)
        (if
     (setq s (ssget (cadr g)))
          (progn
            (setq d (entget (ssname s 0)))
       (if
              (and
                (= (cdr (assoc 0 d)) "TEXT")
                (distof (cdr (assoc 1 d)))
              )
         (ssname s 0)
         (SelDigText "\n\tSpróbuj ponownie: ")
       )
          )
     (SelDigText Msg)
        )
      )
      (t Nil)
    )
  )
  (if
    (and
      (setq a (SelDigText "\n\tWybierz pierwszy tekst będący liczbą: "))
      (setq b (SelDigText "\n\tWybierz drugi tekst będący liczbą: "))
      (setq p (getpoint "\nWskaż punkt wstawienia tekstu: "))
    )
    (if
      (setq e
        (cd:ENT_MakeText
          (getvar "CTAB")
          (cd:CON_Real2Str
            (abs
              (-
                (distof (cdr (assoc 1 (entget a))) 2)
                (distof (cdr (assoc 1 (entget b))) 2)
              )
            ) 2 nil
          )
          p (getvar "TEXTSIZE") 0.0
        )
      )
      (cd:ENT_SetDXF e 8 "--TEMP--")
    )
  )
  (princ)
)
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 06, 2016 18:11

witam, temat jest podobny więc nie będę tworzyć nowego tematu.
zajmuję się geodezją i ciągle "poprawiam" pliki dxf, które powstają po eksporcie z programu typowo geodezyjnego.
"Poprawianie" polega na zmianie warstwom o konkretnych nazwach- grubości, typu linii i koloru warstwy. Pozostałe rzeczy- czyli tworzenie szkiców, tabelek, zakresów, formatek jest za każdym razem inne więc tych czynności nie potrzebuję automatyzować. Czy jest możliwość stworzenia takiego lispa, który zmieniałby automatycznie te parametry (np. warstwa EBUPP powinna mieć linię ciągłą, biały kolor i grubość 0,5, a następne warstwy już inne parametry- warstw jest za każdym razem kilkadziesiąt.
Proszę o wskazówki i pozdrawiam
Justyna
Grappa25
 
Posty: 14
Dołączył(a): kwi 06, 2016 17:41

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

Postprzez kojacek » kwi 06, 2016 18:30

Grappa25 napisał(a):witam, temat jest podobny więc nie będę tworzyć nowego tematu.
zajmuję się geodezją i ciągle "poprawiam" pliki dxf, które powstają po eksporcie z programu typowo geodezyjnego.
"Poprawianie" polega na zmianie warstwom o konkretnych nazwach- grubości, typu linii i koloru warstwy. Pozostałe rzeczy- czyli tworzenie szkiców, tabelek, zakresów, formatek jest za każdym razem inne więc tych czynności nie potrzebuję automatyzować. Czy jest możliwość stworzenia takiego lispa, który zmieniałby automatycznie te parametry (np. warstwa EBUPP powinna mieć linię ciągłą, biały kolor i grubość 0,5, a następne warstwy już inne parametry- warstw jest za każdym razem kilkadziesiąt.
Proszę o wskazówki i pozdrawiam
Justyna


Szczególnie trudne nie jest, wykorzystując zaś CADPL-Pack'a jest jeszcze łatwiejsze. Inna - zasadnicza sprawa, to wzorzec, na podstawie którego musiała by być dokonywana zmiana. Pewnie nigdy nie jest tak samo. Polecam zatem wykorzystanie pliku tekstowego typu *.ini, w którym zapisane będą nastawy, i możliwa będzie ich szybka edycja.
Przykładowe linie takiego pliku może wyglądać tak:
Kod: Zaznacz cały
EBUPP=EBUPP,Continuous,7,0.53
Granice=00-Granice,Continuous,6,0.18

StaraNazwaWarstwy=NowaNazwa,RodzajLinii,Kolor,GrubośćPisaka
itd.
Oczywiście wpisów w pliku może być więcej, niż jest zwykle warstw, zmianie podlegały by tylko znalezione nastawy.
Avatar użytkownika
kojacek
 
Posty: 5450
Dołączył(a): paź 03, 2005 20:17

Następna strona

Powrót do AutoCAD

Kto przegląda forum

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