目录

  • 遗传算法求解3D打印中零件二维排布问题(MATLAB实现)
  • 一、遗传算法简介
  • 二、排样方法
    • 1.二维不规则排样
    • 2.编码及解码方式
  • 三、遗传算法求解
    • 1.算法建模
    • 2.遗传算子
      • 选择算子
      • 交叉算子
      • 变异算子
  • 四、实例
  • 五、MATLAB代码
  • 六、结语
  • 七、参考文献

遗传算法求解3D打印中零件二维排布问题(MATLAB实现)

增材制造是一种高效的并行制造方法,如何在有限的工作台面排布尽可能多的零件,是一个典型的N-P难题。遗传算法是一种全局最优化的数值优化方法,由于搜索过程不依赖梯度信息,不易陷入局部最优解,它适合解决各类优化问题,尤其是复杂的非线性问题。本文讨论了在二维状态下矩形件的排样问题,并将最低水平线法与遗传算法相结合对排样进行了优化,并给出了计算实例。


一、遗传算法简介

遗传算法是一种借鉴生物界自然选择思想和自然遗传机制的全局随机搜索算法。它把问题的可行解构成种群把每一个可能的解看作种群的个体运行时算法在整个解空间内随机搜索按一定的评估策略(或适应度函数)对每一个体作出评价不断地使用选择、交叉、变异这三种遗传算子使问题的解不断进化直至产生最优解。因为遗传算法在解决大空间、非线性全局寻优等复杂问题时具有传统方法所不具备的独特优越性所以它自1975年由美国学者J.H.Holland提出以来已经得到了广泛的研究和应用1
与传统优化方法相比,遗传算法的优越性主要体现在如下方面:遗传算法仅仅利用个体的适应度进行群体的进化,不需要优化模型中目标函数和约束函数的导数信息,因而具有极强的鲁棒性,适合解决各种优化问题。遗传算法利用设计变量编码在设计变量空间进行多点搜索,突变算子能避免交叉繁殖收敛于局部优良个体,并保持群体搜索的多样性,这些确保了遗传算法具有更强的全局寻优能力。此外由于遗传算法搜索过程中保持群体规模不变,因而具有潜在的并行性,所以它适合解决复杂的、大型的优化问题。本文尝试用遗传算法来解决这一典型的组合优化问题,首先给出排样优化的数学模型然后用遗传算法求解该模型寻找最优排样方案。

二、排样方法

1.二维不规则排样

二维排样就是在给定的平面区域内找出被排零件的最优布局,使得材料消耗最少,并且零件不能互相重叠,如图1所示。二维排样问题在工业生产中广泛存在:造船业中钣金件的裁切,服装制鞋行业中各种布料、皮革的裁剪;木材制品加工中加工各种家具时木材的裁切以及印刷业中各种书刊的排版均属于排样问题。由于材料费用在产品成本中占很大比重,提高材料利用率就意味着降低成本、提高效益,因而开展排样研究,寻求有效的排样方法具有很深远的理论意义和现实意义23。对于大批次的3D打印件来说,一般在打印前应该会依据打印件的高度进行分组,这样,同一批次的3D打印件应为高度相近的件,故三维问题即可简化成二维排样问题。

二维排样问题主要包括矩形排样、规则形状排样(如圆形、正多边形等特殊形状)以及不规则形状排样。在生产实践中,其排样优化目标函数一般为 或者 。前者表示材料利用率,即零件面积总和除排样后零件占用面积总和最大;后者表示零件排样后占用总高度或总长度最小。
不规则形状排样问题是平面排样中最复杂的问题,由于解空间太大,采用确定性算法己无法求解中等规模的排样问题,因此许多研究人员通过分阶段简化排样过程来最终求解该问题,最典型的一种简化方式是将不规则形状排样问题转化为较为简单的规则形状排样问题。其中应用最多的是最小包络矩形法,即将需要3D打印的零件投影在二维平面上,求出一个可以将其轮廓最小包络的矩形。并且对一些形状互补的零件通过平移、旋转等方法进行简单组合,对组合后的图形再求解最小包络矩形。这样二维平面零件排样问题就转化为矩形件的正交排样问题。本文将二维不规则件简化成最小包络矩形进行了下文所述排样优化。

