Announcements
Attention for Customers without Multi-Factor Authentication or Single Sign-On - OTP Verification rolls out April 2025. Read all about it here.

Create a SurfaceBody from an OrientedBox

DRoam
Mentor

Create a SurfaceBody from an OrientedBox

DRoam
Mentor
Mentor

I'm trying to figure out how display an oriented box as client graphics in a part, but I can't find a way to create a SurfaceBody object from an OrientedBox. I can create a SurfaceBody of a regular Box using "TransientBRep.CreateSolidBlock(box As Box)", but this method won't accept an OrientedBox.

 

Does anyone know how to do this?

 

Below is my code so far, everything seems to be in working order except for creating the SurfaceBody:

 

Dim app As Inventor.Application = ThisApplication

Dim tg As TransientGeometry = app.TransientGeometry

' Create skewed OrientedBox
Dim boxCorner As Point = tg.CreatePoint(1, 1, 1)

Dim boxDir1 As Vector = tg.CreateVector(1, 0, 1)
Dim boxDir2 As Vector = tg.CreateVector(0, 1, 0)
Dim boxDir3 As Vector = tg.CreateVector(1, 0, -1)

Dim oBox As OrientedBox = tg.CreateOrientedBox(boxCorner, boxDir1, boxDir2, boxDir3)

' Create a surface body of the oriented box.
Dim oBoxSurf As SurfaceBody 

' ====== THE LINE BELOW DOES NOT WORK ======
Try
	oBoxSurf = app.TransientBRep.CreateSolidBlock(oBox)
Catch ex As Exception
	MessageBox.Show("Could not create a surface body from the oriented box. Error message: " & vbCr & vbCr & ex.Message)
	Exit Sub
End Try

' Add oriented box to client graphics to display in part.
Dim partDoc As PartDocument = ThisDoc.Document

Dim cGraphics As ClientGraphics = Nothing
Try
	cGraphics = partDoc.ComponentDefinition.ClientGraphicsCollection.Add("TestColl")
Catch
	cGraphics = partDoc.ComponentDefinition.ClientGraphicsCollection.Item("TestColl")
End Try

Dim gNode As GraphicsNode = Nothing

Try
	gNode = cGraphics.AddNode(1)
Catch
	gNode = cGraphics.Item(1)
End Try

gNode.AddSurfaceGraphics(oBoxSurf)
0 Likes
Reply
650 Views
2 Replies
Replies (2)

JhoelForshav
Mentor
Mentor

Hi @DRoam 

Seems like there is no function to create a surfacebody from an oriented box.

I gave it a go to write this function and it seems to work 🙂

Sub Main
Dim app As Inventor.Application = ThisApplication

Dim tg As TransientGeometry = app.TransientGeometry

' Create skewed OrientedBox
Dim boxCorner As Point = tg.CreatePoint(1, 1, 1)

Dim boxDir1 As Vector = tg.CreateVector(1, 0, 1)
Dim boxDir2 As Vector = tg.CreateVector(0, 1, 0)
Dim boxDir3 As Vector = tg.CreateVector(1, 0, -1)

Dim oBox As OrientedBox = tg.CreateOrientedBox(boxCorner, boxDir1, boxDir2, boxDir3)

' Create a surface body of the oriented box.
Dim oBoxSurf As SurfaceBody 

Try
	oBoxSurf = SurfBodFromOrientedBox(oBox)
Catch ex As Exception
	MessageBox.Show("Could not create a surface body from the oriented box. Error message: " & vbCr & vbCr & ex.Message)
	Exit Sub
End Try


' Add oriented box to client graphics to display in part.
Dim partDoc As PartDocument = ThisDoc.Document

Dim cGraphics As ClientGraphics = Nothing
Try
	cGraphics = partDoc.ComponentDefinition.ClientGraphicsCollection.Add("TestColl")
Catch
	cGraphics = partDoc.ComponentDefinition.ClientGraphicsCollection.Item("TestColl")
End Try

Dim gNode As GraphicsNode = Nothing

Try
	gNode = cGraphics.AddNode(1)
Catch
	gNode = cGraphics.Item(1)
End Try

gNode.AddSurfaceGraphics(oBoxSurf)

End Sub

Function SurfBodFromOrientedBox(ByVal oBox As OrientedBox) As SurfaceBody
Dim oTG As TransientGeometry = ThisApplication.TransientGeometry
Dim oCorner As Point
Dim oV1, oV2, oV3 As Vector
oBox.GetOrientedBoxData(oCorner, oV1, oV2, oV3)

Dim tBRep As TransientBRep = ThisApplication.TransientBRep
Dim bodyDef As SurfaceBodyDefinition = tBRep.CreateSurfaceBodyDefinition

Dim lumpDef As LumpDefinition = bodyDef.LumpDefinitions.Add

Dim shellDef As FaceShellDefinition = lumpDef.FaceShellDefinitions.Add

Dim wireDef As WireDefinition = shellDef.WireDefinitions.Add

Dim opt As Point = oCorner.Copy
Dim v1 As VertexDefinition = bodyDef.VertexDefinitions.Add(opt)
opt.TranslateBy(oV1)
Dim v2 As VertexDefinition = bodyDef.VertexDefinitions.Add(opt)
opt.TranslateBy(oV2)
Dim v3 As VertexDefinition = bodyDef.VertexDefinitions.Add(opt)
opt = oCorner.Copy
opt.TranslateBy(oV2)
Dim v4 As VertexDefinition = bodyDef.VertexDefinitions.Add(opt)
opt = v1.Position.Copy
opt.TranslateBy(oV3)
Dim v5 As VertexDefinition = bodyDef.VertexDefinitions.Add(opt)
opt = v2.Position.Copy
opt.TranslateBy(oV3)
Dim v6 As VertexDefinition = bodyDef.VertexDefinitions.Add(opt)
opt = v3.Position.Copy
opt.TranslateBy(oV3)
Dim v7 As VertexDefinition = bodyDef.VertexDefinitions.Add(opt)
opt = v4.Position
opt.TranslateBy(oV3)
Dim v8 As VertexDefinition = bodyDef.VertexDefinitions.Add(opt)

v1v2 = bodyDef.EdgeDefinitions.Add(v1, v2, oTG.CreateLineSegment(v1.Position, v2.Position))
v2v3 = bodyDef.EdgeDefinitions.Add(v2, v3, oTG.CreateLineSegment(v2.Position, v3.Position))
v3v4 = bodyDef.EdgeDefinitions.Add(v3, v4, oTG.CreateLineSegment(v3.Position, v4.Position))
v4v1 = bodyDef.EdgeDefinitions.Add(v4, v1, oTG.CreateLineSegment(v4.Position, v1.Position))
v1v5 = bodyDef.EdgeDefinitions.Add(v1, v5, oTG.CreateLineSegment(v1.Position, v5.Position))
v5v6 = bodyDef.EdgeDefinitions.Add(v5, v6, oTG.CreateLineSegment(v5.Position, v6.Position))
v6v7= bodyDef.EdgeDefinitions.Add(v6, v7, oTG.CreateLineSegment(v6.Position, v7.Position))
v7v8 = bodyDef.EdgeDefinitions.Add(v7, v8, oTG.CreateLineSegment(v7.Position, v8.Position))
v8v5 = bodyDef.EdgeDefinitions.Add(v8, v5, oTG.CreateLineSegment(v8.Position, v5.Position))
v2v6 = bodyDef.EdgeDefinitions.Add(v2, v6, oTG.CreateLineSegment(v2.Position, v6.Position))
v3v7 = bodyDef.EdgeDefinitions.Add(v3, v7, oTG.CreateLineSegment(v3.Position, v7.Position))
v4v8 = bodyDef.EdgeDefinitions.Add(v4, v8, oTG.CreateLineSegment(v4.Position, v8.Position))


Dim negV3 As Vector = oV3.Copy
negV3.ScaleBy(-1)
Dim fs1 = shellDef.FaceDefinitions.Add(oTG.CreatePlane(v1.Position, negV3), False)
Dim fs1Loop As EdgeLoopDefinition = fs1.EdgeLoopDefinitions.Add
fs1Loop.EdgeUseDefinitions.Add(v1v2, False)
fs1Loop.EdgeUseDefinitions.Add(v2v3, False)
fs1Loop.EdgeUseDefinitions.Add(v3v4, False)
fs1Loop.EdgeUseDefinitions.Add(v4v1, False)



Dim fs2 = shellDef.FaceDefinitions.Add(oTG.CreatePlane(v5.Position, oV3), False)
Dim fs2Loop As EdgeLoopDefinition = fs2.EdgeLoopDefinitions.Add
fs2Loop.EdgeUseDefinitions.Add(v5v6, False)
fs2Loop.EdgeUseDefinitions.Add(v6v7, False)
fs2Loop.EdgeUseDefinitions.Add(v7v8, False)
fs2Loop.EdgeUseDefinitions.Add(v8v5, False)


Dim negV2 As Vector = oV2.Copy
negV2.ScaleBy(-1)
Dim fs3 = shellDef.FaceDefinitions.Add(oTG.CreatePlane(v1.Position, negV2), False)
Dim fs3Loop As EdgeLoopDefinition = fs3.EdgeLoopDefinitions.Add
fs3Loop.EdgeUseDefinitions.Add(v1v2, False)
fs3Loop.EdgeUseDefinitions.Add(v2v6, False)
fs3Loop.EdgeUseDefinitions.Add(v5v6, True)
fs3Loop.EdgeUseDefinitions.Add(v1v5, True)

Dim fs4 = shellDef.FaceDefinitions.Add(oTG.CreatePlane(v2.Position, oV1), False)
Dim fs4Loop As EdgeLoopDefinition = fs4.EdgeLoopDefinitions.Add
fs4Loop.EdgeUseDefinitions.Add(v2v3, False)
fs4Loop.EdgeUseDefinitions.Add(v3v7, False)
fs4Loop.EdgeUseDefinitions.Add(v6v7, True)
fs4Loop.EdgeUseDefinitions.Add(v2v6, True)

Dim fs5 = shellDef.FaceDefinitions.Add(oTG.CreatePlane(v3.Position, oV2), False)
Dim fs5Loop As EdgeLoopDefinition = fs5.EdgeLoopDefinitions.Add
fs5Loop.EdgeUseDefinitions.Add(v3v7, False)
fs5Loop.EdgeUseDefinitions.Add(v7v8, False)
fs5Loop.EdgeUseDefinitions.Add(v4v8, True)
fs5Loop.EdgeUseDefinitions.Add(v3v4, True)

Dim negV1 As Vector = oV1.Copy
negV1.ScaleBy(-1)
Dim fs6 = shellDef.FaceDefinitions.Add(oTG.CreatePlane(v1.Position, negV1), False)
Dim fs6Loop As EdgeLoopDefinition = fs6.EdgeLoopDefinitions.Add
fs6Loop.EdgeUseDefinitions.Add(v1v5, False)
fs6Loop.EdgeUseDefinitions.Add(v8v5, True)
fs6Loop.EdgeUseDefinitions.Add(v4v8, True)
fs6Loop.EdgeUseDefinitions.Add(v4v1, False)


Dim errors As NameValueMap = ThisApplication.TransientObjects.CreateNameValueMap
Dim body As SurfaceBody = bodyDef.CreateTransientSurfaceBody(errors)

Return body
End Function

BOX1.PNG