
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
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.
Solved! Go to Solution.