PDA

View Full Version : Verificar dimenssões de uma polyline fechada



ed_cristian.dwg
2010-03-12, 01:48 PM
Bom dia pessoal, quanto tempo :)

Gostaria muito da ajuda de vc's.

Tendo eu um poligono irregular "fechado", é possível extrair as informações altura e largura máxima?
é possível into por algum comando lisp?

ex: tendo eu uma estrela de 5 ponta, é possível achar a altura dela.


Obrigado pessoal!


Tentarei ser mais participativo :)

Rui Pestana
2010-03-12, 02:47 PM
Olá

se fôr em .NET pode usar:

acPoly As Polyline=New Polyline()

Dim PointMax As Point3d = acPoly.GeometricExtents.MaxPoint

Dim PointMin As Point3d = acPoly.GeometricExtents.MinPoint

Dim Altura As Double=PointMax.DistanceTo(PointMin)

ed_cristian.dwg
2010-03-12, 03:04 PM
Rui, muito obrigado!
será que a algum comando em lisp ou visual lisp tmb???

valeu mesmo... :)

ed_cristian.dwg
2010-03-12, 06:32 PM
O problema é que eu ja fiz tota programação em vlisp, só me falta este ponto,
por isto que eu gostaria de saber como isto pode ser feito, em Vlisp ou lisp.


Valeu!

alanferreira.l
2010-03-14, 07:36 PM
Vou te dar uma solução,

Pela entidade da polyline você pode pegar a lista de pontos que são os eixos.
Analizando cada coordenada X e Y ex:

(setq H (- (max (car pt1) (car pt2)) (min (car pt1) (car pt2)))

Isso foi só uma ideia, vc pode fazer uma lista de pontos e verificar a maior coordenada em uma estrutura de repetição.

Espero ter ajudado, se não consiguir avisa que deselvovo para você.

Abraços.

ed_cristian.dwg
2010-03-15, 11:39 AM
Alan,

Primeiro de tudo, muito obrigado pela atenção.

Entendi sua explicação "até acreditava que o caminho seria este mesmo", só que escontrei um problema.... se você puder me ajudar.....

Peguei como exemplo, uma polyline de 5 pontos e desenvolvi a seguinte programação:

(setq ent (entsel "\Selecione o objeto:"))
(setq ent_nome (car ent))
(setq ent_lista (entget ent_nome))

quando chegou neste ponto, me retorna a seguinte informação.

((-1 . <Entity name: 7dc22628>) (0 . "LWPOLYLINE") (330 . <Entity name:
7e698cf8>) (5 . "D6BD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(370 . 0) (100 . "AcDbPolyline") (90 . 5) (70 . 1) (43 . 0.0) (38 . 0.0) (39 .
0.0) (10 104.626 348.623) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 148.14 423.991)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (10 190.663 350.34) (40 . 0.0) (41 . 0.0) (42
. 0.0) (10 142.92 267.647) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 33.3351
267.647) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))


problema.....

como faço para acessar as informações de cada ponto???
só estou conceguindo acessar as informações do primeiro....

seria este o caminho certo para a solução deste problema????

Mais uma vez... Obrigado Alan....

alanferreira.l
2010-03-15, 01:01 PM
Isso mesmo,
Se você perceber na lista todos os iniciados por 10 é um ponto de sua polyline..
usando o "assoc" vc só ia pegar o primeiro ponto..

Mais faz assim

(setq ent (entsel "\Selecione o objeto:"))
(setq ent_nome (car ent))
(setq ent_lista (entget ent_nome))

(setq lista_pontos (list))
(foreach temp ent_lista (progn (if (= (car temp) 10)(setq lista_pontos (cons (cdr temp) lista_pontos)))))

a variavel lista_pontos é uma lista com os eixos da polyline.

Espero que resolva!

Abraços



Alan,

Primeiro de tudo, muito obrigado pela atenção.

Entendi sua explicação "até acreditava que o caminho seria este mesmo", só que escontrei um problema.... se você puder me ajudar.....

Peguei como exemplo, uma polyline de 5 pontos e desenvolvi a seguinte programação:

(setq ent (entsel "\Selecione o objeto:"))
(setq ent_nome (car ent))
(setq ent_lista (entget ent_nome))

quando chegou neste ponto, me retorna a seguinte informação.

((-1 . <Entity name: 7dc22628>) (0 . "LWPOLYLINE") (330 . <Entity name:
7e698cf8>) (5 . "D6BD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(370 . 0) (100 . "AcDbPolyline") (90 . 5) (70 . 1) (43 . 0.0) (38 . 0.0) (39 .
0.0) (10 104.626 348.623) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 148.14 423.991)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (10 190.663 350.34) (40 . 0.0) (41 . 0.0) (42
. 0.0) (10 142.92 267.647) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 33.3351
267.647) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))


problema.....

como faço para acessar as informações de cada ponto???
só estou conceguindo acessar as informações do primeiro....

seria este o caminho certo para a solução deste problema????

Mais uma vez... Obrigado Alan....

f_santana
2010-03-15, 02:07 PM
esperimente usar o ENTNEXT e procura os VERTEX da LWPOLYLINE
com um array voce consegue pegar todos

para voce ver como
segue ym trecho de uma rotina minha que trabalha com poligonos

(setq el1 (ssname e1 (setq n1 (1- n1))))
(if (or (equal "POLYLINE" (cdr (assoc 0 (entget el1))))
(equal "LWPOLYLINE" (cdr (assoc 0 (entget el1))))
)
(progn
(if (equal (cdr (assoc 38 (entget el1))) nil)
(progn
(setq el2 (entnext))
(while (/= el2 nil)
(if (equal "VERTEX" (cdr (assoc 0 (entget el2))))
(progn
(setq pt (cdr (assoc 10 (entget el2)))
ptx (car pt)
pty (cadr pt)
p (list ptx pty h)
)
(entmod
(subst (cons 10 p) (assoc 10 (entget el2)) (entget el2))
)
)
)
(setq el2 (entnext el2))
)
)
(progn
(entmod
(subst (cons 38 h) (assoc 38 (entget el1)) (entget el1))
)
)
)
(entupd el1)
)


Alan,

Primeiro de tudo, muito obrigado pela atenção.

Entendi sua explicação "até acreditava que o caminho seria este mesmo", só que escontrei um problema.... se você puder me ajudar.....

Peguei como exemplo, uma polyline de 5 pontos e desenvolvi a seguinte programação:

(setq ent (entsel "\Selecione o objeto:"))
(setq ent_nome (car ent))
(setq ent_lista (entget ent_nome))

quando chegou neste ponto, me retorna a seguinte informação.

((-1 . <Entity name: 7dc22628>) (0 . "LWPOLYLINE") (330 . <Entity name:
7e698cf8>) (5 . "D6BD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(370 . 0) (100 . "AcDbPolyline") (90 . 5) (70 . 1) (43 . 0.0) (38 . 0.0) (39 .
0.0) (10 104.626 348.623) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 148.14 423.991)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (10 190.663 350.34) (40 . 0.0) (41 . 0.0) (42
. 0.0) (10 142.92 267.647) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 33.3351
267.647) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))


problema.....

como faço para acessar as informações de cada ponto???
só estou conceguindo acessar as informações do primeiro....

seria este o caminho certo para a solução deste problema????

Mais uma vez... Obrigado Alan....

ed_cristian.dwg
2010-03-15, 02:07 PM
nossa, te devo uma... uma não.... 50
valeu!

Rui Pestana
2010-03-15, 04:15 PM
Olá Cristiano,

tome em atenção que se a polilinha contiver arcos os extremos podem não estar nos vértices da polilinha mas sim, algures nesses arcos.

ed_cristian.dwg
2010-03-15, 04:22 PM
Rui, realmente este é um problema, na verdade até hj, não sei como resolvê-lo

tem uma maneira que eu fiz,

se vc executar um zoom/object, as variáveis ucsXdir e ucsYdir do setvar, mostram as dimenssões do objeto, conciderando tmb o arco, mas isto não é preciso.