Ru-Board.club
← Вернуться в раздел «Программы»

» Программы для разработки, тестирования,... оптических систем

Автор: paparazzo
Дата сообщения: 10.12.2009 23:52

Цитата:
Может кто-то хорошо владеет Си++ и мог бы подредактировать исходный файл?

Да, это возможно.
Мне тоже он нужен был, но все руки не доходили. На след. неделе гляну, хотя думаю это дело получаса.
Автор: Paredam
Дата сообщения: 13.12.2009 09:53

Цитата:
Как сделать чтобы операнд RGLA не учитывал устаревшие (obsolete) стекла?

1. В каталоге стекол поставить галочку - "Exclude substitution"
2. Tools->Optimization->Glass Substitution...
Автор: wavesim
Дата сообщения: 15.12.2009 17:52


Цитата:
В zemax есть тип пов-ти описанный файлом us_array.dll
Это lenslet с прямоугольным расположением линз.
Очень нужно иметь тоже самое, но для гексагонального расположения линз.
Может кто-то хорошо владеет Си++ и мог бы подредактировать исходный файл?


А есть исходный файл? Было бы крайне интересно на него взглянуть.
Если есть идея как просто реализовать гексагональные растры поделитесь, пожалуйста, хотя бы в общих чертах.
Автор: paparazzo
Дата сообщения: 15.12.2009 18:07

Цитата:
Если есть идея как просто реализовать гексагональные растры поделитесь, пожалуйста, хотя бы в общих чертах.


Проще всего поставить непоследовательный компонент.

А последовательный сегодня мельком глянул, но пока никак не доберусь до реализации... мне качется просто поменять свиг в us_array.c, приняв массив за гексагональный
Автор: sikd
Дата сообщения: 15.12.2009 18:23

Цитата:
А есть исходный файл? Было бы крайне интересно на него взглянуть.
Если есть идея как просто реализовать гексагональные растры поделитесь, пожалуйста, хотя бы в общих чертах.

Исходный файл - в дистрибутиве Zemax
Гексагональный растр можно получить, например, из прямоугольного путем сдвига нечетных строк.
Т.е. пусть есть прямоугольный растр AxB, где А-расстояние вдоль строки, B- расстояние между строками (B=A*cos(30))
Сдвигаем каждую нечетную строку на A/2 и получаем то, что нужно.
Автор: paparazzo
Дата сообщения: 15.12.2009 18:33
http://optdesign.narod.ru/array.SES
http://optdesign.narod.ru/array.ZMX

Пример из Zemax для непоследовательного компонета, также можно обойтись и без boolean
Автор: A_P_V
Дата сообщения: 15.12.2009 20:10
Как одновременно запустить Zemax и Fred?
У них видимо как-то креки пересекаются
Автор: alexgeorg
Дата сообщения: 15.12.2009 23:45

Цитата:
Как одновременно запустить Zemax и Fred?

Virtual Box не спасет отца демократии? Я так Code V под вистой гоняю.
Автор: paparazzo
Дата сообщения: 16.12.2009 07:58

Цитата:
Как одновременно запустить Zemax и Fred?


Одинаковые лекарства только у 2008 Zemax и FRED
А 2009 Zemax имеет другой тип эмулятора - у меня оба работают.
Ну и как сказано виртуальная машина должна помочь.
Автор: wavesim
Дата сообщения: 16.12.2009 12:32
Для sikd и paparazzo
Беда в том, что я не работаю с Zemax. Мне бы хотелось научиться создавать фазовый экран (матрицу) соответствующую линзовому растру с гексагональной структурой (и сделать это по возможности с минимальными вычислительными затратами).
Если файл us_array.c имеет к этому отношениеб и, если пренебрежение авторскими правами Zemax Corp. Вас не сильно шокирует, не могли бы Вы бросить его мне в почту
wavesimsoft@gmail.com. Спасибо.
Автор: paparazzo
Дата сообщения: 16.12.2009 12:45

