Commit f93a9d21 authored by Scott Sun's avatar Scott Sun

scott

parent 5933807f
node_modules/
\ No newline at end of file
# ZDA cam workflow
## input流程
* 导入资料 自动导入第一个tgz gerber的手动操作
* 更改层名和排序 需要改名排序规则 暂未加ui
* 层对齐 (使用公共脚本)
* 资料归零点(会创建outline层 profile)
* 核对客户MAP(手动步骤)
* 保存料号
* 上传层结构
## net流程
* 拷贝net step
* 制作outline定义profile(上面步骤已经做了,删除)
* 去除成型线外内容
* 复合层合并
* 阻焊转pad 线路转pad (公共脚本)
* 设置smd/bga (仅设置smd)
* 设置孔属性 (无规则)
* 孔对齐
* 创建网络信息
* 比对原稿(公共脚本)
* 保存料号
## 钻孔流程
* 拷贝edit step
* 参考MAP图纸检查钻孔(手动步骤)
* 去除重孔
* 大孔转outline
* 钻孔补偿
* 钻孔添加辅助孔 (预钻孔添加)
* 短槽孔 (预钻孔添加)
* 导引孔 (预钻孔添加)
* BGA区域分刀(放大)
* 钻孔分刀
* 钻孔分析
* 核对钻孔试算表(手动步骤)
* 生成 np pth via层
* 原稿比对
* 保存料号
## 内层流程
* 负片散热pad (未重构)
* 负片转正片
* 转铜皮(公共脚本)
* 挑选阻抗线(公共脚本)
* 去除无功能pad
* 原稿预分析
* 内层补偿
* Ring优化
* 优化削铜(公共脚本)
* 补铜桥
* 内层削间距
* 内层添加泪滴
* 内层补细丝
* 内层文字处理 todo
* 捞槽区铺铜
* 内层分析
* 网络比对
* 比对原稿
* 产生mirror step并link层别 todo
## Array流程
* 创建step
* step拼版
* 制作array outline并倒R角
* 制作v-cut line 测试PAD
* 更新原稿折断边
* 添加折断边辅助孔/光学点
* 内层折断边铺铜
* 检查array资料不可进pcs
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*
NAME:
DESCRIPTION: 导出gerber;
PARAMETER:
[
{
name : 'step',
title : 'step',
type : 'LineEdit',
property : {tool_tip : '目标step,默认是orig'},
},
{
name : 'export_path',
title : 'export_path',
type : 'LineEdit',
property : {tool_tip : '目标step,默认是orig'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-09-01 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 导出gerber </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> step信息 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>template");
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
}
}
var Status = 'ok';
var resultData = [];
var par = PAR;
var default_par = {
step: "edit",
export_path:"C:/Users/ADMINI~1/Desktop/jobs/demo",
auto_save: "No",
units:"mm"
}
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job;
try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
var stepList = GEN.getStepList({job:job})
stepList = stepList.filter(function(step){
var reg = new RegExp(par.step,"ig")
return reg.test(step)
})
var matrix = GEN.getMatrix({job:job});
stepList.forEach(function(step){
var excellon = [];
var gerber = [];
fs.mkdir(par.export_path + "/" + step)
for (var key in matrix) {
var info = matrix[key];
if(!GEN.isLayerEmpty({job:job,step:step,layer:key})){
if(info.layer_type == "drill"){
excellon.push(key)
} else {
gerber.push(key)
}
}
}
if(gerber.length){
GEN.COM("output_layer_reset")
gerber.forEach(function(v){
GEN.COM("output_layer_set,layer="+v+",angle=0,mirror=no,x_scale=1,y_scale=1,comp=0,polarity=positive,setupfile=,setupfiletmp=,line_units=inch,gscl_file=,step_scale=no")
})
GEN.COM("output,job="+job+",step="+step+",format=Gerber274x,dir_path="+par.export_path + "/" + step+",prefix=,suffix=.art,break_sr=yes,break_symbols=no,break_arc=no,scale_mode=all,surface_mode=fill,min_brush=1,units=inch,coordinates=absolute,zeroes=none,nf1=2,nf2=4,x_anchor=0,y_anchor=0,wheel=,x_offset=0,y_offset=0,line_units=inch,override_online=yes,film_size_cross_scan=0,film_size_along_scan=0,ds_model=RG6500")
}
if(excellon.length){
GEN.COM("output_layer_reset")
excellon.forEach(function(v){
GEN.COM("output_layer_set,layer="+v+",angle=0,mirror=no,x_scale=1,y_scale=1,comp=0,polarity=positive,setupfile=,setupfiletmp=,line_units=inch,gscl_file=,step_scale=no")
})
GEN.COM("output,job="+job+",step="+step+",format=Excellon2,dir_path="+par.export_path + "/" + step+",prefix=,suffix=.drill,break_sr=yes,break_symbols=yes,break_arc=no,scale_mode=all,surface_mode=fill,min_brush=1,units=inch,coordinates=absolute,decimal=no,zeroes=none,nf1=2,nf2=4,modal=yes,tool_units=inch,optimize=no,iterations=5,reduction_percent=1,cool_spread=0,x_anchor=0,y_anchor=0,x_offset=0,y_offset=0,line_units=inch,override_online=yes,canned_text_mode=break")
excellon.forEach(function(v){
GEN.COM("ncset_create,name=_1_tmp__+++_")
GEN.COM("ncset_cur,job="+job+",step="+step+",layer="+v+",ncset=")
})
}
})
// 保存
if(/yes/ig.test(par.auto_save)){GEN.checkInout({job:job,mode:"out"}); GEN.saveJob({ job: job });GEN.checkInout({job:job,mode:"in"});GEN.closeJob({job:job});} else {GEN.checkInout({job:job,mode:"in"})}
if (mode === "aimdfm") {
$.QDfm.updateRow({table: "pdm_aimdfm_task",data: {progress: 33.33},where: { id: $.task_id }});
if (GEN.hasError()) { Status = 'error';resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {status: Status,result_data: resultData};
} else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return {status: Status,result_data: resultData}; }
}else { return "Done" }
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
\ No newline at end of file
This diff is collapsed.
/*
NAME:
DESCRIPTION: 钢网资料输出;
PARAMETER:
[
{
name : 'step',
title : 'step',
type : 'LineEdit',
property : {tool_tip : '目标step,默认是orig'},
},
{
name : 'orig_step',
title : 'orig_step',
type : 'LineEdit',
property : {tool_tip : '原稿step名称'},
},
{
name : 'export_path',
title : 'export_path',
type : 'LineEdit',
property : {tool_tip : '目标step,默认是orig'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-09-01 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 钢网资料输出 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> step信息 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>template");
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
}
}
var Status = 'ok';
var resultData = [];
var par = PAR;
var default_par = {
orig_step:"orig",
step: "step",
export_path:"C:/Users/ADMINI~1/Desktop/jobs/demo",
auto_save: "No",
units:"mm"
}
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job;
try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
var stepList = GEN.getStepList({job:job})
stepList = stepList.filter(function(step){
var reg = new RegExp(par.step,"ig")
return reg.test(step)
})
if(!GEN.isStepExists({job:job, step:par.orig_step})){
throw "原稿step:" + par.orig_step + "不存在";
}
var matrix = GEN.getMatrix({job:job})
var layers = [];
for (var key in matrix) {
var info = matrix[key];
if(info.context == "board" && /silk_screen|solder_mask|solder_past|signal/.test(info.layer_type)){
layers.push(key)
}
}
stepList.forEach(function(step){
if(GEN.isStepExists({job:job, step:step})){
var substeps = GEN.getSubSteps({job:job,step:step});
substeps.forEach(function(substep){
if(substep){
// 将原稿的board 文字防旱锡膏线路 层拷贝到这些substep里
GEN.openStep({job:job, name:substep})
layers.forEach(function(v){
GEN.copyLayer({source_job:job,source_step:par.orig_step,source_layer:v,dest_layer:v,mode:"replace"})
})
GEN.closeStep()
}
})
// 导出step
fs.mkdir(par.export_path + "/" + step)
if(layers.length){
GEN.COM("output_layer_reset")
layers.forEach(function(v){
GEN.COM("output_layer_set,layer="+v+",angle=0,mirror=no,x_scale=1,y_scale=1,comp=0,polarity=positive,setupfile=,setupfiletmp=,line_units=inch,gscl_file=,step_scale=no")
})
GEN.COM("output,job="+job+",step="+step+",format=Gerber274x,dir_path="+par.export_path + "/" + step+",prefix=,suffix=.art,break_sr=yes,break_symbols=no,break_arc=no,scale_mode=all,surface_mode=fill,min_brush=1,units=inch,coordinates=absolute,zeroes=none,nf1=2,nf2=4,x_anchor=0,y_anchor=0,wheel=,x_offset=0,y_offset=0,line_units=inch,override_online=yes,film_size_cross_scan=0,film_size_along_scan=0,ds_model=RG6500")
}
}
})
// 保存
if(/yes/ig.test(par.auto_save)){GEN.checkInout({job:job,mode:"out"}); GEN.saveJob({ job: job });GEN.checkInout({job:job,mode:"in"});GEN.closeJob({job:job});} else {GEN.checkInout({job:job,mode:"in"})}
if (mode === "aimdfm") {
$.QDfm.updateRow({table: "pdm_aimdfm_task",data: {progress: 33.33},where: { id: $.task_id }});
if (GEN.hasError()) { Status = 'error';resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {status: Status,result_data: resultData};
} else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return {status: Status,result_data: resultData}; }
}else { return "Done" }
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
\ No newline at end of file
This diff is collapsed.
/*
NAME:
DESCRIPTION: 导入资料;
PARAMETER:
[
{
name : 'path',
title : '料号路径',
type : 'LineEdit',
property : {tool_tip : 'path'},
},
{
name : 'delJob',
title : '料号存在是否删除',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-09-01 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 导入资料 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> step信息 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>template");
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
}
}
var Status = 'ok';
var resultData = [];
var par = PAR;
var default_par = {
auto_save: "No",
delJob:"yes",
units:"mm"
}
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job;
try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
var job_path = par.path;
if(!par.path || par.path == ""){throw "无料号路径"}
var dirs = fs.listDir(job_path, 1).filter(function(item){return item.type == "dir"})
var jobDir = dirs.filter(function(v){return v.name === job})
if(jobDir.length > 0){
var jobFiles = fs.listDir( jobDir[0].path, -1)
var otherFiles = jobFiles.filter(function(file){return file.completeSuffix != "tgz"})
jobFiles = jobFiles.filter(function(file){return file.completeSuffix == "tgz"})
if(GEN.isJobExists({job:job}) && /yes/.test(par.delJob) ){GEN.deleteJob({job:job})}
if(jobFiles.length > 0) {
GEN.importJob({db:'genesis',path:jobFiles[0].path,name:job,analyze_surfaces:'yes'})
} else {
GEN.createJob({name:job, db:"genesis"})
GEN.createStep({job:job, name:"orig"})
GEN.COM("input_show_page")
GEN.COM("input_set_params,path=" + jobDir[0].path + ",job=" +job + ",step=orig")
// otherFiles.forEach(function(item){ // ?
// GEN.COM("input_identify,path=" + item.path + ",job=" +job)
// })
}
}
// 保存
if(/yes/ig.test(par.auto_save)){GEN.checkInout({job:job,mode:"out"}); GEN.saveJob({ job: job });GEN.checkInout({job:job,mode:"in"});GEN.closeJob({job:job});} else {GEN.checkInout({job:job,mode:"in"})}
if (mode === "aimdfm") {
$.QDfm.updateRow({table: "pdm_aimdfm_task",data: {progress: 33.33},where: { id: $.task_id }});
if (GEN.hasError()) { Status = 'error';resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {status: Status,result_data: resultData};
} else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return {status: Status,result_data: resultData}; }
}else { return "Done" }
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
/*
NAME:
DESCRIPTION: 设置零点;
PARAMETER:
[
{
name : 'step',
title : 'Step',
type : 'LineEdit',
property : {tool_tip : 'orig'},
},
{
name : 'outline',
title : '外形层',
type : 'LineEdit',
property : {tool_tip : '外形层,默认是ol'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 设置零点 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 资料路径 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>rename and sort");
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
}
}
var Status = 'ok';
var resultData = [];
var par = PAR;
var default_par = {
outline:"ol",
step:"orig",
auto_save: "No",
units:"mm"
}
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job;
try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
var orig_step = par.step.toLowerCase()
var stepList = GEN.getStepList({job:job})
if(stepList.indexOf(orig_step) < 0){throw "step:"+orig_step+"不存在"}
var outline = par.outline;
// 判断参考层(outline)是否存在并不为空
if(!GEN.isLayerExists({job:job,layer:outline})){throw "outline不存在"}
stepList.forEach(function(step){
GEN.openStep({job:job,name:step})
GEN.units({type:par.units})
// 将所有物件依据外形移动到零点
GEN.workLayer({name:outline,display_number:2,clear_before:'yes'})
GEN.selAllFeat()
if(GEN.getSelectCount()>0){
GEN.selClearFeature()
var outline_symbol = GEN.getProfileLimits({job:job,step:step,units:'mm'})
GEN.affectedLayer({affected:"yes",mode:"all"})
GEN.selAllFeat()
GEN.selMove({dx:-outline_symbol.xmin,dy:-outline_symbol.ymin})
GEN.affectedLayer({affected:"no",mode:"all"})
// 重新设置profile
GEN.selCreateProfile()
GEN.clearLayers()
GEN.selClearFeature()
} else {
throw "outline无物件"
}
})
// 保存
if(/yes/ig.test(par.auto_save)){GEN.checkInout({job:job,mode:"out"}); GEN.saveJob({ job: job });GEN.checkInout({job:job,mode:"in"});GEN.closeJob({job:job});} else {GEN.checkInout({job:job,mode:"in"})}
if (mode === "aimdfm") {
$.QDfm.updateRow({table: "pdm_aimdfm_task",data: {progress: 33.33},where: { id: $.task_id }});
if (GEN.hasError()) { Status = 'error';resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {status: Status,result_data: resultData};
} else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return {status: Status,result_data: resultData}; }
}else { return "Done" }
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
/*
NAME:
DESCRIPTION: 拷贝net step;
PARAMETER:
[
{
name : 'orig_step',
title : 'orig_step',
type : 'LineEdit',
property : {tool_tip : 'orig'},
},
{
name : 'other_step',
title : 'other_step',
type : 'LineEdit',
property : {tool_tip : 'orig'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 拷贝net step </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> 资料路径 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>rename and sort");
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
}
}
var Status = 'ok';
var resultData = [];
var par = PAR;
var default_par = {
orig_step:"orig",
other_step:"net",
auto_save: "No",
units:"mm"
}
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job;
try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
var orig_step = par.orig_step.toLowerCase()
var other_step = par.other_step.toLowerCase()
if(GEN.isStepExists({job:job, step:orig_step})){
if(GEN.isStepExists({job:job, step:other_step})){
GEN.deleteStep({job:job, step:other_step})
}
GEN.copyStep({source_job:job,source_name:orig_step,dest_job:job,dest_name:other_step})
}
// 保存
if(/yes/ig.test(par.auto_save)){GEN.checkInout({job:job,mode:"out"}); GEN.saveJob({ job: job });GEN.checkInout({job:job,mode:"in"});GEN.closeJob({job:job});} else {GEN.checkInout({job:job,mode:"in"})}
if (mode === "aimdfm") {
$.QDfm.updateRow({table: "pdm_aimdfm_task",data: {progress: 33.33},where: { id: $.task_id }});
if (GEN.hasError()) { Status = 'error';resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {status: Status,result_data: resultData};
} else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return {status: Status,result_data: resultData}; }
}else { return "Done" }
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
/*
NAME:
DESCRIPTION: 钻孔矫正对位;
PARAMETER:
[
{
name: 'step_filter',
title: 'step过滤',
type: 'LineEdit'
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'Yes'},
{name:'no',text:'No'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-04-20 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 钻孔矫正对位 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("================================>pad 对齐");
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) {
PAR = $.par
} else if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter);
}
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
current_process_title: $.process_title
},
where: { id: $.task_id }
});
}
}
var Status = 'ok';
var resultData = [];
try {
var par = PAR;
var default_par = {
step_filter:'net',
max_via_size: "0.9mm",
min_via_num: "100",
equidistant_tolerance: "0.005mm",
auto_save: "No",
units: "mm",
}
for(var key in default_par){ // 设置默认属性
if (!par.hasOwnProperty(key) || par[key] == ""){
par[key] = default_par[key]
}
}
if(_.isEmpty(Job)){throw "参数Job不存在"}
var job = Job.toLowerCase()
if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
if(mode == "aimdfm"){
if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"});
}
var steplist = GEN.getStepList({job:job})
steplist = steplist.filter(function(v){
var tmpreg = new RegExp(par.step_filter,"ig")
return tmpreg.test(v)
})
var drl_layers = getLayer({layer_type:"drill"})
steplist.forEach(function(step){
GEN.openStep({job:job,name:step})
//料号初始化
GEN.clearLayers(); //清除层显示
GEN.affectedLayer({ mode: 'all', affected: 'no' }); //设置影响层全部不影响
//操作模式初始化
GEN.COM("sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude");
GEN.units({ type: par.units }); //单位初始化
GEN.zoomHome(); //窗口显示回到原始位置
var tmpchk = "pad_snap"
drl_layers.forEach(function(drl){
var tmpchk = "pad_snap"
if(GEN.isChklistExists({job:job,step:step,chklist:tmpchk})){
GEN.COM("chklist_delete,chklist="+tmpchk)
}
GEN.units({ type: "mm" }); //单位初始化
GEN.COM("chklist_create,chklist="+tmpchk)
GEN.COM("chklist_show,chklist="+tmpchk)
GEN.COM("chklist_single,action=valor_dfm_pad_snap,show=yes")
GEN.COM("chklist_pclear")
GEN.COM("chklist_cupd,chklist=valor_dfm_pad_snap,nact=1,params=((pp_layer="+drl+")(pp_ref_layer=.affected)(pp_max_snapping=50)),mode=regular") // (pp_ref_layer=lyr1)
GEN.COM("chklist_pcopy,chklist=valor_dfm_pad_snap,nact=1")
GEN.COM("chklist_close,chklist=valor_dfm_pad_snap,mode=hide")
GEN.COM("chklist_ppaste,chklist="+tmpchk+",row=0")
GEN.workLayer({name:drl,display_number:2,clear_before:'yes'})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.affectedLayer({affected:'yes',layer:['gtl',"gbl"]})
GEN.chklistRun({chklist:tmpchk})
GEN.units({ type: par.units }); //单位初始化
})
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.affectedLayer({affected:'yes',layer:drl_layers})
if(GEN.isChklistExists({job:job,step:step,chklist:tmpchk})){
GEN.COM("chklist_delete,chklist="+tmpchk)
}
GEN.units({ type: "mm" }); //单位初始化
GEN.COM("chklist_create,chklist="+tmpchk)
GEN.COM("chklist_show,chklist="+tmpchk)
GEN.COM("chklist_single,action=valor_dfm_pad_snap,show=yes")
GEN.COM("chklist_pclear")
GEN.COM("chklist_cupd,chklist=valor_dfm_pad_snap,nact=1,params=((pp_layer=.type=signal|power_ground&side=inner)(pp_ref_layer=.affected)(pp_max_snapping=50)),mode=regular") // (pp_ref_layer=lyr1)
GEN.COM("chklist_pcopy,chklist=valor_dfm_pad_snap,nact=1")
GEN.COM("chklist_close,chklist=valor_dfm_pad_snap,mode=hide")
GEN.COM("chklist_ppaste,chklist="+tmpchk+",row=0")
GEN.affectedLayer({affected:'no',mode:'all'})
GEN.affectedLayer({affected:'yes',layer:drl_layers})
GEN.chklistRun({chklist:tmpchk})
GEN.units({ type: par.units }); //单位初始化
})
//保存
if(/yes/ig.test(par.auto_save.toLowerCase())){ //
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
GEN.saveJob({ job: job });
GEN.checkInout({job:job,mode:"in"})
GEN.closeJob({job:job})
} else {
GEN.checkInout({job:job,mode:"in"})
}
if (mode === "aimdfm") {
$.QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
progress: 33.33
},
where: { id: $.task_id }
});
if (GEN.hasError()) {
Status = 'error';
resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {
status: Status,
result_data: resultData
};
} else {
resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
return {
status: Status,
result_data: resultData
};
}
}else {
return "Done"
}
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"))
IKM.msg(e)
Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
function getLayer(props){
if(!props){return}
if(!props.context){props.context = "board"}
var matrix = GEN.getMatrix({job:job})
return Object.keys(matrix).reduce(function(a,b){
var info = matrix[b];
var ret = true;
for (var key in props) { if(!Array.isArray(props[key])){props[key] = [props[key]]}
if(info[key] && props[key].indexOf(info[key]) < 0){ ret = false } }
if(ret){ a.push(props.res == "info"? info : b) } return a
},[])
}
\ No newline at end of file
/*
NAME:
DESCRIPTION: 创建网络信息;
PARAMETER:
[
{
name : 'step',
title : 'step',
type : 'LineEdit',
property : {tool_tip : '目标step,默认是orig'},
},
{
name : 'auto_save',
title : '自动保存',
type : 'RadioBox',
property : {
item_list:[
{name:'yes',text:'YES'},
{name:'no',text:'NO'},
],
tool_tip:'是否自动保存料号开关'
}
}
]
VERSION_HISTORY:
V1.00 2020-09-01 Scott Sun
1.新版本
HELP:
<html><body bgcolor="#DDECFE">
<font size="3" color="#003DB2"><p>功能简介</p></font>
<p> 创建网络信息 </p>
<br>
<font size="3" color="#003DB2"><p>参数配置</p></font>
<p> step信息 </p>
<br>
<font size="3" color="#003DB2"><p>注意事项</p></font>
<p> 无 </p>
<br>
</body></html>
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
console.log("==============================>template");
// 引入模块 包
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } });
}
}
var Status = 'ok';
var resultData = [];
var par = PAR;
var default_par = {
step: "net",
auto_save: "No",
units:"mm"
}
for(var key in default_par){ if (!par.hasOwnProperty(key) || par[key] == ""){ par[key] = default_par[key] }}
var job = Job;
try {
if(_.isEmpty(job)){throw "参数job不存在"} else { job = job.toLowerCase() }
if(!GEN.isJobExists({job:job})){throw "料号"+job+"不存在"}
if(!GEN.isJobOpen({job:job})){ GEN.openJob({job:job}) }
if(mode == "aimdfm"){ if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" } else { GEN.checkInout({job:job,mode:"out"}) } }
var stepList = GEN.getStepList({job:job}) // 工作step列表
stepList = stepList.filter(function(step){
var reg = new RegExp(par.step,"ig")
return reg.test(step)
})
var layer_type = par.layer_type;
var matrix = GEN.getMatrix({job:job})
var worklayers = Object.keys(matrix).filter(function(layer) {
var layer_info = matrix[layer];
var tmp_layer_type = /inner_negative/.test(layer_type) ? "power_ground" : "signal";
var side_reg = /out/.test(layer_type)? /top|bot/ : /inner/;
return layer_info.context == "board" && layer_info.layer_type == tmp_layer_type && side_reg.test(layer_info.side)
})
if(worklayers.length == 0) { throw "没有找到工作层" + layer_type}
stepList.forEach(function(step){
GEN.openStep({job:job,name:step})
GEN.clearLayers(); //清除层显示
GEN.affectedLayer({ mode: 'all', affected: 'no' }); //设置影响层全部不影响
GEN.COM("sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude");
GEN.units({ type: par.units }); //单位初始化
GEN.zoomHome(); //窗口显示回到原始位置
GEN.COM('netlist_page_open',{set:'yes',job1:job,step1:step,type1:'cur',job2:job,step2:step,type2:'cur'});
GEN.COM('netlist_recalc',{job:job,step:step,type:'cur',display:'top'});
GEN.COM('netlist_ref_update',{job:job,step:step,source:'cur',reduce:'yes'});
// GEN.COM('netlist_page_close');
})
// 保存
if(/yes/ig.test(par.auto_save)){GEN.checkInout({job:job,mode:"out"}); GEN.saveJob({ job: job });GEN.checkInout({job:job,mode:"in"});GEN.closeJob({job:job});} else {GEN.checkInout({job:job,mode:"in"})}
if (mode === "aimdfm") {
$.QDfm.updateRow({table: "pdm_aimdfm_task",data: {progress: 33.33},where: { id: $.task_id }});
if (GEN.hasError()) { Status = 'error';resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {status: Status,result_data: resultData};
} else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return {status: Status,result_data: resultData}; }
}else { return "Done" }
} catch (e) {
IKM.msg(_.join(GEN.STATUS, "\n"));IKM.msg(e);Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment