FastFiber

Select polylines with blocks (Opgelost)

Gestart door Bart Dheere, do 09 06 2016, 21:21:28

Vorige topic - Volgende topic

Bart Dheere

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

roy_043

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

Bart Dheere

Roy,

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

Kan je hier iets mee?

Bedankt.
Bart

Bart Dheere

Roy,

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

Groeten,
Bart

roy_043

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

Reimer

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

roy_043

@ Reimer:
Hartelijk dank voor de bevestiging.

Bart Dheere


FastFiber