_

[LISP] CADPL-Pack-v1.lsp [Dyskusja]

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-Pack-v1.lsp [Dyskusja]

Postprzez kruuger » kwi 23, 2014 08:34

olo-gdynia napisał(a):Skłaniał bym się ku podejściu Kojacka.
olo-gdynia

dobrze by bylo zeby dzialal tez ze zwyklymi blokami, a nie tylko dynamicznymi.
k.
Avatar użytkownika
kruuger
 
Posty: 4863
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kojacek » kwi 23, 2014 08:45

kruuger napisał(a):dobrze by bylo zeby dzialal tez ze zwyklymi blokami, a nie tylko dynamicznymi.

Można to tak podkręcić:
Kod: Zaznacz cały
(defun jk:SSX_SelectDynBlockFilter (Mode Name / l p n f)
  (if
    (setq l (cond ((cd:BLK_GetDynBlockNames Name))(t (list Name))))
    (progn
      (setq p (strcat "`" (cd:STR_ReParse (mapcar 'chr (vl-string->list Name)) "`"))
            n (if (cdr l)(cd:STR_ReParse (mapcar '(lambda (%)(strcat "`" %))(cdr l)) ",") nil)
            f (list '(0 . "INSERT")(cons 2 (strcat p (if n (strcat "," n) ""))))
      )
      (if Mode (ssget "_x" f)(ssget f))
    )
  )
)

Oczywiście warunek if L (można ewentualnie) wyrzucić, bowiem zawsze będzie (no chyba że Name=nil, co się może gdzieś w kodzie przytrafić).
Avatar użytkownika
kojacek
 
Posty: 5507
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kruuger » kwi 23, 2014 09:53

nie wiem czy to cos lepiej, czytelniej:
Kod: Zaznacz cały
(defun jk:SSX_SelectDynBlockFilter1 (Mode Name / _Sub l p f)
  (defun _Sub (Str)
    (list '(0 . "INSERT") (cons 2 Str))
  )
  (setq p (strcat "`" (cd:STR_ReParse (mapcar 'chr (vl-string->list Name)) "`")))
  (setq f
    (if (setq l (cdr (cd:BLK_GetDynBlockNames Name)))
      (_Sub (strcat p "," (cd:STR_ReParse (mapcar '(lambda (%) (strcat "`" %)) l) ",")))
      (_Sub p)
    )
  )
  (if Mode (ssget "_x" f) (ssget f))
)

Kod: Zaznacz cały
(defun jk:SSX_SelectDynBlockFilter2 (Mode Name / l p n f)
  (setq p (strcat "`" (cd:STR_ReParse (mapcar 'chr (vl-string->list Name)) "`")))
  (if (setq l (cdr (cd:BLK_GetDynBlockNames Name)))
    (setq n (cd:STR_ReParse (mapcar '(lambda (%) (strcat "`" %)) l) ",")
          f (list '(0 . "INSERT") (cons 2 (strcat p "," n)))
    )
    (setq f (list '(0 . "INSERT") (cons 2 p)))
  )
  (if Mode (ssget "_x" f) (ssget f))
)

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

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kojacek » kwi 23, 2014 21:17

Jeśli już kręcimy się wokół bloków dynamicznych - wrzucam pod dyskusję - funkcja zwracająca ich listę (nazw takich bloków). O ile potrafimy okreslić czy wstawienie jest blokiem dynamicznym (funkcja: cd:BLK_IsDynamicInsert), oraz stworzyć listę bloków zależnych bloku dynamicznego (funkcja: cd:BLK_GetDynBlockNames), tak brakuje właśnie takiej: listy nazw bloków dynamicznych. Zrobiłem tak:
Kod: Zaznacz cały
; =========================================================================================== ;
; Zwraca liste blokow dynamicznych / Returns a list of dynamic blocks                         ;
; ------------------------------------------------------------------------------------------- ;
; (jk:BLK_GetDynBlockList)                                                                    ;
; =========================================================================================== ;
(defun jk:BLK_GetDynBlockList ()
  (mapcar (quote cdadr)
    (vl-remove nil
      (mapcar
         (quote
           (lambda (%)
             (cd:XDT_GetXData
               (cdr (assoc 330 (entget (tblobjname "Block" %))))
               "AcDbDynamicBlockTrueName*"
             )
           )
         )
         (cd:SYS_CollList "BLOCK" (+ 1 2 4 8))
      )
    )
  )
)

Testujcie. Dajcie też inne propozycje, jeśli macie.
Avatar użytkownika
kojacek
 
Posty: 5507
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kruuger » kwi 24, 2014 00:33

kojacek napisał(a):Jeśli już kręcimy się wokół bloków dynamicznych - wrzucam pod dyskusję - funkcja zwracająca ich listę (nazw takich bloków). O ile potrafimy okreslić czy wstawienie jest blokiem dynamicznym (funkcja: cd:BLK_IsDynamicInsert), oraz stworzyć listę bloków zależnych bloku dynamicznego (funkcja: cd:BLK_GetDynBlockNames), tak brakuje właśnie takiej: listy nazw bloków dynamicznych. Zrobiłem tak:
Kod: Zaznacz cały
; =========================================================================================== ;
; Zwraca liste blokow dynamicznych / Returns a list of dynamic blocks                         ;
; ------------------------------------------------------------------------------------------- ;
; (jk:BLK_GetDynBlockList)                                                                    ;
; =========================================================================================== ;
(defun jk:BLK_GetDynBlockList ()
  (mapcar (quote cdadr)
    (vl-remove nil
      (mapcar
         (quote
           (lambda (%)
             (cd:XDT_GetXData
               (cdr (assoc 330 (entget (tblobjname "Block" %))))
               "AcDbDynamicBlockTrueName*"
             )
           )
         )
         (cd:SYS_CollList "BLOCK" (+ 1 2 4 8))
      )
    )
  )
)

Testujcie. Dajcie też inne propozycje, jeśli macie.

nigdy nie potrzebowalem, ale mysle ze bedzie.
k.
Avatar użytkownika
kruuger
 
Posty: 4863
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kojacek » kwi 24, 2014 09:57

kruuger napisał(a): nigdy nie potrzebowalem, ale mysle ze bedzie.

A tak se zapuść. Lista dynamitów z dziećmi... ;) :
Kod: Zaznacz cały
(mapcar '(lambda (%)(cd:BLK_GetDynBlockNames %))(jk:BLK_GetDynBlockList))
Avatar użytkownika
kojacek
 
Posty: 5507
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kruuger » kwi 24, 2014 10:14

kojacek napisał(a):
kruuger napisał(a): nigdy nie potrzebowalem, ale mysle ze bedzie.

A tak se zapuść. Lista dynamitów z dziećmi... ;) :
Kod: Zaznacz cały
(mapcar '(lambda (%)(cd:BLK_GetDynBlockNames %))(jk:BLK_GetDynBlockList))

gitara. to na razie dodam ta funkcje zeby se przypomniec wsio co i jak.
upload helpy itp
k.
Avatar użytkownika
kruuger
 
Posty: 4863
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kojacek » kwi 24, 2014 10:27

kruuger napisał(a): gitara. to na razie dodam ta funkcje zeby se przypomniec wsio co i jak.

Popatrz jeszcze na wczorajszą funkcję filtracyjną, uprościłem w ten sposób:
Kod: Zaznacz cały
(defun jk:SSX_SelectDynBlockFilter3 (Mode Name / f l)
  (setq f
    (list '(0 . "INSERT")
      (cons 2
        (strcat "`"
          (cd:STR_ReParse (mapcar 'chr (vl-string->list Name)) "`")
          (if
            (setq l (cdr (cd:BLK_GetDynBlockNames Name)))
            (strcat ","
              (cd:STR_ReParse (mapcar '(lambda (%)(strcat "`" %)) l) ",")
            )
            ""
          )
        )
      )
    )
  )
  (if Mode (ssget "_x" f)(ssget f))
)

Może coś się jeszcze da wyszlifować?
Avatar użytkownika
kojacek
 
Posty: 5507
Dołączył(a): paź 03, 2005 20:17

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kruuger » kwi 24, 2014 11:11

kojacek napisał(a):
kruuger napisał(a): gitara. to na razie dodam ta funkcje zeby se przypomniec wsio co i jak.

Popatrz jeszcze na wczorajszą funkcję filtracyjną, uprościłem w ten sposób:
Kod: Zaznacz cały
(defun jk:SSX_SelectDynBlockFilter3 (Mode Name / f l)
  (setq f
    (list '(0 . "INSERT")
      (cons 2
        (strcat "`"
          (cd:STR_ReParse (mapcar 'chr (vl-string->list Name)) "`")
          (if
            (setq l (cdr (cd:BLK_GetDynBlockNames Name)))
            (strcat ","
              (cd:STR_ReParse (mapcar '(lambda (%)(strcat "`" %)) l) ",")
            )
            ""
          )
        )
      )
    )
  )
  (if Mode (ssget "_x" f)(ssget f))
)

Może coś się jeszcze da wyszlifować?

ano byla wczoraj na chwile :) bedzie. tez juz chyba mozna dodac
k.
Avatar użytkownika
kruuger
 
Posty: 4863
Dołączył(a): paź 27, 2005 20:14
Lokalizacja: Kraków

Re: [LISP] CADPL-Pack-v1.lsp [Dyskusja]

Postprzez kruuger » kwi 24, 2014 13:57

moze by niecie skrocic funkcje jeszcze na ?
Kod: Zaznacz cały
cd:SSX_SsDynBlockFilter
Avatar użytkownika
kruuger
 
Posty: 4863
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