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
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
ver rotina...
é isso.. para saber o que cada método, propriedade ou constante faz ou significa, veja o seguinte arquivo: "C:\Arquivos de programas\AutoCAD Civil 3D 2008\Help\civilauto-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...;|
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))
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))
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
Olá Neyton,
ResponderExcluirNesse 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
para exportar as coordenadas, mande colocar o conteudo das variaveis x1,y1, x2,y2 junto com o restane dos dados...
ResponderExcluircivilauto-reference.chm: no 2010 ele se chama: civil_api_activex_reference.chm
apesar de no help ainda estar com o nome antigo