Autoturn mequetrefe

Já ouviu falar do Autoturn?
Muito bom com certeza!!! Se não ouviu falar e faz projeto de acessos rodiviários deveria, hehehe.
Claro que ele tem uma versão demo etc e tal, mas as vezes só precisamos de uma análise rápida, com um veículo de projeto específico e não temos o Autoturn "full", nem mesmo o genérico dele... o que fazemos? Será que a curva que estamos calculando atenderá a superlargura requerida por um ônibus por exemplo?

É o que o programa abaixo faz, dado um eixo que representa a trajetória do eixo da frente de um veículo, calcula a trajetoria do eixo de traz.
Veja a figura:

Imagine uma rótula qualquer, será que a largura das vias é suficiente para um ônibus?
Usando o programa abaixo, ou o Autoturn, podemos desenhar a trajetória dos eixos deste veículo, a saber:
Distância entre eixos: 6.1m
Distância entre rodas: 2.6m

Alimentamos estes valores, e obtemos:

No desenho, a linha amarela é a trajetória do eixo da frente, que o motorista hipoteticamente irá seguir, verde é o caminho executado pelas rodas da frente e magenta o caminho percorrido pelas rodas de traz.
Assim, podemos ver que ele passa, apertado, mas passa!!

Claro que aí ainda temos de levar em conta raios internos mínimos das curvas, velocidade que o veículo fará a curva, etc... Ma pra começo de conversa, já é um indicativo!!
ver o programa...

(Setq trajetoria:disteixo 6.1
      trajetoria:delta 1
      trajetoria:layerfrente "trajeto-frente"
      trajetoria:layertraz "trajeto-traz"
      trajetoria:offset 2.6)