2.编码及解码方式

用遗传算法求解问题,必然先要进行编码。不同的编码方法,遗传算子实现的方式也不同。可以十进制码方式,将每一矩形进行编号 i= 1,2,3…,n 零件编号构成一个整数串
P= {P1, P2, …,Pn } (pi≤n )表示了一种排样图(一个解) 。其中,每一位整数代表一个矩形,并且每一位整数可以有正负之分,正号表示零件不发生旋转,负号表示将零件旋转90度。这样一个整数串就是一个个体,每一个体对应一种排样图,m 个个体构成一个群体。
采用这种编码方法,每一矩形有横放、竖放两种方式。n个矩形的排列为n!,因此解空间的大小为 。虽然有些零件的包络矩形可能长、宽相等,其旋转、不旋转相同,但解空间仍很巨大,采用穷举法是很难求解的。
由遗传算法产生一个个体的编码后,整个算法的核心就是能否快速地求出其对应的排样图,得到所需板材的尺寸(长度、宽度、占用面积等) 是一个关键。同时,只有求得该个体对应的排样图后,才能计算适应度值,并对该个体进行评价、选择。综合查阅的文献资料,主要有以下几种解码方法:

  1. BL算法
    Step1. 将P1放在板材的左下角,若Pi为负值,则将其旋转90度后再排放,求出排放后所占板材的最大高度。
    Step2. 将Pi ( i= 2,3,…, n) 置于板材右边最大高度处交替向下向左移动Pi。首先尽可能地向下移动,然后再尽可能地向左移动直至Pi无法再向下向左移动为止(即接触到其它零件或板材边界)并求出此时的最大高度;重复上述过程直至所有零件排放完毕最后所得的最大高度即为所需板材的高度。
    排布图如图所示:

  2. “下台阶”算法
    Step1.将p1 零件排放在板材的左下角, 若p1 为负值则将其旋转90 度后再排放, 求出排放后所占板材的最大高度。
    Step2.将pi ( i= 2, 3, ⋯, n) 置于右边最大高度处, 向下向左移动pi , 且向下移动优先, 直至pi无法向下向左移动为止( 即接触到其他零件或板材边界) , 并求出此时的最大高度。重复上述过程, 直至所有零件排放完毕, 最后所得最大高度即为所需板材长度。其排样过程如图3所示, 就好像下台阶一样, 形象地称之为下台阶算法4

  3. 最低水平线法
    Step1. 设置初始最高轮廓线为板材的最下面的边.
    Step2. 每当要排入一个零件Pi时,就在最高轮廓线集中选取最低的一段水平线,如有数段,则选取最左边的一段,测试该段线的宽度是否大于或等于要排入零件的宽度:
    a. 如果该段线的宽度大于要排入零件的宽度,则将该零件在此位置排放,更新零件最高轮廓线;
    b. 否则,查询与最低水平线段相邻的左、右两段水平线,将最低水平线提升至与高度较低的一段平齐,更新零件最高轮廓线.
    重复Step2 直至能排入该零件.
    重复上述过程,直至所有零件排放完毕.
    对于编码{ 1 -2 3 -4} 采用该方法的排样过程如图所示. 在排放1,2 矩形后,最低水平线在最右端,要排矩形3时,此时最低水平线的宽度小于矩形件3的宽度,则提升该段与相邻的左段水平线平齐,这时最低水平线变成了靠左边的一段,将3排放,照此方法放入矩形45.
    由于该方法在排入零件时总是先查询排样图的高度轮廓线的最低水平线,故称之为 最低水平线法。显然,最低水平线法同样满足BL条件。

  4. 改进的最低水平线法
    Step1. 设置初始最高轮廓线为板材的最下面的边.
    Step2. 每当要排入一个零件Pi时,就在最高轮廓线集中选取最低的一段水平线,如有数段,则选取最左边的一段,测试该段线的宽度是否大于或等于要排入零件的宽度:
    a. 如果该段线的宽度大于要排入零件的宽度,则将该零件在此位置排放,更新零件最高轮廓线;
    b. 否则,从零件所在的位置起向后搜索一个可以放下的零件,同时交换这两个零件的位置。如果没有则将最低水平线提升至与高度较低的一段平齐,更新零件最高轮廓线。即:对于P={P1,P2,…Pi,…Pj,…, Pn},1<Pi<Pj<Pn,如果Pi的宽度大于最低水平线的宽度,则在{Pi+1,…,Pj…Pn}中搜索,如果Pj的宽度小于最低水平线的宽度,则将Pj排入。同时,P={P1,P2,…Pi,…Pj,…, Pn}更新为P={P1,P2,…Pj,…Pi,…, Pn}.
    重复Step2 直至能排入该零件.
    重复上述过程 直至所有零件排放完毕。