Цитата:
Если файл us_array.c имеет к этому отношениеб и, если пренебрежение авторскими правами Zemax Corp. Вас не сильно шокирует, не могли бы Вы бросить его мне в почту


us_array.c - лежит в папке установленного Zemax в качестве примера и реализует прямоугольный линзовый растр. Найти его можно в любом дистрибутиве Zemax. Если вы не пользуетесь Zemax, вам он мало поможет т.к. представляет собой исходник dll для Zemax.
Текст файла ниже:


Код: #include <windows.h>
#include <math.h>
#include <string.h>
#include "usersurf.h"

/*
Written by Kenneth E. Moore
Oct 11, 1996

This DLL models an arbitrary number of lens elements in a lens array.
The individual lenses are generally conic aspheres.

The user provides the number of elements in x and y, the size in x and y of
each element, and the radius, conic, and glass.

This surface breaks up the beam into numerous separate
beams, and so most ZEMAX features will fail to work with this surface.

However, the spot diagrams, image analysis, etc, all work okay.

Modified GetCellCenter 9-25-01 KEM to accept rays at edge of lenses
Modified GetCellCenter 2-07-06 KEM to bound cell values to valid range, useful for very fast lenslets

*/


int __declspec(dllexport) APIENTRY UserDefinedSurface(USER_DATA *UD, FIXED_DATA *FD);
int GetCellCenter(int nx, int ny, double wx, double wy, double x, double y, double *cx, double *cy);

/* a generic Snells law refraction routine */
int Refract(double thisn, double nextn, double *l, double *m, double *n, double ln, double mn, double nn);

BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
    {
return TRUE;
}

/* this DLL models a lens array surface type */

int __declspec(dllexport) APIENTRY UserDefinedSurface(USER_DATA *UD, FIXED_DATA *FD)
    {
int i, nx, ny, error, miss_flag;
double p2, alpha, power, a, b, c, rad, casp, t, zc;
double wx, wy, cx, cy, x, y, z;
switch(FD->type)
    {
case 0:
    /* ZEMAX is requesting general information about the surface */
switch(FD->numb)
    {
case 0:
    /* ZEMAX wants to know the name of the surface */
         /* do not exceed 12 characters */
         strcpy(UD->string,"Lens Array");
break;
case 1:
    /* ZEMAX wants to know if this surface is rotationally symmetric */
/* it is not, so return a null string */
    UD->string[0] = '\0';
break;
case 2:
    /* ZEMAX wants to know if this surface is a gradient index media */
/* it is not, so return a null string */
    UD->string[0] = '\0';
    break;
}
break;
case 1:
    /* ZEMAX is requesting the names of the parameter columns */
/* the value FD->numb will indicate which value ZEMAX wants. */
/* they are all "Unused" for this surface type */
/* returning a null string indicates that the parameter is unused. */
switch(FD->numb)
    {
case 1:
    strcpy(UD->string, "Number X");
break;
case 2:
    strcpy(UD->string, "Number Y");
break;
case 3:
    strcpy(UD->string, "Width X");
break;
case 4:
    strcpy(UD->string, "Height Y");
break;
default:
    UD->string[0] = '\0';
    break;
}
    break;
case 2:
    /* ZEMAX is requesting the names of the extra data columns */
/* the value FD->numb will indicate which value ZEMAX wants. */
/* they are all "Unused" for this surface type */
/* returning a null string indicates that the extradata value is unused. */
switch(FD->numb)
    {
default:
    UD->string[0] = '\0';
    break;
}
    break;
case 3:
    /* ZEMAX wants to know the sag of the surface */
/* if there is an alternate sag, return it as well */
/* otherwise, set the alternate sag identical to the sag */
/* The sag is sag1, alternate is sag2. */

UD->sag1 = 0.0;
UD->sag2 = 0.0;

            /* if a plane, just return */
            if (FD->cv == 0) return(0);

/* figure out the center coordinates of which "cell" we are in */
nx = (int)FD->param[1];
ny = (int)FD->param[2];
wx = FD->param[3];
wy = FD->param[4];
x = UD->x;
y = UD->y;

/* make sure nx and ny are both odd, otherwise the chief ray is a problem... */
if (!nx&1)nx++;
if (!ny&1)ny++;
if (wx <= 0.0 || wy <= 0.0) return(-1);
error = GetCellCenter(nx, ny, wx, wy, UD->x, UD->y, &cx, &cy);

if (error) return(0);

/* offset the coordinates */
x -= cx;
y -= cy;

p2 = x*x + y*y;
alpha = 1 - (1+FD->k)*FD->cv*FD->cv*p2;
if (alpha < 0)
    {
/* lens is not big enough to fill the cell, radius is too short */
/* assume it is plane between lenses */
alpha = 0.0;
}
UD->sag1 = (FD->cv*p2)/(1 + sqrt(alpha));
            /* forget supporting a hyper hemisphere! */
UD->sag2 = UD->sag1;
    break;
case 4:
    /* ZEMAX wants a paraxial ray trace to this surface */
/* x, y, z, and the optical path are unaffected, at least for this surface type */
/* for paraxial ray tracing, the return z coordinate should always be zero. */
/* paraxial surfaces are always planes with the following normals */

/* for a lens array, only consider the single lens on axis */
UD->ln = 0.0;
UD->mn = 0.0;
UD->nn = -1.0;
power = (FD->n2 - FD->n1)*FD->cv;
if ((UD->n) != 0.0)
    {
(UD->l) = (UD->l)/(UD->n);
(UD->m) = (UD->m)/(UD->n);

(UD->l) = (FD->n1*(UD->l) - (UD->x)*power)/(FD->n2);
(UD->m) = (FD->n1*(UD->m) - (UD->y)*power)/(FD->n2);

/* normalize */
(UD->n) = sqrt(1/(1 + (UD->l)*(UD->l) + (UD->m)*(UD->m) ) );
/* de-paraxialize */
(UD->l) = (UD->l)*(UD->n);
(UD->m) = (UD->m)*(UD->n);
}
break;
case 5:
    /* ZEMAX wants a real ray trace to this surface */

            /* clear the multiple intercept test flag */
miss_flag = 0;

if (FD->cv == 0.0)
    {
     outofbounds:;
     UD->ln = 0.0;
     UD->mn = 0.0;
     UD->nn = -1.0;
             if (Refract(FD->n1, FD->n2, &UD->l, &UD->m, &UD->n, UD->ln, UD->mn, UD->nn)) return(-FD->surf);
return(0);
}
/* okay, not a plane. */
nx = (int)FD->param[1];
ny = (int)FD->param[2];
wx = FD->param[3];
wy = FD->param[4];
x = UD->x;
y = UD->y;

/* make sure nx and ny are both odd, otherwise the chief ray is a problem... */
if (!nx&1)nx++;
if (!ny&1)ny++;
if (wx <= 0.0 || wy <= 0.0) return(-1);
error = GetCellCenter(nx, ny, wx, wy, UD->x, UD->y, &cx, &cy);
if (error) goto outofbounds;

try_again:;

/* offset the coordinates */
x -= cx;
y -= cy;
z = 0.0;

            a = (UD->n) * (UD->n) * FD->k + 1;
            b = ((UD->n)/FD->cv) - (x) * (UD->l) - (y) * (UD->m);
            c = (x) * (x) + (y) * (y);
            rad = b * b - a * c;
            if (rad < 0) return(FD->surf); /* ray missed this surface */
            if (FD->cv > 0) t = c / (b + sqrt(rad));
            else t = c / (b - sqrt(rad));
            (x) = (UD->l) * t + (x);
            (y) = (UD->m) * t + (y);
            (z) = (UD->n) * t + (z);
            UD->path = t;

/* okay, if the ray makes a steep angle of intercept,
we may actually have hit the wrong element. Check it again! */
if (miss_flag == 0)
    {
double new_cx, new_cy;

                /* avoid infinite loop */
miss_flag = 1;

        /* restore global coordinates prior to test */
     UD->x = x + cx;
     UD->y = y + cy;
     error = GetCellCenter(nx, ny, wx, wy, UD->x, UD->y, &new_cx, &new_cy);
     if (error) goto outofbounds;
if (new_cx != cx || new_cy != cy)
    {
/* we hit the wrong one! */
/* go back to the tangent plane */
t = -t;
                    (x) = (UD->l) * t + (x);
                    (y) = (UD->m) * t + (y);

         x = x + cx;
          y = y + cy;

cx = new_cx;
cy = new_cy;

goto try_again;
}
}

            zc = (z) * FD->cv;
            rad = zc * FD->k * (zc * (FD->k + 1) - 2) + 1;
            casp = FD->cv / sqrt(rad);
            UD->ln = (x) * casp;
            UD->mn = (y) * casp;
            UD->nn = ((z) - ((1/FD->cv) - (z) * FD->k)) * casp;

/* restore coordinates */
UD->x = x + cx;
UD->y = y + cy;
UD->z = z;

if (Refract(FD->n1, FD->n2, &UD->l, &UD->m, &UD->n, UD->ln, UD->mn, UD->nn)) return(-FD->surf);
break;
case 6:
    /* ZEMAX wants the index, dn/dx, dn/dy, and dn/dz at the given x, y, z. */

/* This is only required for gradient index surfaces, so return dummy values */
UD->index = FD->n2;
UD->dndx = 0.0;
UD->dndy = 0.0;
UD->dndz = 0.0;
    break;
case 7:
    /* ZEMAX wants the "safe" data. */
/* this is used by ZEMAX to set the initial values for all parameters and extra data */
/* when the user first changes to this surface type. */
/* this is the only time the DLL should modify the data in the FIXED_DATA FD structure */
FD->param[1] = 5;
FD->param[2] = 5;
if (FD->cv == 0.0) FD->param[3] = 100.0;
else FD->param[3] = 0.5/FD->cv;
FD->param[4] = FD->param[3];
for (i = 5; i <= 8; i++) FD->param[i] = 0.0;
for (i = 1; i <= 200; i++) FD->xdata[i] = 0.0;
break;
}
return 0;
}

int Refract(double thisn, double nextn, double *l, double *m, double *n, double ln, double mn, double nn)
{
double nr, cosi, cosi2, rad, cosr, gamma;
if (thisn != nextn)
    {
    nr = thisn / nextn;
    cosi = fabs((*l) * ln + (*m) * mn + (*n) * nn);
    cosi2 = cosi * cosi;
    if (cosi2 > 1) cosi2 = 1;
    rad = 1 - ((1 - cosi2) * (nr * nr));
    if (rad < 0) return(-1);
    cosr = sqrt(rad);
    gamma = nr * cosi - cosr;
    (*l) = (nr * (*l)) + (gamma * ln);
    (*m) = (nr * (*m)) + (gamma * mn);
    (*n) = (nr * (*n)) + (gamma * nn);
    }
return 0;
}

int GetCellCenter(int nx, int ny, double wx, double wy, double x, double y, double *cx, double *cy)
{
double hwx, hwy, tx, ty;
int tnx, tny;
int mx, my;

*cx = 0.0;
*cy = 0.0;

tnx = 0;
tny = 0;

hwx = 0.5*wx;
hwy = 0.5*wy;

mx = (nx-1)/2; // the maximum legal cell number (plus or minus)
my = (ny-1)/2;

/* do cx */
if (fabs(x) > hwx)
    {
tx = x;
tnx = 0;
if (x > 0)
    {
while(tx > hwx)
    {
tnx++;
tx -= wx;
}
}
else
    {
while(tx < -hwx)
    {
tnx--;
tx += wx;
}
}
*cx = tnx*wx;
}

/* do cy */
if (fabs(y) > hwy)
    {
ty = y;
tny = 0;
if (y > 0)
    {
while(ty > hwy)
    {
tny++;
ty -= wy;
}
}
else
    {
while(ty < -hwy)
    {
tny--;
ty += wy;
}
}
*cy = tny*wy;
}

// Modified 2-07-06 KEM to bound cell values to valid range, useful for very fast lenslets
// new test to bound cell values to valid range
while (tnx > mx) tnx--;
while (tnx <-mx) tnx++;
while (tny > my) tny--;
while (tny <-my) tny++;
*cx = tnx*wx;
*cy = tny*wy;

/* are there this many cells? */
if (fabs(tnx) > (nx-1)/2 || fabs(tny) > (ny-1)/2) return -1;
else return 0;
}

