_

[LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

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] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kojacek » kwi 20, 2012 14:57

kruuger napisał(a):znecam sie troche nad notatkami i tak:
1. na razie wczytana jest jakas tam sobie lista. wydumalem ze bedzie ona w postaci:
[code] dzieki temu mozemy latwo wydobyc pierwsza czesc do okienka DCL car'em (wypelnic liste), a druga CADR'em. sa to dane o widoku czyli: arkusz, punkt i trzecia to chyba wysokosc widoku VIEWSIZE.
co o tym myslicie ? oczywiscie zamiast tej listy bedzie czytanie/zapisywanie do slownika.

2.powinno dzialac: dodawanie, edycja, usuwanie (lacznie z wygaszaniem przyciskow). dodawanie punku jeszcze kuleje.
3.sortowanie na razie odbywa sie po dacie (rosnaco)
k.



pobieznie popatrzył:
1) Sortowanie nie działa (a wczesniej chyba było)
2) Operacje Dodaj Edytuj nie powinny chyba zamykać okna głównego, jeno otwierać się kaskadowo (na wierzchu) będąc oknami podrzędnymi.
3) Format listy jest (właściwie) rzeczą wtórną. W XRECORD i tak będą zapisane na jednym poziomie. Odczytane zaś mogą być potem ułożone w dowolny sposób. Niemniej przyjęcie zasady (dla jednego rekordu) że będzie to lista dwuelementowa (list dwóch list), nie powinna ograniczać długości tych list. Wydaje się to bezpieczne dla pierwszego elementu - to lista trzech elementów (data / autor / treść) i tak może zostać. Drugiej listy zaś, z góry bym nie ograniczał - w przyszłości możnaby coś ewentualnie dodać, jeśli zechcemy.
kojacek
Avatar użytkownika
kojacek
 
Posty: 5511
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kruuger » kwi 20, 2012 15:09

kojacek napisał(a):pobieznie popatrzył:

1) jakos tam dzialalo. na razie wyrzucilem zeby nie rozwlekac pliku, zle sie pracuje. bez problemu bedzie mozna dodac jak wszystko zagra jak cza.
2) no wlasnie. ale teraz co z pobieraniem punktu w drugim okienku ? trzeba by zamknac oba na raz, a potem je przywrocic. pojdzie to gladko ?
3) druga lista oczywicie moze rosnac. na razie chyba potrzebne beda 3 elementy.
kruuger
Avatar użytkownika
kruuger
 
Posty: 4870
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kojacek » kwi 20, 2012 15:15

kruuger napisał(a):
kojacek napisał(a):pobieznie popatrzył:

1) jakos tam dzialalo. na razie wyrzucilem zeby nie rozwlekac pliku, zle sie pracuje. bez problemu bedzie mozna dodac jak wszystko zagra jak cza.
2) no wlasnie. ale teraz co z pobieraniem punktu w drugim okienku ? trzeba by zamknac oba na raz, a potem je przywrocic. pojdzie to gladko ?
3) druga lista oczywicie moze rosnac. na razie chyba potrzebne beda 3 elementy.
kruuger

1) ok
2) chyba pójdzie. to się trochę inaczej robi - ale myślę że się da.
3) ok
Jeszcze jedna sprawa, ale to trzeba będzie dopiero sprawdzić - żeby się na te notki nie namnażały (przy wstawianiu bloków, wklejaniu, itp.)...

kojacek
Avatar użytkownika
kojacek
 
Posty: 5511
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez ZK » kwi 26, 2012 12:38

Czy dla punktu 2) nie lepiej zastosować w DCL zamiast:
Kod: Zaznacz cały
b15 : button {
  width = 13;
  fixed_width = true;
  horizontal_margin = none;
}

to np.
Kod: Zaznacz cały
b16 : retirement_button {
  width = 13;
  fixed_width = true;
  horizontal_margin = none;
}
? Ma to jakieś znaczenie?

