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 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...
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:

  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

    ResponderExcluir
  2. para exportar as coordenadas, mande colocar o conteudo das variaveis x1,y1, x2,y2 junto com o restane dos dados...

    civilauto-reference.chm: no 2010 ele se chama: civil_api_activex_reference.chm

    apesar de no help ainda estar com o nome antigo

    ResponderExcluir