Uma simples macro que exemplifica como o excel poderia criar layers no autocad!!
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...
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...
Muito bom seu blog Neyton.
ResponderExcluirBem organizado, eu to um pouco sem tempo para fazer o meu (http://civil3dbrazil.blogspot.com/) mas tudo bem.
Só uma coisinha, sobre indicação das estacas, em vez de fazer as expressoes, é só ultilizar a fomatação (Index Format) desde que o index do seu alinhamento esteja para 20m.
Abração
obrigado!!!
ResponderExcluirah, se vc se refere as labels das sections... veja bem a figura onde mostro a label por expressions e por station index...
ah sim... no 2009 funciona perfeitamente como deveria, mas no 2008 não, hehehe
ResponderExcluiro tutorial foi feito em cima do 2008
2007 nao lembro, mas creio que tenha o mesmo defeito
Neyton a macro esta dando erro na seguinte linha:
ResponderExcluir'3 lay2 66
Sub Teste() (aqui)
If getacaddoc() Then
sera q é pq estou usando o civil 2010?
muito provavel que sim
ResponderExcluiro civil 3d 2010 é a versao 18 do autocad
corrija aa linha onde esta indicado no codigo para cada versao
era isso mesmo, deu certo agora!
ResponderExcluirvalew...e parabens pelo blog.
neyton seu blog edez estou indicando para muitas pessoas, é o siguinte o codigo do gera uma msbox dizendo ERRO!!! e nao cria as layer poxa, socorro!!!! como fço para dar certo!!!!
ResponderExcluireste codigo so ger uma msgbox descrevendo ERRO!!!
ResponderExcluirNeyton essa macro funciona para autocad 2012?
ResponderExcluirE outra pergunta é possivel definir além da cor o tipo de linha e espessura?
Neyton,
ResponderExcluirCom faço para carregar uma linetype enquanto crio um layer via vba?
Porque vc não usa o codigo de erro 429 e cada erro incrementa ate chegar a versão do cad correta e se passar digamos de 50 manda abrir o cad.
ResponderExcluirEx.
'insera um modulo cole
' retire o form1 ou faça uma chamada call main
Option Explicit
Public cad As Object
Public doc As Object
Public corner1(0 To 2) As Double, corner2(0 To 2) As Double
Dim circo As Object
Const acWORLD = 0
Const acUCS = 1
Const pi = 3.14159265358979
Sub Main()
On Error GoTo ERRO2
Dim raio
Dim returnp(0 To 2) As Double
Dim retur As Variant
Dim sysVarName As String
Dim sysVarData As Variant
Dim intData As Integer, chat
Dim varia() As Double
Dim varia2() As Double
Dim texto, num
num = 10
Set cad = GetObject(, "Autocad.Application." & num)
Set doc = cad.ActiveDocument
doc.Activate
'AA = doc.ActiveLayer.Name
Dim mode As Integer
Dim Inter, Ext, Compri, NumDente, Incli, Tipo, Larg
Dim modulo
sysVarName = "UCSICON"
intData = 3
sysVarData = intData
Call doc.SetVariable(sysVarName, sysVarData)
Dim poli As Variant
Dim passo, topo
Dim poli2(0 To 0) As Object
Dim poli3(0 To 0) As Object
Dim altura As Double
Dim ChaLarg, ChaAlt
Dim chave As String
ReDim varia(0 To 2) As Double
Dim iincli
Dim cabeça As Double, pe As Double
doc.Utility.Prompt "Rotina para Geração de Rosca para AutoCad " & vbCrLf
doc.Utility.Prompt "Autor: Ricardo doricid@gmail.com" & vbCrLf
retur = doc.Utility.GetPoint(, "Indique Ponto Central para Engrenagem : ")
'inter = modulo * ((numdente / Cos(incli)) - 2.333)
Dim f As Double
Dim k As Double
f = 1.1666 * modulo
k = modulo
altura = modulo * 2.1666
'erro na altura calculo do pe e da cabeça
'Stop
ERRO2:
If solido Is Nothing Then
Else
solido.Visible = True: doc.Utility.Prompt "Modulo = " & modulo & vbCrLf
corner2(0) = returnp(0) + Ext + 5: corner2(1) = returnp(1): corner2(2) = 0
texto = texto & "Modulo = " & modulo & vbCrLf
texto = texto & "Diametro Externo = " & Int(Ext * 200) / 100 & vbCrLf
texto = texto & "Diametro Interno = " & Inter * 2 & vbCrLf
texto = texto & "Diametro Primitivo = " & modulo * NumDente & vbCrLf
If Val(iincli) <> 0 Then
If iincli > 0 Then
texto = texto & "Inclinação Direita= " & iincli & vbCrLf
Else
texto = texto & "Inclinação Esquerda= " & iincli & vbCrLf
End If
End If
texto = texto & "Numero de Dentes = " & NumDente & vbCrLf
texto = texto & "Espessura da Engrenagem = " & Compri & vbCrLf
doc.modelspace.AddMText corner2, 300, texto
End If
Dim e
If Err = 429 Then
If num > 30 Then End
num = num + 1: Resume
End If
End
Resume
End Sub