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!!
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
Thank you for your information! Honestly I have never come across anything that interesting.
I like the template of your blog! It looks really amazing.
o final do programa tem os links para as demais funções usadas pelo programa, verifique
Quando executo o programa surge o erro: “error: no function definition: TBN:ERROR-INIT”
coloque
( vl-load-com )
antes do programa
ai funciona
oi
não consigo executar dá erro:
Error: no function definition: VLAX-CURVE-GETSTARTPOINT
brigado
Opa, valeu o toque, já coloquei o link da função: asin
*** 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?
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
)
*** 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?