Recommended Posts

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 :)

Link to post
Share on other sites

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

Link to post
Share on other sites
Posted (edited)

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.

Edited by adrian_SKA
Link to post
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...