ASIN

Função arco-seno, usada na rotina "Trajetória"
(defun asin (x) (/ x (sqrt (- 1.0 (expt x 2)))))

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

Plotar varios arquivos

É, tô sumido uns dias... mudança de apartamento, contas pra pagar... a internet lá de casa que é uma droga... o dinheiro nao entra... heheheh problemas de todos os brasileiros pra não deixar em branco, vou postar um programinha que fiz para plotar uns arquivos que estou fazendo, veja uma tela dele:

Funciona assim: após carregar o programinha, vá ate o menu tools macros, e carregue a macro "plotarvarios", ele irá apresentar a tela acima, onde você escolhe a pasta origem dos dwgs e a pasta destino dos pdfs ou plts. Note que tem um campo onde você deve escolher o "template" do layout do desenho corrente para ele usar em todos os arquivos selecionados.
Por que assim? Você me pergunta...
Porque assim, você configura uma vez um layout e plota vários desenhos, pois é comum não darmos muita atenção à configuração da pagina nos nossos desenhos...

Aqui tenho de plotar localmente para pdf e no servidor para a ploter, e este programa facilita muito, uma vez que nao preciso configurar ploters diferentes em todos os desenhos...

Claro, que se você só usa uma ploter, o publish é a solução ideal, claro que você terá de configuarar as páginas de todos os layouts dos seus desenhos. "Whatever"!!!

O programa não salva a configuração de página nos desenhos, mas isso é fácil de fazer, basta um "doc.save" no local apropriado (está comentada a linha onde isso deve ser feito)

Experimente, baixe o arquivo e teste!!!