get-lst-pih

Aproveitando o post anterior, vou colocar um programa que extrai diversos dados de um alinhamento, tal como raio, angulo central, estcas… veja que é necessário carregar a TLB do civil 3d, senão as funções começando com “cvl*” não irão funcionar

ver rotina…

;|
retorna uma lista (xPI yPI R Teta Dc Cx Cy Sent Lc1 Sc1 EstTsPC EstSc Tc1 Lc2 Sc2 EstStPt EstCs Tc2)
onde:
xPI, yPI – coordenadas do PI
R, Teta, Dc – raio, angulo central, desenvolvimento da parte em ARCO da curva
Cx, Cy – coordenadas do centro da parte em arco da curva
Sentido – “a” anti-horário, “h” horário
Lc1, Sc1 – comprimento e angulo total da espiral inicial
EstTsPC – Estaca inicial da Curva ( circular ou de transição )
EstSc – Estaca inicial do trecho em ARCO de uma curva de transição
Tc1 – comprimento da tangente inicial ( distancia PI EstTsPc )
Lc2, Sc2 – comprimento e angulo total da espiral final
EstStPt – Estaca final da Curva ( circular ou de transição )
EstCs – Estaca final do trecho em ARCO de uma curva de transição
Tc2 – comprimento da tangente final ( distancia PI EstStPt )
(setq vla (vlax-ename->vla-object (car (entsel))))
(get-lst-pih vla)
|;

(defun get-lst-pih (vla / vlaentities id lst2 n el e pis seco tp x1 y1 x2 y2 a b tmp arc spi spo esi esf)
(
setq vlaentities (cvlp-get-entities vla)
id (cvlp-get-FirstEntity vlaentities))

(repeat (cvlp-get-count vlaentities)
(
setq e (cvlm-EntityAtId vlaentities id)
id (cvlp-get-Entityafter e)
lst2 (cons e lst2)))

;inicia as variaveis
(setq n 1
;primeira entidade da lista
el (car lst2)
;coordenada do ponto inicial:
pis (list (list (cvlp-get-endeasting el) (cvlp-get-endnorthing el))))

;pega todas as entidades e extrai os dados
(repeat (1- (length lst2))
(
setq
;entidade corrente
e (nth n lst2)
;entidade anterior
el (nth (1- n) lst2)
;a entidade é uma linha reta?
tp (= cvlc-aecctangent (cvlp-get-type e))
;a anterior tb? entao é um PI sem curva
seco (and tp (= cvlc-aecctangent (cvlp-get-type el)))
;estaca inicial e final da entidade
esi (cvlp-get-startingstation e)
esf (cvlp-get-endingstation e)
n (1+ n))

;coordenadas do TS,PC e CP,TS
(cvlm-PointLocationex vla esi 0 0 x1 y1 a)
(
cvlm-PointLocationex vla esf 0 0 x2 y2 b)

(if seco
(setq pis (cons (list (list x2 y2)) pis))
(
if (not tp)
(
setq arc (if (vlax-property-available-p e “Radius”)
e
(if (vlax-property-available-p e “Arc”) (cvlp-get-arc e)))
spi (if (vlax-property-available-p e “SpiralIn”) (cvlp-get-SpiralIn e))
spo (if (vlax-property-available-p e “SpiralOut”) (cvlp-get-SpiralOut e))

;para compatibilizar com o c3d2k7:
tmp (inters (list x1 y1) (list (+ x1 (sin a)) (+ y1 (cos a))) ;vetor direcional
(list x2 y2) (list (+ x2 (sin b)) (+ y2 (cos b))) ;vetor direcional
nil)
pis (cons (list
;no c3d2k8 basta:
;(list (cvlp-get-pieasting e) (cvlp-get-pinorthing e))
(car tmp)
(
cadr tmp)
(
if arc (vla-get-radius arc)) ;Raio do arco
(if arc (cvlp-get-delta arc)) ;Teta (angulo do arco)
(if arc (cvlp-get-length arc)) ;Dc
(if arc (cvlp-get-CenterEasting arc)) ;centroX
(if arc (cvlp-get-CenterNorthing arc)) ;centroY
(if arc (if (= :vlax-true (cvlp-get-clockwise arc)) “h” “a”))

(if spi (vla-get-length spi)) ;Lc1
(if spi (cvlp-get-delta spi)) ;Sc1 (angulo)
esi ;estaca do TS ou PC
(if spi (cvlp-get-endingstation spi)) ;estaca do SC
(if spi (distance tmp (list x1 y1))) ;Tc1

(if spo (vla-get-length spo)) ;Lc2
(if spo (cvlp-get-delta spo)) ;Sc2 (angulo)
esf ;estaca do ST ou CP
(if spo (cvlp-get-startingstation spo)) ;estaca do SC
(if spo (distance tmp (list x2 y2))) ;Tc2
)
pis)))))
;ultima entidade:
(setq e (last lst2))
;coordenada do PF (ponto final)
(cons (list (cvlp-get-starteasting e) (cvlp-get-startnorthing e)) pis))

é isso.. para saber o que cada método, propriedade ou constante faz ou significa, veja o seguinte arquivo: “C:Arquivos de programasAutoCAD Civil 3D 2008Helpcivilauto-reference.chm”, nele você irá encontrar o help para cada função usada neste programa. Claro, funciona como as funções VL* do visual lisp, onde vc retira o prefixo “CVL*” da função e procura no help, ex: “cvlm-PointLocation”, sem o prefixo fica só “PointLocation” e é assim que se deve procurar…
para usar o programa faça, por exemplo:
(setq file (open “c:/teste.txt” “w”) lst (get-lst-pih (vlax-ename->vla-object (car (entsel)))))
(
write-line “(xPI yPI R Teta Dc Cx Cy Sentido Lc1 Sc1 EstTsPC EstSc Tc1 Lc2 Sc2 EstStPt EstCs Tc2)” file)
(
foreach x lst (write-line (tostring x) file))
(
close file)
(
startapp “notepad.exe” “c:/teste.txt”)

Link(s) da(s) subrotina(s) usada(s):
tostring

2 comentários em “get-lst-pih”

  1. Olá Neyton,
    Nesse trecho da sua rotina são extraidas as estacas dos 'TS ou PC' e 'ST ou CP'…
    ——-
    esi ;estaca do TS ou PC
    (if spi (cvlp-get-endingstation spi)) ;estaca do SC
    esf ;estaca do ST ou CP
    (if spo (cvlp-get-startingstation spo)) ;estaca do SC
    ——-

    As coordenadas, são lidas nessa parte, mas não são extraidas para o arquivo .TXT
    ——-
    ;coordenadas do TS,PC e CP,TS
    (cvlm-PointLocationex vla esi 0 0 'x1 'y1 'a)
    (cvlm-PointLocationex vla esf 0 0 'x2 'y2 'b)
    ——-

    Tem como extrair, também, as coordenadas dos 'TS,PC' e 'CP,TS'?

    PS: não consegui encontrar o arquivo de ajuda 'civilauto-reference.chm' que você se refere… estou utilizando o C3D 2010 e não existe tal arquivo na pasta de ajuda… aonde posso encontrá-lo?

    []s

    __
    Marcus

Deixe um comentário

Carrinho de compras
Rolar para cima