Автор: wavesim
Дата сообщения: 16.12.2009 14:54
Спасибо. Некоторая польза кажется есть.
Если я правильно понял подправить нужно только функцию GetCellCenter.
Растр задан так: nx - число ячеек по горизонтали, ny - по вертикали, wx,wy - расстояние между центрами столбцов и строк соотвественно. Оптическая ось всегда проходит через центр центральной ячейки.
Если это описание устраивает, я попробую сделать изменения.
Автор: Xamez
Дата сообщения: 16.12.2009 17:11
А в чём преимущества FRED? Зачем его запускать вместе с Zemax?
Автор: paparazzo
Дата сообщения: 16.12.2009 17:29

Цитата:
А в чём преимущества FRED? Зачем его запускать вместе с Zemax?


Для меня преимущество только одно - открывает rayset разных программ, т.е. я редактирую их с помощью FRED.
А вообще тормознутая программа, считает медленно. Также давно брали на пробу, так нашел очень грубую оптическую ошибку в программе, пришлось долго сорить с разарботчиками, доказывая им элементарные вещи - исправили все же, когда им разжевал.
Потом нашел вторую, но не исправили, мотивировав, что больше никто не жалуется.

Вообще FRED это модифицированный и урезанный ASAP (но и более дешевый), вся его работа организована через скрипты.
Автор: sikd
Дата сообщения: 16.12.2009 17:37

Цитата:
Если я правильно понял подправить нужно только функцию GetCellCenter.
Растр задан так: nx - число ячеек по горизонтали, ny - по вертикали, wx,wy - расстояние между центрами столбцов и строк соотвественно. Оптическая ось всегда проходит через центр центральной ячейки.
Если это описание устраивает, я попробую сделать изменения.


с учетом замечания paparazzo


Цитата:
Что требуется поменять, это учесть, что апертура гексагональная, т.е. лучи не попадающие на неё считать уже для соседнего растра

Автор: Xamez
Дата сообщения: 16.12.2009 17:43

Цитата:
Вообще FRED это модифицированный и урезанный ASAP (но и более дешевый), вся его работа организована через скрипты.


Спасибо, понял. А сколько оно стОит?
Автор: A_P_V
Дата сообщения: 16.12.2009 18:55
alexgeorg, paparazzo.

Спасибо за ответ. У меня стоит две версии земакса 2008 и 2009, лекарство для 2009 одновременно работает на обе, поэтому я думал, что можно поставить Фред со своим. 2009 продолжает работу, а с 2008 возникли проблемы.

Xamez, параллельно я запускаю что бы не терять времени. Пока в Zemax идёт расчёт, хотел попробовать FRED. ASAP который лежит здесь вроде более ранний по году выпуска, поэтому хотел использовать более свежий вариант.

Автор: paparazzo
Дата сообщения: 16.12.2009 20:34

Цитата:
Спасибо, понял. А сколько оно стОит?


