Pomoc przy lispie


Rekomendowane odpowiedzi

Cześć, jestem tutaj nowy i chce się przywitać. 

Czy byłby ktoś w stanie mi pomóc? Mam bloki z atrybutami, chciałbym zrobić aby po wskazaniu polilini automatycznie zczytywało jej długość. Znalazłem potobny temat https://kojacek.wordpress.com/2018/01/23/etykietowanbloki.dwgie-polilinii/ ale potrzebuje to dostosować to swoich bloków. Bardzo dziękuję za pomoc :)

Odnośnik do komentarza
Udostępnij na innych stronach

Może tak (czując się wywołanym linkiem):

Uproszczony kod:

; -------------------------------------------------------------------------------------- ;
; 2021 by kojacek
(defun C:LPOLY (/ GetObjectID getObj l b v i)
  (defun GetObjectID (obj doc) ;; Lee Mac
    (if (eq "64" (strcase (getenv "PROCESSOR_ARCHITECTURE")))
    (vlax-invoke-method (vla-get-Utility doc)
        'GetObjectIdString obj :vlax-false)
      (itoa (vla-get-Objectid obj))
    )
  )
  (defun getObj (/ e)
    (if
      (setq e (car (entsel "\nWybierz obiekt do zmierzenia: ")))
      (if
        (member
          (cdr (assoc 0 (entget e)))
          (list "LINE" "ARC" "LWPOLYLINE")
        )
        e
      )
    )
  )
  (defun GetBlk (BlkList ATT / e d a)
    (if
      (setq e (car (entsel "\nWybierz blok opisuący: ")))
      (if
        (and
          (setq d (entget e))
          (setq a
            (mapcar
              '(lambda (%)(cdr (assoc 2 (entget %))))
              (cd:BLK_GetAttEntity e)
            )
          )
          (= "INSERT" (cdr (assoc 0 d)))
          (member 
            (cdr (assoc 2 d))
            BlkList
          )
          (member Att a)
        )
        e
      )
    )
  )
  (if
    (and
      (setq l (getObj))
      (setq b
        (GetBlk
          (list "KABEL" "OBIEKT_OCHRONNY")
          "MEASURED_LENGTH"
        )
      )
    )
    (progn
      (setq v
        (GetObjectID
          (vlax-ename->vla-object l)
          (cd:ACX_ADoc)
        )
            i
        (strcat
          "%<\\AcObjProp Object(%<\\_ObjId "
           v
           ">%).Length \\f \"%lu2%pr2\">%"
        )
      )
      (cd:SYS_UndoBegin)
      (cd:BLK_SetAttValueVLA
        b
        "MEASURED_LENGTH"
        i
      )
      (vla-Regen (cd:ACX_ADoc) acActiveViewport)
      (cd:SYS_UndoEnd)
    )
    (princ "\nZły wybór")
  )
  (princ)
)
; -------------------------------------------------------------------------------------------- ;

Wymagane jest załadowanie CADPL-Pack'a: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/

Nazwy bloków, tagi atrybutów i format Field-a, trezba sobie "podkręcić" po swojemu.

 

LPOLY.gif

Odnośnik do komentarza
Udostępnij na innych stronach

Bardzo dziękuję za odpowiedź w temacie. Jesteśmy już bardzo blisko rozwiązania. chciałbym aby to działało podobnie jak byl przykład z etykietowaniem z tą różnicą że zamiast bloku z wielolinią odneisieniaaby były to te moje bloki. Lisp powinien dzialać następująco: kiedy wstawiam blok punktem wstawienia (małe kółeczko) dotykam polilini i wtedy wpisuje sie długośc polilini do atrybutu.

Edytowane przez adrian_SKA
Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie