export function newInstance(extend, className) {
const constructor = (initialValues = {}) => {
const model = {};
const publicAPI = {};
extend(publicAPI, model, initialValues);
return Object.freeze(publicAPI);
};
// Register constructor to factory
if (className) {
vtk.register(className, constructor);
}
return constructor;
}
//对象信息修改分发
modified()
onModified(callback)
//对象删除
delete()
isDeleted():boolean
//对象修改时间
getMTime();
//对象RTTI支持
isA(className);
getClassName();
//返回一个格式化对象用于序列化
getState()
所有的setter都是通过findSetter去生成一个对应setter,一个setter在调用的时候会调用对象modify方法通知对象更新:
function findSetter(field) {
if (typeof field === 'object') {
const fn = objectSetterMap[field.type];
if (fn) {
return (publicAPI, model) => fn(publicAPI, model, field);
}
vtkErrorMacro(`No setter for field ${field}`);
throw new TypeError('No setter for field');
}
return function getSetter(publicAPI, model) {
return function setter(value) {
if (model.deleted) {
vtkErrorMacro('instance deleted - cannot call any method');
return false;
}
if (model[field] !== value) {
model[field] = value;
publicAPI.modified();
return true;
}
return false;
};
};
}
abstract requestData()
setInputData(),
setInputConnection(),
getOutputData(),
getOutputPort()
它的输入输出一般都是vtkDataSet(通常是vtkPolydata)
export function algo(publicAPI, model, numberOfInputs, numberOfOutputs)
如这个是Source类的定义,表示这个是数据源,有0个输入1个输出
this.mapper.setInputData(this.coneSource.getOutputData());
这种方式获取的数据是一次性的,所以当数据修改后不会刷新显示
setInputConnection设置的是一个输出函数,输出函数会调用getOutputData()来获取输出数据。
getOutputPort是获取一个输出函数
使用它们的好处是每次render都会通过调用输出函数调用getOutputData重新获取数据,这样如果数据源有修改则会同步渲染。
一般的用法是
this.mapper.setInputConnection(this.coneSource.getOutputPort());
输出函数定义如下,其直接执行可以获取输出数据,同时有filter属性,可以访问这个输出数据的算法对象
function getOutputPort(port = 0) {
const outputPortAccess = () => getOutputData(port); //获取数据
// Add reference to filter
outputPortAccess.filter = publicAPI;
return outputPortAccess;
}
类似于下面这个接口的实现,下面这个是ts定义,
interface vtkOutputPort{
():void;
}
interface vtkOutputPortAccess extends vtkOutputPort{
filter:vtkAlgorithm;
}
publicAPI.requestData = (inData, outData) => {
const dataset = vtkPolyData.newInstance();
dataset.getPoints().setData(inData[0].getPoints().getData());
dataset.getLines().setData(inData[0].getLines().getData());
outData[0] = dataset;
};
requestData会在算法类对象update时调用请求重新计算输出数据,getOutputData()会调用update()
publicAPI.update = () => {
const ins = [];
if (model.numberOfInputs) {
let count = 0;
while (count < model.numberOfInputs) {
ins[count] = publicAPI.getInputData(count);
count++;
}
}
if (publicAPI.shouldUpdate() && publicAPI.requestData) {
publicAPI.requestData(ins, model.output);
}
};
function getOutputData(port = 0) {
if (model.deleted) {
vtkErrorMacro('instance deleted - cannot call any method');
return null;
}
if (publicAPI.shouldUpdate()) {
publicAPI.update();
}
return model.output[port];
}
文章浏览阅读251次。1:变量的规则定义变量规则:变量名=值shell定义变量的规则:1:等号两边不能有空格2:定义特殊的变量需要用单引号或者双引号结合3:定义linux命令需要用反单引号区分单引号和双引号的不同和相同点2:脚本的命名格式脚本名称使用.sh结尾3:脚本的起始行格式第一行必须写# !/bin/bash4:脚本输入输出格式1:输入语句用:read2:Shell输出值:echo $变量名5: 脚本的调用方式1:./脚本名.sh(权限的问题)方式2: sh 脚本名.sh比较运算符和逻辑运_shell:登录名和密码可以用文本文件存储,默认已有一个登录名admin,其密码为123456,
文章浏览阅读3w次,点赞7次,收藏8次。1. Ctrl + Alt + T 快捷键直接打开2. 在Ubuntu左上角选择File/Open in Terminal3. 快捷键alt+F2调出Run a Command,输入gnome-terminal4. 通过dash home这个按钮,输入te,就可以看到Terminal终端的选项了,如下图:_mate 桌面查看当前桌面所有终端
文章浏览阅读360次。写在前面:参考哔哩哔哩黑马程序员pink老师教程 地址:https://www.bilibili.com/video/BV1Sy4y1C7ha?t=41&p=4目录BOM 浏览器对象模型BOM 概述什么是 BOMBOM 的构成window 对象的常见事件窗口加载事件调整窗口大小事件定时器setTimeout() 定时器案例: 5秒后自动关闭的广告停止 setTimeout() 定时器setInterval() 定时器案例: 倒计时停止 .
文章浏览阅读2.6w次,点赞14次,收藏26次。echarts的y轴自适应,不从0开始最近写项目的时候画图工具用的esharts,还是比较不错,但是做一个折线图的时候遇到个问题。可以看到如果数值接近,那么曲线就不会很明显,最后找到个属性。scale:true加上之后就可以自由伸展了。option = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], }, yAxis_echarts y轴自适应
文章浏览阅读5.8k次。1.设置core文件大小1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文 件的时候,gdb会提示错误。可以将ulimit -c unlimited写入到.ba_linux查看core文件路径
文章浏览阅读626次。摘要:软件测试的类型通常分为白盒测试和黑盒测试,其中基于等价类的划分法与基于判定表的测试法都是较为典型和实用的黑盒测试技术方法。在实际工作中,为了使测试用例的覆盖更加全面,测试目的更加明确,通常不仅仅局限于某一种测试手段。针对等价类和判定表这两种方法各自的特点,可以将两者有机结合,通过对输入条件进行等价类划分,对输出行为进行判定表列举,用综合的手段进行软..._测试用例等价类和判定表合用
文章浏览阅读724次。Nano,Orangepi修改ip,和修改ip不生效问题总结。_nano改ip
文章浏览阅读590次。目前打算选用Retrofit2+RxJava2作为网络请求框架,下面从源码角度分析下这两个框架是怎么粘合在一起的。看完本文,你将会看到: - 动态代理模式在Retrofit中的运用。 - 抽象工厂模式在Retrofit中的运用。 - RxJava2如何和Retrofit结合实现网络请求模块。使用Retrofit实现网络请求定义一个Service接口//ht..._retrofit call flowable区别
文章浏览阅读7.5k次,点赞3次,收藏5次。出现这种情况,输入service iptables save命令,iptables启动正常_centos7安装了iptables但是无法启动
文章浏览阅读4.6k次。Qt单元测试--基本使用2018年03月19日 16:27:11zzwdkxx阅读数 332更多个人分类:Qt转自:http://blog.csdn.net/yizhou2010/article/details/78272505框架生成QtTestLib框架提供了一个简单易用的单元测试框架,首先我们通过Qt Creator自动创建一个测试框架。创建名为MyTest的..._qt单元测试
文章浏览阅读2.4k次,点赞13次,收藏6次。一、问题描述每次打开RDM的时候,只显示了更新提示窗口,而主窗口却并没有显示(双屏都没有显示),通过Alt + Tab检查发现,软件是正常打开的。二、解决办法首先按alt+tab键,确保该窗口处于激活位置(或者任务栏选中这个RDM) 然后再按alt+space键,激活控制菜单(注意快捷键别被占用,如:uTool快键键就是这个) 再按m键(按住不放),上下左右操作,将窗口移到屏幕中间位置即可三、相关图片..._为什么another redis desktop manager打开后是白屏
文章浏览阅读2.1k次。检查是否报错 ,是否将title等组件引入清除浏览器缓存(踩过的坑)_为什么 pyecharts的标题不显示