lighttools api 数据访问

-------------------------------------------------分--割--线--------------------------------------------------------------------------------

连接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。

方法2win32com 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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值