pom.xml文件带有删除线的解决方案

一、场景 当你创建的一个module(如springboot_sh),然后不符合需求,又重新创建一个同名的module(springboot_sh)时,就会发现pom.xml文件时代有删除线的。这种场景应该怎么处理呢? 二、解决方案 实际是由于前后两个module同名导致的,新的pom.xml是被忽略了。 第一步: 我们只要把<option value="$PROJECT_DIR$/springboot_sh/pom.xml" /> 复制粘贴到 <option name="originalFiles">的list中,并删除<option name="ignoredFiles">标签。 第二步:删除 springboot_sh.iml文件 通过以上两步就可以解决问题

【NODE.JS】多进程架构(一)——基本概念

nodejs遵循的是单线程单进程的模式 它是基于事件驱动、异步非阻塞模式的。 Node的单线程是指JS的引擎只有一个实例,且在nodejs的主线程中执行,同时node以事件驱动的方式处理IO等异步操作。Node的单线程模式,只维持一个主线程,大大减少了线程间切换的开销,但是会有多个worker线程,用于执行异步操作。Node的单线程使得在主线程不能进行CPU密集型操作,否则会阻塞主线程。对于CPU密集型操作,在node中通过 child_process 可以创建独立的子进程,父子进程通过IPC通信,子进程可以是外部应用也可以是node子程序,子进程执行后可以将结果返回给父进程。 目录 Master-Worker模式 创建子进程 进程间通信 Master-Worker模式 Node提供了 child_process 模块,同时提供了 child_process.fork() 函数实现进程复制。 Master-Worker模式 Master只负责调度和管理进程Worker只负责具体的业务处理 典型的分布式架构中用于并行处理业务的模式,具备较好的可伸缩性和稳定性。 通过fork() 复制的进程都是一个独立的进程,这个进程具有着独立而全新的V8实例。 它至少需要30ms启动和至少10MB的内存。为此fork()进程是昂贵的。 好在Node通过事件驱动的方式在单线程上解决了大并发的问题,这里启动多个进程只是为了充分将CPU资源利用起来,而不是为了解决并发问题。 创建子进程 方法描述spawn()启动一个子进程来执行命令exec()启动一个子进程来执行命令,与spawn() 不同的是其接口不同,它有一个回调函数获知子进程的状况execFile()启动一个子进程来执行文件fork()与spawn() 类似,不同点在于它创建Node的子进程只需指定要执行的JS文件模块既可 spawn() 与 exec()、execFile()不同的是,后两者创建时可以指定timeout属性设置超时事件,一旦创建的进程运行超过设定的时间将会被杀死。 exec() 与 execFile() 不同的时,exec() 适合执行已有的命令,execFile() 适合执行文件 var cp = require('child_process'); cp.spawn('node', ['worker.js']); cp.exec('node worker.js', fucntion (err, stdout, stderr){ // funciton }); cp.execFile('worker.js', function (err, stdout, stderr){ // funciton }); cp.fork('./worker.js'); 进程间通信 通过fork() 或者其他API,创建子进程后,为了实现父子进程之间的通信,父子进程之间将会创建IPC通道并使用message和send()传递消息。 IPC —— Inter-Process Communication,进程间通信。 目的是为了让不同的进程能够相互访问资源并进行协调工资,Node使用的技术是管道(pipe)技术 (着仅仅是字面上的称呼,和传统的不一样,具体细节实现由libuv提供) 在Windows下由命名管道(named pipe)实现,Linux则使用 Unix Domain Socket 实现。表现在应用层上的进程间通信只有简单的message事件和send()方法。

爬取医药卫生知识服务系统的药品数据——超详细流程

爬取医药卫生知识服务系统的药品数据——超详细流程 文章目录 爬取医药卫生知识服务系统的药品数据——超详细流程前言一、寻找药品数据二、爬取药品ID1.资源获取2.数据提取3.资源保存4.主函数5.总体代码 三、爬取药品信息1.加载资源ID2.获取数据3.数据提取4.保存信息5.主函数6.总体代码 小结 前言 最近,实验室的项目需要用到医药卫生知识服务系统的药品数据,查看发现该网站上的数据不少,手动采集数据比较麻烦,考虑使用网络爬虫,交由我来进行分析和爬取。 在我爬取药品数据的时候,发现该系统的数据是通过 AJAX 动态加载的,直接无脑复制 URL 使用 request.get 爬取的简单方式是行不通的。于是我爬取完之后写下这篇博客作为一个记录,也方便后来者进行学习。 医药卫生知识服务系统的网址是 https://med.ckcest.cn/ 我们点击右上方的 资源导航 -> 医药百科,进入药品目录页 可以看到这些药品数据都是我们需要的,网站进行了分页展示,每一页展示十条 点击第一条药品 氨己烯酸,就会在新的标签页中可以看到药品的详细数据,这是药品的详情页。 总的任务就是把所有药品数据都爬取下来,每一个药品数据都用单独一个文件进行保存。 请大家在这一步记住目录页和详情页是怎么找到的,之后的步骤中会直接提及这两个概念。 一、寻找药品数据 每一个药品都用了单独的标签页进行展示,那么每一个药品都会对应一个链接来获取数据,因此我们找到这些 URL 的规律就可以爬取了。 我们点开第一个药品 氨己烯酸 和第二个药品 奥卡西平的详情页,在浏览器的地址栏中观察两个药品的URL: https://med.ckcest.cn/details.html?id=5005884384970756&classesEn=wiki&searchValue= https://med.ckcest.cn/details.html?id=5005884384954370&classesEn=wiki&searchValue= 我们发现,URL仅在 id 部分发生了变化,其余完全相同。这意味着 id 即为每个药品数据的标识,我们只需要找到每个药品的 id ,对 URL 进行拼接就可以对应获取到单个药品数据了。 因此,我们只需要拿到所有药品的 id 信息,然后遍历每一条 id ,就能依次拿到所有药品的数据了。那么药品的 id 信息又从哪拿呢,我们可以通过药品目录页进行爬取。 接下来是具体的找 id 的步骤,这里我使用的是谷歌浏览器。注意,找数据是编写爬虫最关键的部分,这非常重要。 第一步,用谷歌浏览器进入药品目录页 第二步,按 F12 键,打开浏览器的控制台,转到 NetWork 部分。(可以看到此时 Network 部分什么数据都没有) 第三步,键盘按 F5 进行页面刷新,Network部分会加载该页面的全部数据 第四步,在控制台左侧的 Search 窗口搜索第一条药品的名字 氨己烯酸 可以看到,搜出了两个对应链接,我们分别点击链接,右侧的 response 会具体展示其数据。

Quartus II 18.1的下载安装和注册

前言 本文章主要教学Quartus II 18.1安装教学以及使用方法的介绍说明。 一、Quartus的下载 进入Quartus官网: 点击下载Windows版: 选择所需要的软件版本:(推荐使用18.1版本的) 下载Quartus软件包和ModelSim组件包: 下载器件库文件:(一般选择Cyclone4、5) 二、安装Quartus 完成上述下载操作后点击如下图所示的运行文件: 点击后即可进入以下安装界面: 选择“I accept”后点击“Next”: 选择安装地址路径: 选择需要安装的内容: 点击“Next”: 点击“Finish”: 安装设备驱动程序安装向导: 完成安装后,至此即可全部完成Quartus的安装: 三、Quartus的注册 在压缩文件夹中找到破解器: 将Quartus破解器复制到bin64文件夹下: 进入Quartus,找到并进入option界面,复制好NIC id: 找到license.dat文件复制到所安装的目录下: 打开license.dat文件,将NIC id复制到该文件中的“XXXXXXXXX”: 找到license.dat的地址复制到license file处: 点击OK后即可完成Quartus的注册:

pyinstaller 打包exe 防反编译(加密)

如果对安全性要求不高,可以选择直接将py文件,打包成exe即可,解压出来的是pyc文件,pyc文件还原成源码,也是有一定复杂度的,相对而言也是有一定的安全性的 在源文件同级目录下创建build文件 buidl_pyd.py # -*- ecoding: utf-8 -*- # @ModuleName: build_pyd # @Function: # @Author: darling # @Time: 2022-11-12 14:58 # -*- coding: utf-8 -*- from distutils.core import setup from Cython.Build import cythonize setup( name='any words.....', ext_modules=cythonize(["you_source_file.py", ] ), ) 打开cmd执行 python .\build_pyd.py build_ext --inplace 同级目录下会生成一个.pyd的文件you_source_file.cp39-win_amd64.pyd 修改成和源文件名一致 同级目录下创建一个main.py的入口文件 注意: 1、程序的__main__入口只能有一个,如果源py文件中有定义main入口,需要注释掉并调整代码缩进,否则通过main.py调用pyd文件遇到if name == ‘main’:之后的代码都不会运行。 2、源文件you_source_file.py文件头部import到的第三方库需全部复制到main.py文件头部,不然运行会闪退,相当于是,引用包没打进去 main.py # -*- ecoding: utf-8 -*- # @ModuleName: main # @Function: # @Author: darling # @Time: 2022-11-12 15:21 import hashlib import json import math import os import sys import time import urllib.

简单选择排序——C语言实现

选择排序思想:若按照递增顺序对顺序表进行排列,在n个元素的顺序表中,从第i(i=1)个元素开始遍历到第n-1个元素,在遍历过程中都将第i个元素依次与第i+1到第n个元素进行比较,确定最小的元素,如果最小的元素不是第i个元素则将其与最小的元素进行交换。 代码如下: #include<stdio.h> void select_sort(int a[],int n){ int i,j,min,temp=0; //变量i,j用来遍历数组,min用来标记最小值的位置,temp用于交换两个变量的值 for(i=0;i<n-1;i++){ //从第1个元素开始遍历到第n-1个元素 min=i; //每一轮遍历都先将i的值赋给min,默认a[i]是最小元素 for(j=i+1;j<n;j++){ //从第i+1开始遍历,并逐一与a[i]进行比较 if(a[min]>a[j]) //若a[min]>a[j]则将j的值赋给min,用来记录当前最小元素的位置 min=j; } if(min!=i){ //当a[i]与待比较的元素比较完后,若min的位置与i不一致 temp=a[i]; //那么就将最小的元素a[min]与a[i]进行交换 a[i]=a[min]; a[min]=temp; } } } int main(){ int a[]={6,2,1,3,4,5}; //初始化数组 int len=sizeof(a)/sizeof(a[0]); //用变量len接收数组长度计算出来 printf("排序前的数组:\n"); for(int i=0;i<len;i++) //遍历排序前的数组 printf("%d ",a[i]); printf("\n"); select_sort(a,len); //使用选择排序算法 printf("排序后的数组:\n"); for(int i=0;i<len;i++) //遍历排序后的数组 printf("%d ",a[i]); return 0; } 运行结果:

嵌入式linux驱动之路16:U-Boot 启动流程(1)

通过对 uboot 启动流程的梳理,我们就可以掌握一些外设是在哪里被初始化的,这样当我们需要修改这些外设驱动的时候就会心里有数。另外,通过分析 uboot 的启动流程可以了解 Linux 内核是如何被启动的。 二级标题链接脚本 u-boot.lds 要分析 uboot 的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入口。 为代码当前入口点:_start,_start 后面就是中断向量表,此代码存放在.vectors 段里面。 打开 u-boot.lds,内容如下: 第 12 行将 arch/arm/cpu/armv7/start.s 编译出来的代码放到中断向量表后面。 第 13 行为 text 段,其他的代码段就放到这里。 _start 文件 如图 : 打开 u-boot.map,如图: 从图可以看出,vectors 段的起始地址也是 0X87800000,说明整个 uboot 的起始地址就是 0X87800000 U-Boot 启动流程详解 reset 函数 reset 函数经过几次跳转跳转到 save_boot_params_ret 函数,读取寄存器 cpsr 中的值并修改,设置处理器进入 SVC 模式并关闭 FIQ 和 IRQ,然后读取 CP15 中 c1 寄存器的值到 r0 寄存器中即读取SCTLR 寄存器的值,清除 SCTLR 寄存器中的 bit13,bit13 为 向量表控制位,当为 0 的时候向量表基地址为 0X00000000,软件可以重定位向量表。为 1 的时候向量表基地址为 0XFFFF0000,软件不能重定位向量表。这里清零,目的就是为了接下来的向量表重定位。然后设置r0寄存器的值为_start,_start就是整个uboot的入口地址,将 r0 寄存器的值(向量表值)写入到 CP15 的 c12 寄存器中,也就是 VBAR 寄存器。接着调用函数 cpu_init_cp15 用来设置 CP15 相关的内容,比如关闭 MMU 啥的,调用函数 cpu_init_crit 内部调用了函数 lowlevel_init(设置SP指针)lowlevel_init函数后面又调用了s_init函数,但什么也没有做;调用流程为:

Android Studio 海豚版本运行完显示安装成功,但是没有图标!

Android Studio 海豚版本运行完显示安装成功,但是没有图标! 背景:原因: 背景: 代码绝对正确,release包debug包正常,as刚刚更新,运行变成桌面没有,但是应用管理有个无法安装的包。 不小心点到run 看了一下名字,是以插件化在run了 原因: 这里是插件化运行了!!!!!!!!!!,改成run 以app变异就行!!

connect: 网络不可达

connect: 网络不可达 的解决方案 1 .虚拟机的配置 2.设置网络 要确保虚拟网卡与主机在同一网段中 3. 确保开启dhcp 4. 解决 connect: 网络不可达 问题 1)su 切换成root 用户 2)打开网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 3)重启 network 服务 service network restart

MySQL触发器

介绍 触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操作 。 使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。 创建触发器 语法结构 : create trigger trigger_name before/after insert/update/delete on tbl_name [ for each row ] -- 行级触发器 begin trigger_stmt; end; 1)示例需求: 通过触发器记录 emp 表的数据变更日志 , 包含增加, 修改 , 删除 ; 2)首先创建操作表和日志表 : create table emp_logs( id int(11) not null auto_increment, operation varchar(20) not null comment '操作类型, insert/update/delete', operate_time datetime not null comment '操作时间', operate_id int(11) not null comment '操作表的ID', operate_params varchar(500) comment '操作参数', primary key(`id`) )engine=innodb default charset=utf8; create table emp( id int(11) not null auto_increment , name varchar(50) not null comment '姓名', age int(11) comment '年龄', salary int(11) comment '薪水', primary key(`id`))engine=innodb default charset=utf8 ; insert into emp(id,name,age,salary) values(null,'金毛狮王',55,3800),(null,'白眉鹰王',60,4000),(null,'青翼蝠王',38,2800),(null,'紫衫龙王',42,1800); 3)创建 insert 型触发器,完成插入数据时的日志记录 :(插入是new)

gdb如何查看指针指向的是具体基类实例还是派生类实例

我们在调试过程中经常遇到类似的问题,即如何获取基类指针实际指向内存的实例是基类类型还是派生类类型,我们知道在C++中我们可以通过typeid和dynamic_cast来获取指针具体指向对象类型是基类,或者是哪个派生类。那么在gdb调试时,我们能够获取具体指向内存的类型吗?答案是可以的,我们来给出一个实例,先给出代码,文件inherit.cc: class Animal { public: Animal():animalAge(11) {} virtual void Foo(){ }; virtual void Boo(){ }; private: int animalAge; }; class Fish: public Animal { public: Fish():fishAge(22){} virtual void Foo(){ } int fishAge; }; class GoldFish: public Fish { public: GoldFish():goldFishAge(33){} virtual void Foo(){ } int goldFishAge; }; int main() { Animal *p1 = new Animal(); Animal *p2 = new Fish(); Animal *p3 = new GoldFish(); return 0; } 编译的时候,加上-g:

图像处理—灰度图像转为伪彩色图像

目录 一、算法简介二、代码实现三、实验效果 一、算法简介 对于单通道灰度图转换成伪彩图像,本质上是将一种灰度映射为一种颜色。在RGB色彩显示体系下,就是将0-255 中的256种灰度梯度一 一 对应为256种颜色。 示意图如下: 二、代码实现 主要原理就是利用算法将不同灰度的像素点转换为不同颜色的像素点。 将灰色亮度小于64的像素点颜色置为Red=0,Green=4R,Bule=255; 亮度为65-128 的像素点颜色置为 Red=0,Green=255,Bule=510-4R; 亮度为129-192 的像素点颜色置为 Red=4 * R - 510,Green=255,Bule=0; 亮度为65-128 的像素点颜色置为 Red=255,Green=1020 - 4*R,Bule=0; 我这里用的就是以上的这种转换公式,可根据使用场景修改。 private void but_colorful_Click(object sender, EventArgs e) { if (pictureBox1.Image == null) { MessageBox.Show("错误,没有导入图片!"); return; } bt1 = new Bitmap(pictureBox1.Image); bt2 = new Bitmap(pictureBox1.Image); int Red, Green, Blue; for (int i = 0; i < bt1.Width; i++) { for (int j = 0; j < bt1.

记录|M1 Pro mps跑模型LeNet和AlexNet

记录M1 Pro芯片Macbook Pro mps跑模型 设置pytorch的模式LeNetAlexNet 设置pytorch的模式 设置mps才会用到gpu,一般Nvidia的那种方法没用,还是run on cpu device = torch.device("mps") 然后把device参数传进网络模型 LeNet AlexNet 网络结构: 经历了很长一段时间才开始画图。。 风扇从过了4个epoch开始叫得有点可怕 电量也开始掉 其实看网络的情况,是比当时毕设跑的那个output10000+的好很多的 内存压力也不大,主要都被我开着的虚拟机给占了 gpu的占比从70+、80+到90+,cpu占比20+,不会再往上。不是很懂芯片设计。 跑完了,风扇声也停了。

磁盘篇 - linux磁盘信息查看

1、mount 查看磁盘挂载情况,框框里的字段表示磁盘为可读写状态,如果是read-only 就需要修复了,只读不能写入。 2、lsblk 列出所有可用块设备的信息(list block) 3、blkid 查询UUID 4、mount -a 的意思是将/etc/fstab的所有内容重新加载。一家在的则忽略 5、fdisk -l 查看机器所挂硬盘个数及分区情况;

【名人问题】有 n 个人他们之间是否认识用邻接矩阵表示(1表示认识,0表示不认识),并且 A 认识 B 并不意味着 B 认识 A,名人定义为他不是认识任何人且所有人都认识他的人。求出所有名人。

名人问题 题目一、思路二、题解代码测试数据 题目 n个人中的名人是指这样一个人:他不认识别人,但是每个人都认识他。任务就是找出这样一个名人,但只能通过询问“你认识他/她吗?”这种问是来完成。设计一个高效算法,找出该名人或者确定这群人中没有名人。你的算法在最坏情况下需要问多少个问题? 一、思路 根据题目知道,所有人都要认识名人,名人所有人都不认识。所以只能有一个名人。 用二维数组arr[i][j] 表示 i 是否认识 j ------arr[i][j] =1表示 i 认识 j ------arr[i][j] =0表示 i 不认识 j 所以思路就是: ------arr[i][j] =1时,i 一定不会是名人,j暂时无法判断。 ------arr[i][j] =0时,j 一定不会是名人,i 暂时确定不了。 即if(arr[i][j] ==1)我就可以把编号为 i 的人丢掉了,反之丢掉j。 我没有写不存在名人的情况,名人的位置为输入的编号。其他人对应的------arr[i][j] 随机取的值。 按照上面的思路,如果名人不存在的情况不能确定栈中最后的人是不是名人,还需遍历判断一下。 二、题解代码 public static int select(int arr[][],int n) { /* * 查找名人 * arr[i][j]=1表示i认识j * arr[i][j]=0表示i不认识j * */ if (n<=1) return 0; int count = 0; Stack<Integer> stack = new Stack<>(); for (int i = 0; i < n; i++) stack.

[Codeforces] games (R1600) Part.1

[Codeforces] games (R1600) Part.1 题单:https://codeforces.com/problemset?tags=games,1201-1600 74B. Train 原题指路:https://codeforces.com/problemset/problem/74/B 题意 ( 2 s 2\ \mathrm{s} 2 s) 偷渡者(Stowaway)和管理员(Controller)在火车上玩游戏.火车有编号 1 ∼ n 1\sim n 1∼n的 n n n节车厢,其中 1 1 1号车厢是头, n n n号车厢是尾.火车每分钟处于运行或停靠状态.每分钟两个玩家都会移动,且偷渡者先移动.任意时刻两玩家都知道对方的位置. 管理员有一个移动方向——朝着火车头或火车尾.每分钟他会移动到他的移动方向的下一节车厢,当他在 1 1 1号或 n n n号车厢时转向. 偷渡者的移动与火车的状态有关.若火车该分钟处于运行状态,则偷渡者可移动到相邻的一节车厢或留在所处车厢;若火车处于停靠状态且不是终点站,他会下车并从任一节车厢上车.若火车停靠若干分钟,则每分钟他都会下车再重新上车. 若某一分钟偷渡者和管理员处于同一节车厢,则管理员胜.若到终点站后偷渡者仍未负,则偷渡者胜.若偷渡者负,则希望他尽量晚负.两人都采取最优策略,问最后的胜者.若管理员胜,需他抓到偷渡者的分钟数(从 1 1 1开始). 第一行输入三个整数 n , m , k ( 2 ≤ n ≤ 50 , 1 ≤ m , k ≤ n , m ≠ k ) n,m,k\ \ (2\leq n\leq 50,1\leq m,k\leq n,m\neq k) n,m,k (2≤n≤50,1≤m,k≤n,m=k),分别表示火车的车厢数、偷渡者的初始位置、管理员的初始位置.

leecode每日一题11.9(面试题16.24 数对和)

题解:利用hashmap,以数组中元素为健,以数组中元素出现次数为值。 (1)循环数组中各个元素 i ,判断 target - i 是否出现在hashmap中,即以target - i 为键对应的值是否大于0,因为键有不存在的可能,所以使用getOrDefault函数判断。 if(table.getOrDefault(target-i,0)>0) (2)若出现则将 i 与 target - i 存入目标列表中,并将target - i 的出现次数 即 target - i 键对应的值减1. (3)若不存在则将 i 作为键存入hashmap中,出现次数加1. 完整代码块: class Solution2{ public List<List<Integer>> pairSums(int[] nums,int target){ Map<Integer,Integer> table=new HashMap<>(); List<List<Integer>> res=new ArrayList<>(); for(int i:nums) { if(table.getOrDefault(target-i,0)>0){ List<Integer> list = new ArrayList<>(); list.add(target-i); list.add(i); res.add(list); table.put(target-i, table.getOrDefault(target-i,0)-1); } else{ table.put(i,table.getOrDefault(i,0)+1); } } return res; } }

Java基础课程设计——DVD管理器

一、DVD管理器项目介绍 基于java的DVD管理器实现,功能如下:新增DVD,查看DVD,删除DVD,借出DVD,归还DVD,退出DVD 二、代码实现 1、创建三个类 DVD:存放DVD属性 DVDManager:用来实现DVD管理器的功能 Test:测试运行DVD管理器 2.DVD类代码 package com.java17; public class DVD { //书名 String name; //借出次数 int count; //图书借出状态 String status="可借"; //借出日期 String data = ""; } 3.DVDManager类代码 package com.java17; import java.util.Scanner; public class DvdManager { //存储DVD DVD[] dvdList = new DVD[50]; Scanner sc = new Scanner(System.in); //初始化数据 public void initial(){ dvdList[0] = new DVD(); dvdList[0].name = "水浒传"; dvdList[0].count = 1; dvdList[0].status = "借出"; dvdList[1] = new DVD(); dvdList[1].

Path对象报错AttributeError: ‘PosixPath‘ object has no attribute ‘endswith‘

我遇到这个问题是在使用vedo进行点云可视化的过程中,虽然只是个小小的路径问题,但卡了我大半天。 具体解决方法是,在出错的调用前,将Path对象转为字符串对象。如下所示,我添加了filename= str(filename)后,问题完美解决。 if not vedo.plotter_instance or not vedo.plotter_instance.window: vedo.logger.error("in screenshot(), rendering window is not present, skip.") return vedo.plotter_instance filename= str(filename) if filename.endswith(".pdf"): writer = vtk.vtkGL2PSExporter() writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() writer.SetSortToBSP() writer.SetFileFormatToPDF() writer.SetFilePrefix(filename.replace(".pdf", "")) writer.Write() return vedo.plotter_instance ########## if filename.endswith(".svg"): writer = vtk.vtkGL2PSExporter() writer.SetRenderWindow(vedo.plotter_instance.window)