lisp, generowanie kierunków/grotów strzałek na zadanej polilinii


alf
 Share

Recommended Posts

Poszukuję szybkiego rozwiązania (np lispa, w necie takiego nie znalazłam lub linii specjalnej, ale to się chyba w cadzie nie da..) do wstawiania strzałek kierunkowych na zadanej polilinii:  konkretnie w środku długości pojedynczego jej odcinka. Ze względu na różnorodność przypadków dobrze było by by lisp do generowania "grotów" miał możliwość:

1. Ustalenia skali rysunku (w stosunku do jednostki podstawowej, zadeklarowanej w "units") na której wstawia się kierunek (np mapy, dla których units ustawiam na "m" są w róznych skalach, np  1:1000, 1:50 000) - ale nie koniecznie, jesli to klopot, bo jesli strzalka bedzie blokiem to sprawa przeskalowania grupy bloków jest prosta

2. pomijanie odcinków, których długość jest mniejsza od wielokrotności długości grotu np >3x długość strzałki (strzałki na krótkich odcinkach są bez sensu) - tu potrzebna jest skala wstawienia

3. forma strzalki to chyba najlepiej rodzaj bloku (prosty grot z wypełnieniem, calosc by block), bo latwiej podmienic blok na inny blok, lub wprowadzić jakąs nietypową skalę, gdyby ktoś chciał jakąś dziwaczną strzałkę.

4. Środek ciężkości bloku/punkt wstawienia = środek odcinka polilinii  -by "ładnie" wyglądały wygenerowane kierunki

z góry dziękuję za pomoc..

 

image.thumb.png.ae2a33d3ae81405c4b78ff0dfa57732d.png

 

Link to comment
Share on other sites

.. no własnie nie do końca..

chodzi o multum polilinii, do których trzeba by dołożyć symbole kierunków, a lisp LZS to klikanie strzałkami po każdym odcinku.. do us--ej śmierci można klikać i klikać..

ponieważ to jest rodzaj schematu, strzałki powinny być konkretne by schemat na "przeciętnego" użytkownika był czytelny. Dlatego pytałam o szybsze rozwiązanie, dla którego podałam ideę działania..

zwcad nie jest w stanie o ile wiem wygenerować rodzaju linii tak by za każdym razem na środku odcinka polilinii wstawiał zadany symbol a nie co jakiś odcinek.. stąd pomysł o rozmieszczenia bloku grotu strzałki na środku odcinka. Takiego lispa nie znalazłam, a sama lispowac nie umiem.. 

 

Link to comment
Share on other sites

19 godzin temu, alf napisał:

Poszukuję szybkiego rozwiązania

Bardzo proszę o podesłania kawałka rysunku, zastanowimy się jak ułatwić to zadanie ze wstawianiem bloków.

Rozumiem, że na każdym odcinku pollinii ma być wstawiony tylko jeden blok w jego środku, chyba, że odcinek jest zbyt krótki?

 

Link to comment
Share on other sites

tak na szybko:

divide i measure - nie.. tzn tak, ale "ładny" tj prosty i czytelny schemat z tego nie będzie..  dlatego bloki na środku odcinka z pomijaniem odcinków zbyt krótkich. i nie pomysl np z wstawianiem trójkąta z polilinii z wycięciem tego co w środku, bo wtedy demoluje się polilinię (kiedyś taki lisp widziałam).. jak chce się "wyciąć" linię to można przykryć to hatchem lub wipeoutem - może to nie jest piękne ale Polilinia cała..

oczywiście lista bloków różnych "arrow" to jedno a co w tych blokach siedzi (można to przecież podmieniać) to drugie. Zresztą lista bloków może być długa jak ktoś potrzebuje może do listy dorobić następne bloki dwg dla innych bardziej fikuśnych strzałek

ważne żeby pomijać odcinki na których dany typ kierunku się po prostu nie mieści. O tyle lepiej bloki a nie np jakiś wymiar, tak przynajmniej mi się wydaje, że z wymiarami różnie bywa, a blok to stabilny obiekt jeśli chodzi o "wędrówki" między różnymi programami

i ważne żeby blok wstawiać na aktualnej warstwie. Warstwy w bloku  powinny też być "unikatowe", żeby nie było nakładania na ist warstwy w rysunkach. w zał pliku nazwy elementów w bloku są niby unikatowe ale nie  do końca.. , to można zmienić  na coś bardziej nietypowego

wielkość strzałek - rzecz gustu, tu są dość małe, bo dużo polilinii leci blisko siebie, ale jak schemat był by bardziej ogólny, można strzałki dac większe, to kwestia współczynnika skali..

Drawing1111.dwg

Link to comment
Share on other sites

Zadanie z tych banalnych raczej... Można rozwiązać tak:

; ---------------------------------------------------------------------------- ;
(defun c:testuj ()(InsBlkInPolySeg (car (entsel)) "arrow1" 20.0 15.0)(princ))
; ---------------------------------------------------------------------------- ;
; funkcja zwraca liste segmentow LWPOLY typu: ((p1 bulge1 p2)(p2 bulge2 p3)...);
; ---------------------------------------------------------------------------- ;
(defun jk:LWP_GetSegments (e / p d r)
  (setq d (entget e)
        p (if
             (= 1 (logand (cdr (assoc 70 d)) 1))
             (cdr (assoc 10 d))
           )
        d (mapcar 'cdr
            (vl-remove-if-not
              '(lambda (%)(member (car %) '(10 42)))
              d
            )
          )
  )
  (if p
    (setq d (append d (list p)))
  )
  (while
    (> (length d) 2)
    (setq r (cons
                (list
                  (car d)
                  (cadr d)
                  (caddr d)
                ) r
              )
          d (cddr d)
    )
  )
  (reverse r)
)
; ---------------------------------------------------------------------------- ;
(defun InsBlkInPolySeg (Poly Block Scale MinLength / d b n a p)
  (if
    (not (tblobjname "BLOCK" Block))
    (princ
      (strcat
        "\nBłąd: w rysunku nie ma bloku "
        (strcase Block) "."
      )
    )
    (if
      (not
        (setq d (jk:LWP_GetSegments Poly))
      )
      (princ "\nBłąd - niepoprawna Polilinia.")
      (if
        (not
          (setq d
            (vl-remove-if-not '(lambda (%)(zerop (cadr %))) d)
          )
        )
        (princ "\nBłąd - polilinia składa sie z samych łuków.")
        (if
          (not
            (setq d
              (vl-remove-if
                '(lambda (%)
                   (< (distance (car %)(caddr %)) MinLength)
                ) d
              )
            )
          )
          (princ "\nBłąd - segmenty polilinii są za krótkie.")
          (progn
            (cd:SYS_UndoBegin)
            (foreach % d
              (setq a (angle (car %)(caddr %))
                    p (polar (car %) a (/ (distance (car %)(caddr %)) 2.0))
              )
              (cd:BLK_InsertBlock p Block (list Scale Scale Scale) a nil)
            )
            (cd:SYS_UndoEnd)
          )
        )
      )
    )
  )
)
; ---------------------------------------------------------------------------- ;

Polecenie TESTUJ, wywołuje funkcję InsBlkInPolySeg, dla której jednak kluczem jest funkcja jk:LWP_GetSegments. Dla całości trzeba CADPL-Pack-a który opisywałem kiedyś tutaj: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ . W uproszczeniu - groty strzałek w postaci bloku (argument Block) wstawiane są na liniowych segmentach wskazanej polilinii (argument Block - tutaj trzeba wstawić jeszcze jakieś testowanie wyboru), których długość jest większa niż argument MinLength.

insblkinpolysec.gif

Link to comment
Share on other sites

Wywołałam wilka z lasu...

Dziękuję twórcy, właśnie na strone "kojacek" znalazłam różne ciekawe "bajery" dla oznaczania kierunków, ale ten chyba najfajniejszy niestety fas,

Pytanie, choć mi na razie zbędne, lisp nie wstawi grota na części plinii tj łuku, i tak samo będzie ze splajnami połaczonymi w pl?

Czy nie dało by się dorobić do lispa pobierania bloku grota jaki wybór z rysunku, jakie uproszczone zagranie: wstawiamy wybrany grot do schematu, skalujemy go odpowiednio do skali przygotowywanego schematu a potem właśnie ten przeskalowany wybieramy do wstawiania na dają polilinię

PS.. Może i banał, ale ja w lispowych sprawach jestem ciemna masa..

Link to comment
Share on other sites

7 godzin temu, alf napisał:

Wywołałam wilka z lasu...

Dziękuję twórcy, właśnie na strone "kojacek" znalazłam różne ciekawe "bajery" dla oznaczania kierunków, ale ten chyba najfajniejszy niestety fas,

Pytanie, choć mi na razie zbędne, lisp nie wstawi grota na części plinii tj łuku, i tak samo będzie ze splajnami połaczonymi w pl?

Czy nie dało by się dorobić do lispa pobierania bloku grota jaki wybór z rysunku, jakie uproszczone zagranie: wstawiamy wybrany grot do schematu, skalujemy go odpowiednio do skali przygotowywanego schematu a potem właśnie ten przeskalowany wybieramy do wstawiania na dają polilinię

PS.. Może i banał, ale ja w lispowych sprawach jestem ciemna masa..

Przedstawiony kod dotyczy tak zwanej "lekkiej polilinii" czyli obiektu typu LWPOLYLINE, a makro oczywiście (i rzeczywiście) "omija" segmenty łukowe. Polilinia której segmenty są splajnami, jest automatycznie konwertowana na ("stary") obiekt i jest typu POLYLINE, więc na tych obiektach kod nie działa. Krótko (ale mam nadzieję) w jasny sposób parę słów o polilinich znajdziesz (reklama) tu: https://kojacek.wordpress.com/2015/09/18/polilinie-2d/

Jeśli chodzi o rozwój przedstawionego rozwiązania. Sugerowałbym aby blok grota, był blokiem dynamicznym (z kilkoma trybami widoczności), co uprościłoby wszelkie zabawy z tymże - zamiast przebierać w setkach (możliwych przecież) bloków w rysunku, brać jeden i wybierać potrzebny stan widoczności. Idea bloków dynamicznych właśnie (choć nie tylko) sprawdza się doskonale w takich sytuacjach.

PS. w avatarze jest wrona, nie wilk... 😉

Edited by kojacek
Link to comment
Share on other sites

Jak sugeruje @kojacek myślę, że dobrze żeby blok strzałki był blokiem dynamicznym. Można mu zadać zarówno skalę, jak i widoczność (różne groty) jak i parametr align. Wtedy na ewentualnym łuku ustawiałoby się to ręcznie. Zresztą skalę bloku można zmienić przez select similar/qselect i po prostu we właściwościach bloku ją zmienić. 

Link to comment
Share on other sites

Tak, tylko, że wchodzimy w ten sposób w sferę tabu. Co prawda mam "swój" sposób na tworzenie prostych boków dynamicznych, ale chodziło w mojej wypowiedzi o prostotę lispa i odporność jego na wynalazki z patentem, za którego wykorzystanie bez zgody i wiedzy wiadomokogo grozi krzesło elektryczne.

Nie mniej jednak nawet w postaci jw, lisp już stał się super przydatny..  reszte załatwić można na kilka innych lispo-sposobów

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share