Assembly Surface Areas & an iLogic Hack

@ClintBrown3D Autodesk Inventor 03.png

Back in 2015, I wrote a blog post detailing some best practice around calculating assembly surface areas for paint or coatings, sadly this post has disappeared from the interwebs, but I did include a reference to it in my AU London class “Need for Speed: 102 Productivity Hacks for Inventor”

The Area iProperty of an Inventor assembly, is a sum of all of the surface areas, of all of the parts in this assembly. This means that mating faces and internal faces are included in the surface area calculation, making it less than ideal for use when looking at paint or coatings.

Below is a copy of my slide from AU London 2018, showing a side by side example of a normal assembly and a Shrinkwrap.

@ClintBrown3D Autodesk Inventor Assembly Surface area ilogic Click me for higher res version

With this in mind you can easily create a Shrinkwrap Substitute of your assembly (patching holes as required). From here you can look at the iProperties and the surface area will be accurate (for paint or coatings).

@ClintBrown3D Autodesk Inventor 12

What about some iLogic?

I have written a pretty epic iLogic routine to get this information. In the animation below, you can see an assembly file with no mates, the surface area is the same as the normal assembly. When the mates are re-applied, the surface area is reduced, as the mating faces are not part of the surface area calculation.

@ClintBrown3D - iLogic Paint area Autodesk Inventor Click me for higher res version

The iLogic code does the following:

  • Sets the assembly LOD to “Master”.
  • Creates a temporary Shrinkwrap LOD.
  • Deletes the temporary LOD.
  • Extracts the Area info from the temporary Shrinkwrap part.
  • Writes the Area values to custom iProperties.
  • Deletes the temporary Shrinkwrap part.
  • Fires up a message box, telling the user that the job is complete.

The iLogic code is set to not patch any holes in the shrinkwrap geometry, but I have included details for patching holes (commented in the code).

If you are looking for the surface area of hollow framework, my suggestion is to set “HolePatcher” to 88322, which should fill all of the voids and give you a more accurate answer.

'Set Hole Patching
	HolePatcher = 88321  '(88323 = Range) (88322 = All) (88321 = None) ***********************************************************************************************************
	MinimumPerimeter = 0.1
	MaximumPerimeter = 5

Here is the full iLogic code:

'iLogic code by @ClintBrown3D - UNOFFICIAL INVENTOR BLOG
'Originally posted at:

Dim oDoc As AssemblyDocument
oDoc = ThisApplication.ActiveDocument
Dim oDef As AssemblyComponentDefinition
oDef = oDoc.ComponentDefinition

'Set the LOD to Master"
	Dim doc As AssemblyDocument = ThisDoc.Document
	Dim oLOD As LevelOfDetailRepresentation
	Dim oAsmCompDef As ComponentDefinition
	oAsmCompDef = doc.ComponentDefinition
	oLOD = oAsmCompDef.RepresentationsManager.LevelOfDetailRepresentations.Item("Master")
	MsgBox("Could Not Set LOD")
End Try

' Create a new part document that will be the shrinkwrap substitute
	Dim oPartDoc As PartDocument
	oPartDoc = ThisApplication.Documents.Add(kPartDocumentObject, , False)

	Dim oPartDef As PartComponentDefinition
	oPartDef = oPartDoc.ComponentDefinition

	Dim oDerivedAssemblyDef As DerivedAssemblyDefinition
	oDerivedAssemblyDef = oPartDef.ReferenceComponents.DerivedAssemblyComponents.CreateDefinition(oDoc.FullDocumentName)

' Set various shrinkwrap related options
	oDerivedAssemblyDef.DeriveStyle = 80642 '"kDeriveAsSingleBodyNoSeams"
	oDerivedAssemblyDef.IncludeAllTopLevelWorkFeatures = 27137 '"kDerivedIncludeAll"
	oDerivedAssemblyDef.IncludeAllTopLevelSketches = 27137 '"kDerivedIncludeAll"
	oDerivedAssemblyDef.IncludeAllTopLeveliMateDefinitions = 27138'"kDerivedExcludeAll"
	oDerivedAssemblyDef.IncludeAllTopLevelParameters = 27138'"kDerivedExcludeAll"
	oDerivedAssemblyDef.ReducedMemoryMode = True

