CADsite forum

AutoCAD => Autolisp => Topic gestart door: cadtools@gmail.com op di 28 06 2016, 22:06:07

Titel: Multiselect in LM:Entity->PointList (Opgelost)
Bericht door: cadtools@gmail.com op di 28 06 2016, 22:06:07
Hoi

Is er iemand handig met lisp en repeat and while loops?
Waar ik naar op zoek ben is een aangepaste routine van Lee Mac Entity to Point List routine

https://www.youtube.com/watch?v=M_mminy4FMg

Bij 1m:05s selecteer ik deze een voor een maar daar wil een multi select ..


(defun c:test ( / ent )
    (if (setq ent (car (entsel))).         ;;<=ssget met while repeat loop hier =>
        (foreach x (LM:Entity->PointList ent)
            (entmake (list '(0 . "POINT") (cons 10 x)))
        )
    )
    (princ)
)
(vl-load-com) (princ)
Titel: Re: Multiselect in LM:Entity->PointList
Bericht door: roy_043 op wo 29 06 2016, 11:59:00
(defun KGA_Conv_Pickset_To_EnameList (ss / i ret)
  (if ss
    (repeat (setq i (sslength ss))
      (setq ret (cons (ssname ss (setq i (1- i))) ret))
    )
  )
)

(defun c:test ()
  (foreach ent (KGA_Conv_Pickset_To_EnameList (ssget))
    (foreach pt (LM:Entity->PointList ent)
      (entmake (list '(0 . "POINT") (cons 10 pt)))
    )
  )
  (princ)
)
Titel: Re: Multiselect in LM:Entity->PointList
Bericht door: cadtools@gmail.com op wo 29 06 2016, 17:02:29
 :shock: holy sht :shock:
Credits for Roy !

Titel: Re: Multiselect in LM:Entity->PointList
Bericht door: cadtools@gmail.com op wo 29 06 2016, 23:40:03
I wil het een stap verder brengen en ik dacht dat het nogal simpel was om ipv een point een blockdef. te bebruiken. Het idee is dat middels een field en dynamisch block de xyz waarden van dit punt worden weergegeven. Het vreemde waar ik tegenaanloop is dat ik een 'normaal' blocks zonder enige poesas kan gebruiken (FUNCTIE ENTOPO1 met block def. dyn-xyz-file) maar niet zijn beoogde, nested definitie.
(FUNCTIE ENTOPO2 met block def. dyn_XYZ)


Hoe zit dat met voorwaarden aan definitie gebruik met entmake blocks? Ik kan er nog geen vinger achter krjigen. Beste (Roy :-)  als iemand me verder op weg kan helpen.. mucho gracias..


(defun c:entopo1 ()
  (foreach ent (KGA_Conv_Pickset_To_EnameList (ssget))
    (foreach pt (LM:Entity->PointList ent)
      (entmake (list
      '(0 . "INSERT")
;;    '(66 . 0); has attribute(s)
      (cons 2 "dyn-xyz-file")
      (cons 10 pt)
      '(41 . 100.0); X schaal
      '(42 . 100.0); Y schaal
      '(43 . 100.0); Z schaal
    ) ; end list inserting block
     ))
   )
  (princ)
)


(defun c:entopo2 ()
  (foreach ent (KGA_Conv_Pickset_To_EnameList (ssget))
    (foreach pt (LM:Entity->PointList ent)
      (entmake (list
      '(0 . "INSERT")
;;    '(66 . 0); has attribute(s)
      (cons 2 "dyn_XYZ")
      (cons 10 pt)
      '(41 . 100.0); X schaal
      '(42 . 100.0); Y schaal
      '(43 . 100.0); Z schaal
    ) ; end list inserting block
     ))
   )
  (princ)
)

Titel: Re: Multiselect in LM:Entity->PointList
Bericht door: roy_043 op do 30 06 2016, 13:03:50
Als je met entmake een "INSERT" met attributen wilt maken dan moeten deze apart worden 'ge-entmaket'. In het algemeen is het daarom gemakkelijker om de insertblock methode te gebruiken (vla-insertblock). Maar in BricsCAD is er dan het probleem dat de fields ontbreken (zie c:entopo3). De enige oplossing is dus gebruik te maken van (command "_.-insert" ...) (zie c:entopo4).

Laat a.u.b. even weten of c:entopo3 in AutoCAD wel een eindresultaat met fields oplevert.

(defun KGA_Conv_Pickset_To_EnameList (ss / i ret)
  (if ss
    (repeat (setq i (sslength ss))
      (setq ret (cons (ssname ss (setq i (1- i))) ret))
    )
  )
)

(defun KGA_Sys_SpaceObject ()
  ((if (= 1 (getvar 'cvport)) vla-get-paperspace vla-get-modelspace)
    (vla-get-activedocument (vlax-get-acad-object))
  )
)

(defun c:entopo3 ( / spc)
  (setq spc (KGA_Sys_SpaceObject))
  (foreach ent (KGA_Conv_Pickset_To_EnameList (ssget))
    (foreach pt (LM:Entity->PointList ent)
      (vlax-invoke
        spc
        'insertblock
        pt
        "dyn_XYZ"
        100.0 ; X schaal.
        100.0 ; Y schaal.
        100.0 ; Z schaal.
        0.0   ; Hoek.
      )
    )
  )
  (princ)
)


(defun c:entopo4 ( / oldAttrec oldCannoscale)
  (setq oldAttrec (getvar 'attreq))
  (setq oldCannoscale (getvar 'cannoscale))
  (setvar 'attreq 0)
  (setvar 'cannoscale "NLCS_M_1:100")
  (foreach ent (KGA_Conv_Pickset_To_EnameList (ssget))
    (foreach pt (LM:Entity->PointList ent)
      (command "_.-insert" "dyn_XYZ" "_scale" 100.0 "_non" (trans pt 0 1) 0.0)
    )
  )
  (setvar 'attreq oldAttRec)
  (setvar 'cannoscale oldCannoscale)
  (princ)
)


Edit 1: "_non" toegevoegd.
Edit 2: (trans ...) toegevoegd.
Titel: Re: Multiselect in LM:Entity->PointList
Bericht door: cadtools@gmail.com op do 30 06 2016, 23:09:24
resultaat ENTOPO3 in AutoCAD
; error: AutoCAD.Application: Filer error


resultaat ENTOPO4 in AutoCAD (schaal voor NLCS mm. tekening)
CANNOSCALE <"NLCS_MM_1:100">
SCALE = 1
Doet z'n werk maar is niet super snel
Echt top klasse om dit voor elkaar te krijgen!

https://youtu.be/biTkwLtTG6Q
Titel: Re: Multiselect in LM:Entity->PointList
Bericht door: roy_043 op vr 01 07 2016, 09:52:32
Om de snelheid te verbeteren zou je (command-s ...) i.p.v. (command ...) kunnen proberen. Het uitzetten van CMDECHO levert ook wat tijdwinst op.
Titel: Re: Multiselect in LM:Entity->PointList
Bericht door: roy_043 op vr 01 07 2016, 09:59:38
De 'Filer error' wijst er mogelijk op dat het block "dyn_XYZ" niet in de tekening aanwezig is.
Titel: Re: Multiselect in LM:Entity->PointList
Bericht door: cadtools@gmail.com op vr 01 07 2016, 14:58:44
Je hebt weer eens gelijk. ENTOPO3 werkt daarmeee beter en sneller.
Ik gebruik LM:layerdirector waarmee daarmee ook direct alles in een apart laagjes wordt geplaatst.
Wat mij betreft is deze code daarmee voorlopig de beste.

Case closed :-)


(defun c:entopo3 ( / spc)
  (setq spc (KGA_Sys_SpaceObject))
  (foreach ent (KGA_Conv_Pickset_To_EnameList (ssget))
    (foreach pt (LM:Entity->PointList ent)
      (vlax-invoke
        spc
        'insertblock
        pt
        "dyn_XYZ" ; your block
        1 ; X scale. ; annotative? set to 1
        1 ; Y scale.
        1 ; Z scale.
        0.0   ; Angle.
      )
    )
  )
  (princ)
)