_

Lisp - tworzenie warstw dla obrazów

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 - tworzenie warstw dla obrazów

Postprzez kojacek » wrz 01, 2015 10:57

wilda napisał(a):jakoś udało się coś "napisać"
Kod: Zaznacz cały
(defun C:XREFtoLAY ( / ent entdata plikname)
   (setq ent (entlast))
   (setq entdata (entget ent))
   (setq plikname (cdr (assoc 2 entdata)))
   (cd:ENT_SetDXF ent 8 plikname)
)

ale reaktory to już ponad moje możliwości.
Na razie dopisałem polecenie do menu wstaw odnośnik, wiec działa automatycznie (zmienia nazwę warstwy wstawionego odnośnika) po wstawieniu odnośnika.



Nie tak, trochę...
Po pierwsze, z góry zakładasz że jest ostatni obiekt (w ogóle) i że jest on XRefem. W rzeczywistości nie zawsze tak będzie. Ok, wywołujesz polecenie po wstawieniu Xref-a, ale wszystko się może zdarzyć. Niech to małe makro, działa dobrze. Popatrz niżej, wstawiłem parę poprawek:
Kod: Zaznacz cały
(defun C:XREFtoLAY ( / ent entdata name)
  (if
    (and
      (setq ent (entlast))
      (= (cdr (assoc 0 (setq entdata (entget ent)))) "INSERT")
    )
    (if
      (= (vla-get-IsXref (vla-item (cd:ACX_Blocks)
           (setq name (cdr (assoc 2 entdata))))
         )
         :vlax-true
      )
      (cd:ENT_SetDXF ent 8 name)
    )
  )
  (princ)
)

W pierwszym if, są określone konieczne dwa warunki do spełnienia: jest ostatni obiekt, oraz (jednocześnie gdy jest), tym obiektem jest odniesienie do bloku. Dopiero teraz (drugie if) sprawdzamy czy znalezione odniesienie jest XRef-em. Gdy tak, zmieniamy mu warstwę...
Avatar użytkownika
kojacek
 
Posty: 5250
Dołączył(a): paź 03, 2005 20:17

Re: Lisp - tworzenie warstw dla obrazów

Postprzez wilda » wrz 07, 2015 10:00

Po pierwsze, z góry zakładasz że jest ostatni obiekt (w ogóle) i że jest on XRefem.

Myślałem że jak uruchamiam lispa bezpośrednio po wstawieniu xrefa to na pewno on jest.
Każda modyfikacja eliminująca możliwość wystąpienia błędu jest mile widziana.
Problemem jakiego nie mogę jeszcze rozwiązać to taki, że lisp dopięty jest do polecenia menu "wstaw odnośnik dwg" (^C^C_xattach (if C:XREFtoLAY (princ) (load "XREFtoLAY.lsp"));XREFtoLAY) i działa tylko z tym poleceniem.
Gdy używam menadżera (klasycznego )odnośników i tam chcę dołączyć odnośnik to tam nie ma gdzie "mojego" lispa dołączyć.
wilda
 
Posty: 176
Dołączył(a): gru 18, 2007 21:41

Re: Lisp - tworzenie warstw dla obrazów

Postprzez wilda » cze 13, 2017 12:47

Lisp na wstawianie odnośników na warstwę o nazwie pliku odnośnika działa.
Chciałem analogicznie zrobić na wstawianie obrazów ale jak uzyskać informacje o nazwie wstawianego pliku z obrazem?
wilda
 
Posty: 176
Dołączył(a): gru 18, 2007 21:41

Re: Lisp - tworzenie warstw dla obrazów

Postprzez kojacek » cze 13, 2017 14:04

wilda napisał(a):Lisp na wstawianie odnośników na warstwę o nazwie pliku odnośnika działa.
Chciałem analogicznie zrobić na wstawianie obrazów ale jak uzyskać informacje o nazwie wstawianego pliku z obrazem?


Trzy sposoby na wydziobanie nazwy:
1) Klasyczny:
Kod: Zaznacz cały
(cadr
  (fnsplitl
    (cdr
      (assoc 1
        (entget
          (cdr
            (assoc 340 (entget (car (entsel))))
          )
        )
      )
    )
  )
)


2) AciveX-ny:
Kod: Zaznacz cały
(vla-get-Name (vlax-ename->vla-object (car (entsel))))


3) Nowoczesny:
Kod: Zaznacz cały
(getpropertyvalue (car (entsel)) "ImageName")


Rzecz jasna car/entsel musi być poprawnym wyborem obrazka
Avatar użytkownika
kojacek
 
Posty: 5250
Dołączył(a): paź 03, 2005 20:17

Re: Lisp - tworzenie warstw dla obrazów

Postprzez wilda » cze 13, 2017 14:43

Nie chodzi oto żeby wskazać obraz żeby poznać jego nazwę ale,
żeby wstawiając obraz do rysunku poznać nazwę pliku obrazu tak jak w przykładzie wcześniej parę postów.
W momencie wstawiania plik odnośnika, dostaję nazwę pliku odnośnika i automatycznie nazwę warstwy zmieniam na taką samą jak nazwa pliku.
wilda
 
Posty: 176
Dołączył(a): gru 18, 2007 21:41

Re: Lisp - tworzenie warstw dla obrazów

Postprzez kojacek » cze 13, 2017 14:49

wilda napisał(a):Nie chodzi oto żeby wskazać obraz żeby poznać jego nazwę ale,
żeby wstawiając obraz do rysunku poznać nazwę pliku obrazu tak jak w przykładzie wcześniej parę postów.
W momencie wstawiania plik odnośnika, dostaję nazwę pliku odnośnika i automatycznie nazwę warstwy zmieniam na taką samą jak nazwa pliku.


Jeżeli w przykładzie (bardziej) powyżej dla "INSERT" zadziała entlast, to (w moim głębokim przekonaniu), tak samo może być dla "IMAGE". Tak?
Avatar użytkownika
kojacek
 
Posty: 5250
Dołączył(a): paź 03, 2005 20:17

Re: Lisp - tworzenie warstw dla obrazów

Postprzez wilda » cze 13, 2017 15:39

Może być ale nie jest!
Dla wstawianego odnośnika "(entget (entlast))" zwraca (to się chyba nazywa kody dxf)
kod 2 - nazwa pliku, a dla wstawionego obrazu takiego kodu nie ma!
wilda
 
Posty: 176
Dołączył(a): gru 18, 2007 21:41

Re: Lisp - tworzenie warstw dla obrazów

Postprzez ziele_o2k » cze 13, 2017 17:25

wilda napisał(a):Może być ale nie jest!
Dla wstawianego odnośnika "(entget (entlast))" zwraca (to się chyba nazywa kody dxf)
kod 2 - nazwa pliku, a dla wstawionego obrazu takiego kodu nie ma!

Tak na szybko (zaznaczam, że tematu nie czytałem), ale może się przydać:
http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-235B22E0-A567-4CF6-92D3-38A2306D73F3
Tajemnice kodów dxf i co się za nimi kryje.
To co Ciebie interesuje znajdziesz gdzieś w About the DXF ENTITIES Section
Ziele
Avatar użytkownika
ziele_o2k
 
Posty: 493
Dołączył(a): mar 18, 2014 11:33
Lokalizacja: Poznań

Re: Lisp - tworzenie warstw dla obrazów

Postprzez wilda » cze 13, 2017 20:52

Tak jak pisałem powyżej dla (entget (entlast)) nie ma kodu (2-nazwa pliku)
Jedyne informacje to:
Kod: Zaznacz cały
Polecenie: (entget (entlast))
((-1 . <Nazwa elementu: -405782b0>) (0 . "IMAGE") (330 . <Nazwa elementu:
-4057f308>) (5 . "C8A") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(100 . "AcDbRasterImage") (90 . 0) (10 2243.3 1714.61 0.0) (11 0.121927 0.0
0.0) (12 7.4656e-018 0.121927 0.0) (13 850.0 608.0 0.0) (340 . <Nazwa elementu:
-405782c0>) (70 . 7) (280 . 0) (281 . 50) (282 . 50) (283 . 0) (290 . 0) (360 .
<Nazwa elementu: -405782b8>) (71 . 1) (91 . 2) (14 -0.5 -0.5 0.0) (14 849.5
607.5 0.0))

Może mając informację z kodu "Nazwa elementu" można jakoś wyciągnąć informację o nazwie wstawionego obrazu?
wilda
 
Posty: 176
Dołączył(a): gru 18, 2007 21:41

Re: Lisp - tworzenie warstw dla obrazów

Postprzez kojacek » cze 13, 2017 20:59

wilda napisał(a):Może być ale nie jest!
Dla wstawianego odnośnika "(entget (entlast))" zwraca (to się chyba nazywa kody dxf)
kod 2 - nazwa pliku, a dla wstawionego obrazu takiego kodu nie ma!


E no popatrz na to:
Kod: Zaznacz cały
(if
  (and
    (setq e (entlast))
    (setq d (cdr (assoc 0 (entget e))))
  )
  (cond
    ( (= d "INSERT")(cdr (assoc 2 (entget e))))
    ( (= d "IMAGE")(getpropertyvalue e "ImageName"))
    (t nil)
  )
)
Avatar użytkownika
kojacek
 
Posty: 5250
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