CADsite forum

AutoCAD => Autolisp => Topic gestart door: Bart Dheere op do 09 06 2016, 21:21:28

Titel: Select polylines with blocks (Opgelost)
Bericht door: Bart Dheere op do 09 06 2016, 21:21:28
Beste,

Na een meting op terrein met een landmeetkundig toestel, exporteren we de data in dxf-vorm. Een filterfunctie op datum wordt meestal toegepast bij het exporteren gezien de vorige metingen in dezelfde tekening niet meer nodig zijn.

De filterfunctie wordt enkel toegepast op de gemeten punten (blocks op layer 0). Dus in de geexporteerde dxf komen alle reeds gemeten lijnen in het project ook mee. Het toestel, Leica Viva GS15, laat niet toe te filteren op de lijnen.

Graag had ik enkel de lijnen kunnen selecteren met een gemeten punt (block) op het begin en einde van een vertex.
Kent iemand hier een lisp-oplossing voor?

Als voorbeeld stop ik dergelijke dxf in de bijlage.

Gegroet en dank.
Bart
Titel: Re: Select polylines with blocks
Bericht door: roy_043 op vr 10 06 2016, 10:06:48
Probeer dit (commando 'EraseNoBlockPoly'):
(defun _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 _List_IndexSeqMakeLength (len / ret)
  (repeat (rem len 4)
    (setq ret (cons (setq len (1- len)) ret))
  )
  (repeat (/ len 4)
    (setq ret
      (vl-list*
        (- len 4)
        (- len 3)
        (- len 2)
        (- len 1)
        ret
      )
    )
    (setq len (- len 4))
  )
  ret
)

(defun c:EraseNoBlockPoly ( / cnt doc ptLst ssIns ssPoly)
  (setq cnt 0)
  (if
    (and
      (setq ssPoly (ssget "_X" (list (cons 410 (getvar 'ctab)) '(0 . "POLYLINE") '(-4 . "&") '(70 . 8))))
      (setq ssIns  (ssget "_X" (list (cons 410 (getvar 'ctab)) '(0 . "INSERT"))))
    )
    (progn
      (setq doc (vla-get-activedocument (vlax-get-acad-object)))
      (vla-endundomark doc) ; End open undo group.
      (vla-startundomark doc)
      (setq ptLst
        (mapcar
          '(lambda (enm) (vlax-get (vlax-ename->vla-object enm) 'insertionpoint))
          (_Conv_Pickset_To_EnameList ssIns)
        )
      )
      (foreach poly (_Conv_Pickset_To_EnameList ssPoly)
        (if
          (not
            (vl-some
              '(lambda (param)
                (vl-position (vlax-curve-getpointatparam poly param) ptLst)
              )
              (_List_IndexSeqMakeLength (1+ (vlax-curve-getendparam poly)))
            )
          )
          (progn
            (entdel poly)
            (setq cnt (1+ cnt))
          )
        )
      )
      (vla-endundomark doc)
    )
  )
  (princ (strcat "\n" (itoa cnt) " 3D polyline(s) erased "))
  (princ)
)
Titel: Re: Select polylines with blocks
Bericht door: Bart Dheere op ma 13 06 2016, 09:36:20
Roy,

Command: ERASENOBLOCKPOLY
; error: bad argument type: fixnump: 1.0

Kan je hier iets mee?

Bedankt.
Bart
Titel: Re: Select polylines with blocks
Bericht door: Bart Dheere op ma 13 06 2016, 10:07:08
Roy,

mss heeft dit iets te maken met 3d polylijnen of 2d polylijnen?

Groeten,
Bart
Titel: Re: Select polylines with blocks
Bericht door: roy_043 op ma 13 06 2016, 10:40:40
De functie selecteert geen 2D polylijnen, dus daaraan kan het probleem niet liggen.
Ik vermoed nu dat AutoCAD iets strikter is voor wat betreft de repeat functie. Daar waar BricsCAD ook een 'real' accepteert (1.0) moet het getal voor AutoCAD een 'integer' zijn (1). Als mijn vermoeden klopt dan zou de onderstaande code wel moeten werken.
(defun _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 _List_IndexSeqMakeLength (len / ret)
  (repeat (rem len 4)
    (setq ret (cons (setq len (1- len)) ret))
  )
  (repeat (/ len 4)
    (setq ret
      (vl-list*
        (- len 4)
        (- len 3)
        (- len 2)
        (- len 1)
        ret
      )
    )
    (setq len (- len 4))
  )
  ret
)

(defun c:EraseNoBlockPoly ( / cnt doc ptLst ssIns ssPoly)
  (setq cnt 0)
  (if
    (and
      (setq ssPoly (ssget "_X" (list (cons 410 (getvar 'ctab)) '(0 . "POLYLINE") '(-4 . "&") '(70 . 8))))
      (setq ssIns  (ssget "_X" (list (cons 410 (getvar 'ctab)) '(0 . "INSERT"))))
    )
    (progn
      (setq doc (vla-get-activedocument (vlax-get-acad-object)))
      (vla-endundomark doc) ; End open undo group.
      (vla-startundomark doc)
      (setq ptLst
        (mapcar
          '(lambda (enm) (vlax-get (vlax-ename->vla-object enm) 'insertionpoint))
          (_Conv_Pickset_To_EnameList ssIns)
        )
      )
      (foreach poly (_Conv_Pickset_To_EnameList ssPoly)
        (if
          (not
            (vl-some
              '(lambda (param)
                (vl-position (vlax-curve-getpointatparam poly param) ptLst)
              )
              (_List_IndexSeqMakeLength (fix (+ 1.1 (vlax-curve-getendparam poly)))) ; Fix nodig voor AutoCAD?
            )
          )
          (progn
            (entdel poly)
            (setq cnt (1+ cnt))
          )
        )
      )
      (vla-endundomark doc)
    )
  )
  (princ (strcat "\n" (itoa cnt) " 3D polyline(s) erased "))
  (princ)
)
Titel: Re: Select polylines with blocks
Bericht door: Reimer op ma 13 06 2016, 11:34:16
Je aanname klopt.
CiteerCommand: (repeat 3 (print "test"))
"test"
"test"
"test" "test"

Command: (repeat 3.0 (print "test"))
; error: bad argument type: fixnump: 3.0

Bij mij werkt de routine nu goed op de voorbeeld tekening.

Reimer
Titel: Re: Select polylines with blocks
Bericht door: roy_043 op ma 13 06 2016, 12:40:26
@ Reimer:
Hartelijk dank voor de bevestiging.
Titel: Re: Select polylines with blocks
Bericht door: Bart Dheere op ma 27 06 2016, 09:58:07
super.

Bedankt.