Mostrando postagens com marcador dicas. Mostrar todas as postagens
Mostrando postagens com marcador dicas. Mostrar todas as postagens

Civil 3D - Dicas - Sectionviews

Dica de hoje: Como fazer seção de corredor, sem modelar o corredor!!!
Bem, quase, hehehehe!!!

A idéia é usar um recurso que pouca gente sabe, mas que na hora de "refinar" o greide ou mesmo o alinhamento, ajuda pra caramba.

Pra começar, tenha um alinhamento com greide e tenha uma seção típica.

Faça uma única sampleline e dela extraia uma sectionview. acredito que seja simples isso a essa altura, caso contrário, siga os tutoriais indicados.

Se não tiver um dwg com essas coisas, use este .

Já tem a seção típica? Então explode ela!!!
Transforme tudo num único bloco, onde o ponto de inserção seja onde era a iserção da assembly:


Achou estranho? hehehe, nem fizemos nada ainda...
Claro que você pode explodir uma cópia da seção, mas vou deixar isso pra você decidir

Agora, peça as propriedades da sectionview e vá na aba Profile Grade Lines:
No item marcado número 1, clique a caixa, depois, clique o item marcado número 2 para mudar o estilo.



Lembra que criamos um bloco com a seção típica??
Vamos fazer um "Marker Style" que usa esse bloco!!

Use os items marcados como estão no meu exemplo e use o bloco que voce criou.



Aí é só clicar os OK que precisar.

Bom, em fim, olhe como fica a sectionview:

Tá, eu sei, os daylight não fazem target no terreno...Eu disse QUASE no início do post, correto?

Qual a utilidade disso? Bem, quando você está refinando, so precisa ter ideía se o greide está na cota correta e o ajuste é mínimo. O mesmo com o alinhamento.

Vantagem: rapidez de se conseguir uma seção básica e desempenho. Qualquer alteração de greide ou alinhamento, não será necessário esperar um rebuild do corredor, basta mover de leve a sampleline para ela atualizar o sectionview (o regen tambem serve, mas é demorado).

Na empresa onde trabalho, temos projetos de ferrovia, as quais possuem estradas de serviço e estas precisam hora estar em cima de uma banqueta já existente, hora em cima do terreno plano... então que forma melhor de analizar seção a seção onde deve ficar o alinhamento e o greide?



 Ah, se você ainda não usa dois monitores para projetar com o Civil 3D, pare a leitura por aqui.

Se usa dois momitores, tenho mais uma dicazinha, o Station Tracker, que você encontra na Ribbon (é, eu também não gosto do espaço que a ribbon toma...):


É um barato essa ferramenta!! Ela mostra dinamicamente a estaca que você esta no profileview quando o mouse passa por cima do alinhamento e viceversa. Muito loco, hehehe

Station Equation - um uso diferente

Olá, boas festas a todos!!!

Hoje estou sem o meu computador, então nada de imagens... depois eu coloco se precisar

Sé queria dividir uma dica:
Station Equation

Sabia que ela não serve apenas para corrigir estaqueamentos?

Imagine o seguinte: você começou e terminou o projeto da estrada com a estaca inicial (Station Control) igual a zero. Seu corredor tem diversas regions, com as mais variadas seções típicas.... Aí um mala qualquer diz que quer a estaca inicial começa em 120+00 por exemplo...

Você altera o Station Control para o valor correto, as labels mudam bonitinho, fica perfeito!! e rápido também...

Mas... o Greide ficou com as estacas defazadas.... bem são poucos os PIVs e você os altera manualmente um a um... OK...

Hummmmm.... o corredor ferrou tudo!!! vai ter de escrever os intervalos do estaqueamento de início e fim em todas as regions!!! agora fu#$%¨&*!!!!

Então, tem jeito melhor??? Sim!!!

Use o Station Equation.

Primeiro, desfaça tudo até voltar na situação antes de mudar o Station Control.

Na mesma tela do Alignment Properties, em vez de colocar o valor para estaca 120+00 no Station Control, adicione uma Station Equation. Deixe o Raw Station seja a estaca 0, ou início do alinhamento. O Station Back deixe igual ao valor do Raw Station e no Station Ahead coloque o valor correspondente a estaca 120+00 (240000, se station index for 20 metros).

Note que as labels vão funcionar direitinho também, mas sem defazar o greide ou ferrar com o corredor!!!

Esta dica venho usando a um bom tempo, porque volta e meia começamos o projeto sem saber ao certo a estaca inicial do nosso trecho de estrada e acabamos tendo algum retrabalho para corrigir isso.

Com este recurso, fica bem simples!!!

Espero que tenham gostado, até a próxima... 

Civil 3d - Desempenho - Dicas

Lembra daquele post em que eu falei sobre arquivos temporários que o autocad usa?

Então, a dica é sobre como aumentar a velocidade de leitura e escrita deles, o que acarreta aumento de performance no autocad.

Comece instalando o RamDisk, que é um programa capaz de criar um dive virtual na sua memória RAM.

Ah, claro, se você tem pouca RAM, esqueça....




Configure 2GB ou 2048 MB para o disco virtual. Você vai notar que ele cria um drive extra no explorer:


