You are on page 1of 14

Sub Exporte_DXF()

Dim oDoc As Inventor.AssemblyDocument


Set oDoc = ThisApplication.ActiveDocument

Dim oCompDef As Inventor.ComponentDefinition


Set oCompDef = oDoc.ComponentDefinition

Dim sMsg As String


Dim iLeafNodes As Long
Dim iSubAssemblies As Long
Dim modelo As PartComponentDefinition
Dim documento As PartDocument
Dim nome_ficheiro As String
Dim nome_pasta As String
Dim nome_dxf As String
Dim oDataIO As DataIO
Dim forma As PartFeature
Dim furo As HoleFeature
Dim faces As Face
Dim larg_circle As Double
Dim alt_circle As Double
Dim x_centro As Double
Dim y_centro As Double

Dim perfil As Sketch


Dim perfil_final As Sketch
Dim perfil_final_texto As Sketch

Dim aresta As Edge


Dim raio_circulo As Double

Dim x1 As Double
Dim x2 As Double
Dim y1 As Double
Dim y2 As Double
Dim oTG As TransientGeometry
Set oTG = ThisApplication.TransientGeometry

Dim planificado As FlatPattern


Dim chapa_planificada As SheetMetalComponentDefinition

Dim Propriedades As PropertySet


Dim Propriedade As Property
Dim odef As SheetMetalComponentDefinition
Dim quantidade As Integer
Dim quant_pecas As Integer

Dim ponto1 As Point2d


Dim ponto2 As Point2d

Dim oPaths As ObjectCollection


Dim oProfile As Profile
Dim oExtrudeDef As ExtrudeDefinition
Dim oExtrude As ExtrudeFeature
Dim tipo_material As String
Dim espessura_chapa As String
Dim espessura_chapa_final As Double

nome_pasta = "C:\DXF\" ' Nome da pasta a criar. Aqui podem definir a pasta que
vocês quiserem. Depois digam alguma coisa se precisarem de ajuda para definir outra
pasta.

Dim oCompOcc As ComponentOccurrence

For Each oCompOcc In oCompDef.Occurrences

If oCompOcc.SubOccurrences.Count = 0 Then

Set modelo = oCompOcc.Definition

If modelo.Type = "150995200" Then

Call quantidade_pecas(modelo, oCompOcc, oDoc, quant_pecas,


tipo_material, espessura_chapa)

End If

If modelo.Type = "150995200" Then

'**************************** Suprimir Furos lisos


*******************

For i = 1 To modelo.Features.Count

Set forma = modelo.Features.Item(i)

If forma.Type = 83912192 Then

Set furo = forma

If furo.Tapped = False Then

furo.Suppressed = True

End If

End If

Next i

'**************************** Criar marcas de centro nos furos


*******************
Set chapa_planificada = modelo

espessura_chapa_final = Round(chapa_planificada.Thickness.Value
* 10, 1)

Call chapa_planificada.Unfold

Set planificado = chapa_planificada.FlatPattern

Set faces = planificado.TopFace

Set perfil = planificado.Sketches.Add(faces, True)

min_point_y = 10000

min_point_x = 10000

Set perfil_final = planificado.Sketches.Add(faces, False)


Set perfil_final_texto = planificado.Sketches.Add(faces, False)

'Call oDoc.Update2

quantidade = perfil.SketchEntities.Count

For j = 1 To perfil.SketchEntities.Count

Set entidade = perfil.SketchEntities.Item(j)

If entidade.Type = kSketchCircleObject Then

x_centro = entidade.RangeBox.MinPoint.X +
((entidade.RangeBox.MaxPoint.X - entidade.RangeBox.MinPoint.X) / 2)
y_centro = entidade.RangeBox.MinPoint.Y +
((entidade.RangeBox.MaxPoint.Y - entidade.RangeBox.MinPoint.Y) / 2)
raio_circulo = (entidade.RangeBox.MaxPoint.X -
entidade.RangeBox.MinPoint.X) / 2

x1 = x_centro - raio_circulo
x2 = x_centro + raio_circulo
y1 = y_centro + raio_circulo
y2 = y_centro - raio_circulo