'Set Hole Patching
	HolePatcher = 88321  '(88323 = Range) (88322 = All) (88321 = None) ***********************************************************************************************************
	MinimumPerimeter = 0.1
	MaximumPerimeter = 5
	Call oDerivedAssemblyDef.SetHolePatchingOptions(HolePatcher, MinimumPerimeter, MaximumPerimeter)

' Name the TEMP part
	Dim strSubstituteFileName As String
	oTime = Now.ToFileTime' .ToShortTimeString
	strSubstituteFileName = "C:\Temp\DeleteMe" & oTime & ".ipt"

Call oDerivedAssemblyDef.SetRemoveByVisibilityOptions(88579, 25)'(kDerivedRemovePartsAndFaces, 25)

' Create the shrinkwrap component
	Dim oDerivedAssembly As DerivedAssemblyComponent
	oDerivedAssembly = oPartDef.ReferenceComponents.DerivedAssemblyComponents.Add(oDerivedAssemblyDef)

	' Save the TEMP part
	ThisApplication.SilentOperation = True 
	Call oPartDoc.SaveAs(strSubstituteFileName, True)
	ThisApplication.SilentOperation = True

' Create a substitute level of detail using the shrinkwrap part.
	Dim oSubstituteLOD As LevelOfDetailRepresentation
	oSubstituteLOD = oDef.RepresentationsManager.LevelOfDetailRepresentations.AddSubstitute(strSubstituteFileName)
	oSubstituteLOD.Name = "@ClintBrown3D"

'Set LOD back to Master
	Dim doc1 As AssemblyDocument = ThisDoc.Document
	Dim oLOD1 As LevelOfDetailRepresentation
	Dim oAsmCompDef1 As ComponentDefinition
	oAsmCompDef1 = doc1.ComponentDefinition
	oLOD1 = oAsmCompDef1.RepresentationsManager.LevelOfDetailRepresentations.Item("Master")

'Get Vaules from the temporary file
	ThisApplication.SilentOperation = False
	Dim oModel As PartDocument
	aFilePath = strSubstituteFileName
	oModel = ThisApplication.Documents.Open(aFilePath, False)
	oArea = oModel.ComponentDefinition.MassProperties.Area

'Write the temporary value to iProperties
	iProperties.Value("Custom", "PaintAREA cm") = oArea & " cm^2"
	iProperties.Value("Custom", "PaintAREA mm") = (oArea * 100) & " mm^2"
	iProperties.Value("Custom", "Assembly Area") = iProperties.Area

'Delete Temp LOD

 'Delete Temporary shrinkwrap file
	If System.IO.File.Exists(strSubstituteFileName) Then
End If
	MsgBox("Could Not Delete Temp File")
End Try

MessageBox.Show("Success!" & vbNewLine & vbNewLine &"Paint Area = " & iProperties.Value("Custom", "PaintAREA cm")  & vbNewLine & vbNewLine & "This has been written to PaintArea under Custom iProperties", "@ClintBrown3D")

This version of the code was briefly tested with Inventor 2020 & 2019.

Please note that I cannot offer any additional support, this blog post is offered as-is, and is aimed at the more advanced user.

As always, please test all iLogic code extensively on non-production files. Do not use any code in a production environment until YOU have thoroughly tested it and have verified that it works as expected. Always back up any data before running any experimental code. You are ultimately responsible for any iLogic code that you run, so make sure you test it thoroughly!

As this code could have an impact on costings within your business, please ensure that you are 100% happy with the output of the code, and that you have understood the impact of the different hole capping options etc. Make sure you run some tests on known components. This site takes absolutely no responsibility for how you use this code in production (see disclaimer).