Agora, abra as propriedades do sistema indo em Iniciar, Painel de Controle, Sistema, Configurações Avançadas de Sistema, se abrirá:


Clique o botão "Variáveis de Ambiente", edite as variáveis "TEMP" que estarão direcionadas para por exemplo: C:\Users\neyton\AppData\Local\Temp, direcione para a letra de unidade que o RamDisk usa, por exemplo: G:\TEMP\

Eu fiz para as variáveis do sistema e do usuário:

Depois disso é bom reiniciar o windows para ter certeza que ele ainda funciona, hehehehe!!!

Agora é a vez do autocad civil 3d:
Abra o options e configure as pastas TEMP para essa pasta do disco do RamDisk:

Clique os OK que precisar, feche e abra o civil 3d para se certificar que isso deu certo.

Após abrir digite SAVEFILEPATH na linha de comando do autocad civil 3d para saber se ela direciona os arquivos para lá, se não estiver, digite o caminho correto.

Até diria que você pode mudar no registro do windows as chaves:
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.0\ACAD-8000:409\aecProfile\Default\AutoCAD\Editor Configuration\SaveFilePath
e
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.0\ACAD-8000:409\aecProfile\Default\AutoCAD\Editor Configuration\XrefLoadPath

na verdade tem um par dessas para cada profile... se não sabe mecher com o REGEDIT deixe pra lá

você vai notar que o autosave do autocad demorá MUUUUUUUUUUUIIIIITO menos, as operações de UNDO e REDO ficarão mais rápidas.... em fim, tudo que depende de salvar e ler aruqivos temporários irá funcionar mais depressa, pois a velocodade de leitura e escrita será a da memória RAM, não do disco rígido!!!

Fiz uns testes com arquivos grandes e tem se comportado muito bem!!

Note que o autosave cria os arquivos de extensão *.SV$, o undo e redo criam arquivos *.AC$ e eles ficam gravados na pasta TEMP.

Ah, claro, se você desligar o windows, todo o conteúdo do disco do RAMDRIVE será APAGADO!!! A menos que você o configure para salvar no HD normal antes do windows encerrar... Mas isso você descobrirá sozinho como, é bem simples...

Dica - Civil 3D 2011 e datashortcut impossivel de criar

Já aconteceu de voce criar um desenho e tentar fazer datashortcut de alguma coisa nele e o civil reclamar que tem que salvar o desenho antes e você salva, mas ele insiste que tem que salvar outra vez e acaba que não deixa criar o datashortcut?

É comigo também.....

Mas espere!!! Não ligue ainda!!!

hehehe

Faz o seguinte: salve o desenho na versão 2010 e pronto... esse erro acontece porque sue autocad está configurado para salvar o arquivo em versão 2004 ou inferior...

Na compra do seu [pleonasmos mode on] Swivel Sweeper Flex ultra turbo com "plus a mais" [pleonasmos mode off], você ainda ganha uma oferta exclusiva!!!! hehehe

Civil 3d - geographiclocation

Já reparou como é pentelha aquela marquinha que aparece no desenho que parece um pino?

Ela aparece quando você define no Units and Zone do civil 3d os parâmetros de georreferenciamento

Veja a safada:

Em 3d, com o visual style conceptual:

E fica ali... te pentelhando... bom, dá pra tirar ela, basta chamar o comando GEOGRAPHICLOCATION, ou somente GEO, para os íntimos, hehehe

aparecerá esta telinha:

Nela, clique "Remove the geographic location". O civil pedirá confirmação, confirme e pronto!!! ela sumiu!!

Veja que nesta tela ainda pode-se redefinir a posição ou criar uma nova...
Sugiro você fazer uns teste pra ver o que acontece!!!

Se achar algo interessante, me conta

algumas pessoas comentaram, então achei que deveria colocar: pode-se usar o comando (variavel de sistema) GEOMARKERVISIBILITY, que em vez de apagar, só "desliga" essa marquinha pentelha...

Obrigado aos que comentaram!!!

Novos Programas - link

Lembra do programa que comentei aqui e aqui, segue o link: tbn2
Aguardo seus palpites!!!

Ah, roda no civil 3d 2011, autocad 2011

Demais versões, me mande um email

Dica sobre estilos do civil 3d

Outro dia vi um comando do civil 3d num site grigo que achei muito interessante, o comando é AECCIMPORTSTYLESANDSETTINGS, é é isso tudo aí...

A idéia é importar TODOS os estilos de um desenho para outro. Legal né?

Funciona assim: abre o desenho que receberá os estilos. Cerifique-se de que aquele que possui os estilos esteja fechado. Chame o comando AECCIMPORTSTYLESANDSETTINGS na linha de comando. Informe o caminhoccompleto e pronto. Um ououtro REFRESH no settings e os estilos estarão lá!!

Como digitar o caminho ou mesmo esse comando todo, experimente salvar esta lisp:

(DEFUN C:ISTYLES (/)
  (
IF (SETQ FILE (GETFILED "SELECIONE UM ARQUIVO"  "" "DWG" 4))
    (
COMMAND "AECCIMPORTSTYLESANDSETTINGS" FILE)
 ))