I konstrukcja w LISP:
Kod: Zaznacz cały
(setq state 2)
(while (>= state 2)
    (if (not (new_dialog nazwa_okna dcl_id)) (exit))
   
    (action_tile "1" "(done_dialog 4)")
    (action_tile "2" "(done_dialog 5)")
    (action_tile "3" "(done_dialog 6)")
    (action_tile "4" "(done_dialog 7)")
   (action_tile "ok" "(setq akcja 1)(done_dialog 0)(princ)")
    (action_tile "cancel" "(setq akcja 0)(done_dialog 0)(princ)")

    (setq state (start_dialog))

    (cond (
          (= state 4)
         (princ)
      )
       (
          (= state 5)
         (princ)
        )
      (
       (= state 6)
         (princ)
        )
      (
       (= state 7)
         (princ)
        )
       (
          (= state 0)
         (princ)
        )
    )
  )

  (unload_dialog dcl_id)

  (if (= akcja 1)
    (princ)
  )


ZK

EDIT: no jest jeszcze opcja taka: http://www.afralisp.net/dialog-control- ... -boxes.php
**************************************
********* http://madebynati.com *********
**************************************
Avatar użytkownika
ZK
 
Posty: 1082
Dołączył(a): mar 11, 2009 12:08
Lokalizacja: Poznań

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kruuger » kwi 27, 2012 09:20

ZK napisał(a):Czy dla punktu 2) nie lepiej zastosować w DCL zamiast:

a nawet nie wiem co szczegolnego ma ten retirement_button.

