Option Explicit Sub ToGeometry_Model Dim doc As FMDocument Dim crv As FMCurve Dim model As FMModel Dim geoms As FMModels Dim X1 As Double, Y1 As Double, Z1 As Double, X2 As Double, Y2 As Double, Z2 As Double Dim lastX1 As Double, lastY1 As Double, lastZ1 As Double, lastX2 As Double, lastY2 As Double, lastZ2 As Double Dim first As Boolean, has_endpoint1 As Boolean, has_endpoint2 As Boolean Dim mLine As FMLine Dim mCircle As FMCircle Set doc = ActiveDocument If( doc.Selected.Count <> 1) Then MsgBox "Select a curve" Exit Sub End If Set model = doc.Selected(1) If( TypeName(model) <> "IFMCurve") Then MsgBox "Select a curve" Exit Sub End If Set crv = model crv.Visible = False Set geoms = crv.ToGeometry first = True For Each model In geoms If( TypeName( model) = "IFMLine") Then Set mLine = model mLine.GetEndpoints2( X1, Y1, Z1, X2, Y2, Z2, has_endpoint1, has_endpoint2) If( Not has_endpoint1 Or Not has_endpoint2) Then MsgBox "Line '" + mLine + "' is infinite!" Exit Sub End If ElseIf( TypeName( model) = "IFMCircle") Then Set mCircle = model mCircle.GetEndpoints( X1, Y1, Z1, X2, Y2, Z2, has_endpoint1) If( Not has_endpoint1) Then MsgBox "Circle '" + mCircle + "' is infinite!" Exit Sub End If End If model.Select( True, False) If( first) Then doc.AddPoint( X1, Y1, Z1) doc.AddPoint( X2, Y2, Z2) Else If( ApxEq( X1, lastX1) And ApxEq( Y1, lastY1) And ApxEq( Z1, lastZ1)) Then doc.AddPoint( X2, Y2, Z2) ElseIf( ApxEq( X1, lastX2) And ApxEq( Y1, lastY2) And ApxEq( Z1, lastZ2)) Then doc.AddPoint( X2, Y2, Z2) ElseIf( ApxEq( X2, lastX1) And ApxEq( Y2, lastY1) And ApxEq( Z2, lastZ1)) Then doc.AddPoint( X1, Y1, Z1) ElseIf( ApxEq( X2, lastX2) And ApxEq( Y2, lastY2) And ApxEq( Z2, lastZ2)) Then doc.AddPoint( X1, Y1, Z1) Else MsgBox "point mismatch!" End If End If first = False lastX1 = X1 lastY1 = Y1 lastZ1 = Z1 lastX2 = X2 lastY2 = Y2 lastZ2 = Z2 Next model End Sub Function ApxEq(d1 As Double, d2 As Double) As Boolean ApxEq = Abs(d1 - d2) < 1e-6 End Function Sub ToGeometry_Server Dim doc As FMDocument Dim crv As FMCurve, gCrv As FMGCurve Dim geom As FMGeom Dim geoms As FMGeoms Dim model As FMModel Dim X1 As Double, Y1 As Double, Z1 As Double, X2 As Double, Y2 As Double, Z2 As Double Dim lastX1 As Double, lastY1 As Double, lastZ1 As Double, lastX2 As Double, lastY2 As Double, lastZ2 As Double Dim first As Boolean, has_endpoint1 As Boolean, has_endpoint2 As Boolean Dim gLine As FMGLine Dim gCircle As FMGCircle Set doc = ActiveDocument If( doc.Selected.Count <> 1) Then MsgBox "Select a curve" Exit Sub End If Set model = doc.Selected(1) If( TypeName(model) <> "IFMCurve") Then MsgBox "Select a curve" Exit Sub End If Set crv = model first = True Set gCrv = Application.GeomServer.MakeCurveFromModel( crv) Set geoms = gCrv.ToGeometry( doc.Metric ) For Each geom In geoms If( TypeName( geom) = "IFMGLine") Then Set gLine = geom gLine.GetEndpoints( X1, Y1, Z1, X2, Y2, Z2, has_endpoint1, has_endpoint2) If( Not has_endpoint1 Or Not has_endpoint2) Then MsgBox "Line is infinite!" Exit Sub End If ElseIf( TypeName( geom) = "IFMGCircle") Then Set gCircle = geom gCircle.GetEndpoints( X1, Y1, Z1, X2, Y2, Z2, has_endpoint1) If( Not has_endpoint1) Then MsgBox "Circle is infinite!" Exit Sub End If End If If( first) Then doc.AddPoint( X1, Y1, Z1) doc.AddPoint( X2, Y2, Z2) Else If( ApxEq( X1, lastX1) And ApxEq( Y1, lastY1) And ApxEq( Z1, lastZ1)) Then doc.AddPoint( X2, Y2, Z2) ElseIf( ApxEq( X1, lastX2) And ApxEq( Y1, lastY2) And ApxEq( Z1, lastZ2)) Then doc.AddPoint( X2, Y2, Z2) ElseIf( ApxEq( X2, lastX1) And ApxEq( Y2, lastY1) And ApxEq( Z2, lastZ1)) Then doc.AddPoint( X1, Y1, Z1) ElseIf( ApxEq( X2, lastX2) And ApxEq( Y2, lastY2) And ApxEq( Z2, lastZ2)) Then doc.AddPoint( X1, Y1, Z1) Else MsgBox "point mismatch!" End If End If first = False lastX1 = X1 lastY1 = Y1 lastZ1 = Z1 lastX2 = X2 lastY2 = Y2 lastZ2 = Z2 Next geom End Sub Sub CircleEndpoints Dim doc As FMDocument Dim model As FMModel Dim X1 As Double, Y1 As Double, Z1 As Double, X2 As Double, Y2 As Double, Z2 As Double Dim has_endpoints As Boolean Dim mCircle As FMCircle Set doc = ActiveDocument If( doc.Selected.Count <> 1) Then MsgBox "Select a circle" Exit Sub End If Set model = doc.Selected(1) If( TypeName(model) <> "IFMCircle") Then MsgBox "Select a circle" Exit Sub End If Set mCircle = model mCircle.GetEndpoints( X1, Y1, Z1, X2, Y2, Z2, has_endpoints) If( Not has_endpoints) Then MsgBox "Circle '" + mCircle + "' is a full circle" Else ' arc is between start and end point counter-clockwise relative to the circle normal. MsgBox "Circle '" + mCircle + "'" _ + ", X1: " + Format(X1,"##0.0###") + ", Y1: " + Format(Y1,"##0.0###") + ", Z1: " + Format(Z1,"##0.0###") _ + ", X2: " + Format(X2,"##0.0###") + ", Y2: " + Format(Y2,"##0.0###") + ", Z2: " + Format(Z2,"##0.0###") End If End Sub