Salve e carregue com o APPLOAD, depois chame a lisp na linha de comando: ISTYLES

ah, o site onde vi é este

TEXTFILL - textos vazados

Esses dias fui plotar uns arquivos e as letras sairam todas vazadas... já aconteceu isso com você?
por exemplo, se você definiu o text style para arial e no preview do plot fica assim:


é... essa bagaça me aporrinhou um monte também, hehehe

Para corrigir, use a variavel do sistema TEXTFILL, defina ela em 1
(Digite TEXTFILL na linha de comando)

é isso.. espero que seja útil!!!

Excel escravizando o autocad

Uma simples macro que exemplifica como o excel poderia criar layers no autocad!!
Veja o código...
'adicione as referencias:
'autocad 2008 type library (ou a sua versão)
'autocad/objectdbx commom 17.0 type libray (ou a sua versão do cad)

'define as variaveis globais a seguir
Dim Acad As IAcadApplication
Dim Thisdrawing As AcadDocument

'função que "linka" o cad QUE JÁ ESTÁ ABERTO
'se  nao estiver aberto, abra-o, ou implemente a função CREATEOBJECT
Function getacaddoc() As Boolean
  On Error GoTo erro
  'corrija aqui a versão correta do seu autocad
  '2009 => 17.2
  '2008 => 17.1
  '2007 => 17.0
  Set Acad = GetObject(, "Autocad.Application.17.1")
  
  'pega o dwg que estiver aberto
  Set Thisdrawing = Acad.ActiveDocument
ok:
  getacaddoc = True
  Exit Function
erro:
  getacaddoc = False
End Function

'função que obtem um layer pelo seu nome, criando caso nao exista
Function get_or_create_layer(name As String) As AcadLayer
  On Error GoTo cria
  Set get_or_create_layer = Thisdrawing.Layers.Item(name)
  Exit Function
cria:
  Set get_or_create_layer = Thisdrawing.Layers.Add(name)
End Function


'macro que cria layers no cad no dwg que estiver aberto
'defina a coluna "A" da planilha atual com os nomes
'defina a coluna "B" com as cores dos layers
'exemplo:
'   A       B
'1  teste   1
'2  jj      5
'3  lay2    66

Sub Teste()
  If getacaddoc() Then
    'MsgBox Thisdrawing.Name
  Else
    MsgBox "Erro:" & Err.Description
    Err.Clear
    Exit Sub
  End If
  
  Dim layer As AcadLayer
  Dim i As Long
  
  For i = 1 To 10
   If Me.Cells(i, 1) <> "" Then
     Set layer = get_or_create_layer(Me.Cells(i, 1))
     layer.Color = Me.Cells(i, 2)
   End If
  Next
  MsgBox "Pronto!!"
End Sub

Para usar, abra o excel, nele abra o editor do visual basic for applications e cole o código na "Plan1" por exemplo...


Em seguida, preencha a coluna "A" com o nomes dos layers a criar e na coluna "B" as cores, por exemplo, A1=lay1, A2=lay2 e B1=1 B2=3:

Depois aperte o "Play" hehehehe

Ah, claro, não esqueça de adicionar as referencias (menu ferramentas, referências no editor do vba):
autocad 2008 type library (ou a sua versão)
autocad/objectdbx commom 17.0 type libray (ou a sua versão do cad)
e claro, tenha o excel e o autocad já abertos nas planilhas e dwg de ua escolha!!

é isso...

Como passar variaveis do VBA para o LISP

Sim nerd é possível!!! e sem aquele recurso de usar as variaveis de sistema!! navegando na net encontrei um esquema jóia!!!
Vamos lá então, veja o código VBA:

Function ReadLispVariable(varname As String) As Variant
Dim VL As Object
If VL Is Nothing Then
Set VL = CreateObject("VL.APPLICATION.16")
End If

With VL.ActiveDocument.Functions
Set SYM = .Item("read").funcall(varname)
ReadLispVariable = .Item("eval").funcall(SYM)
End With
End Function

Sub SetLispVariable(varname As String, value As Variant)
Dim VL As Object
Dim SYM As Object

If VL Is Nothing Then
Set VL = CreateObject("VL.APPLICATION.16")
End If

With VL.ActiveDocument.Functions
Set SYM = .Item("read").funcall(varname)
.Item("set").funcall SYM, value
End With
End Sub

'para testar, rode esta macro primeiro:
Sub setar()
SetLispVariable "nomevar", "Funciona!!"

End Sub

'depois rode esta:
Sub pegar()
MsgBox ReadLispVariable("nomevar")
End Sub


E por fim, experimente isto:
no console do visual lisp (ou na linha de comando do cad), faça:
(setq muitobom "que beleza!!!")

depois edite a macro "pegar" para ficar assim:

Sub pegar()
MsgBox ReadLispVariable("muitobom")
End Sub


E veja os resultados!!

Reactor e tempo de edição

Hoje vou postar uma lisp que monitora o open/save do seu desenho, bem legal para quem precisa controlar o tempo de edição do dwg, mas não confia no timer do cad, até porque pouca gente lembra de zerar ele... aí está:

(vl-load-com
(
defun log_me_SAVE (rea par / TMP H
  (
setq tmp (open (strcat (getvar "dwgprefix") "open_save_log.txt") "a"
       H   (menucmd "M=$(edtime,$(getvar,date),DD/M/YYYY hh:mm:ss)")) 
  (
write-line  (STRCAT 
               "OPEN\t" log_me_open_date "\tSAVE\t" 
               
               "\t" (getvar "loginname") "\t" 
               (getvar "dwgname"
               ) 

    TMP
  (
SETQ log_me_open_date H) ;RESETA A HORA DE ABERTURA PARA A HORA DO SAVE 
  

(
DEFUN log_me_OPEN (/ TMP
  (
setq log_me_open_date (menucmd "M=$(edtime,$(getvar,date),DD/M/YYYY hh:mm:ss)"
  )) 

(
vlr-dwg-reactor (getvar "loginname" ) '((:vlr-saveComplete . log_me_SAVE))) 

(
log_me_OPEN
(
princ)



coloque-a na startup suite do cad, ou cole na acaddoc.lsp da pasta support. Pronto, experimente abrir um desenho qualquer, e clique save... aparecerá um arquivo de texto na pasta onde este desenho estava, listando a hora de abertura, do save e o nome do usuário...

É um uso interessante do reactor

vlr-dwg-reactor é uma função que cria um monitor de eventos associado ao desenho, sua sintaxe é a seguinte:
(vlr-dwg-reactor dados  '((evento1 . função1)))
onde "evento1" pode ser aquele :vlr-saveComplete qe aparece na minha rotina, ou qualquer um daqueles que estão no help, dependendo do evento que vc quer monitorar, no caso o "savecomplete"

"função1" é o nome da função a ser chamada quando o evento é disparado, ela deve existir, estar carregada e aceitar os argumentos que serão passadas a ela

para saber que argumentos são esses: o help diz o numero de argumentos para cada evento, numa tabela, veja lá

no geral é isso:
"reactor", "parameter"
mas pra ter certeza, inicie a função que o numero de variaveis que o evento pede, e usa o prompt para mostrar essas variaveis, por exemplo:
( função1 ( var1 var2 
(
 prompt ( strcat ( vl-princ-to-string var1 )  "\n" ( vl-princ-to-string var2 ) ) 
)

aí na linha de comando será mostrado o que foi passado para a função

o "dados" são dados que você queira passar para a "função1", voce os obtem com
( vlr-data var1 )
var1 é sempre ( ou quase ) o objeto "reactor" retornado pela função ( vlr-*-reactor ), onde esse asterisco pode ser dwg, editor, command, etc...

Como Criar um spoiler

Bom, respondendo ao Alencar, é assim que eu fiz o esquema do "mais"/"menos" mais...

<html>
<head>
</head>

<style type="text/css"><!--
.spoiler { height: 1px;
width: 1px;
overflow:auto;
border-width:1px;
border-color:black;}
.sspoiler {color: red;cursor:pointer;}
.spanover {color:green; cursor:pointer;}
--></style>

<body>
<span class="sspoiler"
onclick="spoiler('mais...', 'menos...',this,400,'98%')">mais...</span>
<div class="spoiler">
SEU TEXTO AQUI
</div>
</body>



<script language="javascript"><!--
function spoiler(textoabre, textofecha, botao, altura, largura)
{ divelm = botao.parentNode.getElementsByTagName("div").item(0)
altura = altura + ""
largura= largura + ""
with (divelm.style)
if (width == "1px" !width)
{ height = altura + (altura.match(/^\d+$/) ? "px" : "")
width = largura + (largura.match(/^\d+$/) ? "px" : "")
borderWidth="1px"
botao.innerHTML=textofecha
}
else
{ height = "1px"
width = "1px"
borderWidth="0px"
botao.innerHTML=textoabre}}

var spans = document.getElementsByTagName("span")

for(i=0; i<spans.length; i++)
if (spans[i].className=="sspoiler"
spans[i].className=="spanover")
{ spans[i].onmouseover = function()
{this.className='spanover'}
spans[i].onmouseout = function()
{this.className='sspoiler'}

}
//--></script>


</html>

1 - Você adiciona a parte do "style" no inicio do seu template html
2 - Inclua a parte do "javascript" no final do template, para que seja a última coisa a ser executada pelo browser
Escreva o texto a ser escondido no lugar onde está o "SEU TEXTO AQUI", que deverá ficar dentro de uma DIV de class="spoiler"
3 - o texto "mais" e o texto "menos" deve ficar numa span, como no exemplo...

Simples né?

Ldata, como salvar, recuperar, deletar ou listar dados em um desenho

Funções interessantes para armazenar dados ocultos DENTRO de um desenho:
vlax-ldata-put, para salvar dados
sintaxe: (vlax-ldata-put dict key data [private])
onde: dict pode ser uma entidade (vla-object, ou ename) ou uma string (que nomeia um dictionary), funciona como uma "tabela" key é a "chave" ou "campo" dentro da "tabela" onde se quer armazenar algo data são os dados em si, pode ser qualquer coisa válida no autolisp, como listas, strings, numeros, etc... [private], opcional, se for colocado algo diferente de NIL, e vlax-ldata-put for usado dentro de uma VLX com separate namespace somente esta VLX terá acesso a esta LDATA exemplo:
(vlax-ldata-put "tabela" "campo" 25) para recuperar os dados: (vlax-ldata-get
"tabela" "campo") retorna então, o 25 Veja que 25, é um exemplo, mas poderia ser '(1 2 5), ou "teste", ou 14.5, ou seja, qualquer coisa
Legal né?

E tem ainda as funções:
vlax-ldata-get, para recuparar os dados
sintaxe: (vlax-ldata-get dict key data [private])
exemplo:
(vlax-ldata-put "tabela" "campo")

vlax-ldata-delete, pra deletar um dado (doh!!)
sintaxe:
(vlax-ldata-delete dict key data [private])
exemplo:
(vlax-ldata-delete "tabela" "campo")

vlax-ldata-list, para listar todos os "campos" de uma "tabela"
sintaxe:
(vlax-ldata-list dict [private])
exemplo:
(vlax-ldata-put "tabela" "campo" 25)
(vlax-ldata-put "tabela" "teste" '((14 3)))

(vlax-ldata-list "tabela")
retorna:
(("teste" (14 3)) ("campo" . 25))

Legal, agora, qualquer coisa MEEEEEESSMMOO pode ser salva? para saber se seus dados podem ser salvos e recuperados depois, use:
vlax-ldata-test, para testar se é possível salvar seus dados
sintaxe:
(vlax-ldata-test data)
exemplo:
(vlax-ldata-test '((10 25) (6 "aa")))
que retorna T (ou NIL se nao puder ser salvo)

É isso...
Ainda tem a possibilidade de usar XDATA ou XRECORD, se bem que XRECORD é bem mais complexo...

Como montar uma lisp com dcl de maneira eficiente

Vi em alguns forums que os iniciantes querem fazer lisps com dcl, mas muitas vezes não tem muita noção de como fazer isso, seja no "como" preencher os campos, controlar se eles estão disponíveis ou não, o que acontece se colocar um valor ínvalido, etc. Aí, até sai um código, mas que fica bastante complexo, para uma coisa que deveria ser bem simples... Não foram poucas as rotinas que vi, onde há "malabarismos" para obter valores, ou até mesmo setar ações para os campos de uma DCL... por exemplo, esse negócio de colocar ações mais elaboradaas via (action_tile "campo" "acao"), onde "acao" é muito mais que um simples "setq", é ruim, principlamente se você precisar manipular strings dentro da ação, ruim, porque não há como depurar o código... além de ficar feio!!! Outra coisa é empilhar (veja a parte dos set_tile), assim:
(action_tile "campo1" "(acao1)")
(
action_tile "campo2" "(acao2)")
;......
(action_tile "campon" "(acaon)")

putz... é fácil, fazer mas depois fica complicado manter, ainda mais se cada "(acaon)" é uma rotina com mais de 5 palavras.

Uma coisa que atrapalha bastante é o fato de algum campo depender de outro. Nestes casos, pelo que pude observar, é melhor deixar desabilitado o campo dependente, do que colocar na sua "action" um IF que avalie os campos dos quais ele depende. Ainda mais se tiver mais de um campo assim.

O programinha abaixo, mostrado na figura, expõe estes aspectos e, mostra soluções viáveis e simples. Tenho feito sempre assim nos meus programas, veja:
Salve esta parte como "circulo.lsp":

;função que controla as ações das keys, seta valores, erros, etc
(defun acao (key val)
  (
cond ((= key "raio") (if (> (atof val) 0)
               (
setq raio val);valor correto
               (progn
                 (alert "Erro:\nDeve ser maior que zero!!")
                 (
mode_tile "raio" 2) ;seleciona o conteudo
                 )))
    ((
= key "layer") (if (snvalid val) ;é um nome de layer válido?
               (setq layer val)
               (
progn
                 (alert "Erro:\nDeve ser preenchido!!")
                 (
mode_tile "layer" 2)
                 )))

;|acao que precisa da linha de comando, entao encerra o dcl
  com um valor  diferente de 0 (cancel) e 1 (ok)|;

    ((= key "botao") (done_dialog 2))
    ;((key "outras_coisas") (done_dialog 3))
    )
;altera o estado dos campos (habilitar ou nao)
  (modes)
  )


;função que (des)habilita keys
(defun modes nil
;condiciona o layer ao raio estar correto:
  (mode_tile "layer" (if raio 0 1))
;condiciona o botao ao layer
  (mode_tile "botao" (if layer 0 1))
;condiciona o botao OK ao raio, ao layer e a coordenada
  (mode_tile "accept" (if (and layer raio coord) 0 1)))

;função principal:
(defun c:circulo (/ ;veja que uso as variaveis com nomes iguais as keys:
        raio layer coord ;keys em forma de symbol
        pt ;variavel temporaria
        dcl dlg faz ;variaveis de controle do dcl
        key val ;variaveis de controle dos campos da dcl
        )
;inicia o dcl
  (setq dcl (load_dialog "d:/circulo.dcl")
    faz t);controla o looping
  

;|valores padrao, descomente a linha abaixo se preferir.
  veja que os uso em forma de string já, para facilitar o
  preenchimento dos campos do dcl|;

;(mapcar 'set '(raio layer coord) '("10" "circulo" "(5 3)"))
  

;enquanto FAZ:
  (while faz
;abre a tela do dcl:
    (new_dialog "circulo" dcl)

;|preenche o formulario e seta as ações
  na primeira execução estará tudo "zerado",
  se "valores padrao" nao forem setados|;

    (foreach key '("raio" "layer" "botao" "coord")
      (
action_tile key "(acao $key $value)")
      (
if (setq val (eval (read key)))
    (
set_tile key val)))
    

;(des)habilita as keys:
    (modes)
    

;inicia o formulario:
    (setq dlg (start_dialog))

    (
cond
;|acoes padrao, mesmo que voce nao faça action_tile para o
  botao "ok" e "cancel", eles fazem (done_dialog 1) e (done_dialog 0)
  respectivamente, em geral nao se muda isso mesmo|;

          ((= dlg 0) (alert "cancelado") (setq faz nil))
      ((
= dlg 1) (alert "OK") (setq faz nil))
;|a partir daqui, vão todas as ações que dependem da linha de comando
  sao as funções get*: getpoint, getcorner, getint...|;

      ((= dlg 2) (if (setq pt (getpoint "\nEntre com um ponto"))
               (
setq coord (strcat "("
                       (rtos (car pt) 2 2)
                       " "
                       (rtos (cadr pt) 2 2)
                       ")"
                       ))
               (
setq coord nil)))
      ;((dlg 3) (outras_coisas))
      )
;|se foi clicado o "botao", ele pede uma coordenada e volta ao
  new_dialog, senao encerra de vez o dcl|;

    );end while

;descarrega o dcl da memoria:
  (unload_dialog dcl)
  

;única condição válida é clicar "OK", para desenhar o círculo:
  (if (= dlg 1)
    (
entmake (list '(0 . "CIRCLE")
           (
cons 10 (read coord))
           (
cons 8 layer)
           (
cons 40 (atof raio)))))
  (
princ)
  )


Agora salve esta como "circulo.dcl":

circulo :dialog {
    label = "Desenhar circulo";
    initial_focus= "raio";
  :
boxed_column {label = "Powered by Neyton";    
    :
edit_box {label = "raio"; key = "raio" ;}
    :edit_box {label = "layer"; key = "layer" ;}
    :button {label = "pegar um ponto >"; key = "botao";}
    :text {key="coord"; label = "clique o botao";}}
  ok_cancel;
}


Ah, claro, na rotina, salvei no drive D, caso salve em outro lugar, corriga na lisp a linha (setq dcl (load_dialog "d:/circulo.dcl")... para o caminho correto
Se preferir, salve ambos na pasta do autocad, e retire o "d:/" dessa linha

O programa é bem simples e está bem comentado, a função dele é mostrar um quadro de diálogo, onde você deve informar o raio, o layer e uma coordenada, para desenhar um círculo. Sim eu sei, tudo isso, pra isso, é so um exemplo, hehehehe, que pode ser escalado para lisps/dcls bem mais complexas.

Veja que o nome do layer só fica editável, depois de informar um raio válido, assim como o botão OK só fica disponível depois de você fornecer todos os dados.

É interessante observar a sequência de eventos que deve acontecer até o "OK" ficar disponível. Existe um loopingo no meio do caminho e você pode se perguntar por que ele está ali.

Bem, quando o DCL está aberto (visível na tela), não é possível usar funções que dependem da linha de comando, tais como getpoint, getint, getcorner, a maioria das variações do ssget, o entsel, etc. Por isso, é necessário fechar o DCL, quando se precisa delas. Experimente trocar a ação do botão, adicionando esta linha:
(action_tile "botao" "(setq pt (getpoint))")
antes da linha do (start_dialog)
Salve seus desenhos, caso tenha algum aberto, e carregue a rotina.... quando você for clicar o botão, seu autocad irá travar!!! Isso mesmo, fatal error... só reiniciando o autocad!! Por que isso? sei lá, só sei que é assim.

E as variáveis, como que faz?
Isso não é regra, mas eu tenho preferido usá-las com os mesmos nomes das KEY do dcl, assim, no exemplo, a key "raio" está associada à variável raio e pra facilitar, sempre armazeno ela como uma string, algo assim: (setq raio "10.5"), só pra facilitar o preenchimento do dcl, aí quando for usar seu valor, basta um (atof raio).
No programa do exemplo, tem uma linha comentada, que mostra como seria para definir valores padrão para estas variáveis, acelerenado assim o tempo até o "ok" estar disponível.

Bem, é isso, espero que tenha ajudado!!

Mlh2 2 - a Missão!!

Lembra do Mlh2? então, uns tempos atraz postei ele aqui no blog, aqui. Com ele é possível criar a malha de coordenadas UTM para uma determinada polilinha, área clicada na tela, ou até viewport selecionada. Bom resolvi incluir algumas coisas nele e pra nao ter de atualizar o post, vou colocar já o executavel pra download. Quem ja usa ele, verá algumas diferenças:



Já os novatos podem usar como está. Para usar descompacte o arquivo na pasta do cad, e com o comando APPLOAD, carregue o MLH2.VLX

é possível pré-configurar os layers, escalas, etc simplesmente alterando o arquivo "mlh2.ini", edite-o com o bloco de notas.

Download

Visualizar arquivos BAK

Um "troço" interessante este: como habilitar o preview dos thumbnails (imagens em miniatura) do autocad para arquivos BAK e SV$

com ela, alem de previsualizar os DWG em miniatura no explorer, será possivel visualizar os BAK e SV$

(vl-registry-write "HKEY_CLASSES_ROOT\\.bak\\shellex\\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}" "" "{AC1DB655-4F9A-4c39-8AD2-A65324A4C446}"

(
vl-registry-write "HKEY_CLASSES_ROOT\\.SV$\\shellex\\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}" "" "{AC1DB655-4F9A-4c39-8AD2-A65324A4C446}")


fonte:
hyperpics.blogs.com

doubleclick

Uma dica legal pra trabalhar com mais eficiência no civil 3d: as doubleclik. Na verdade é um recurso que já existe no autocad a um bom tempo, mas qua não damos muita importância. Imagine você clicar duas vezes num alinhamento, perfil, modelo de estrada ou qualquer coisa do civil 3d e ele inicia o comando relevante àquela entidade; Um alinhamento por exemplo a edição mais comum é a de alterar a geometria. Se você não gosta de ter que ligar o toolspace o tempo todo ou, mantêlo ligado, pois ocupa espaço na tela (tenha 2 monitores!!!), pode se beneficiar desse recurso, então vamos lá, pra usar isso, no civil 3d, digite CUI, aparecerá a janela do "Customize User Interface", nela, no quadro superior esquerdo, localize "Double Click Actions", como na figura. Clique com o botão direito do mouse sobre ele e escolha "New Double Click Action". No quadro a direita, no campo "Name" coloque o nome da ação e no campo "Object Name" o tipo de entidade. Tá, mas como saber que nomes colocar ali? Faça assim: na linha de comando digite:



(cdr (assoc 0 (entget (car (entsel "\nSelecione algo")))))






é isso mesmo, um lisp, ao selecionar um Alignment, na linha de comando aparecerá:



"AECC_ALIGNMENT"



coloque isso nos campos "Name" e Object Name" citados acima.

Agora, vamos criar os comandos que serão executados:


No quadro inferior esquerdo (o "Command List"), clique o botão "Create a new command" e no quadro da direita (o "Properties" ), preencha o campo "Name" com o comando que você quer e o campo "Macro" com o mesmo nome precedido do prefixo "^C^C_", como na figura ao lado.



Agora, no quadro "Command List" aparecerá o seu novo comando, "arraste-o" com o mouse para cima do nome da doubleclick que voce criou, deverá ficar como na figura abaixo:

Pronto, faça o mesmo para as demais entidades que você quer ter essa funcionalidade, eu estou usando as que aparecem na figura, é bem melhor que abrir o toolspace toda hora, ou usar aquele menu do botão direito do mouse pra tudo...

Import type library

Bom, faz tempo que não posto nada, então vou postar um código que stou achando bastante útil:

;importa as funções do civil 3d para o visual lisp
(vlax-import-type-library
 :tlb-filename
 "C:\\Program Files\\AutoCAD Civil 3D 2008\\Civil\\AeccXLand.tlb"
 :methods-prefix "cvlm-"
 :properties-prefix "cvlp-"
 :constants-prefix "cvlc-")


Veja, ele importa os métodos, propriedades e constantes do Civil 3d para o visual lisp

Qual a utilidade disso? bem... você sabe programar em vba? não? sabe em visual lisp?
então.... com isso você pode manipular entidades do civil 3d via lisp!!
um exemplo:
digamos que queiramos obter uma polilinha que passe pelos pontos de um alinhamento... sei lá pra que, mas precisamos fazer isso...
o civil 3d tem um comando que faz o inverso, pega uma polilinha e cria o alinhamento, mas não tem um comando que cria uma polilinha a partir de um alinhamento!! como fazer?
Command: pline ....

bom, veja:

(defun c:alin2pline (/ ss ent)
  (
tbn:error-init nil)
  (
if (setq ss (ssget '((0 . "AECC_ALIGNMENT"))))
    (
repeat (sslength ss)
      (
setq ent (ssname ss 0))
      (
cvlm-GetLWPolyline (vlax-ename->vla-object ent))
      (
ssdel ent ss)))
  (
tbn:error-restore ))


a palavra cvlm-GetLWPolyline so existe APÓS você importar a "type library" do civil 3d que contem o método GetLWPolyline, saca?

essas "type library" estão em "C:\Program Files\AutoCAD Civil 3D 2008\Civil\", no caso do c3d2k8...
agora me pergunte COMO saber que novos métodos você dispõe??

experimente isto:

(setq tmp (atoms-family 1) file (open "d:/cvl.txt" "w"))
(
foreach x tmp
  (if (= "CVL" (strcase (substr x 1 3))) (write-line x file)))
(
close file)
(
startapp "notepad.exe" "d:/cvl.txt")



isto irá criar um arquivo de texto no drive D:\ com todos os métodos, propriedades e constantes importados...

tá, e o help de cada uma delas????????
ache este arquivo:
"C:\Program Files\AutoCAD Civil 3D 2008\Help\civilauto-reference.chm"

abra este tópico:
"AeccXLandLib Library", nele ache "IAeccAlignment Interface"
nele você acha o método que usei no exemplo (GetLWPolyline)
como usar o help?
o help deste método, é algo assim:

Gets the lightweight polyline from alignment geometry.

HRESULT GetLWPolyline(
[out, retval] IAcadLWPolyline ** ppLWPolyline
);


isto é em C, mas é fácil entender...
é quase como os métodos activex ( as famosas VL* ) do cad
ficaria em visual lisp:
(cvlm-GetLWPolyline vlaobj)
onde vlaobj é o vla-object name do alinhamento ( veja o exemplo acima!! )

outro exemplo:
(setq vla     (vlax-ename->vla-object (car (entsel "\nSelecione um alinhamento")))
      station (cvlp-get-startingstation vla)
      offset  0)
(
cvlm-PointLocation vla station offset  'x 'y)
(
prompt (strcat "o ponto inicial é " (rtos x) ", " (rtos y)))


simples né?
o método pointlocation, no help é assim:
HRESULT PointLocation(
[in] double Station,
[in] double Offset,
[out] double* Easting,
[out] double* Northing
);


em lisp, o método PointLocation ficaria:
(cvlm-PointLocation vla station offset 'x 'y)
onde:
"cvlm-" é o prefixo que eu escolho para indicar os métodos
vla é o vla-object do alignment
station é a estaca
offset é a distancia perpendicular ao alinhamento na estaca escolhida

Altitudes no Google Earth

Então, uns testes que estou fazendo aqui, se bem que até agora, obtive umas elevações bem "variadas" por assim dizer... O caso é o seguinte: a rotina a seguir deveria servir para isso: dadas as coordenadas geográficas de um ponto, ela abre o google earth e "pergunta" a ele qual a elevação do ponto na coordenada informada.. bom, deveria ser assim, mas até agora não encontrei uma confiável de de certificar-me que a imagem "estabilizou" na tela, para aí sim, "perguntar" a cota... se ela não estabiliza, o terreno não informa a cota corretamente, e o google earth não está sendo "modal" nos métodos que usei nele.. aos que pensarem que isso se deve a estar programado em lisp, digo que não tem nada a ver... faz o teste, rode a rotina para as coordenadas Lat: -21 e Lon:-48 por exemplo... põe o globo em movimento e rode a rotina pelo console... ela deverá informar cotas estranhas... e se deixar a imagem estabilizar nesta coordenada, ele passa a informar sempre o mesmo valor.. em fim... se estabilizar funciona!!!
imagine as utilidades!! para um anteprojeto de estradas por exemplo, já é um começo se você não tem topografia alguma, hehehe, eu mesmo estou usando este esquema até a topografia ser concluída, aliás, até o geométrico preliminar foi feito no google earth e exportado para o cad com o expge. Se alguém quiser contribuir no desenvolvimento, ou tiver alguma dica, manda aí!!!
mais...
;inicializa o google earth:
(defun getools:init ()
  (
if (setq ge:app (vlax-get-or-create-object "GoogleEarth.ApplicationGE")
        kh:app (vlax-get-or-create-object "Keyhole.khInterface"))
    (
progn
      (while (/= 1 (vlax-invoke-method ge:app "isinitialized")))
      (
while (/= 1 (vlax-invoke-method ge:app "isonline")))
      

      t)
    ))


;calcula a elevação de um ponto na superficie do globo:
(defun getools:elevation-from-pt (lon lat / PointOnTerrain)
  (
if (not kh:app)  (getools:init))
  (
vlax-invoke-method kh:app "setViewParams" lat lon 1000 0 0 5 5)
  (
setq PointOnTerrain nil)
  (
setvar "cmdecho" 0)
  (
while (/= PointOnTerrain
         (setq PointOnTerrain
            (caddr
              (vlax-safearray->list
            (vlax-invoke-method
              kh:app
              "GetPointOnTerrainFromScreenCoords"
              0 0)))))
    (
command "delay" 500))
  (
setvar "cmdecho" 1)
  PointOnTerrain)

;libera a memória:
(defun getools:restore ()
  (
if (equal 'vla-object (type ge:app)) (vlax-release-object ge:app))
  (
if (equal 'vla-object (type kh:app)) (vlax-release-object kh:app))
  (
setq ge:app nil kh:app nil))
Para usar é simples:
(getools:init)
(getools:elevation-from-pt lon lat)
(getools:restore)
onde lat e lon são as coordenadas geográficas do ponto, por exemplo
Lon = -48.5 ( 48º30' Oeste )
Lat = -21 ( 21º00' Sul )

Publicidade: interneyshop