Solved

ZOS-API non-sequential object not behaving the way I want it to

  • 10 August 2021
  • 1 reply
  • 222 views

Hi guys 

I have a very simple POB object which is just a wedge, and I’m trying to see how the angle between the internal and external reflective surfaces change with tilt angle rotation around x. I can do this fine in OpticsStudio, by altering the TiltAroundX in the non-sequential component editor. 

Screenshot of simple design

I then made a C# standalone app, so that I could control what I wanted programmatically. 

 

I open up the file, no problems:

 IOpticalSystem TheSystem = TheApplication.PrimarySystem;
            // Add your custom code here...

            ///open relevant file
            bool SuccessfulFileOpen = TheSystem.LoadFile(FQP,
                saveIfNeeded: false
            );
            Console.WriteLine("File succesfully opened: " + SuccessfulFileOpen);
            Console.WriteLine(FQP);
 

I then access the object to make sure it’s thr right one:

INonSeqEditor NCE = TheSystem.NCE;
            INCERow Object_n = NCE.GetObjectAt(ObjectNumber: 1);
            Console.WriteLine("Object Comment: " + Object_n.Comment);

And set up a batch ray trace

 //set up ray tracing 
            var rayTracer = TheSystem.Tools.OpenBatchRayTrace();
            var nRays = 5000;
            var normUnPolData = rayTracer.CreateNormUnpol(nRays, ZOSAPI.Tools.RayTrace.RaysType.Real, nSurfaces);
            var calcOPD = ZOSAPI.Tools.RayTrace.OPDMode.None;

 

Last step is I increment over all the tilt angles as follows:

   var start = -2;
            var end = -22;
            for (double j = start; j >= end; j--)
            {
                Object_n.TiltAboutX = j;

                //TheSystem.Save();
                //clear data from batch 
                normUnPolData.ClearData();
                List<Tuple<double, double, double>> xyz = new List<Tuple<double, double, double>>();

                for (int ray = 0; ray <= nRays; ray++)
                {
                    var hx = NormRandom(1);
                    var hy = NormRandom(1); ;
                    var rand_px = NormRandom(1);
                    var rand_py = NormRandom(1);
                    while (rand_px * rand_px + rand_py * rand_py > 1)
                    {
                        rand_py = NormRandom(1);
                    }
                    normUnPolData.AddRay(1, rand_px, rand_py, 0, 0, calcOPD);
                }
                rayTracer.RunAndWaitForCompletion();
                normUnPolData.StartReadingResults();
                for (int ray = 0; ray <= nRays; ray++)
                {
                    var rayN = 0;
                    double X;
                    double Z;
                    double Y;
                    var error = 0;
                    var vign = 0;
                    double A, B, C, D, E, F, G, H = 0;
                    bool success = normUnPolData.ReadNextResult(out rayN, out error, out vign, out X, out Y, out Z, out A, out B, out C, out D, out E, out F, out G, out H);
                    xyz.Add(new Tuple<double, double, double>(X, Y, Z));
                }
            }

 

And collect the data. In my eyes, this is identical to what I would be doing inside OpticsStudio, but for some reason, it doesn’t seem to work like it does in the GUI. Am I doing anything wrong? I’m varying the TiltAboutX in increments, collecting rays, and last step not shown is saving them to a CSV file. 

 

However, when I plot the data in python, I get the following:

Which is not right, so I must be doing something wrong in the code.

I’ve even tried to change the TiltAroundX to say -2, saved when it gets to -22 in the C# program, and then opened it up in the GUI, and the wedge is at that saved angle, so I know I’m rotating the right object in the right way.

Any help would be greatly helpful!

 

icon

Best answer by David.Nguyen 6 September 2021, 18:10

View original

1 reply

Userlevel 7
Badge +2

Hi Alexander,

 

Can you share your code and an example file demonstrating the issue? While what you describe make sense to me, there might be issues elsewhere in your code. I doubt it has to do with the POB.

Looking forward to hearing back from you.

Take care,

 

David

Reply