GetParamAtPoint exception on some points and not others... why?

GetParamAtPoint exception on some points and not others... why?

Anonymous
Not applicable
628 Views
3 Replies
Message 1 of 4

GetParamAtPoint exception on some points and not others... why?

Anonymous
Not applicable

Hello,
I'm working on a project of mine: to develop an add-in that helps me design radio control airplanes.

For several reasons, airfoils are quite challenging in Inventor, and I need to  work with GetParamAtPoint during airfoil rib construction.

I've written two small snippets of code to illustrate the problem: I have a set of points that generate a BSpline in 2d, and on these I need to find the parameter position using GetParamAtPoint. For one set it runs flawlessly, and for the second set I get exceptions on two points. You can use both snippets as VBA code, or use the attached test part file.

The following examples only differ on the set of points.

Any suggestion?

 

This code works.

Attribute VB_Name = "Module3"
Option Explicit

Public Sub Test_E197()

       
    Dim ExceptionCounter As Integer
    ExceptionCounter = 0
    
    Dim ExceptionPoints(61, 2) As Double
    Dim ExceptionPosition(61) As Double
    
    Dim NoSolutionCounter As Integer
    NoSolutionCounter = 0
    
    Dim NoSolutionPoints(61, 2) As Double
    Dim NoSolutionPosition(61) As Double
    
    Dim oDoc As PartDocument
    Set oDoc = ThisApplication.Documents.Add(kPartDocumentObject, _
                ThisApplication.FileManager.GetTemplateFile(kPartDocumentObject))
                    
    Dim oDef As PartComponentDefinition
    Set oDef = oDoc.ComponentDefinition
    
    Dim oSketch As PlanarSketch
    Set oSketch = oDef.Sketches.Add(oDef.WorkPlanes(3))
    
    Dim oTG As TransientGeometry
    Set oTG = ThisApplication.TransientGeometry
    
    Dim dPoint(1) As Double
    
    Dim Points(61, 2) As Double
    Points(0, 0) = 14.4907695728873
    Points(1, 0) = 14.2854055644861
    Points(2, 0) = 14.0453959313376
    Points(3, 0) = 13.7289392501585
    Points(4, 0) = 13.3404597873862
    Points(5, 0) = 12.8829999756369
    Points(6, 0) = 12.3624673268312
    Points(7, 0) = 11.7875675199403
    Points(8, 0) = 11.1671608563613
    Points(9, 0) = 10.5103977952277
    Points(10, 0) = 9.82841971955707
    Points(11, 0) = 9.12683540803325
    Points(12, 0) = 8.41977258253163
    Points(13, 0) = 7.71610071303484
    Points(14, 0) = 7.0213333418339
    Points(15, 0) = 6.33689601620119
    Points(16, 0) = 5.66551618859487
    Points(17, 0) = 5.0111209706802
    Points(18, 0) = 4.37741230062781
    Points(19, 0) = 3.76765676172087
    Points(20, 0) = 3.18602704036131
    Points(21, 0) = 2.63944344911459
    Points(22, 0) = 2.13324374713737
    Points(23, 0) = 1.67317332222972
    Points(24, 0) = 1.26383712609901
    Points(25, 0) = 0.909469967922463
    Points(26, 0) = 0.613911053700469
    Points(27, 0) = 0.379838124495134
    Points(28, 0) = 0.211553823445475
    Points(29, 0) = 0.107340584212587
    Points(30, 0) = 7.49922083232751E-02
    Points(31, 0) = 0.100773118547368
    Points(32, 0) = 0.195957815164159
    Points(33, 0) = 0.3658918599253
    Points(34, 0) = 0.598578258521761
    Points(35, 0) = 0.895378635996072
    Points(36, 0) = 1.25036560111405
    Points(37, 0) = 1.66087222039693
    Points(38, 0) = 2.12201765308262
    Points(39, 0) = 2.62949442265907
    Points(40, 0) = 3.17739555812898
    Points(41, 0) = 3.7604912042886
    Points(42, 0) = 4.37192790101342
    Points(43, 0) = 5.00729354895522
    Points(44, 0) = 5.66330982607984
    Points(45, 0) = 6.33661251563786
    Points(46, 0) = 7.02334889471077
    Points(47, 0) = 7.72034879381119
    Points(48, 0) = 8.4256186259489
    Points(49, 0) = 9.13365933627886
    Points(50, 0) = 9.83600608338291
    Points(51, 0) = 10.5185769432585
    Points(52, 0) = 11.1758058890516
    Points(53, 0) = 11.7966181179425
    Points(54, 0) = 12.3719046695251
    Points(55, 0) = 12.8927693814615
    Points(56, 0) = 13.3506613810223
    Points(57, 0) = 13.7395972368384
    Points(58, 0) = 14.0565322106635
    Points(59, 0) = 14.2967743354842
    Points(60, 0) = 14.5019020083038
    Points(0, 1) = -3.71808093669204E-02
    Points(1, 1) = -7.37931321893928E-03
    Points(2, 1) = 3.55119928610518E-02
    Points(3, 1) = 9.52069909987956E-02
    Points(4, 1) = 0.167306668326217
    Points(5, 1) = 0.249497785118683
    Points(6, 1) = 0.34217538860176
    Points(7, 1) = 0.444327560271386
    Points(8, 1) = 0.554352389318162
    Points(9, 1) = 0.670121475753395
    Points(10, 1) = 0.789007780758336
    Points(11, 1) = 0.907516034760596
    Points(12, 1) = 1.0207091965074
    Points(13, 1) = 1.12189546955481
    Points(14, 1) = 1.20248616530378
    Points(15, 1) = 1.25793543301148
    Points(16, 1) = 1.28717825990845
    Points(17, 1) = 1.28989502070063
    Points(18, 1) = 1.26637668087402
    Points(19, 1) = 1.21847316623901
    Points(20, 1) = 1.14979193135322
    Points(21, 1) = 1.06355135426219
    Points(22, 1) = 0.961967508122893
    Points(23, 1) = 0.847708656779257
    Points(24, 1) = 0.723234163142819
    Points(25, 1) = 0.591285103955416
    Points(26, 1) = 0.455401447353334
    Points(27, 1) = 0.319156296066433
    Points(28, 1) = 0.189487355688774
    Points(29, 1) = 7.10943136051898E-02
    Points(30, 1) = 1.0810600346469E-03
    Points(31, 1) = -4.73194313323893E-02
    Points(32, 1) = -0.114600628404787
    Points(33, 1) = -0.192775614269317
    Points(34, 1) = -0.266759381457776
    Points(35, 1) = -0.334547495336756
    Points(36, 1) = -0.393655942049727
    Points(37, 1) = -0.44302530220799
    Points(38, 1) = -0.481903953625492
    Points(39, 1) = -0.510147951254571
    Points(40, 1) = -0.527693796140256
    Points(41, 1) = -0.534542381244536
    Points(42, 1) = -0.53081798154212
    Points(43, 1) = -0.515067663097893
    Points(44, 1) = -0.485870174125962
    Points(45, 1) = -0.445026999694613
    Points(46, 1) = -0.397245269600379
    Points(47, 1) = -0.346242333215651
    Points(48, 1) = -0.2938082472949
    Points(49, 1) = -0.241864948302902
    Points(50, 1) = -0.192299114678529
    Points(51, 1) = -0.146884566752125
    Points(52, 1) = -0.106423156523523
    Points(53, 1) = -7.12582635375992E-02
    Points(54, 1) = -0.041421763464576
    Points(55, 1) = -1.68385691018486E-02
    Points(56, 1) = 3.36251556073071E-03
    Points(57, 1) = 2.02118179662924E-02
    Points(58, 1) = 3.30326549334277E-02
    Points(59, 1) = 3.90918273795761E-02
    Points(60, 1) = 3.77268604601142E-02

    
    Dim BSpline As BSplineCurve2dDefinition
    Set BSpline = ThisApplication.TransientGeometry.CreateBSplineCurve2dDefinition()
    
    Dim i As Integer
    For i = 0 To 60
        Dim Point As Point2d
        Set Point = ThisApplication.TransientGeometry.CreatePoint2d(Points(i, 0), Points(i, 1))
        Call BSpline.AddPoint(Point)
    Next
    
    Dim BSplineCurve2d As BSplineCurve2d
    Set BSplineCurve2d = ThisApplication.TransientGeometry.CreateFittedBSplineCurve2d(BSpline)
    
    For i = 0 To 60
        
        Dim GuessParams(1) As Double
        Dim MaxDeviations(1) As Double
        MaxDeviations(0) = 0
        Dim Params(1) As Double
        Dim SolTypes(1) As SolutionNatureEnum
        dPoint(0) = Points(i, 0)
        dPoint(1) = Points(i, 1)
        On Error GoTo Oops
        Call BSplineCurve2d.Evaluator.GetParamAtPoint(dPoint, GuessParams, MaxDeviations, Params, SolTypes)
        On Error GoTo 0
       
        If SolTypes(0) = kNoSolution Then
            NoSolutionPoints(NoSolutionCounter, 0) = dPoint(0)
            NoSolutionPoints(NoSolutionCounter, 1) = dPoint(1)
            NoSolutionPosition(NoSolutionCounter) = i
            NoSolutionCounter = NoSolutionCounter + 1
        End If
    Next
    
    Dim Message As String
    Message = "Completed." & vbNewLine
    If ExceptionCounter > 0 Then
        Message = Message & "Exceptions: " & ExceptionCounter & vbNewLine
        For i = 0 To ExceptionCounter - 1
            Message = Message & "    Point " & ExceptionPosition(i) & " (" & ExceptionPoints(i, 0) & ", " & ExceptionPoints(i, 1) & ")" & vbNewLine
        Next
    End If
    If NoSolutionCounter > 0 Then
        Message = Message & "No Solutions:" & NoSolutionCounter & vbNewLine
        For i = 0 To NoSolutionCounter - 1
            Message = Message & "    Point " & NoSolutionPosition(i) & " (" & NoSolutionPoints(i, 0) & ", " & NoSolutionPoints(i, 1) & ")" & vbNewLine
        Next
    End If
    MsgBox (Message)
    Exit Sub
        
