FastFiber

Multiselect in LM:Entity->PointList (Opgelost)

Gestart door cadtools@gmail.com, di 28 06 2016, 22:06:07

Vorige topic - Volgende topic

cadtools@gmail.com

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)

roy_043

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

cadtools@gmail.com


cadtools@gmail.com

#3
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)
)


roy_043

#4
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.

cadtools@gmail.com

#5
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

roy_043

Om de snelheid te verbeteren zou je (command-s ...) i.p.v. (command ...) kunnen proberen. Het uitzetten van CMDECHO levert ook wat tijdwinst op.

roy_043

De 'Filer error' wijst er mogelijk op dat het block "dyn_XYZ" niet in de tekening aanwezig is.

cadtools@gmail.com

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