minimum distance of cone face

By Xiaodong Liang

Issue
I uses GetMinimumDistance to get the distance from a cylinder to a cone face. If the cone has no tip (minor and major radius > 0), the distance looks correct. But if it has tip, the distance is no correct. It looks it chooses a random point on conical surface, instead of the tip point. e.g. as shown in the fig below. The attachment is a code reproduce it.

image

Public Sub GetMinDistance()

    Dim oDoc As PartDocument
    Set oDoc = ThisApplication.ActiveDocument
    Dim oDef As PartComponentDefinition
    
    Set oDef = oDoc.ComponentDefinition

    Dim oTransientBRep As TransientBRep
    Set oTransientBRep = ThisApplication.TransientBRep

    ‘ Create a point representing the center of the bottom of the cone
    Dim oBottom As Point
    Set oBottom = ThisApplication.TransientGeometry.CreatePoint(0, 0, 0)

    ‘ Create a point representing the tip of the cone
    Dim oTop As Point
    Set oTop = ThisApplication.TransientGeometry.CreatePoint(0, 2.54, 0)

    ‘ Create a transient cone body
    Dim oBody As SurfaceBody
    Set oBody = oTransientBRep.CreateSolidCylinderCone(oBottom, oTop, 5, 5, 2)

    ‘ Reset the top and bottom point of the cylinder
    Set oTop = ThisApplication.TransientGeometry.CreatePoint(0, 2.54 + 1.27, 0)
    Set oBottom = ThisApplication.TransientGeometry.CreatePoint(0, 2.54 + 1.27 + 2.54, 0)

    ‘ Create a transient cylinder body
    Dim oCylBody As SurfaceBody
    ‘Set oCylBody = oTransientBRep.CreateSolidCylinderCone(oBottom, oTop, 2.5, 2.5, 2.5)
    Set oCylBody = oTransientBRep.CreateSolidCylinderCone(oBottom, oTop, 2.5, 2.5, 0)
    
 
    ‘ Boolean the bodies; "oBody" will return the result
    Call oTransientBRep.DoBoolean(oBody, oCylBody, kBooleanTypeUnion)
    
    Dim oBaseFeature As NonParametricBaseFeature
    Set oBaseFeature = oDef.Features.NonParametricBaseFeatures.Add(oBody)
   
    
    Dim ocyl As Face
    Dim ocone As Face
    Dim f As Face
    
    For Each f In oBaseFeature.Faces
        If TypeOf f.Geometry Is Cone Then
            Set ocone = f
            Exit For
        End If
       
    Next
    
    For Each f In oBaseFeature.Faces
        If TypeOf f.Geometry Is Cone And (Not f Is ocone) Then
            Set ocyl = f
            Exit For
        End If
        
    Next
    
    Dim cont As NameValueMap
    Dim dist As Double
    
    ‘ The distance returned below is same as return By UI
    dist = ThisApplication.MeasureTools.GetMinimumDistance(ocone, ocyl, kNoInference, kNoInference, cont)
    
    Dim pt1 As Point
    Set pt1 = cont.Item(2)
    Dim pt2 As Point
    Set pt2 = cont.Item(3)
    
    oDef.WorkPoints.AddFixed pt1
    oDef.WorkPoints.AddFixed pt2
    
End Sub

Solution

Assume there are one cylinder and one cone (with tip).  The minimum distance between cylindrical face and cone with tip is calculated incorrectly as we have seen. But if we select planar face of cylinder and conical face then distance is shown correctly between tip and planar face.

If we create a 2D model bases on the 3D model like below figure.

image

The 2D model is created on a plane which is across the axis of the cone and cylinder, so now we can find that the minimum distance of the conical face and cylindrical face is the same of the minimum distance between the black line and the blue line. So create a line from the top end(red point) of the black line and perpendicular to the blue line like the picture shows, we will get the yellow line, the yellow line is the shortest one between the black line and blue line.

Actually this is affected by the apex angle of the cone(also the position of the cone tip), so like below if the apex angle of the cone
is sharp enough that the yellow line has its perpendicular point on the extension of the blue line then the shortest line between the black line and the blue line would be like magenta line in below figure:

 

image


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading