Public Sub IsCylindricalFaceInterior()
Dim oDoc As Document
Set oDoc = ThisApplication.ActiveDocument
If Not Typeof oDoc.SelectSet(1) Is Face Then
MsgBox "A face must be selected."
Exit Sub
End If
Dim oFace As Face
Set oFace = oDoc.SelectSet(1)
If Not oFace.SurfaceType = kCylinderSurface Then
MsgBox "A cylindrical face must be selected."
Exit Sub
End If
Dim oCylinder As Cylinder
Set oCylinder = oFace.Geometry
Dim params(1) As Double
params(0) = 0.5
params(1) = 0.5
' Get point on surface at param .5,.5
Dim points(2) As Double
Call oFace.Evaluator.GetPointAtParam(params, points)
' Create point object
Dim oPoint As point
Set oPoint = ThisApplication.TransientGeometry.CreatePoint(points(0), points(1), points(2))
' Get normal at this point
Dim normals(2) As Double
Call oFace.Evaluator.GetNormal(params, normals)
' Create normal vector object
Dim oNormal As Vector
Set oNormal = ThisApplication.TransientGeometry.CreateVector(normals(0), normals(1), normals(2))
' Scale vector by radius of the cylinder
oNormal.ScaleBy oCylinder.Radius
' Find the sampler point on the normal by adding the
' scaled normal vector to the point at .5,.5 param.
Dim oSamplePoint As point
Set oSamplePoint = oPoint
oSamplePoint.TranslateBy oNormal
' Check if the sample point lies on the cylinder axis.
' If it does, we have a hollow face.
' Create a line describing the cylinder axis
Dim oAxisLine As Line
Set oAxisLine = ThisApplication.TransientGeometry.CreateLine _
(oCylinder.BasePoint, oCylinder.AxisVector.AsVector)
'Create a line parallel to the axis passing thru the sample point.
Dim oSampleLine As Line
Set oSampleLine = ThisApplication.TransientGeometry.CreateLine _
(oSamplePoint, oCylinder.AxisVector.AsVector)
If oSampleLine.IsColinearTo(oAxisLine) Then
MsgBox "Interior face."
Else
MsgBox "Exterior face."
End If
End Sub