_

[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 » maja 01, 2012 10:03

Ok, rzeczywiście tak będzie (naj)lepiej. Zatem:
1] Już z nazwą cd:
Kod: Zaznacz cały
(defun cd:DCT_GetDict (Root Name)
  (cdr (assoc -1 (dictsearch Root Name)))
)
2] Też nazwa z cd:
Kod: Zaznacz cały
(defun cd:DCT_GetDictList (Root Name Code / dic dt tmp res)
  (if
    (and
      (setq dic (cd: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)
)

Reszta jak wcześniej (?)
Opisy trza dorobić i do PACK-a? Jako mocny początek zabaw niegraficznych... ;)
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 » maja 01, 2012 10:16

kojacek napisał(a):Reszta jak wcześniej (?)
Opisy trza dorobić i do PACK-a? Jako mocny początek zabaw niegraficznych... ;)
kojacek

XRECORD'y jeszcze cos tam bym zmienil. zapodam pozniej propozycje.
widze jeszcze ze kr:DCT_GetDictList cza troche przerobic. jesli nie podamy NAME (nil) to wtedy trzeba przerobic (entget (namedobjdict)) bo w obecnej wersji chyba nie da sie chyba zczytac glownych slownikow.
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 » maja 01, 2012 10:26

kruuger napisał(a):
kojacek napisał(a):Reszta jak wcześniej (?)
Opisy trza dorobić i do PACK-a? Jako mocny początek zabaw niegraficznych... ;)
kojacek

XRECORD'y jeszcze cos tam bym zmienil. zapodam pozniej propozycje.
widze jeszcze ze kr:DCT_GetDictList cza troche przerobic. jesli nie podamy NAME (nil) to wtedy trzeba przerobic (entget (namedobjdict)) bo w obecnej wersji chyba nie da sie chyba zczytac glownych slownikow.
k.


takie coś powinno wystarczyć:
Kod: Zaznacz cały
(setq dic (if (not Name)(namedobjdict)(cd:DCT_GetDict Root Name)))
popatrzeę jeszcze...
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 » maja 01, 2012 10:33

Można jeszcze zrobic cos takiego - w cd:DCT_GetDict jako Root dopuscić nil (wtedy nameobjdict):
Kod: Zaznacz cały
(defun cd:DCT_GetDict (Root Name)
  (cdr (assoc -1 (dictsearch (if (not Root)(namedobjdict) Root) Name)))
)


i teraz:
Kod: Zaznacz cały
(cd:DCT_GetDict nil "ACAD_LAYOUT")

lub:
Kod: Zaznacz cały
(cd:DCT_GetDict (namedobjdict) "ACAD_LAYOUT")

a poprzednie (nawet):
Kod: Zaznacz cały
(cd:DCT_GetDictList nil nil t)
albo:
Kod: Zaznacz cały
(cd:DCT_GetDictList nil nil nil)

:idea:
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 » maja 01, 2012 11:00

a moze tak:
Kod: Zaznacz cały
(defun cd:DCT_GetDict (Root Name)
  (if Name
    (cdr (assoc -1 (dictsearch Root Name)))
    (namedobjdict)
  )
)

zamiast if'owac ROOT (nadal wymaga if NAME) zrobic to z NAME. wtedy poprzednia GetDictList jest bez zmian:
Kod: Zaznacz cały
(defun cd:DCT_GetDictList (Root Name Code / dic dt tmp res)
  (if
    (and
      (setq dic (cd: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)
)

?
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 » maja 01, 2012 11:11

kruuger napisał(a):a moze tak:
Kod: Zaznacz cały
(defun cd:DCT_GetDict (Root Name)
  (if Name
    (cdr (assoc -1 (dictsearch Root Name)))
    (namedobjdict)
  )
)

zamiast if'owac ROOT (nadal wymaga if NAME) zrobic to z NAME. wtedy poprzednia GetDictList jest bez zmian:
Kod: Zaznacz cały
(defun cd:DCT_GetDictList (Root Name Code / dic dt tmp res)
  (if
    (and
      (setq dic (cd: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)
)

?
k.



Nie rozumiem, jaki tu zysk? Poprzednio masz:
Kod: Zaznacz cały
(cd:DCT_GetDict nil "ACAD_LAYOUT")
bo chcesz wziąć ten słownik z nameobjdict.
po zmianie możesz wywołac:
Kod: Zaznacz cały
(cd:DCT_GetDict (nameobjdict) nil)
... no ale po co? dostajesz nameobjdict....

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 » maja 01, 2012 11:22

kojacek napisał(a):Nie rozumiem, jaki tu zysk?

zysk jest dopiero w GetDictList:
Kod: Zaznacz cały
(cd:DCT_GetDict (nameobjdict) nil)

daje nameobjdict po to, aby uzyc wlasnie w GetDictList
jesli wydaje sie to bez sensu to lepiej zrobic:
Kod: Zaznacz cały
(defun cd:DCT_GetDictList (Root Name Code / dic dt tmp res)
  (if
    (and
      (setq dic
        (if Name
          (cd:DCT_GetDict Root Name)
          (namedobjdict)
        )
      )
      (setq dt (entget dic))
    )
    ....

i zostawic GetDict jaki byl.
?
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 » maja 01, 2012 11:43

kruuger napisał(a):(...) ?


Polećmy kolejno. Najpierw pierwsza i podstawowa: cd:DCT_GetDict
Wg mnie dwa argumenty: Root <ename> (tatusia) i <str> Name (imię słownika) - które jest wymagane - bowiem czegoś w końcu szukamy. Uważam że ename mozna dopuścić jako nil wtedy przyjmowane jest że jest to główny słownik rozszerzeń czyli namedobjdict.
Dodpuszczalne są zatem wywołania:

Kod: Zaznacz cały
(cd:DCT_GetDict nil "ACAD_LAYOUT")

bowiem chcę obiekt o nazwie "ACAD_LAYOUT" (z nameoobjdict), albo też:
Kod: Zaznacz cały
(cd:DCT_GetDict (cd:DCT_GetDict nil "ACAD_LAYOUT") "Layout1")

dostaję obiekt o nazwie "Layout1" ze słownika "ACAD_LAYOUT"

Gdyby Name mogło być Nil - nie ma to absolutnie żadnego sensu:
bowiem:
Kod: Zaznacz cały
(cd:DCT_GetDict (nameobjdict) nil)
jest równoważne
Kod: Zaznacz cały
(nameobjdict)
... więc gdzie to jest to Get...
Zatem uważam że tylko Root moze być nil, a Name musi być zawsze obowiazkowe.

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 » maja 01, 2012 11:57

kojacek napisał(a):Zatem uważam że tylko Root moze być nil, a Name musi być zawsze obowiazkowe.
kojacek

to w takim razie jak dostac liste slownikow w (namedobjdict) ?
w twojej wersji (dwa przejscia) to dalo rade zrobic, ale w mojej musimy gdzies zrobic if do Name, aby dostac liste slownikow glowych. poprsotu jesli nie ma Name to przetrzep (entget (namedobjdict)).
k.

EDIT: Name=nil jest jak najbardziej uzasadnione gdy wlasnie chcemy przejrzec slownik glowny. nie szukamy wtedy nic konkretnego.
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 » maja 01, 2012 12:11

kruuger napisał(a):
kojacek napisał(a):Zatem uważam że tylko Root moze być nil, a Name musi być zawsze obowiazkowe.
kojacek

to w takim razie jak dostac liste slownik w (namedobjdict) ?
k.

No to jest teraz krok 2 czyli funkcja cd:DCT_GetDictList, trzeba ją teraz tak poustawiać aby brała dla wszystkich z każdego dowolnego. Ogólnie ma ona zwracać listę słowników w słowniku okreslonym przez Name (nie root - które jest "tatusiem" dla Name). I teraz uważam że (przy trzech argumentach)
Kod: Zaznacz cały
(cd:DCT_GetDictList <Root><Name><Code>)
<Root> może być nil lub ename, jeśli nil to lista z namedobjdict (w tym przypadku kazde Name jest ignorowane)
<Name> jest nazwą słownika w <Root> i jest wymagane zawsze dla <Root> róznego od nil
<code> - wiadomo
Innymi słowy jeśli Root=nil to zwraca słowniki z namedobjdict, jeśli zaś /=nil zwraca listę obiektów w słowniku okreslonym przez Name znajdującym się w <Root> (wtedy oba argumenty wymagane).
Ma sens?
kojacek
Avatar użytkownika
kojacek
 
Posty: 5511
Dołączył(a): paź 03, 2005 20:17

Poprzednia stronaNastępna strona

Powrót do AutoCAD

Kto przegląda forum

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