PDA

View Full Version : Inserindo DWG´s como Blocos - VBA



leo_munters
2007-04-11, 09:29 PM
Desculpem mas sou eu de novo
eu sei que pode lhe parecer meio tola, mas estou começando neste negócio de VBA

preciso inserir um desenho, digamos formaA4.dwg em um outro desenho como bloco, usando VBA.

tentei fazer o seguinte código

' Define the block
Dim blockObj As AcadBlock
Dim insertionPnt(0 To 2) As Double
Dim pathform As String
pathform = "C:/eletrico/forma4.dwg"
insertionPnt(0) = 0
insertionPnt(1) = 0
insertionPnt(2) = 0
Set blockObj = ThisDrawing.Blocks.Add(insertionPnt, pathform)

mas tenho um erro na última linha

no help do Autocad não achei um exemplo inserindo um arquivo tipo DWG como desenho.

voces podem me ajudar nisto?

Filipe Francisco
2007-04-12, 11:33 PM
Uma maneira mais simples




Sub TESTE()

ThisDrawing.SendCommand "_-Insert" & vbCr & "C:\1.dwg" & vbCr
End Sub



Espero ter ajudado
Filipe

Rui Pestana
2007-05-29, 09:21 AM
Caro leo_munters o erro está em que você está a acrescentar um bloco, visto como definição, na colecção de blocos de um desenho.
Para entender melhor o que estou a dizer abra um desenho e execute o comando ".insert". Aparece-lhe uma caixa de diálogo e no canto superior esquerdo tem uma caixa de texto com uma seta para baixo (ComboBox) os itens dessa lista são a colecção de blocos do desenho. isto é são os blocos que se podem inserir como "BLOCK REFERENCE". Experimente a inserir um bloco no desenho e execute o comando ".List" selecionando esse bloco. Vai reparar que o objecto é um ""BLOCK REFERENCE" e não um "BLOCK".

Isto tudo para dizer que: para inserir um "bloco" deve instanciar-se um AcadBlockReference e não um AcadBlock. Veja o seu exemplo alterado:

' Define the blockreference
Dim blockRef AcadBlockreference
Dim insertionPnt(0 To 2) As Double
Dim pathform As String
pathform = "C:/eletrico/forma4.dwg"
insertionPnt(0) = 0
insertionPnt(1) = 0
insertionPnt(2) = 0
Set blockObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, pathform,1,1,1,0)
'end of code

Notas:
1. Se o Bloco já existir no desenho basta inserir o seu nome, não é necessário o caminho completo.
2. Os Valores 1,1,1,0 dizem respeito a: escala em X, Y, Z e rotação por esta ordem.

3. Procure "InsertBlock" na ajuda VB do AutoCAD.

Cumprimentos,

Rui Pestana.

PS. Desculpe-me o Filipe pois obviamente o seu método também funciona.

Filipe Francisco
2007-05-29, 10:31 AM
PS. Desculpe-me o Filipe pois obviamente o seu método também funciona.
Caro Rui,

Não tem qualquer tipo de problema, fizeste muito bem em responder e ajudar a responder de uma forma melhor e mais elaborada, estamos todos aqui para aprender e partilhar (até eu estou aqui para aprender). existem sempre vários métodos e resoluções das questões... O importante é participar e ajudar...

Um Abraço

marcio.cartacho
2007-06-18, 03:52 PM
Caro leo_munters o erro está em que você está a acrescentar um bloco, visto como definição, na colecção de blocos de um desenho.
Para entender melhor o que estou a dizer abra um desenho e execute o comando ".insert". Aparece-lhe uma caixa de diálogo e no canto superior esquerdo tem uma caixa de texto com uma seta para baixo (ComboBox) os itens dessa lista são a colecção de blocos do desenho. isto é são os blocos que se podem inserir como "BLOCK REFERENCE". Experimente a inserir um bloco no desenho e execute o comando ".List" selecionando esse bloco. Vai reparar que o objecto é um ""BLOCK REFERENCE" e não um "BLOCK".

