FastFiber

select nth previous object (on layout) (opgelost)

Gestart door Reimer, wo 02 11 2016, 14:52:22

Vorige topic - Volgende topic

Reimer

Op internet kwam ik de volgende code tegen:
(defun countback (steps / ms)
(vl-load-com)
(setq ms (vla-get-modelspace (vla-get-activedocument
(vlax-get-acad-object))))
(vlax-vla-object->ename (vla-item ms (- (vla-get-count ms) steps)))
)

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/2nd-from-the-last-object-in-autocad-database/td-p/807274

Met (countback 2) krijg je het op een na laatste object uit de tekening.
Dit werkt alleen voor modelspace objecten. Helaas weet ik niets van visual lisp. Weet iemand of het mogelijk is om hetzelfde te doen voor alle objecten, dus ook in de layouts?

Reimer

Reimer


EddyBeerke

Citaat van: Reimer op ma 07 11 2016, 08:21:33
Heeft niemand een idee?
Ja ik heb wel een idee...
Misschien als je de code leest dan kom je uit bij objecten in "modelspace"  -->> vla-get-modelspace
Als je dit veranderd in "vla-get-paperspace" dan zul je uitkomen in "paperspace"

Laat je weten of het daarmee lukt en misschien wil je de toepassing duidelijk maken, dus wat je ermee gaat doen. Lijkt mij interessant.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

gery

Citaat van: EddyBeerke op ma 07 11 2016, 09:29:23
Misschien als je de code leest dan kom je uit bij objecten in "modelspace"  -->> vla-get-modelspace
Als je dit veranderd in "vla-get-paperspace" dan zul je uitkomen in "paperspace"
Maar dan krijg je toch enkel de objecten uit de actieve paperspace?
AutoCAD 2020 - Windows 10

roy_043

; (countback 0) => Last entity in current space.
(defun CountBack (int / cnt spc)
  (vl-load-com)
  (setq spc
    ((if (= 1 (getvar 'cvport)) vla-get-paperspace vla-get-modelspace)
      (vla-get-activedocument (vlax-get-acad-object))
    )
  )
  (if (< -1 int (setq cnt (vla-get-count spc)))
    (vlax-vla-object->ename (vla-item spc (- cnt int 1)))
  )
)

Reimer

#5
Fantastisch Roy, dit werkt.  :vreegoe:

Ik gebruik al een paar jaar mijn eigen commando's  SEL en SEP (SElect Last / Previous)
(defun c:sel ()  (command "pselect" "last" ""))
(defun c:sep ()  (command "pselect" "previous" ""))

Hiermee pak ik snel het laatste of voorgaande object. Vervolgens kan ik naar wens commando's starten (bijv. erase, explode, etc.).
Omdat ik eerst het object selecteer kan ik in mijn properties venster direct zien welk object ik te pakken heb. Dit scheelt mij weer klikken met de muis.

Toen ik ontdekte dat het mogelijk is om voorgaande objecten te selecteren zag ik hier wel voordelen in.
Voorbeeld:
Ik moest de viewports van mijn legenda vervangen in meerdere layouts. De ene keer viewport A, danweer B. De viewports heb ik naar het klembord gekopieerd en steeds op de layout geplakt. (ctrl+pagedown; ctrl+v; 0,0). Vervolgens moest ik steeds danwel A, danwel B verwijderen. A verwijderen ging lekker snel met ERASE LAST. Voor B moest ik met de muis steeds het block selecteren. Dankzij Roy kan ik nu dus zonder muis al mijn layouts langsgaan. (ctrl+pagedown; ctrl+v; 0,0; SEL 0 of 1; Erase).

Groeten,
Reimer

edit:
Mijn commando SEL ziet er nu als volgt uit:
(defun c:sel ( / N)
  (setq N (getint "\nHoeveelste object terug wil je selecteren <1>: "))
  (if (not N)
    (setq N 1)
  )
  (command "pselect" (countback N) "")
)

(ik heb de code van Roy iets veranderd waardoor 1 het laatste object is en niet 0)

FastFiber