Oops:
            ExceptionPoints(ExceptionCounter, 0) = dPoint(0)
            ExceptionPoints(ExceptionCounter, 1) = dPoint(1)
            ExceptionPosition(ExceptionCounter) = i
            ExceptionCounter = ExceptionCounter + 1
            Err.Clear
            Resume Next
    
    
End Sub

This does not

Attribute VB_Name = "Module2"
Option Explicit

Public Sub Test_E502()

       
    Dim ExceptionCounter As Integer
    ExceptionCounter = 0
    
    Dim ExceptionPoints(65, 2) As Double
    Dim ExceptionPosition(65) As Double
    
    Dim NoSolutionCounter As Integer
    NoSolutionCounter = 0
    
    Dim NoSolutionPoints(65, 2) As Double
    Dim NoSolutionPosition(65) As Double
    
    Dim oDoc As PartDocument
    Set oDoc = ThisApplication.Documents.Add(kPartDocumentObject, _
                ThisApplication.FileManager.GetTemplateFile(kPartDocumentObject))
                    
    Dim oDef As PartComponentDefinition
    Set oDef = oDoc.ComponentDefinition
    
    Dim oSketch As PlanarSketch
    Set oSketch = oDef.Sketches.Add(oDef.WorkPlanes(3))
    
    Dim oTG As TransientGeometry
    Set oTG = ThisApplication.TransientGeometry
    
    Dim dPoint(1) As Double
    
    Dim Points(65, 2) As Double
    Points(0, 0) = 14.4842675301393
    Points(1, 0) = 14.4253201655653
    Points(2, 0) = 14.2772182562438
    Points(3, 0) = 14.0568384043582
    Points(4, 0) = 13.768932825146
    Points(5, 0) = 13.4074671825104
    Points(6, 0) = 12.9752493047422
    Points(7, 0) = 12.482890619269
    Points(8, 0) = 11.9416058627813
    Points(9, 0) = 11.3653612020933
    Points(10, 0) = 10.7728907587934
    Points(11, 0) = 10.1733789012258
    Points(12, 0) = 9.5549442603162
    Points(13, 0) = 8.91078888910626
    Points(14, 0) = 8.24698284384668
    Points(15, 0) = 7.56939427999263
    Points(16, 0) = 6.88576366279301
    Points(17, 0) = 6.20296506777091
    Points(18, 0) = 5.52845947879423
    Points(19, 0) = 4.86869449449081
    Points(20, 0) = 4.23031703868267
    Points(21, 0) = 3.6196742901519
    Points(22, 0) = 3.04258273050807
    Points(23, 0) = 2.50460977661185
    Points(24, 0) = 2.01077709254148
    Points(25, 0) = 1.5654880908635
    Points(26, 0) = 1.17284518290119
    Points(27, 0) = 0.836294026854053
    Points(28, 0) = 0.558858853275929
    Points(29, 0) = 0.342661632708162
    Points(30, 0) = 0.190697892734332
    Points(31, 0) = 0.10082875840029
    Points(32, 0) = 7.49504997244067E-02
    Points(33, 0) = 9.40557405426082E-02
    Points(34, 0) = 0.168789104432926
    Points(35, 0) = 0.314414256905581
    Points(36, 0) = 0.538039307991623
    Points(37, 0) = 0.811508087540188
    Points(38, 0) = 1.15372129334084
    Points(39, 0) = 1.54670827499391
    Points(40, 0) = 1.9951946521321
    Points(41, 0) = 2.49096265942302
    Points(42, 0) = 3.03131022167453
    Points(43, 0) = 3.61049886275319
    Points(44, 0) = 4.2231900558884
    Points(45, 0) = 4.86349271783455
    Points(46, 0) = 5.52514133677746
    Points(47, 0) = 6.20141693222698
    Points(48, 0) = 6.88590373349273
    Points(49, 0) = 7.57121203808827
    Points(50, 0) = 8.2503605205007
    Points(51, 0) = 8.91581936016116
    Points(52, 0) = 9.56142963112468
    Points(53, 0) = 10.181493239254
    Points(54, 0) = 10.7825539499519
    Points(55, 0) = 11.3755625711293
    Points(56, 0) = 11.9525979325414
    Points(57, 0) = 12.4959398930343
    Points(58, 0) = 12.9913203623519
    Points(59, 0) = 13.4277086932217
    Points(60, 0) = 13.795179478054
    Points(61, 0) = 14.0902288458272
    Points(62, 0) = 14.3152944159717
    Points(63, 0) = 14.4639750473279
    Points(64, 0) = 14.5218347351443
    Points(0, 1) = -3.60823489505252E-02
    Points(1, 1) = -1.94873414702549E-02
    Points(2, 1) = 3.19133987869411E-02
    Points(3, 1) = 0.11216738778177
    Points(4, 1) = 0.208243470792598
    Points(5, 1) = 0.316247969568306
    Points(6, 1) = 0.439867697952935
    Points(7, 1) = 0.580038205544362
    Points(8, 1) = 0.735830020504761
    Points(9, 1) = 0.904483506037076
    Points(10, 1) = 1.07633655359597
    Points(11, 1) = 1.22970253193954
    Points(12, 1) = 1.35179252845345
    Points(13, 1) = 1.44708863746267
    Points(14, 1) = 1.51881104538249
    Points(15, 1) = 1.56820960887469
    Points(16, 1) = 1.59617504465534
    Points(17, 1) = 1.60265132058043
    Points(18, 1) = 1.58820226542129
    Points(19, 1) = 1.55280894017627
    Points(20, 1) = 1.49734878420396
    Points(21, 1) = 1.42271571267121
    Points(22, 1) = 1.32994954843391
    Points(23, 1) = 1.22068488467998
    Points(24, 1) = 1.09672582422115
    Points(25, 1) = 0.960326351052942
    Points(26, 1) = 0.814258143157974
    Points(27, 1) = 0.661487259885749
    Points(28, 1) = 0.505857940017053
    Points(29, 1) = 0.351853226109551
    Points(30, 1) = 0.206780127385137
    Points(31, 1) = 7.63507974710623E-02
    Points(32, 1) = 2.72444325720158E-03
    Points(33, 1) = -3.62323703154369E-02
    Points(34, 1) = -0.101041620750911
    Points(35, 1) = -0.145849515725546
    Points(36, 1) = -0.213063103312707
    Points(37, 1) = -0.257754807405763
    Points(38, 1) = -0.303344890536264
    Points(39, 1) = -0.339193831331616
    Points(40, 1) = -0.368848634498634
    Points(41, 1) = -0.392741938226076
    Points(42, 1) = -0.410757014894062
    Points(43, 1) = -0.423863171516462
    Points(44, 1) = -0.431710555497273
    Points(45, 1) = -0.434648013296563
    Points(46, 1) = -0.432520626302502
    Points(47, 1) = -0.425266782157501
    Points(48, 1) = -0.412289814295775
    Points(49, 1) = -0.393326264286991
    Points(50, 1) = -0.367456342756439
    Points(51, 1) = -0.333128403112096
    Points(52, 1) = -0.288349985663276
    Points(53, 1) = -0.227892598371109
    Points(54, 1) = -0.150139981409469
    Points(55, 1) = -6.30478073849969E-02
    Points(56, 1) = 1.91236060346523E-02
    Points(57, 1) = 8.35528083512411E-02
    Points(58, 1) = 0.123826719488026
    Points(59, 1) = 0.139255996519053
    Points(60, 1) = 0.131769448839527
    Points(61, 1) = 0.108456684893059
    Points(62, 1) = 7.69649696608038E-02
    Points(63, 1) = 4.88078091328519E-02
    Points(64, 1) = 3.45022490843679E-02
    
    Dim BSpline As BSplineCurve2dDefinition
    Set BSpline = ThisApplication.TransientGeometry.CreateBSplineCurve2dDefinition()
    
    Dim i As Integer
    For i = 0 To 64
        Dim Point As Point2d
        Set Point = ThisApplication.TransientGeometry.CreatePoint2d(Points(i, 0), Points(i, 1))
        Call BSpline.AddPoint(Point)
    Next
    
    Dim BSplineCurve2d As BSplineCurve2d
    Set BSplineCurve2d = ThisApplication.TransientGeometry.CreateFittedBSplineCurve2d(BSpline)
    
    For i = 0 To 64
        
        Dim GuessParams(1) As Double
        Dim MaxDeviations(1) As Double
        MaxDeviations(0) = 0
        Dim Params(1) As Double
        Dim SolTypes(1) As SolutionNatureEnum
        dPoint(0) = Points(i, 0)
        dPoint(1) = Points(i, 1)
        On Error GoTo Oops
        Call BSplineCurve2d.Evaluator.GetParamAtPoint(dPoint, GuessParams, MaxDeviations, Params, SolTypes)
        On Error GoTo 0
       
        If SolTypes(0) = kNoSolution Then
            NoSolutionPoints(NoSolutionCounter, 0) = dPoint(0)
            NoSolutionPoints(NoSolutionCounter, 1) = dPoint(1)
            NoSolutionPosition(NoSolutionCounter) = i
            NoSolutionCounter = NoSolutionCounter + 1
        End If
    Next
    
    Dim Message As String
    Message = "Completed." & vbNewLine
    If ExceptionCounter > 0 Then
        Message = Message & "Exceptions: " & ExceptionCounter & vbNewLine
        For i = 0 To ExceptionCounter - 1
            Message = Message & "    Point " & ExceptionPosition(i) & " (" & ExceptionPoints(i, 0) & ", " & ExceptionPoints(i, 1) & ")" & vbNewLine
        Next
    End If
    If NoSolutionCounter > 0 Then
        Message = Message & "No Solutions:" & NoSolutionCounter & vbNewLine
        For i = 0 To NoSolutionCounter - 1
            Message = Message & "    Point " & NoSolutionPosition(i) & " (" & NoSolutionPoints(i, 0) & ", " & NoSolutionPoints(i, 1) & ")" & vbNewLine
        Next
    End If
    MsgBox (Message)
    Exit Sub
        