propozycje slownikowe. wydaje mi sie ze krotkie i zwiezle:
Kod: Zaznacz cały
; =========================================================================================== ;
; Pobiera liste slownikow podrzednych  / Gets a list of sub-dictionaries                      ;
;  Name [STR] - nazwa slownika glownego / name of the root dictionary                         ;
; ------------------------------------------------------------------------------------------- ;
; (kr:DCT_GetDictList "NAZWA")                                                                ;
; =========================================================================================== ;
(defun kr:DCT_GetDictList (Name / dic dt tmp res)
  (if
    (and
      (setq dic (kr:DCT_GetDict Name))
      (setq dt (entget dic))
    )
    (while
      (setq dt (member (setq tmp (assoc 3 dt)) dt))
      (setq res (cons (cons (cdr tmp) (cdr (assoc 350 dt))) res)
            dt (cdr dt)
      )
    )
  )
  (reverse res)
)
; =========================================================================================== ;
; Dodaje slownik / Adds the dictionary                                                        ;
;  Name [STR] - nazwa slownika / name of the dictionary                                       ;
; ------------------------------------------------------------------------------------------- ;
; (kr:DCT_AddDict "NAZWA")                                                                    ;
; =========================================================================================== ;
(defun kr:DCT_AddDict (Name)
  (dictadd (namedobjdict) Name
    (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))
  )
)
; =========================================================================================== ;
; Pobiera slownik / Gets the dictionary                                                       ;
;  Name [STR] - nazwa slownika / name of the dictionary                                       ;
; ------------------------------------------------------------------------------------------- ;
; (kr:DCT_GetDict "NAZWA")                                                                    ;
; =========================================================================================== ;
(defun kr:DCT_GetDict (Name)
  (cdr (assoc -1 (dictsearch (namedobjdict) Name)))
)
; =========================================================================================== ;
; Usuwa slownik / Removes the dictionary                                                      ;
;  Name [STR] - nazwa slownika / name of the dictionary                                       ;
; ------------------------------------------------------------------------------------------- ;
; (kr:DCT_RemoveDict "NAZWA")                                                                 ;
; =========================================================================================== ;
(defun kr:DCT_RemoveDict (Name)
  (dictremove (namedobjdict) Name)
)
; =========================================================================================== ;
; Dodaje Xrecord / Adds the Xrecord                                                           ;
;  Name  [STR]  - nazwa slownika / name of the dictionary                                     ;
;  XName [STR]  - nazwa xrecord / xrecord name                                                ;
;  XData [LIST] - dane xrecord / xrecord data                                                 ;
; ------------------------------------------------------------------------------------------- ;
; (kr:DCT_AddXrecord "NAZWA" "SUB" '((1 . "ABC") (2 . "XYZ") (10 0 0 0)))                     ;
; =========================================================================================== ;
(defun kr:DCT_AddXrecord (Name XName XData)
  (dictadd (kr:DCT_GetDict Name) XName
    (entmakex (append '((0 . "XRECORD") (100 . "AcDbXrecord")) XData))
  )
)

przyklad
Kod: Zaznacz cały
(defun c:TEST (/ _PrincXrecord res sub)
  (defun _PrincXrecord (Data)
    (alert
      (strcat
        "Xrecord ( " (itoa res) " )" "\n"
        "1= " (cdr (assoc 1 (entget Data))) "\n"
        "2= " (cdr (assoc 2 (entget Data))) "\n"
        "3= " (vl-Princ-To-String (cdr (assoc 10 (entget Data))))
      )
    )
  )
  (kr:DCT_AddDict "NAZWA")
  (kr:DCT_AddXrecord "NAZWA" "SUB1" '((1 . "ABC") (2 . "one") (10 0 0 0)))
  (kr:DCT_AddXrecord "NAZWA" "SUB2" '((1 . "DEF") (2 . "two") (10 1 1 1)))
  (kr:DCT_AddXrecord "NAZWA" "SUB3" '((1 . "GHI") (2 . "tri") (10 2 2 2)))
  (setq res
    (cd:DCL_StdListDialog
      (mapcar 'car (setq sub (kr:DCT_GetDictList "NAZWA")))
      0 "Dictionary" "Slownik NAZWA:" 40 15 2 nil T nil
    )
  )
  (if res
    (cond
      ( (zerop res)
        (_PrincXrecord (cdr (nth res sub)))
      )
      ( (= res 1)
        (_PrincXrecord (cdr (nth res sub)))
      )
      ( T
        (_PrincXrecord (cdr (nth res sub)))
      )
    )
  )
  (princ)
)

k.
Avatar użytkownika
kruuger
 
Posty: 4870
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kojacek » kwi 27, 2012 09:51

kruuger napisał(a):a nawet nie wiem co szczegolnego ma ten retirement_button.

retirement_button to przycisk będący zastąpieniem standardowego przycisku zamykajacego (w DCL- okno musi mieć co najmniej jeden taki przycisk). Np. można sobie zrobić [Zaniechaj] zamiast [Cancel]. Normalnie jeśli jakiś przycisk ma w sposób jawny podany w definicji np. is_accept, lub is_cancel, i ma przypisana reakcję done_dialog, nie ma potrzeby stosowania retirement_button. Nie wiem dlaczego ZK tak chciał, bowiem to (tutaj) nic nie daje.

kruuger napisał(a):propozycje slownikowe. wydaje mi sie ze krotkie i zwiezle:

Jedna podstawowa uwaga: wszystkie one pozwalają tworzyć słowniki tylko na jednym poziomie (w Słowniku Nazwanych Obiektów - NamedObjDict). Uważam to za wadę. W rozwiązaniach:
http://kojacek.republika.pl/nongraphic_3.html
http://kojacek.republika.pl/nongraphic_4.html
słowniki i Xrecordy mogą być tworzone w dowolnym miejscu np.:
Kod: Zaznacz cały
NAMEDOBDICT ---> MY_DICT_1 ---> MY_DICT_A
                            ---> MY_DICT_B
                            ---> MY_DICT_C ----> Next_My_DICT...

kojacek
Avatar użytkownika
kojacek
 
Posty: 5511
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kruuger » kwi 29, 2012 09:34

moze po kolei jakos to obadac, i tak:
- sprawdzania czy slownik istnieje, wystarczy chyba:
Kod: Zaznacz cały
(defun kr:DCT_CheckDict (Root Name)
  (dictsearch Root DictName)
)

- dodawanie/tworzenie (2 opcje)
Kod: Zaznacz cały
(defun kr:DCT_AddGetDict (Root Name Ret)
  (cond
    ( (dictadd Root Name (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))))   
    ( Ret
      (cdr (assoc -1 (dictsearch Root Name)))
    )
  )
)
(kr:DCT_AddGetDict (namedobjdict) "NAZWA" T)

jesli nie ma slownika jest tworzony i zwraca ename. jesli slownik wystepuje to zwracany jest jego ename (gry Ret=T), nil gdy Ret=nil
druga opcja:
Kod: Zaznacz cały
(defun kr:DCT_AddGetDict2 (Root Name)
  (cond
    ( (cdr (assoc -1 (dictsearch Root Name))))
    ( (dictadd Root Name (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))))
  )
)
(kr:DCT_AddGetDict2 (namedobjdict) "NAZWA")

jesli jest slownik to zawsze zwraca ename, jesli nie ma to go tworzy.
co lepsiejsze ?
k.
Avatar użytkownika
kruuger
 
Posty: 4870
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kojacek » kwi 29, 2012 19:37

kruuger napisał(a):moze po kolei jakos to obadac, i tak:
- sprawdzania czy slownik istnieje, wystarczy chyba:
Kod: Zaznacz cały
(defun kr:DCT_CheckDict (Root Name)
  (dictsearch Root DictName)
)

- dodawanie/tworzenie (2 opcje)
Kod: Zaznacz cały
(defun kr:DCT_AddGetDict (Root Name Ret)
  (cond
    ( (dictadd Root Name (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))))   
    ( Ret
      (cdr (assoc -1 (dictsearch Root Name)))
    )
  )
)
(kr:DCT_AddGetDict (namedobjdict) "NAZWA" T)

jesli nie ma slownika jest tworzony i zwraca ename. jesli slownik wystepuje to zwracany jest jego ename (gry Ret=T), nil gdy Ret=nil
druga opcja:
Kod: Zaznacz cały
(defun kr:DCT_AddGetDict2 (Root Name)
  (cond
    ( (cdr (assoc -1 (dictsearch Root Name))))
    ( (dictadd Root Name (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))))
  )
)
(kr:DCT_AddGetDict2 (namedobjdict) "NAZWA")

jesli jest slownik to zawsze zwraca ename, jesli nie ma to go tworzy.
co lepsiejsze ?
k.


To trochę poporzadkujmy niegrafiki ;) :
1) kr:DCT_CheckDict - ok ale (chyba) jako:
Kod: Zaznacz cały
(defun kr:DCT_CheckDict (Root Name)
  (cdr (assoc -1 (dictsearch Root Name)))
)

2) kr:DCT_AddGetDict2 dla mnie (i ogólnie :) ) lepsze. Oczywiście nazwa (przez analogię do CAD-owego vlax-get-or-create-object) może być np. cd:DCT_GetOrCreateDict
3) Dorzucam (od siebie nieco zmienioną):
Kod: Zaznacz cały
; =========================================================================================== ;
; Zwraca liste obiektow w slowniku
; =========================================================================================== ;
(defun jk:DCT_GetDictList (Root Code / dl res)
  (setq dl (entget Root)
        res (cd:DXF_Massoc 3 dl)
  )
  (if Code
    (mapcar
      (function
        (lambda (%)
          (cons
            %
            (cdadr
              (member (cons 3 %) dl)
            )
          )
        )
      )
      res
    )
    res
  )
)

