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
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)
)
Roy,
Command: ERASENOBLOCKPOLY
; error: bad argument type: fixnump: 1.0
Kan je hier iets mee?
Bedankt.
Bart
Roy,
mss heeft dit iets te maken met 3d polylijnen of 2d polylijnen?
Groeten,
Bart
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)
)
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
@ Reimer:
Hartelijk dank voor de bevestiging.
super.
Bedankt.