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

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!!

VB.NET e o autocad

Que tal mudar um pouco a cara dos nosso programinhas e tornar a coisa mais interessante? Vamos experimentar o VB.NET então!!! Com ele podemos usar os forms do Framework, bem mais interessantes que os basiquinhos do VBA e MUIIIIIIIITTO melhor que os famigerados DCLs (objectdcl... nome fácil de pegar nojo, hehehe) vamos fazer algo mais que o famoso "Hello World" que todo tutorial faz, vamos já desenhar uma linha!!!

Para isso, usei o VB.NET Express Edition, di grátis no site da M$ e o Autocad, no caso as versões 2008 de ambos
no editor do VB.Net, crie uma nova "Class Library" e colenela este código:




'acadApp depende de:
Imports AutoCAD = Autodesk.AutoCAD.Interop

'objetos do cad (textot, linha, layer, etc..) dependem de:
Imports AcadLib = Autodesk.AutoCAD.Interop.Common

'CommandMethod depende de:
Imports Autodesk.AutoCAD.Runtime

Public Class teste

'o autocad em si
Public acadApp As AutoCAD.IAcadApplication

'documento corrente
Public Thisdrawing As AutoCAD.IAcadDocument

'é executado ao carregar a dll com o NETLOAD
Public Sub New()
'17.0? = cad 2007
'17.1 = cad 2008
'17.2 = cad 2009
acadApp = GetObject(, "Autocad.Application.17.1")
Thisdrawing = acadApp.ActiveDocument
End Sub

'expoe a sub como um novo comando do autocad
_
Public Sub desenhalinha()
Dim pt1(2), pt2(2) As Double
Dim linha As AcadLib.AcadLine
Dim lay As AcadLib.AcadLayer

'pede o primeiro ponto:
pt1 = Thisdrawing.Utility.GetPoint(, "Entre com o primeiro ponto")

'pede o segundo ponto:
pt2 = Thisdrawing.Utility.GetPoint(pt1, "Entre com o segundo ponto")

'desenha uma linha:
linha = Thisdrawing.ModelSpace.AddLine(pt1, pt2)

'troca o layer, criando se ele nao existe:
Try
linha.Layer = "layer_teste"
Catch
lay = Thisdrawing.Layers.Add("layer_teste")
linha.Layer = "layer_teste"
End Try

End Sub

End Class


Algumas palavras devem aparecer sublinhadas, pois ainda não adicionamos as referências que precisamos, são elas (no caso do cad 2008):
para que possamos criar comandos:
pasta do Autocad\"acmgd.dll"
para que possamos desenhar no cad:
"Autocad 2008 Type Lybrary"
"Autocad/ObjecDBX Commom 17.0 type Libray"

E pronto!!

As partes importantes da classe:
a sub "New" que inicializa qualquer coisa que precisamos ao carregar a dll que será gerada e a linha _ antes da Sub que contem o programa em si

De resto, é algumas adaptações do código VBA para VB.NET, por exemplo:
o tipo "Variant" irá ser o tipo "Object", o legal é que o processo do "copiar/colar" já az essa transformação!!!

No VBA, usamos o Thisdrawing, que no VB não tem, mas aí simulamos ele, como no código acima

E claro, precisamos dos tipos dos objetos do cad ("AcadLayer", "AcadLine", por exemplo) aí fiz outra gambiarra usando o "AcadLib" que aparece no código, veja como criei e usei ele...
Interessante, não?

Compile o código e ele irá gerar o arquivo "teste.dll" na pasta /bin/release ( se você não mudou isso)

Carregue no cad com o comando NETLOAD e na linha de comando chame o novo comando criado: "desenhalinha"
Chique, né?
mais aqui e aqui

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!!!