(defun c:trajetoria (/ ss ent pxf pxt angv1 tmp d total
             lst mlt mlf  pxf2 dirtrv alpha dsttrv
             angtrn angv2 rfront angtilt rback pback2
)
  

;salva variáveis de sistema, inicia  controle de erros
  (tbn:error-init (list (list "osmode" (getvar "osmode")) nil))
  

;pergunta pelos parâmetros... TODO: substituir por um dcl, muito chato assim
  (prompt "Selecione as trajetorias do eixo dianteiro:")
  (
setq  ss      (ssget  '((0 . "ARC,*[~M]LINE,LINE")))
         tmp      (getdist (strcat "\nQual a distancia entre eixos <" (rtos trajetoria:disteixo)">"))
         trajetoria:disteixo (if tmp tmp trajetoria:disteixo)
         tmp       (getdist (strcat "\nqual a distancia entre interpolações <" (rtos trajetoria:delta) ">"))
         trajetoria:delta  (if tmp tmp trajetoria:delta)
         tmp      (getstring (strcat "\nQual o layer desenhar a trajetoria frontal? <" trajetoria:layerfrente ">"))
         trajetoria:layerfrente (if (/= "" tmp) tmp trajetoria:layerfrente)
         tmp      (getstring (strcat "\nQual o layer desenhar a trajetoria trazeira? <" trajetoria:layertraz ">"))
         trajetoria:layertraz (if (/= "" tmp) tmp trajetoria:layertraz)
         tmp      (getdist (strcat "\nQual a ditancia entre rodas? <" (rtos trajetoria:offset)">"))
         trajetoria:offset (if tmp tmp trajetoria:offset))

;desliga o osnap
  (setvar "osmode" 0)
  (
repeat (if ss (sslength ss) 0)
    (
setq ent      (ssname ss 0)
          pxf      (vlax-curve-getstartpoint ent)
          angv1    (+ pi (get-tan-of-pt ent pxf)) ;tangente à curva no ponto PXF
          d        trajetoria:delta
          total
    (get-length-of ent) ;comprimento da trajetória
          lst      nil)
    (
ssdel ent ss)

;prezumindo que o estilo seja o standard nao alterado:
    (command "._mline" "j" "z" "s" trajetoria:offset
         (vlax-curve-getstartpoint ent))
    

;desenha a mlina do eixo dianteiro
    (while (< d total)
      (
setq pxt (vlax-curve-getpointatdist ent d)
        lst (cons pxt lst)
            d   (+ d trajetoria:delta))
      (
command pxt))

    (
setq pxt (vlax-curve-getendpoint ent)
      lst (cons pxt  lst))
    (
command pxt "")
    

;corrige o layer da primeira mline
    (remake-ent (entlast) 8 trajetoria:layerfrente)

;desenha a mline do eixo de traz
    (command "._mline" "j" "z" "s" trajetoria:offset
         (polar pxf angv1 trajetoria:disteixo))

;para cada ponto da mline dianteira, calcula o ponto do eixo trazeiro
    (foreach pxf2 (reverse lst)
      (
setq
;; angulo da traj do eixo da frente
    dirtrv   (angle pxf pxf2)
;; angulo das rodas frontais em relação ao veiculo
    alpha    (- angv1 dirtrv)
;; distance front wheels traveled this step
    dsttrv   (distance pxf pxf2)
;; angle vehicle turned this step
        angtrn   (* 2 (atan (/ (sin alpha)
                   (
- (/ (* 2 trajetoria:disteixo) dsttrv)
                  (
cos alpha)))))
        angv2    (+ angv1 angtrn)
;; average front wheel radius this step
        rfront   (/ dsttrv (* 2.0 (sin (/ angtrn 2.0))))
;; average wheel tilt or articulation angle this step
        angtilt  (asin (/ trajetoria:disteixo rfront))
;; average back wheel radius this step
    rback    (/ trajetoria:disteixo (tan angtilt))
    pback2   (polar pxf2 angv2 trajetoria:disteixo)
    pxf      pxf2
    pxt      pback2
    angv1    angv2
)
      (
command pxt))
    (
command "")
;corrige o layer da segunda mline
    (remake-ent (entlast) 8 trajetoria:layertraz))
  (
tbn:error-restore))


Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, get-tan-of-pt, get-length-of, remake-ent, tan, tbn:error-restore, asin

10 comentários:

  1. *** Não consigo executar...
    *** desenho um ARC ou uma LINE
    Command: a ARC Specify start point of arc or [Center]:
    Specify second point of arc or [Center/End]:
    Specify end point of arc:

    *** e rodo o comando
    Command: TRAJETORIA
    Selecione as trajetorias do eixo dianteiro:
    Select objects: 1 found

    Select objects:

    *** E sempre dá esse erro
    ; error: bad argument type: numberp: nil

    *** Já chequei e as rotinas
    *** dependentes já estão
    *** carregadas...

    *** O que poderia ser?

    ResponderExcluir
  2. Opa, então, o problema é que ficou faltando setar as variáveis locais... aqui uso um sistema de arquivos INI... em fim, coloque isto ANTES da rotina:
    (Setq
    trajetoria:disteixo 6.1
    trajetoria:delta 1
    trajetoria:layerfrente "trajeto-frente"
    trajetoria:layertraz "trajeto-traz"
    trajetoria:offset 2.6
    )

    ResponderExcluir
  3. *** Beleza!
    *** Funcionou mas apareceu outra
    *** mensagem de erro...

    Command: TRAJETORIA
    Selecione as trajetorias do eixo dianteiro:
    Select objects: 1 found

    Select objects:

    Qual a distancia entre eixos [6.1]

    qual a distancia entre interpolações [1]

    Qual o layer desenhar a trajetoria frontal? [trajeto-frente]

    Qual o layer desenhar a trajetoria trazeira? [trajeto-traz]

    Qual a ditancia entre rodas? [2.6]


    Error: no function definition: ASIN
    undoing

    *** Faltou declarar a função ASIN?

    ResponderExcluir
  4. Opa, valeu o toque, já coloquei o link da função: asin

    ResponderExcluir
  5. Anônimo5/4/09 10:49

    oi

    não consigo executar dá erro:


    Error: no function definition: VLAX-CURVE-GETSTARTPOINT

    brigado

    ResponderExcluir
  6. coloque
    ( vl-load-com )

    antes do programa

    ai funciona

    ResponderExcluir
  7. Quando executo o programa surge o erro: "error: no function definition: TBN:ERROR-INIT"

    ResponderExcluir
  8. o final do programa tem os links para as demais funções usadas pelo programa, verifique

    ResponderExcluir
  9. I like the template of your blog! It looks really amazing.

    ResponderExcluir
  10. Thank you for your information! Honestly I have never come across anything that interesting.

    ResponderExcluir