本文基于最低水平线法进行解码。

三、遗传算法求解

1.算法建模

因为遗传算法具有极强的全局寻优能力, 本文选用它来求解排样优化模型。按照达尔文的生物进化论,生物的进化是由上代生物群体繁殖产生下代生物群体!因此"对生物进化过程进行模拟的遗传算法的主要内容就是模拟生物群体的进化过程,其过程如图所示:利用遗传算法求解上述优化模型,包括如下几个步骤:

  1. 编码及初始化种群
    根据矩形件优化排样问题的特点,本文采用整数顺序编码方式:先将要排放的每一个生成的最小包络矩形件都统一进行编号,若不考虑矩形的旋转,则编号均为正,一个矩形零件的编号对应一个基因的编码。假设要排放的矩形零件总数为n,n个矩形零件的编号构成一个染色体。种群中每个染色体的长度与待排矩形零件总数相同,染色体中每个基因的编码对应相应矩形零件的编号,所有基因编码的一个排列顺序构成了一个染色体。
    初始种群的好坏对遗传算法的收敛速度和求解质量有很大的影响。常见的产生初始种群的方法是随机生成初始种群,这种方法简单,容易实现,但初始种群的优良程度得不到保证。由于忽略了板材数据和零件数据的具体特点,采用随机的方法产生初始群体很难获得较好的初始群体,即使经过较长时间的进化,也不容易得到令人满意的求解结果,最好采用启发式规则来产生初始种群。种群规模的大小对遗传算法的性能有一定影响。种群规模越大,群体中个体的多样性就越高,算法陷入局部解的危险性就越小,但种群的规模太大会使算法的计算量增加,从而影响算法的性能。种群的规模太小,会使遗传算法的搜索空间中分布范围有限,因而搜索可能停止在未成熟阶段。因此,为了避免早熟现象,必须保持群体的多样性,群体的规模不能太小。群体的规模一般在30~200之间,过大或过小均影响遗传算法的综合性能。
    本文通过产生1-10随机的整数排列来模拟10个基因,组成一个染色体,即一个个体。然后利用MATLAB生成100个这样的排列来模拟一个有100个个体的种群(每一行即为一个个体)。从而完成对种群的初始化。如图所示。

  1. 构造适应度函数
    适应度函数定义的好坏对问题的求解效果有很大影响。常见的定义适应度函数的方法有两种:一种方法主要是从排样图的最大高度方面考虑,要求尽量使排样图的最大高度值小,一般用最大高度值的倒数来表示。另一种方法主要是考虑废料再利用,要求尽可能的提高可再利用废料的利用率(可再利用废料是指处于排样图最高轮廓线和排样图最大高度水平线之间的部分)。本文考虑第一种方法构造适应度函数:

其中area 是排入矩形件的总面积,area1是排样图高度轮廓线以下的板材面积。这样,适应度值最高为1。即代表最密布排列。

2.遗传算子

选择算子

在生物的遗传和自然进化过程中,对生存环境适应程度较高的物种将有更多的机会遗传到下一代;而对生存环境适应程度较低的生物遗传到下一代的机会就相对较小。模仿这个过程,遗传算法使用选择算子(或称复制算子,Reproduction Operator)来对群体中的个体进行优胜劣汰操作:适应度较高的个体被遗传到下一代群体的概率较大;适应度较低的个体被遗传到下一代群体的概率较小。遗传算法中的选择操作就是用来确定如何从父代群体中按某种方法选取哪些个体遗传到下一代群体中的一种遗传运算。选择算子采用最优保存策略6。即当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它替换掉本代群体中经过交叉、变异等遗传操作后所产生的适应度最低的个体。具体操作过程是:
(1)找出当前群体中适应度最高的个体和适应度最低的个体。
(2)若当前群体中最佳个体的适应度比总的迄今为止的最好个体的适应度还要高,则以当前群体中的最佳个体作为新的迄今为止的最好个体。
(3)用迄今为止的最好个体替换掉当前群体中的最差个体。
本文选用的选择算子是在初始种群即父带群体经过交叉变异后形成的子代群体与原来的父带群体组成一个新的群体,求每个个体的适应度进行降序排序,保留适应度最高的一半个体作为新的父带群体进行交叉变异,循环迭代,层层选优。

交叉算子

遗传算法中起核心作用的是遗传操作的交叉算子。交叉是指把两个父代个体的部分结构加以替换重组而生成新的个体。交叉是产生新个体的主要方法,它决定了遗传算法的全局搜索能力。交叉概率一般取为0.4~0.99。
采用整数顺序编码的染色体中,染色体交叉的难点在于将两个染色体的部分基因片断互换后,会形成非法基因,即在染色体中会有重复的基因。在染色体交叉的实现过程中,既要使染色体发生交叉,又要保证交叉后的染色体不会出现重复的基因。
染色体交叉方法有如下两种:先通过产生随机数产生一个随机的交叉位置,在该点以前的基因不变,在该点以后的基因部分进行交叉。由于交叉后要保证一个染色体不能有相同的基因,故需要将两条染色体的不交叉的基因部分进行比较,在去掉两个基因片断中相同的基因后,将染色体不交叉部分剩下的基因按原来的顺序分别放入两个数组p[ ]和q[ ]中。在对染色体交叉部分的基因片断进行操作时,数组p[ ]或q[ ]中的基因所在列不进行交换。
例如,要进行交叉的两个染色体分别为A={1,2,3,4,5,6,7,8,9,10},B={2,1,3,5,6,4,9,8,10,7}:则交换过程如下所示:
(1)交叉前:

(2)对比不变部分的基因,将不同基因分别放在数组p[ ]和q[ ]中:则p[ ]={3}, q[ ]={7},则A对应5的基因的一列和B对应4的基因的一列也不能发生交换。

(3)交叉后的染色体变为:

但该方法会出现无法交叉的情况,如A中6与7交换位置后便无法进行交叉。
另一种方法是:将m 个父辈解群的个体进行自交叉操作, 产生m 个子辈个体, 具体操作方法如下: 设两个配对的个体为P= { p1 , p2 , ⋯, pn }在1~n 范围内随机选取两个整数p、q, 以p 为起点, q为终点,从P中拷贝q-p+1 个元素到其子辈个体P’作为前q-p+1个元素, 剩余的n-q 个元素按其在P中出现的次序依次拷贝到P’ , 从而产生出子辈个体P’。如下所示。本文采用第二种方法。

变异算子

变异算子是模拟生物在自然的遗传进化环境中由于各种偶然因素引起的基因模式突然改变的个体繁殖方式。利用变异算子增加了群体中基因模式的多样性,从而增加了群体进化过程中自然选择的作用,并能避免群体进化过程过早地陷入局部最优解。交叉算子和变异算子相互配合,共同完成对搜索空间的全局搜索和局部搜索,从而使遗传算法能够以良好的搜索性能完成最优化问题的寻优过程,变异概率一般取为0.0001~0.1。变异算子一般采用旋转变异或位置变异,假设要排放的零件总数为规旋转变异的思想是产生1n之间的一个随机数num,将该数取其相反数。位置变异的思想是产生1n之间的两个随机数numl、num2,将两个位置颠倒。
假设变异位置如下所示,则变异后的染色体为:

四、实例

根据上面的算法模型,用MATLAB作为开发工具,编写了利用遗传算法对二维矩形进行排样的程序。排样的矩形信息是随机给出,如下图所示:

左图中每行表示一个矩形,第1,2,3列分别表示矩形的水平宽度,竖直高度,以及面积。右图为对应矩形。
遗传算法模型的参数如图所示:


初始群体的大小为100,矩形件个数即染色体长度为10,边界宽度为20,最大迭代次数为200,交叉概率为0.6,变异概率为0.1。

迭代的过程如图所示:

从迭代的过程可以看出,适应度随着迭代的进行在不断增长,在100次迭代后适应度即趋于稳定。但很明显,最终的适应度是大于1的,这与适应度函数最高值为1是相矛盾的。分析原因,应为最高轮廓线的表示出了问题,导致矩形件发生重叠,导致排样后的最高轮廓线偏低。
运行程序其中一种排样结果为P={10,9,8,6,1,5,3,2,4,7},转化为排样图如下:

五、MATLAB代码

%%%%%%GA遗传算法二维矩形排样%%%%%%%%%%
%存在BUG:1.适应度会有大于1的,最高轮廓的问题,可能会有重叠
clc;
clear all;
%%%%%%%%%设定初值
population_size = 100;      % 种群大小
chromosome_size = 10;       % 染色体长度
bondaryxwidth=20;           % 边界宽度
generation_size = 200;      % 最大迭代次数
cross_rate = 0.6;           % 交叉概率
mutate_rate = 0.01;         % 变异概率
%%%%%%%%%初始化种群
%拟合10个矩形的长宽,面积信息
infor=[4 5 20;3 4 12;8 5 40;6 7 42;1 2 2;1 3 3;5 6 30;4 8 32;4 2 8;5 3 15;];
A=[1 2 3 4 5 6 7 8 9 10];%编码
[m,n]=size(A);
%产生初始种群
for i=1:population_sizeB=randperm(n);population(i,:) =A(:, B);  % 初始种群
end
for i=1:2*population_sizefitness(i)=0;
end
%开始迭代
for k=1:generation_size
originalpopulation=population;%父带%交叉算子步长为2 遍历种群
for i=1:2:population_size% rand<交叉概率,对两个个体的染色体串进行交叉操作if(rand < cross_rate)if(rand < cross_rate)cross_position = floor(rand * chromosome_size)+1;end_position=floor(rand * chromosome_size)+1;%若终点起点大小相反则交换 if(cross_position >end_position)temp=cross_position;cross_position =end_position;end_position=temp;endpcopy(i,:)=population(i,:);population(i,1:end_position-cross_position+1)= pcopy(i,cross_position:end_position);population(i,(end_position-cross_position+2):end_position)= pcopy(i,1:cross_position-1);    end  end
end%%%%%%%位置变异算子
for i=1:population_sizeif rand < mutate_ratemutate_position1= ceil(rand*chromosome_size);  % 变异位置1mutate_position2= ceil(rand*chromosome_size);  % 变异位置2tempv=0;if mutate_position1~= mutate_position2tempv=population(i,mutate_position2) ;population(i,mutate_position2) = population(i, mutate_position1);population(i, mutate_position1)=tempv;endend
end%%%%%%%选择算子
%父代和子代组成新种群,计算适应度
for i=1:population_size
newpopulation(i,:)=originalpopulation(i,:);
end
for i=1:population_size
newpopulation(i+population_size,:)=population(i,:);
end%%%%%%%解码以及适应度%初始化最高轮廓层
for i=1:chromosome_sizehighline(i,:)=[0,0,0];
end%最高轮廓线法计算适应度
for i=1:2*population_size%初始化
highline(i,:)=[0,0,bondaryxwidth];%x,y,length
templ=0;%更新X方向坐标
temph=0;
p=1;
%计算最高轮廓线
for j=1:chromosome_size
%     x= highline(i,3);x=bondaryxwidth; if infor(newpopulation(i,j),1)<=x && templ<bondaryxwidth;highline(j,:)=[templ,infor(newpopulation(i,j),2)+temph,infor(newpopulation(i,j),1)];%最高轮廓线集x,y,length templ=infor(newpopulation(i,j),1)+templ;%水平长度更新x=x-infor(newpopulation(i,j),1);elsezi=find(min(highline(1:j-1,2)));%找最低水平线位置x=highline(zi,3);               %更新待比较长度if infor(newpopulation(i,j),1)<=xx=x-infor(newpopulation(i,j),3);endtemph=temph+highline(zi,2);%最低水平线高度highline(zi,2)=infor(newpopulation(i,j),2)+temph;%更新最高轮廓线end
endend    %%%%%%适应度函数
sumarea=sum(infor(:,3)); %全排列总面积
c=max(highline(:,2));
fitness(i)=sumarea/(c*bondaryxwidth);%适应度%排序,产生新父代
[fitness,I]=sort(fitness,'descend');%降序排列
for i=1:population_size
population(i,:)=newpopulation(I(i),:);
end
py(k)=max(fitness);
end%plot
px=1:generation_size;
plot(px,py,'r-');
xlabel('generation');
ylabel('fitness');

六、结语

本文探讨了增材制造中矩形件排样优化问题的求解, 将其转化为排列问题, 实践了将排列转化为排样图的最低水平线算法, 并讨论了遗传算法的实现。从算例计算结果可见, 本文算法反映了遗传迭代寻优的过程,可以跳出局部最优解,最终有一个稳定的优化排布。但对于适应度还没有做出一个正确的计算,分析原因应为最低水平线算法中最高轮廓线的表示出了问题。故对于一个已知的最优排样图,虽然可以很容易地写出用BL算法、下台阶算法或改进的最低水平线算法排样所对应的最优排列, 但本文算法还不能将其求出, 这还有待于今后作进一步的研究改进。

七、参考文献


  1. 赵晓东, 米小珍. 遗传算法模型在矩形件排样优化中的应用[J]. 锻压技术, 2007, 32(6):153-156. ↩︎

  2. 刘萍, 陆金桂. 基于遗传算法的二维排样优化方法[J]. 南京工业大学学报(自科版), 2001, 23(5):9-12. ↩︎

  3. Zhang Y , Gupta R K , Bernard A . Two-dimensional placement optimization for multi-parts production in additive manufacturing[J]. Robotics and Computer-Integrated Manufacturing, 2016, 38©:102-117. ↩︎

  4. 刘德全, 滕弘飞. 矩形件排样问题的遗传算法求解[J]. 小型微型计算机系统, 1998(12):20-25. ↩︎

  5. 贾志欣, 殷国富, 罗阳. 二维不规则零件排样问题的遗传算法求解[J]. 计算机辅助设计与图形学学报, 2002, 14(5):467-470. ↩︎

  6. 卢齐飞, 唐平, 张光富, et al. 改进的遗传算法优化二维不规则图形排样[J]. 计算机工程与设计, 2013, 34(4). ↩︎