Isto tudo para dizer que: para inserir um "bloco" deve instanciar-se um AcadBlockReference e não um AcadBlock. Veja o seu exemplo alterado:

' Define the blockreference
Dim blockRef AcadBlockreference
Dim insertionPnt(0 To 2) As Double
Dim pathform As String
pathform = "C:/eletrico/forma4.dwg"
insertionPnt(0) = 0
insertionPnt(1) = 0
insertionPnt(2) = 0
Set blockObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, pathform,1,1,1,0)
'end of code

Notas:
1. Se o Bloco já existir no desenho basta inserir o seu nome, não é necessário o caminho completo.
2. Os Valores 1,1,1,0 dizem respeito a: escala em X, Y, Z e rotação por esta ordem.

3. Procure "InsertBlock" na ajuda VB do AutoCAD.

Cumprimentos,

Rui Pestana.

PS. Desculpe-me o Filipe pois obviamente o seu método também funciona.
Bom dia, Rui Pestana!

Comecei a programar no AutoCad recentemente. por acaso, encontrei este forum em uma de minhas consultas na Internet. estou tendo bastante dificuldades para inserir um bloco com atributos pelo VBA. vi e testei os exemplos acima comentados no forum.

com este exemplo:

path_rating = "W:/matrizes/RATING/RT_K_MM.DWG"

ThisDrawing.SendCommand "_-insert" + vbCr + path_rating + vbCr + "493.93030644,276.04006590,0" + vbCr + "1" + vbCr + "1" + vbCr + "0" + vbCr + a + vbCr + b + vbCr + c + vbCr + d + vbCr + e + vbCr + f + vbCr + g + vbCr + h + vbCr + i + vbCr + j + vbCr + k + vbCr + l + vbCr + m + vbCr + n + vbCr + o + vbCr + p + vbCr

até consegui obter o resultado mas as vezes o preenchimento dos campos do atributo não se faz corretamente. as variaveis de A até P são do tipo string.

achei que da forma que você exemplificou eu pudesse atingir o resultado satisfatório mas quando compilo gera uma menssagem de erro: Key not found na ultima linha do código

Dim blockref As AcadBlockReference
Dim insertionPnt(0 To 2) As Double
Dim pathteste As String
pathteste = "W:/matrizes/RATING/RT_K_IN.DWG"
insertionPnt(0) = 0
insertionPnt(1) = 0
insertionPnt(2) = 0
Set blockref = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, pathteste, 1, 1, 1, 0)

voce poderia me ajudar?

agradeço a atenção desde já.

Obrigado

Rui Pestana
2007-06-18, 04:09 PM
Você tem o caminho com os separadores ao contrário.
onde está:
pathteste = "W:/matrizes/RATING/RT_K_IN.DWG"
escreva;
pathteste = "W:\matrizes\RATING\RT_K_IN.DWG"

Use "\" e não "/".

Rui Pestana

marcio.cartacho
2007-06-18, 04:29 PM
Rui Pestana, muito obrigado pelo auxilio.

pretendo participar com frequencia deste forum e tentar ajudar o restante dos participantes no que for possivel.

valeu...

Rui Pestana
2007-06-18, 06:58 PM
De nada. Podes contar sempre comigo.

marcio.cartacho
2007-06-21, 01:34 PM
Olá Rui!

este código abaixo serve para inserir um bloco, no caso um formato A2. o que acontece é que algums arquivos que eu tento incluir como bloco seguindo esta estrutura me gera uma mensagem de erro na ultima linha "FILE ERROR" mas é apenas com algums arquivos, me certifiquei que o arquivo estivesse no caminho especificado e fiz o teste inserindo atraves do thisDrawing.sendcommand funcionou perfeitamente, poderia me ajudar?

