Glad you got it working OK. I was going to reply to your post in Message 5 (on the 15th) about the 'params', but things got busy at work, and I got called away. The 'params' portion of the SurfaceEvaluator.GetNormal method seems to be sort of like a percentage grid of the overall face. That method is usually OK to use when dealing with a relatively simple faces with no holes, voids, cutouts, or interruptions in them. But when any of those may be involved, it is usually better to use the SurfaceEvaluator.GetNormalAtPoint method. A common strategy for getting/setting the 'points' portion of that method, which is being used similarly to the 'params' in the other method, is to use the Face.PointOnFace property to get an Inventor.Point object that is guaranteed to be 'on' that Face, rather than in one of those holes, voids, cutouts, or interruptions. Then use the X, Y, & Z coordinates of that Point as the coordinates of the 'points' array of Double it is asking for. This will tell it to get the 'normal' at that exact point on that face, ensuring proper results, and avoiding a potential error. The other 'evaluator' type objects you may encounter somewhere along the way are the CurveEvaluator and the Curve2dEvaluator. The following online help page touches on these concepts, but does not go into great detail.
Programming Interface > Inventor API User's Manual > Part and Assembly Modeling > Understanding Soli...
Another small detail that often trips some of us up in these types of situations, is when declaring and initializing the variables that the method(s) will be using. In vb.net (and in iLogic rules, which use vb.net), it is necessary to declare the 'Normals' variable similar to this:
Dim oNormals() As Double = {}
...instead of just like this:
Dim oNormals() As Double
...even though we are not setting any initial values to it, and want the method to set its values. This did not seem to be necessary in VBA, and is not that obvious in any of the 'official' documentation that this needs to be done, but when not done, it will usually throw an error.
Wesley Crihfield

(Not an Autodesk Employee)