-------------------------------------------------分--割--线--------------------------------------------------------------------------------
连接lighttools-matlab
matlab连接lighttools有两种方式,一个是.net, 一个是.com
lighttools 建议使用.net 进行连接。两者区别不大,在函数的调用上会存在一些不同。同时在一些老版本的matlab里只能使用.com
.com方式:
clc;clear;
% 连接到lighttools
lt = actxserver('LightTools.LTAPI');
% 连接到扩展API里的lighttools API 函数
ltml = actxserver('ltcom64.LTAPI2');
% 连接到扩展API里的Jumpstart函数
Js=actxserver('ltcom64.jsml');
.net方式:
def=System.Reflection.Missing.Value;
asm = NET.addAssembly('C:\Program Files\Optical Research Associates\LightTools 8.6.0\Utilities.NET\LTCOM64.dll');
lt=LTCOM64.LTAPIx;
lt.UpdateLTPointer
js=LTCOM64.JSNET2;
js.UpdateLTPointer;
好了这就连接上了,可以愉快的调用API函数了
数据寻访
数据寻访有两种方式,一种是建立数据寻访列表,一种是通过数据寻访字符串,数据寻访字符串只能在lighttools命令行里使用,或者通过api里的CMD命令调用。这里需要做一个权衡,当处理大批量数据的时候,使用数据寻访字符串的访问方式会很慢,推荐使用寻访列表。
寻访列表建立
下面的例子都是基于.com的
DbList
[listKey, status] = ltml.LTDbList(lt, dataKey, function)
datakey 是你所要建立列表的对象的上上个层级
function 即你要建立列表的对象
listkey 即得到的 object key ,通过这个 object key 才能调用后面那一堆API 函数
datakey 可以通过在lighttools里你要访问数据的东西上点击右键,复制数据访问名称得到
得到的那一串东西即为 数据访问字符串 ,这串东西并不能直接拿来作为datakey。
把这串字符的最后一小段删掉,作为datakey。
删掉的那部分为 functin
说的有点乱,举个栗子
我想要得到这条光线segment_0部分,的绝对坐标x
在单元格处右键复制数据访问名称可以得到如下的数据访问字符串
LENS_MANAGER[1].NS_RAYS[Rays].NS_RAY[nsRay_1327].NS_SEGMENT[segment_0].Global_X
也就是我想要读取的是这个Global_x
那么首先我们就得为他的上一层级NS_SEGMENT建立列表
% 数据寻访字符串
dataKey = 'LENS_MANAGER[1].NS_RAYS[Rays].NS_RAY[nsRay_1327]';
% 建立对象列表
[listKey, status] = ltml.LTDbList(lt, dataKey, 'NS_SEGMENT');
就是这样子
然后我们获取存在列表里的object key,其实就是NS_SEGMENT后面的索引值[segment_0]
ListAtPos(ListKey, n) | 返回列表中第n个位置的object key |
ListNext(ListKey) | 返回列表中当前位置的object key,并将 list key指向下一个位置 |
ListLast(ListKey) | 返回列表最后位置的object key |
这仨是列表访问函数,选择合适的函数来获取object key
我这里使用ListNext
[dataKey2, status] = ltml.LTListNext(lt, listKey);
status 会返回一个状态指示是否执行成功
datakey2 里存的就是具体的object key了
这里我们可以调用另一个函数DbKeyStr来验证一下datakey2是不是我们想要的对象
DbKeyStr的作用是将object key 转换回数据访问字符串
酱紫:
[keyStr, status] = ltml.LTDbKeyStr(lt, dataKey2);
DbGet
有object key之后我们就可以使用DBGet来读取相应对象的数据值了
x = ltml.LTDbGet(lt, dataKey2, 'Global_X');
写数据的DBset也差不多
—————————————————————————————————————————
但是!以上操作实际是完全是属于脱裤子放屁的操作。
因为可以直接通过DbGet加数据访问字符串的形式进行操作。
唯一好处我觉得是可以方便进行一些循环操作。但问题是,它并不能对应到最末尾的那个层级,只是能生成倒数第二个层级的list,问题是往往倒数第二层级并不是存放最终数据的位置,整个列表里往往也没几个对象。
DbGet加数据访问字符串的形式进行操作的例子:
status3 = lt.DbGet('RECEIVERS[Receiver_List].SURFACE_RECEIVER[Receiver_Eye].FORWARD_SIM_FUNCTION[Forward_Simulation]','LowerThreshold')
上面这个例子是python的例子,不要在意这些细节,意思是这个意思。
补一个数据寻访字符串的使用:
下面这个例子是通过cmd命令创建单根NS光线
pStr = sprintf('NSRayAim xyz 0,0,0 xyz %f,%f,%f ',x,y,z);
returnCode = ltml.LTCmd(lt, pStr);
具体操作的命令可以通过:先鼠标手动操作一遍,再复制控制台里的命令行得到, 但是这种方法有时候会出蜜汁bug,就是复制过来的命令并不好使。
-------------------------------------------------------------------突然更新的分割线-----------------------------------------------------------------------------
用于获取
FREEFORM_SURFACE[FrontSurface]
括号中的名字
下面的代码基于.net
objlist = lt.DbList('COMPONENTS[1]', 'SOLID');
objsize = lt.ListSize(objlist);
for i = 1 : objsize
objkey = lt.ListNext(objlist);
objname = lt.DbGet(objkey, 'NAME');
disp(objname)
end
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Python-lighttools
方法1:使用第三方库ltapy
从GitHub下载库到本地,或参考官方文档直接git安装
GitHub - fellobos/ltapy: A Python interface to the LightTools API
官方文档
Welcome to ltapy’s documentation! — ltapy 1.0.0 documentation (fellobos.github.io)
在控制台里切换到ltapy所在目录,然后下述语句安装
$ cd ltapy
$ python setup.py install
连接到Lt
import ltapy.session
import ltapy.jslib
ses = ltapy.session.Session(pid = 14876)
jslib = ltapy.jslib
lt = ses.lt
ltjs = jslib.js
lt.Message("Successfully connected to LightTools!")
会缺几个库,按提示按装即可。
对于pythoncom这个库,直接pip找不到,实际安装的是pyWIN32。
方法2:win32com client
和方法一本质上应该差不多,需要安装pyWIN32这个库
import os
import win32com.client
lt=win32com.client.Dispatch('lighttools.ltapi4')
js=win32com.client.Dispatch('LTCOM64.JSNET')
SmoothOptical = win32com.client.Dispatch('LTCOM64.SmoothOptical')
这个方法比起方法1可以额外调用一些不在JSNET库里的内容,比如这个SmoothOptical
方法3:通过clr库
这个地方不能直接pip clr,直接pip clr安装的是一个名为clr的同名库,运行会报错,因为库里不含AddReference这个函数。正确的库名为pythonnet
import os
import clr
ltcom64=('C:\\Program Files\\Optical Research Associates\\LightTools 2022.03\\Utilities.NET\\LTCOM64.dll')
clr.AddReference(ltcom64)
import LTCOM64
lt=LTCOM64