Set Linha1 =
perfil_final.SketchLines.AddByTwoPoints(oTG.CreatePoint2d(x1, y_centro),
oTG.CreatePoint2d(x2, y_centro))
Set Linha2 =
perfil_final.SketchLines.AddByTwoPoints(oTG.CreatePoint2d(x_centro, y2),
oTG.CreatePoint2d(x_centro, y1))

End If

If entidade.Type = kSketchLineObject Then


x1 = Round(entidade.RangeBox.MinPoint.X, 3)
x2 = Round(entidade.RangeBox.MaxPoint.X, 3)
y1 = Round(entidade.RangeBox.MinPoint.Y, 3)
y2 = Round(entidade.RangeBox.MaxPoint.Y, 3)

If min_point_x > x1 Then

min_point_x = x1
End If

If min_point_x > x2 Then

min_point_x = x2

End If

If min_point_y > y1 Then

min_point_y = y1

End If

If min_point_y > y2 Then

min_point_y = y2

End If

End If

Next j

Call perfil.Delete

Set ponto1 =
ThisApplication.TransientGeometry.CreatePoint2d(min_point_x, min_point_y - 1)
Set ponto2 =
ThisApplication.TransientGeometry.CreatePoint2d(min_point_x + 100, min_point_y - 2)

Set ponto3 =
ThisApplication.TransientGeometry.CreatePoint2d(min_point_x, min_point_y - 2)
Set ponto4 =
ThisApplication.TransientGeometry.CreatePoint2d(min_point_x + 100, min_point_y - 3)
Set ponto5 =
ThisApplication.TransientGeometry.CreatePoint2d(min_point_x, min_point_y - 3)
Set ponto6 =
ThisApplication.TransientGeometry.CreatePoint2d(min_point_x + 100, min_point_y - 4)

texto1 = "Quantidade de peças=" + Str(quant_pecas)


texto2 = "Material=" + tipo_material
texto3 = "Espessura=" + Str(espessura_chapa_final)

Set texto = perfil_final_texto.TextBoxes.AddByRectangle(ponto1,


ponto2, texto1)
Set texto1 =
perfil_final_texto.TextBoxes.AddByRectangle(ponto3, ponto4, texto2)
Set texto3 =
perfil_final_texto.TextBoxes.AddByRectangle(ponto5, ponto6, texto3)

'MsgBox texto1

Set oPaths =
ThisApplication.TransientObjects.CreateObjectCollection
oPaths.Add texto

Set oProfile = perfil_final_texto.Profiles.AddForSolid(False,


oPaths)

Set oExtrudeDef =
planificado.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile,
kJoinOperation)
Call oExtrudeDef.SetDistanceExtent(0.001,
kNegativeExtentDirection)

Set oExtrude =
planificado.Features.ExtrudeFeatures.Add(oExtrudeDef)

Set oPaths =
ThisApplication.TransientObjects.CreateObjectCollection
oPaths.Add texto1

Set oProfile = perfil_final_texto.Profiles.AddForSolid(False,


oPaths)

Set oExtrudeDef =
planificado.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile,
kJoinOperation)
Call oExtrudeDef.SetDistanceExtent(0.001,
kNegativeExtentDirection)

Set oExtrude2 =
planificado.Features.ExtrudeFeatures.Add(oExtrudeDef)
Set oPaths =
ThisApplication.TransientObjects.CreateObjectCollection
oPaths.Add texto3

Set oProfile = perfil_final_texto.Profiles.AddForSolid(False,


oPaths)

Set oExtrudeDef =
planificado.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile,
kJoinOperation)
Call oExtrudeDef.SetDistanceExtent(0.001,
kNegativeExtentDirection)

Set oExtrude3 =
planificado.Features.ExtrudeFeatures.Add(oExtrudeDef)

Call planificado.ExitEdit

'**************************** sumprir Furos roscados


*******************

For i = 1 To modelo.Features.Count

Set forma = modelo.Features.Item(i)

If forma.Type = 83912192 Then

Set furo = forma

If furo.Tapped = False Then

furo.Suppressed = False

End If

End If

Next i

For i = 1 To modelo.Features.Count
Set forma = modelo.Features.Item(i)

If forma.Type = 83912192 Then

Set furo = forma

If furo.Tapped = True Then

furo.Suppressed = True

End If

End If

Next i

'**************************** Criar DXF


*********************************

Set documento = oCompOcc.Definition.Document