Oops:
            ExceptionPoints(ExceptionCounter, 0) = dPoint(0)
            ExceptionPoints(ExceptionCounter, 1) = dPoint(1)
            ExceptionPosition(ExceptionCounter) = i
            ExceptionCounter = ExceptionCounter + 1
            Err.Clear
            Resume Next
    
    
End Sub

Thanks for your kind help.

0 Likes
Accepted solutions (1)
629 Views
3 Replies
Replies (3)
Message 2 of 4

BrianEkins
Mentor
Mentor
Accepted solution

I'm not sure why it's failing but I found if I change the fit type to either AutoCAD or Smooth then it works correctly.  I just added the highlighted line below.

 

    Set BSpline = ThisApplication.TransientGeometry.CreateBSplineCurve2dDefinition()
    BSpline.FitMethod = kSmoothSplineFit

 

 

---------------------------------------------------------------
Brian Ekins
Inventor and Fusion 360 API Expert
Website/Blog: https://EkinsSolutions.com
Message 3 of 4

Anonymous
Not applicable

Hello Brian,

 

thanks, I've applied your solution and, apparently, it should work. Now, because the bspline changes shape, I have another problem with my code that I'm debugging. I'll let you know if this is the accepted solution.

Ideally, I would prefer to use bsplines with the default kSweetSplineFit, instead of the kSmoothSplineFit you suggest, but I'll pursue your recommendation.

I would like to know, anyhow, why we have the exception on two points and not on others. My understanding would be that if a point is used to define the bspline, I should be able to retrieve the parameter for said point. I presume it has something to do with precision, but still, I have no clear explanation.

Thanks again, I'll write back if yours is finally the accepted solution.

0 Likes
Message 4 of 4

Anonymous
Not applicable

Thanks,

It seems the workarround is the right one. I would welcome, anyhow, an explanation on why a specific value is generating the error.

0 Likes