Teraz:
Kod: Zaznacz cały
(jk:DCT_GetDictList (namedobjdict) t)

daje:
Kod: Zaznacz cały
(("ACAD_COLOR" . <Nazwa elementu: 7ffffb03bb0>) ("ACAD_GROUP" . <Nazwa
elementu: 7ffffb038d0>) ("ACAD_LAYOUT" . <Nazwa elementu: 7ffffb039a0>)
("ACAD_MATERIAL" . <Nazwa elementu: 7ffffb03ba0>) ("ACAD_MLEADERSTYLE" . <Nazwa
elementu: 7ffffb05150>) ("ACAD_MLINESTYLE" . <Nazwa elementu: 7ffffb03970>)
("ACAD_PLOTSETTINGS" . <Nazwa elementu: 7ffffb03990>) ("ACAD_PLOTSTYLENAME" .
<Nazwa elementu: 7ffffb038e0>) ("ACAD_SCALELIST" . <Nazwa elementu:
7ffffb050c0>) ("ACAD_TABLESTYLE" . <Nazwa elementu: 7ffffb03c60>)
("ACAD_VISUALSTYLE" . <Nazwa elementu: 7ffffb03ef0>) ("AcDbVariableDictionary"
. <Nazwa elementu: 7ffffb03ae0>))

a:
Kod: Zaznacz cały
(jk:DCT_GetDictList (namedobjdict) nil)

zwraca:
Kod: Zaznacz cały
("ACAD_COLOR" "ACAD_GROUP" "ACAD_LAYOUT" "ACAD_MATERIAL" "ACAD_MLEADERSTYLE"
"ACAD_MLINESTYLE" "ACAD_PLOTSETTINGS" "ACAD_PLOTSTYLENAME" "ACAD_SCALELIST"
"ACAD_TABLESTYLE" "ACAD_VISUALSTYLE" "AcDbVariableDictionary")

zaś popatrzcie na to - (wielopoziomowe):
Kod: Zaznacz cały
 (kr:DCT_CheckDict (kr:DCT_CheckDict (namedobjdict) "ACAD_SCALELIST") "A1")

moze zwrócić:
Kod: Zaznacz cały
<Nazwa elementu: 7ffffb05560>


kojacek
Avatar użytkownika
kojacek
 
Posty: 5511
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kojacek » kwi 30, 2012 14:38

Dodam jeszcze takie coś:

Kod: Zaznacz cały
; =========================================================================================== ;
; pobiera lub tworzy ExtensionDictionary obiektu
;  Obj  [ENAME/VLAOBJECT] - obiekt
;  Flag [T/nil]           - T => zawsze tworzy | nil => tylko pobiera
; =========================================================================================== ;
(defun dc:DCT_GetOrCreateExtDict (Obj Flag / res)
  (if (= (type Obj) 'ENAME)
    (setq Obj (vlax-ename->vla-object Obj))
  )
  (if
    (setq res
      (if
        (= :vlax-true (vla-get-HasExtensionDictionary Obj))
        (vla-GetExtensionDictionary Obj)
        (if Flag
          (vla-GetExtensionDictionary Obj)
        )
      )
    )
    (vlax-vla-object->ename res)
  )
)


Namalujmy teraz dowolny obiekt (to będzie CIRCLE)
Wykorzystując także poprzednie funkcje możemy wywołac:
Kod: Zaznacz cały
(dc:DCT_AddXrecord (dc:DCT_GetOrCreateExtDict (car (entsel)) T) "CADPL" "Data" '((1 . "Dane-BLA")))

wskazując nasze kółko...
Wywołanie to utworzyło związany z obiektem (okrąg) tzw. Extension Dictionary, w nim utworzyło słownik o nazwie "CADPL", w nim zaś kolejny (o nazwie "Data") w którym umieszczono XRECORD z jakimiś tam danymi. Strukturę tegoż ilustruje obrazek:
extensiondictionary.png



kojacek
Avatar użytkownika
kojacek
 
Posty: 5511
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL - Zapisywanie notatek w rysunku [Tool_005]

Postprzez kruuger » kwi 30, 2012 21:37

jezeli:
Kod: Zaznacz cały
(defun kr:DCT_CheckDict (Root Name)
  (cdr (assoc -1 (dictsearch Root Name)))
)

ma byc wykorzystane do zwrocenia informacji w postaci ENAME a nie info ze slownik istnieje lub nie (T/nil) to funkcje nazwalbym DCT_GetDict ?

w jk:DCT_GetDictList nie podoba mi sie dwukrotne przejscie przez ta sama liste danych, raz DXF_Massoc a potem mapcar
moze tak:
Kod: Zaznacz cały
(defun kr:DCT_GetDictList (Root Name Code / dic dt tmp res)
  (if
    (and
      (setq dic (kr:DCT_GetDict Root Name))
      (setq dt (entget dic))
    )
    (while
      (setq dt (member (setq tmp (assoc 3 dt)) dt))
      (if Code
        (setq res (cons (cons (cdr tmp) (cdr (assoc 350 dt))) res))
        (setq res (cons (cdr tmp) res))
      )
      (setq dt (cdr dt))
    )
  )
  (reverse res)
)

GetDict umieszczone juz w funkcji dzieki temu:
Kod: Zaznacz cały
(jk:DCT_GetDictList (kr:DCT_GetDict (namedobjdict) "acad_layout") nil)

vs
Kod: Zaznacz cały
(kr:DCT_GetDictList (namedobjdict) "acad_layout" nil)


cd:DCT_GetOrCreateDict jak najbardziej tak.
k.
Avatar użytkownika
kruuger
 
Posty: 4870
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Poprzednia stronaNastępna strona

Powrót do AutoCAD

Kto przegląda forum

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