6000-7000$ + ежегодная поддержка
ИМХО Zemax за 4500+700 поддержки выгоднее и лучше.

Добавлено:

Цитата:
Xamez, параллельно я запускаю что бы не терять времени. Пока в Zemax идёт расчёт, хотел попробовать FRED. ASAP который лежит здесь вроде более ранний по году выпуска, поэтому хотел использовать более свежий вариант.


Совет - чтобы использовать более 2-х Zemax поставьте виртуальную машину и в unity режиме запускайте.
Автор: Xamez
Дата сообщения: 17.12.2009 00:52

Цитата:
Совет - чтобы использовать более 2-х Zemax поставьте виртуальную машину и в unity режиме запускайте.


Не использую виртуальную машину и довольно смутно представляю её себе, хотя 2-3 сессии Zemax часто работают вместе.
Что в этом смысле даёт virtual machine?
Автор: DSER
Дата сообщения: 17.12.2009 06:19
Xamez
Интересно, а как 3-й земакс запустить без виртуальной машины?
Автор: basilio_ef
Дата сообщения: 17.12.2009 07:58
paparazzo

На книголюбе файл 273.djvu читается только до 114 разворота. Если есть возможность, то "перезалейте" это файл.
Заранее спасибо.
Автор: paparazzo
Дата сообщения: 17.12.2009 09:29

Цитата:
На книголюбе файл 273.djvu читается только до 114 разворота. Если есть возможность, то "перезалейте" это файл.


У менятоже до 114-го...
Может у кого есть исходники?


Цитата:
Интересно, а как 3-й земакс запустить без виртуальной машины?


Во-во. У меня не получалось никак в разных комбинациях, и эмулятор с ключем, и разные эмуляторы и версии Zemax...
Автор: A_P_V
Дата сообщения: 17.12.2009 10:22
Иногда можно запустить больше 2-х копий Zemax.

Ярлык на него должен находиться в панели быстрого запуска, при старте должны запускаться тяжелые процессы (хрустящие винтом - например антивирусы). Тогда при запуске быстро щелкаешь на ярлык несколько раз- запускается несколько копий. Правда нельзя уже в загруженном состоянии запустить больше.
Удавалось таким образом получить 4 штуки.
Автор: sikd
Дата сообщения: 17.12.2009 10:28

Цитата:
Удавалось таким образом получить 4 штуки.



У меня получалось до 6 штук. Но надо очень быстро клацать мышью
Автор: paparazzo
Дата сообщения: 17.12.2009 10:35

Цитата:
У меня получалось до 6 штук. Но надо очень быстро клацать мышью


Ужас! А куда столько применить?
У меня обычно не больше 2-х запущено...

Добавлено:


А вообще весело так - 26 копий Zemax и все работают.
Спасибо за совет!
Автор: Xamez
Дата сообщения: 17.12.2009 16:44

Цитата:
Интересно, а как 3-й земакс запустить без виртуальной машины?


Дистанционно через сеть.
Автор: A_P_V
Дата сообщения: 17.12.2009 22:08
двух бывает не всегда хватает. Например: в одном идет оптимизация, во втором собирается система, основываясь на открытом в третьей копии варианте.

Xamez,
нужно использовать какие-то средства удалённого доступа? это получыается выгодно, так как она не будет ресурсы твоей машины отъедать.
Автор: seepooha
Дата сообщения: 18.12.2009 02:03
Для четырёх копий Земакса надо проц 4-х ядерный, не меньше )))
Автор: DSER
Дата сообщения: 18.12.2009 05:43
А у разработчика никто не узнавал зачем они ограничение на запуск более двух Zemax на одной машине сделали?
Автор: basilio_ef
Дата сообщения: 18.12.2009 06:09
paparazzo


Цитата:
У меня тоже до 114-го...
Может у кого есть исходники?

Нашел
luizov_cvet_i_svet(273).djvu

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

Предыдущая тема: LogMeIn Hamachi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.