Private Sub CommandButton4_Click()
Dim blockref As AcadBlockReference
Dim insertionPnt(0 To 2) As Double
Dim pathteste As Variant
pathteste = "*W:\matrizes\LINK TEAMWORK & AUTOCAD\CARIMBOS_LINK_AUTOCAD_TEAMWORK\PORTUGUES\INCHES\GE MOTORS\GEMA2_P_INCHES.dwg"
insertionPnt(0) = 0
insertionPnt(1) = 0
insertionPnt(2) = 0
Set blockref = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, pathteste, 1, 1, 1, 0)
End Sub

Rui Pestana
2007-06-21, 02:57 PM
Olá Marcio,

parece-me que a linha de código:

pathteste = "*W:\matrizes\LINK TEAMWORK & AUTOCAD\CARIMBOS_LINK_AUTOCAD_TEAMWORK\PORTUGUES\INCHES\GE MOTORS\GEMA2_P_INCHES.dwg"

tem um asterisco (*) a mais logo antes do W.

Será disso?

marcio.cartacho
2007-06-21, 03:37 PM
Olá Marcio,

parece-me que a linha de código:

pathteste = "*W:\matrizes\LINK TEAMWORK & AUTOCAD\CARIMBOS_LINK_AUTOCAD_TEAMWORK\PORTUGUES\INCHES\GE MOTORS\GEMA2_P_INCHES.dwg"

tem um asterisco (*) a mais logo antes do W.

Será disso?

Boa Tarde, Rui Pestana!

Cara, eu costumo usar este asterisco(*) quando vou inserir um bloco explodido "explode", tem funcionado. no caso destes arquivos que não funcionam se eu remover o asterisco(*) muda a mensagem de erro "SELF REFERENCE" na mesma linha do código "Ultima"...
acho que não é o asterisco..., estou fazendo algums testes mas ainda num cheguei em uma conclusão... satisfatória... se puder continuar me ajudando agradeço mesmo, caso eu encontre algo tb volto a lhe mostrar o resultado.

obrigado até o momento.

marcio.cartacho
2007-09-27, 06:58 PM
pessoal, estou tendo problemas em utilizar o object.move point1, point2,
vejam o código abaixo:

Public Sub Search_Object_ModelSpace()
Dim ObjectAcadBlocRef As AcadEntity
Dim varpoint1(0 To 2), varpoint2(0 To 2)
varpoint1(0) = 938.3843
varpoint1(1) = 2719.5305
varpoint1(2) = 0#
varpoint2(0) = 1445.7342
varpoint2(1) = 2719.5305
varpoint2(2) = 0#
Set ObjectAcadBlocRef = FindObjAcadBlockRef("AcDbBlockReference", "IEC_P70")

ObjectAcadBlocRef.Move varpoint1, varpoint2 '<- o erro esta localizado aqui.

End Sub


Function FindObjAcadBlockRef(ByRef Object_Name As String, ByRef Value_Object As String) As AcadEntity
Dim Num As Integer
Num = -1
Achou = False
For i = 0 To ThisDrawing.ModelSpace.Count - 1
If ThisDrawing.ModelSpace.Item(i).ObjectName = Object_Name Then
If UCase(ThisDrawing.ModelSpace.Item(i).Name) = Value_Object Then
Num = i
Set FindObjAcadBlockRef = ThisDrawing.ModelSpace.Item(i)
Exit For
End If 'Fecha .Name
End If 'Fecha ObjectName = "AcDbText"
Next i
End Function

sera que alguem pode me ajudar? o erro esta quando eu informo as Varpoint....

Rui Pestana
2007-09-28, 08:21 AM
Caro Marcio,

substitua a linha:

Dim varpoint1(0 To 2), varpoint2(0 To 2)

por:

Dim varpoint1(0 To 2) As Double
Dim varpoint2(0 To 2) As Double

Do modo que escreveu as variáveis estavam declaradas como variantes (por omissão). Os métodos da API do AutoCAD muitas vezes rejeitam argumentos que não sejam explicitamente declarados como deviam, mesmo que o seu conteúdo seja correcto. Quando isto acontecer verifique o tipo de argumento necessário e declare-os exactamente como descrito na ajuda.

Já agora permita-me uma sugestão de alteração mais alargada:

Option Explicit

Public Sub Search_Object_ModelSpace()
Dim ObjectAcadBlocRef As AcadEntity
Dim varpoint1(0 To 2) As Double
Dim varpoint2(0 To 2) As Double
varpoint1(0) = 938.3843
varpoint1(1) = 2719.5305
varpoint1(2) = 0#
varpoint2(0) = 1445.7342
varpoint2(1) = 2719.5305
varpoint2(2) = 0#
Dim NomeBloco As String
NomeBloco = "LEGA3-L"
Set ObjectAcadBlocRef = FindObjAcadBlockRef(NomeBloco) ' "IEC_P70")
'verifica se o bloco foi encontrado
If Not ObjectAcadBlocRef Is Nothing Then
ObjectAcadBlocRef.Move varpoint1, varpoint2
Else
MsgBox "Bloco " & NomeBloco & "não encontrado"
End If


End Sub


Function FindObjAcadBlockRef(ByRef BlockName As String) As AcadEntity
Dim i As Integer
Dim oEntity As AcadEntity
Dim MS As AcadModelSpace
Set MS = ThisDrawing.ModelSpace
For i = 0 To MS.Count - 1
Set oEntity = MS.Item(i)
If TypeOf oEntity Is AcadBlockReference Then
If UCase(oEntity.Name) = BlockName Then
Set FindObjAcadBlockRef = oEntity
Exit Function
End If
End If
Next i

Set FindObjAcadBlockRef = Nothing

End Function


Cumprimentos,

marcio.cartacho
2008-01-10, 03:31 PM
Boa Tarde pessoal!

estou tentando inserir um dwg como bloco, mas com a opção DRAGMODE para que a sombra do bloco acompanhe o cursor do mouse, quando eu deixo o dragmode = 2 e tento inserir um dwg como bloco manualmente o processo funciona, mas se eu utilizar uma rotina VBA para inserir ai naum consigo visualizar a sombra do objeto amarrado ao cursor...

meu códio:
Sub Iserindo_arranjos_acess()
Dim Insertpoint As Variant
Select Case TXTACESSORIOS.Value
Case ""
Exit Sub
Case Else
On Error Resume Next
Form_Arranjos.Hide
ThisDrawing.SetVariable "dragmode", 2
Insertpoint = ThisDrawing.Utility.GetPoint(, "Click em um Ponto para Inserir a Caixa dos Acessório: ")
If Err Then Exit Sub
SearchDiagramas.Busca_DimStyle ("DIM-MM")
SearchDiagramas.Busca_DimStyle ("DIM-IN")
Select Case ValEstilo
Case "DIM-MM"
VarScale = VarScale * 25.4
End Select
Set ObjArr = ThisDrawing.ModelSpace.InsertBlock _
(Insertpoint, Directory_Path_acess + TXTACESSORIOS.Value, VarScale, VarScale, VarScale, 0)
ZoomExtents
End Select
End Sub

sera que alguem pode me ajudar?
Obrigado.

ricardo_casarino
2009-04-10, 08:26 PM
Será que alguém tem a resposta??

Preciso inserir blocos de uma origem conhecida no sistema, mas o nome do bloco será alterado de acordo com a especificação de um LISTBOX.
Sei que existe uma maneira de alterar o endereço vinculado ao PATHFORM, mas não faço a menor idéia de como fazer.

Obrigado

danterosado
2010-09-24, 06:38 PM
Caros,

Como definir o rowsource em um combobox utilizando o AutoCAD?

Atenciosamente,
Dante Rosado