Quem já tentou usar uma lista de pontos na sintaxe da função ssget já percebeu que não se pode permitir pontos duplicados nessa lista, sob pena da seleção retornal nil... bom, para resolver isso, você deve remover esses pontos... normalmente isso ocorre quando coletamos as coordenadas de polilinhas mal desenhadas...
(defun rmpdup (ptlist / lst)
(foreach pt ptlist
(if (vl-every '(lambda (p) (> (distance p pt) 0.001))
lst)
(setq lst (cons pt lst))))
(reverse lst))
Na verdade ela remove pontos próximos, veja que eu concidero que menos de 0.001 de distância entre os pontos os torna iguais
get-bounding-box
Esta subrotina é útil nos casos quem que você precisa das coordenadas do retângulo que circunscreve uma determinada entidade... pra dar um "zoom" nela por exemplo... vejam como eu usei o método boundingbox do activex:
(defun get-bounding-box (ent / maxp minp)
(setq ent (vlax-ename->vla-object (ename-of ent)))
(if
(vl-catch-all-error-p
(vl-catch-all-apply 'vla-GetBoundingBox
(list ent 'minp 'maxp)))
(list (setq minp
(3d-of-vla
(vla-get-insertionpoint ent)))
minp)
(list (vlax-safearray->list minp)
(vlax-safearray->list maxp))))
para usar: (get-bounding-box ent), onde ent é a ename, handle ou vla-object da entidade
(defun get-bounding-box (ent / maxp minp)
(setq ent (vlax-ename->vla-object (ename-of ent)))
(if
(vl-catch-all-error-p
(vl-catch-all-apply 'vla-GetBoundingBox
(list ent 'minp 'maxp)))
(list (setq minp
(3d-of-vla
(vla-get-insertionpoint ent)))
minp)
(list (vlax-safearray->list minp)
(vlax-safearray->list maxp))))
para usar: (get-bounding-box ent), onde ent é a ename, handle ou vla-object da entidade
get-points-polig
editado em 01/12/2006: Lwpolylines usam o dxf 10 em OCS, é preciso converter para WCS
Esta subrotina me ajuda em muitas das minhas rotinas, ela serve para coletar as coordenadas das linhas... sei que dá pra usar as subrotinas do express, mas nem todo mundo usa, por isso prefiro programar as minhas próprias...
Link(s) da(s) subrotina(s) usada(s):
get-points-polig, ename-of, dxf, get-points-polig, get-bounding-box
Esta subrotina me ajuda em muitas das minhas rotinas, ela serve para coletar as coordenadas das linhas... sei que dá pra usar as subrotinas do express, mas nem todo mundo usa, por isso prefiro programar as minhas próprias...
(defun get-points-polig (ent / x tp tmp elev)
(setq ent (ename-of ent)
tp (dxf 0 ent))
(cond ((wcmatch tp "LINE,SPLINE,MLINE")
(vl-remove nil
(mapcar '(lambda (x)
(if (member (car x) '(10 11))
(cdr x)))
(entget ent))))
((= tp "LWPOLYLINE")
(setq elev (list (dxf 38 ent)))
(vl-remove nil
(mapcar '(lambda (x)
(if (= (car x) 10)
;o dxf 10 aqui é OCS, converte para WCS:
(trans (append (cdr x) elev) ent 0)))
(entget ent))))
((= "POLYLINE" tp)
(while (/= "SEQEND" (dxf 0 (setq ent (entnext ent))))
(setq tmp (append tmp (list (dxf 10 ent))))))
((= "VIEWPORT")
(if (dxf 0 (dxf 340 ent))
(get-points-polig (dxf 340 ent))
(list (car (setq tmp (get-bounding-box ent)))
(list (caadr tmp) (cadar tmp))
(cadr tmp)
(list (caar tmp) (cadadr tmp)))))))
Link(s) da(s) subrotina(s) usada(s):
get-points-polig, ename-of, dxf, get-points-polig, get-bounding-box
Assinar:
Postagens (Atom)