遗传算法求解3D打印中零件二维排布问题(MATLAB实现)相关推荐

  1. 二维排样规则算法php,一种实用的二维不规则零件排样算法

    I5JKI5L 您的论文得到相关企业家品评 一种实用的二维不规则零件排样算法 !"#$%&'()*('+!,)-./#0)*/1!+1-&*)23-45.6*3#/0*-/! ...

  2. 浩辰3D软件中零件仿真设计究竟有哪些优势?

    作为主流的国产3D软件,浩辰3D软件中提供了先进的仿真设计.下面给大家详细介绍一下浩辰3D软件在仿真设计方面都有哪些优势吧! 优势一:浩辰3D软件支持不同的研究类型.网格类型以及使用多个处理器 浩辰3 ...

  3. 二维有限元方程matlab,有限元法求解二维Poisson方程的MATLAB实现

    有限元法求解二维 Poisson 方程的 MATLAB 实现 陈 莲a ,郭元辉b ,邹叶童a ( 西华师范大学 a. 数学与信息学院; b. 教育信息技术中心,四川南充 6437009) 摘 要: ...

  4. scala中的二维数组_Scala中的多维数组

    scala中的二维数组 多维数组 (Multi-dimensional arrays) An Array that stores data in the form multidimensional m ...

  5. c ++创建二维数组_C ++中的二维数组

    c ++创建二维数组 介绍 (Introduction) A two-dimensional array in C++ is the simplest form of a multi-dimensio ...

  6. 二维数组在c语言中的作用,C语言中的二维数组

    1.二维数组的定义和引用 一. 数据类型 数组名[常量表达式1][常量表达式2]; (1)假如有个二维数组array[n][m],则行下标的取值范围0~n-1 (2)列下标的取值范围0~m-1 (3) ...

  7. 韦丹塔和富士康投资200亿美元兴建半导体工厂;精密陶瓷3D打印中日合资企业微瓷公司在景德镇成立 | 美通企业日报...

    美通社要闻摘要: 韦丹塔和富士康投资200亿美元兴建半导体工厂.精密陶瓷3D打印中日合资企业微瓷公司在景德镇成立.富士胶片向半固态电池研发商24M投资2000万美元.依维柯和现代汽车在汉诺威车展联合展 ...

  8. electron打印条形码、二维码

    功能:在electron打印条形码或者二维码 在百度搜索找不到合适的博客与插件,就在github上找到一个插件 electron-pos-printer 可以一键打印图片.文本.二维码.条形码.表格 ...

  9. 【干货#007】标签机打印小程序参数二维码的方法

    缘起 微信小程序参数二维码是针对小程序特定页面,设定相应参数,用户扫描后可以进入相应页面的方法,具有多种用途. 目前,有多种方式可以生成小程序二维码图片,然后直接打印出来.但在使用标签机打印二维码时, ...

最新文章

  1. vue 拷贝 数组_Vue实现对数组、对象的深拷贝、复制
  2. 米筐量化不支持c语言_量化 | 从零开始学量化(三):数据获取途径
  3. jqery获取每个月天数_三年级《年、月、日》单元重要知识点整理汇总,以及难点题型解析...
  4. .net excel循环插数据_[PaperReading]MEMC-Net 运动估计和运动补偿网络
  5. C#常用 API函数大全
  6. 注入技术--LSP劫持注入
  7. linux journalctl日志分析详解
  8. 计算机bios设置翻译,bios设置中文翻译的操作教程
  9. Python读取snappy后缀文件
  10. java对excel加密_java poi对Excel文件加密
  11. 【JavaScript】时间与时间戳相互转换
  12. qt对excel的基本操作
  13. ios 中字符串怎么换行
  14. 【安卓开机启动】安卓JVM加载so库流程
  15. K8s 架构简介(一)
  16. 古代地图的那些趣事儿
  17. 计算机科学技术考研录取人数,2021清华计算机科学与技术考研招生人数、考试科目、复试科目、分数线录取名单...
  18. 设置Windows本地DNS域名解析hosts
  19. three.js学习笔记(十九)——后期处理
  20. 用nodeMCU制作无线MIDI转换器

热门文章

  1. 互联网时代,知识付费行业发展空间巨大
  2. Android开发知识(二十三)从源码角度分析ListView的滑动复用机制
  3. springboot整合mybatisplus配置多数据源
  4. CSS技巧之向下箭头
  5. [转]科普 | 什么是宽表?
  6. C与C++中的常用符号与标点用法详解及实例
  7. D:\eclipse-workspace\.metadata\.plugins\org.eclipse.core.resources\.projects
  8. SQL Server辅助插件——SQL Prompt
  9. Cisco三层交换机配置命令及解释
  10. 输入一个包含若干数据的列表,先将列表中的数由小到大进行排序,然后将值为负数的元素进行平方运算