'**************************** Adicionar Propriedades


*********************************

Set Propriedades = documento.PropertySets.Item("Inventor User


Defined Properties")
Set opropsets = documento.PropertySets

For Each opropsets In Propriedades

For Each Propriedade In Propriedades

If Propriedade.Name <> "Quantidade" Then

Call Propriedade.Delete

End If

Next
Next

nome_ficheiro = documento.FullFileName

nome_dxf = documento.DisplayName

Set oDataIO = modelo.DataIO


sOut = "FLAT PATTERN DXF?
AcadVersion=R12&OuterProfileLayer=Contorno&BendUpLayer=Cima&BendDownLayer=Baixo&Int
eriorProfilesLayer=Recortes&TangentLayer=Auxiliares&UnconsumedSketchesLayer=Marcas_
centro&SimplifySplines=True&SplineTolerance=0,1&InvisibleLayers=auxiliares;IV_ARC_C
ENTERS"

'Call planificado.Edit

Call planificado.ExitEdit

If Len(nome_dxf) > 4 Then

nome_dxf = Mid(nome_dxf, 1, Len(nome_dxf) - 4)

End If

nome_dxf = nome_pasta + nome_dxf + ".dxf"

Set odef = documento.ComponentDefinition

oDataIO.WriteDataToFile sOut, nome_dxf

'Call perfil_final.Delete

For i = 1 To modelo.Features.Count

Set forma = modelo.Features.Item(i)

If forma.Type = 83912192 Then

Set furo = forma

If furo.Tapped = True Then

furo.Suppressed = False

End If

End If

Next i

Call oExtrude.Delete
Call perfil_final.Delete
Call oExtrude2.Delete
Call oExtrude3.Delete

Call perfil_final_texto.Delete

odef.FlatPattern.ExitEdit
Call documento.Close

'**************************** Cálculos
*********************************

larg_chapa = odef.FlatPattern.Width * 10
comp_chapa = odef.FlatPattern.Length * 10

espessura_chapa = Round(odef.Thickness.Value * 10, 1)

densidade_chapa =
documento.PropertySets.Item(3).Item("density").Value

peso_materia_prima = Round(larg_chapa * comp_chapa *


espessura_chapa * densidade_chapa / 1000000, 3)

larg_chapa = Round(larg_chapa, 1)
comp_chapa = Round(comp_chapa, 1)

a1 = "Largura_Chapa"
b1 = "Comprimento_Chapa"
c1 = "Peso_Bruto"
d1 = "Espessura"
e1 = "Codigo"

If larg_chapa > comp_chapa Then


comp1 = comp_chapa
comp_chapa = larg_chapa
larg_chapa = comp1
End If

If espessura_chapa = 0.5 Then

codigo = "100"

End If
If espessura_chapa = 1 Then

codigo = "200"

End If

If espessura_chapa = 1.5 Then

codigo = "300"

End If
If espessura_chapa = 2 Then

codigo = "400"
End If

peso_materia = Str(peso_materia_prima) + " Kg"


Set Propriedade = Propriedades.Add(larg_chapa, a1)
Set Propriedade = Propriedades.Add(comp_chapa, b1)
Set Propriedade = Propriedades.Add(peso_materia, c1)
Set Propriedade = Propriedades.Add(espessura_chapa, d1)
Set Propriedade = Propriedades.Add(codigo, e1)

peso_chapa = Round(odef.MassProperties.Mass, 5)
peso_chapa = Round(peso_chapa, 3)
peso_chapa_peca = Str(peso_chapa) + " Kg"
e1 = "Peso_Peca"

Set Propriedade = Propriedades.Add(peso_chapa_peca, e1)

End If

iLeafNodes = iLeafNodes + 1
Else

iSubAssemblies = iSubAssemblies + 1

Call processAllSubOcc(oCompOcc, sMsg, iLeafNodes, iSubAssemblies) '


subassembly

End If
Next

End Sub

Private Sub processAllSubOcc(ByVal oCompOcc As ComponentOccurrence, _


ByRef sMsg As String, _
ByRef iLeafNodes As Long, _
ByRef iSubAssemblies As Long)

Dim oSubCompOcc As ComponentOccurrence


Dim modelo As PartComponentDefinition
Dim documento As PartDocument
Dim nome_ficheiro As String
Dim nome_pasta As String
Dim nome_dxf As String
Dim oDataIO As DataIO
Dim odef As SheetMetalComponentDefinition

nome_pasta = "C:\DXF\"

For Each oSubCompOcc In oCompOcc.SubOccurrences

If oSubCompOcc.SubOccurrences.Count = 0 Then

iLeafNodes = iLeafNodes + 1
Set modelo = oSubCompOcc.Definition
If modelo.Type = "150995200" Then

Set documento = oSubCompOcc.Definition.Document

nome_ficheiro = documento.FullFileName

nome_dxf = documento.DisplayName

Set oDataIO = modelo.DataIO

sOut = "FLAT PATTERN DXF?


AcadVersion=R12&OuterProfileLayer=Contorno&BendUpLayer=Cima&BendDownLayer=Baixo&Int
eriorProfilesLayer=Recortes&TangentLayer=Auxiliares&UnconsumedSketchesLayer=Marcas_
centro&SimplifySplines=True&SplineTolerance=0,1&InvisibleLayers=auxiliares;IV_ARC_C
ENTERS"

nome_dxf = Mid(nome_dxf, 1, Len(nome_dxf) - 4)

nome_dxf = nome_pasta + nome_dxf + ".dxf"

Set odef = documento.ComponentDefinition

oDataIO.WriteDataToFile sOut, nome_dxf

odef.FlatPattern.ExitEdit

Call documento.Close

End If

Else
sMsg = sMsg + oSubCompOcc.Name + vbCr
iSubAssemblies = iSubAssemblies + 1

Call processAllSubOcc(oSubCompOcc, sMsg, iLeafNodes, iSubAssemblies)

End If
Next
End Sub

Sub quantidade_pecas(modelo As PartComponentDefinition, componente As


ComponentOccurrence, montagem_total As AssemblyDocument, quant_pecas As Integer,
tipo_material As String, espessura_chapa As String)

Dim lista_pecas As BOM


Dim oBOMView As BOMView
Dim oRow As BOMRow
Dim oCompDef As ComponentDefinition

Dim part_number As String


Dim quantas As String

Dim Propriedades As PropertySet


Dim Propriedade As Property
Dim oPartNumProperty As Property
Dim quant As String
Dim documento As PartDocument
Dim opropsets As PropertySets
Dim oprop As Property
Dim material As MaterialAsset

quant = "Quantidade"

Set documento = componente.Definition.Document

Set opropsets = documento.PropertySets

For Each opropset In opropsets


For Each oprop In opropset

If oprop.Name = "Material" Then

tipo_material = oprop.Value

End If

If oprop.Name = "Part Number" Then

part_number = oprop.Value

End If

Next
Next

'tipo_material = documento.MaterialAssets.Type

'MsgBox documento.MaterialAssets.Count

'MsgBox tipo_material

'Set material = documento.MaterialAssets.Item(1)

'MsgBox material.Name
Set Propriedades = documento.PropertySets.Item("Inventor User Defined Properties")
Set opropsets = documento.PropertySets

For Each opropset In Propriedades

For Each Propriedade In Propriedades

If Propriedade.Name = "Quantidade" Then

Call Propriedade.Delete

End If

Next
Next

Set lista_pecas = montagem_total.ComponentDefinition.BOM

lista_pecas.PartsOnlyViewEnabled = True

If FirstLevelOnly Then
lista_pecas.StructuredViewFirstLevelOnly = True
Else
lista_pecas.StructuredViewFirstLevelOnly = False
End If

lista_pecas.StructuredViewEnabled = True

Set oBOMView = lista_pecas.BOMViews.Item("Parts Only")

For i = 1 To oBOMView.BOMRows.Count

Set oRow = oBOMView.BOMRows.Item(i)

Set oCompDef = oRow.ComponentDefinitions.Item(1)

Set documento = oCompDef.Document

Set opropsets = documento.PropertySets

For Each opropset In opropsets


For Each oprop In opropset

If oprop.Name = "Part Number" Then


If oprop.Value = part_number Then

quant_pecas = oRow.ItemQuantity

End If

End If
Next
Next

Next i

quantas = Str(quantidade)
Set Propriedade = Propriedades.Add(quantas, quant)

End Sub

You might also like