Commit b809ec28 authored by Scott Sun's avatar Scott Sun

scott

parent d4887bbf
......@@ -98,6 +98,8 @@
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var mail = require('topsin.mail');
var error = require('topsin.error');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
......@@ -148,7 +150,7 @@ try {
if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
// 检查料号是否能够check out
if(GEN.checkInout({job:job,mode:"test"}) != 0){ throw "the job check" }
if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode == "aimdfm"){ throw "the job check" }
GEN.checkInout({job:job,mode:"out"});
script_info({ result_severity: "analysis start" })
script_info({ progress: 65 })
......@@ -1001,6 +1003,29 @@ try {
}
}
// 邮件触发
var db_customer = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field:'customer_code',
where:{id : JobId}
})
});
var err = mail.sendMail({
host:'smtp.exmail.qq.com',
auth_method:mail.AuthMethod.LOGIN,
connection_type:mail.ConnectionType.TCP,
from:'scott.sun@topibd.com',
password:'159482673Sun',
to:'scott.sun@topibd.com',
subject:db_customer + ' / '+job+' reading is ready!',
content:db_customer + ' / '+job+' reading is ready!'
});
if (err.isValid()) {
print(err.text());
}
if (mode === "aimdfm") {
$.QDfm.updateRow({
......@@ -1840,8 +1865,6 @@ function symbolAnalysis(props){
min_length:symbols.length
}
}
function smdPitch(props){
var job = props.job
var step = props.step
......@@ -1913,8 +1936,6 @@ function smdPitch(props){
GEN.deleteLayer({job:job,layer:tmp_layer2})
return res
}
function createChklistAndRun(par) {
var checkLayers = par.layers
var items = par.items
......@@ -1938,7 +1959,6 @@ function createChklistAndRun(par) {
})
})
}
function analysisChkAttr(par) {
var layers = par.layers;
var hash = {};
......@@ -2023,7 +2043,6 @@ function analysisDrill(par, step){
})
return res
}
function bgaAnalysis(props){
var job = props.job
var steplist = props.steplist
......@@ -2293,7 +2312,6 @@ function all_bga_min_pitch_anal(props){ // 分析所有bga中间距最小的
GEN.deleteLayer({job:job,layer:tmp_layer2})
return res
}
function bgaPitch(props){
var job = props.job
var step = props.step
......@@ -2381,7 +2399,6 @@ function bgaPitch(props){
// 矩阵
return res || 20.1
}
function myFixed(str, num) {
if(/^[1-9][0-9]*([.][0-9]+)?$/.test(str)){
return Number(str).toFixed(num)
......@@ -2389,7 +2406,6 @@ function myFixed(str, num) {
return str
}
}
function createOutline(props){
var job = props.job
var step = props.step
......@@ -2438,7 +2454,6 @@ function createOutline(props){
return false
}
}
function has_steps(props){
var job = props.job
var pcs_step = props.pcs_step
......@@ -2446,13 +2461,11 @@ function has_steps(props){
var res = GEN.getSubSteps({job:job, step:array_step})
return res.indexOf(pcs_step) >= 0
}
function unSelect(){
GEN.selectByFilter({attribute:[{attribute:'.drill',option:'plated'}],profile:'all',operation:"unselect"})
GEN.selectByFilter({attribute:[{attribute:'.drill',option:'via'}],profile:'all',operation:"unselect"})
GEN.selectByFilter({attribute:[{attribute:'.drill',option:'non_plated'}],profile:'all',operation:"unselect"})
}
function mkPath(path,list) {
console.log("--path:" + path);
if(list.length){
......@@ -2477,7 +2490,6 @@ function saveMeans(props){
fs.writeFile(respath+"/meas",meas.join("\n"))
fs.chmod(respath+"/meas",777)
}
// 算弧长
function arcLength(x1,y1,x2,y2,x3,y3){
var cos0 = +((x3-x1)*(x2-x3) + (y3-y1)*(y2-y3)) / (Math.pow((Math.pow(x2-x3,2) + Math.pow(y2-y3,2)),0.5) * Math.pow((Math.pow(x3-x1,2) + Math.pow(y3-y1,2)),0.5))
......@@ -2514,7 +2526,6 @@ function getMinSym(sym) {
}
return min_size
}
function rmOutProfile(props) {
var job = props.job;
var step = props.step;
......@@ -2548,8 +2559,6 @@ function rmOutProfile(props) {
GEN.closeStep()
}
}
function mvOutProfile (props) {
var job = props.job;
var step = props.step;
......
......@@ -105,7 +105,7 @@ try {
// 料号验证
if(!GEN.isJobExists({job:job})){ throw "job "+ job+ " is not exist" }
if(!GEN.isJobOpen({job:job})){GEN.openJob({job:job})}
if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode != "develop"){ throw "the job check" }
if(GEN.checkInout({job:job,mode:"test"}) != 0 && mode == "aimdfm"){ throw "the job check" }
console.log("Checkout====== ========================>")
GEN.checkInout({job:job,mode:"out"});
console.log("Checkout success==============================>")
......
......@@ -1090,6 +1090,7 @@
{"orig_name" : ["^pgp(\\d+)\\.art$","^art(\\d+)\\.art$","^l_(\\d+)"], "tl_name" : "l_($1)"},
{"orig_name" : ["^bot\\.art$","^bottom$","^bottom.art$"], "tl_name" : "bottom" },
{"orig_name" : ["\\.d(\\d+)$"], "tl_name" : "d_($1)-($1+1)"},
{"orig_name" : ["(\\d+)-(\\d+)-((?:(?!laser)[a-zA-Z])+)\\.drl$","\\.d(\\d+)-(\\d+)((?:(?!laser)[a-zA-Z])+)$"], "tl_name" : "d($1)-($2)-($3)"},
{"orig_name" : ["^drill(\\d+)-(\\d+)$","^d_(\\d+)-(\\d+)$"], "tl_name" : "d_($1)-($2)"},
{"orig_name" : ["^drill$"], "tl_name" : "drill" },
{"orig_name" : ["\\.rou$","^rout$"], "tl_name" : "rout" },
......
"use strict";
var fs = require("fs");
var db = require('topsin.database');
var error = require('topsin.error');
var user_name = "Sys";
try {
db.addConnection({
......@@ -16,10 +17,13 @@ try {
table: 'pub_customer',
field: "code"
});
if (query_1.lastError().isValid())
throw query_1.lastError().text();
if (query_1.lastError().isValid()){
throw query_1.lastError().text()};
// 获取远程文件夹
var samba = fs.listDir("\\\\10.90.2.100\\samba", 0);
console.log(1);
var samba = fs.listDir("\\\\10.90.2.100\\samba", 1);
console.log(2);
throw "tmp"
var sambaDirs_1 = [];
var sambaFiles_1 = [];
samba.forEach(function (v) {
......
let fs = require("fs");
let db = require('topsin.database');
var error = require('topsin.error');
const user_name = "Sys";
try {
db.addConnection({
......
## topcam 驱动
* script_javascript_driver.js 驱动文件名
* 驱动存放地址 TopDFM\qt5.6.3-win32-msvc2015\topcam\top_lib
* topcam 本地调试地址修改
```js
// 更改文件 TopDFM\qt5.6.3-win32-msvc2015\topcam\configure\
topcam.cfg
"script_path" : "D:/vsCodeWork/SjCode/learn/topcam/ats/topcam", // 这里改为电脑上的存放脚本的路径
topcam_javascript.cfg
"script_dir":"D:/vsCodeWork/SjCode/learn/topcam/public_script", // 这里改为电脑上的存放脚本的路径
```
## 需要依赖的包
* topcam.gencom
* topcam.ikm6
* topcam.scriptfunc
* topsin.genmath
* topsin.gengui
```js
// 其他
var _ = require('lodash');
var process = require('process');
var fs = require('fs');
var Err = require('topsin.error');
var Gen = require('topcam.gencom');
var options = require('minimist')(process.argv);
var ARGV = options['_'];
var crypto = require('topsin.crypto');
var os = require('os');
var IKM = require('topcam.ikm6')();
var GUI = require('topsin.gengui').newGui();
var logger = require('topsin.logger');
```
\ No newline at end of file
var _ = require('lodash');
var process = require('process');
var fs = require('fs');
var Err = require('topsin.error');
var Gen = require('topcam.gencom');
var options = require('minimist')(process.argv);
var ARGV = options['_'];
var crypto = require('topsin.crypto');
var os = require('os');
var IKM = require('topcam.ikm6')();
var GUI = require('topsin.gengui').newGui();
var logger = require('topsin.logger');
/*logger.loadConfig({
    'appender': {
        console: {
            'type': 'console',
            'typefilter': 'ERROR,WARN,FATAL,INFO', // 日志分类 *代表所有
            'categoryfilter': '*', // 模块分类
            'format': '{TIME} [{TYPE}]-({CATEGORY}):{MSG} <{THREAD}>@{FILE}:{LINE}/{FUNC}' //自定义输出样式
        }
    }
});
*/
GUI.msg = function(data){
var tmp = data;
var type = {}.toString.call(data).split(" ")[1];
if (/^(\[object Object\]|\[object Array\]|\[object Error\])$/ig.test({}.toString.call(data))) {
data = JSON.stringify(data)
} else if (/^\[object Function\]$/ig.test({}.toString.call(data))){
data = data.toString()
}
type = type.replace("]","")
if(tmp === undefined){type = 'undefined',data = 'undefined'}
GUI.msgBox("数据类型:"+type, "info", data);
return this
}
var APP = IKM.getAPP();
var SCRIPT_RETURN, USER_NAME, USER_FULLNAME, USER_ID, GEN, LANG, JOB, STEP, JOB_ID, RUN_MODE, PAR, RUN_DATA, GEN_TYPE,REAL_BIN;
var CONF = JSON.parse(fs.readFile(process.argv[1]));
if (ARGV.length == 0 || _.isEmpty(ARGV[0])) {
print("\nError: No Args passed to prog. Exiting...\n");
throw new Error("Error: No Args passed to prog. Exiting...");
}
var ARGS = {};
try {
ARGS["socket"] = ARGV[2];
ARGS["job_id"] = ARGV[3];
ARGS["process_id"] = ARGV[4];
ARGS["script_id"] = ARGV[5];
ARGS["user"] = ARGV[6];
ARGS["gen_type"] = ARGV[7];
ARGS["data"] = ARGV[8];
//
GEN = new Gen({ cam_type: ARGS["gen_type"] });
USER_NAME = ARGS["user"];
if (_.isEmpty(USER_NAME)) USER_NAME = GEN.getUserName();
var userinfo = IKM.crud('selectMap',{
table: 'sys_user',
field: ['id', 'fullname'],
where: { username: USER_NAME }
})
USER_ID = userinfo["id"];
USER_FULLNAME = userinfo["fullname"];
GEN_TYPE = ARGS["gen_type"];
JOB = process.getEnv('JOB');
STEP = process.getEnv('STEP');
JOB_ID = ARGS["job_id"];
JOB = IKM.crud('selectValue',{
table: 'pdm_job',
field: "jobname",
where: { id: JOB_ID }
})
SCRIPT_RETURN = _do_script(IKM.get_script_by_id(ARGS["script_id"]));
}
catch (err) {
IKM.msg(err);
logError(err);
}
finally {
//程序结束
tl_end();
}
function logError(msg) {
print("ERROR:" + _.toString(msg));//+ "\nbacktrace:" + _.join(backtrace(), "\n"));
}
function tl_end() {
var status;
if (_.isEmpty(SCRIPT_RETURN)) SCRIPT_RETURN = 'Error';
if (/^done/i.test(SCRIPT_RETURN)) {
status = 'Done';
}
else if (/^cancel/i.test(SCRIPT_RETURN)) {
status = 'Cancel';
}
else if (/^warning/i.test(SCRIPT_RETURN)) {
status = 'Warning';
}
else if (/^finish/i.test(SCRIPT_RETURN)) {
status = 'Finish';
}
else if (/^critical/i.test(SCRIPT_RETURN)) {
status = 'Critical'
}
else if (/^new/i.test(SCRIPT_RETURN)) {
status = 'New'
}
else {
status = 'Error';
}
if (ARGS["socket"]) {
var end_time = os.getNow();
var tmp = {
job_id: JOB_ID,
process_id: ARGS["process_id"],
end_time: end_time,
user_name: USER_NAME,
user_id: USER_ID,
status: status
}
if (ARGS["job_id"]){
tmp.notes = ARGS["job_id"] > 0 ? USER_FULLNAME + status + " script (jobname="+JOB+",jobid="+ARGS["job_id"]+")" : ''
};
IKM.update_job_workflow_log(tmp);
IKM.script_end(JOB_ID,ARGS["process_id"]);
}
}
function doScript(argv){
return _do_script({name:argv})
}
function _do_script(argv) {
var script_name = argv["name"];
var scrinfo = IKM.crud('selectMap',{
table: 'pdm_workprocess_script',
field: ['id', 'md5', 'type', 'encrypt', 'content', 'parameter_value'],
where: { name: script_name, status: 'released' }
})
var func = '';
var scrfile = CONF.script_dir + "/" + script_name + ".js";
if (CONF.debug_mode == true && fs.fileExists(scrfile)) {
func = evalfile(scrfile, { prefix: "(function(){\n", suffix: "\n})"});
} else {
if (_.isEmpty(scrinfo.content)) {
print(_.toString(scrinfo))
throw "script content is Empty!";
}
else {
if (scrinfo.encrypt == 1) {
func = evalstr(crypto.d(scrinfo.content,{ prefix: "(function(){\n", suffix: "\n})" }));
}
else if (scrinfo.encrypt == 2) {
func = evalstr(crypto.d2(scrinfo.content), { prefix: "(function(){\n", suffix: "\n})"});
}
else if (scrinfo.encrypt == 3) {
func = evalstr(crypto.d3(scrinfo.content, { prefix: "(function(){\n", suffix: "\n})" }));
}
else {
func = evalstr(content, { prefix: "(function(){\n", suffix: "\n})" });
}
}
}
if (!_.isFunction(func) && argv.doScriptType !== 2) {
throw "script " + script_name + " eval error!";
}
var jobinfo = IKM.crud('selectMap',{
table: 'pdm_job',
field: ['id AS job_id', 'jobname AS job_name'],
where: { jobname: JOB }
})
var params_info = {};
params_info.gen = GEN;
params_info.ikm = IKM;
params_info.conf = CONF;
params_info.id = JOB_ID;
params_info.script_name = script_name;
params_info.user_name = USER_NAME
params_info.user_id = USER_ID;
params_info.user_full_name = USER_FULLNAME;
params_info.job = JOB;
params_info.gen_type = GEN_TYPE;
params_info.gui = GUI;
params_info.par = JSON.parse(IKM.crud('selectMap',{
table: 'pdm_workprocess',
field: ['script_parameter'],
where: { id: ARGS["process_id"] }
}).script_parameter);
_.merge(params_info, jobinfo);
var res = func.call({}, params_info);
return res;
}
function addFlowNotes(par){
par["user_name"] = par["user_name"] || USER_NAME
par["user_id"] = par["user_id"] || USER_ID
return IKM.update_job_workflow_log(par)
}
function updateFlowReport(par){
par["job_id"] = par["job_id"] || JOB_ID
return IKM.update_flow_report(par)
}
/*
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: "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 stepList = GEN.getStepList({job:job})
stepList = stepList.filter(function(step){
var reg = new RegExp(par.step,"ig")
return reg.test(step)
})
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.closeStep()
})
// 保存
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
......@@ -93,7 +93,7 @@ declare class TopCamIkm6 {
data: [{jobname:"test7""}, {jobname:"test8""}]
})
*/
batch_insert(p:{table: string , field:array, data:array }):void;
batch_insert(p:{table: string , field:Array<string>, data:Array<string> }):void;
/**
* 更新料号工作流程日志
......@@ -142,6 +142,31 @@ declare class TopCamIkm6 {
     * @returns 返回料号info
     */
    get_jobinfo(p:{jobid:number, jobinfo:string}):any;
/**
     * 保存料号info
     * 
     * @param 
     * @returns 
     */
save_job_info(p:{jobid:number, jobinfohash:Object}):void;
/**
     * 保存层信息
     * 
     * @param 
     * @returns 
     */
save_layerinfo(p:{jobid:number,layer:string, layerinfohash:Object}):void;
/**
     * 获取层
     * 
     * @param 
     * @returns 返回料号info
     */
get_layerinfo(p:{jobid:number,layer:string, layerinfo:string}):any;
}
export = TopCamIkm6;
......
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"@types/lodash": {
"version": "4.14.110",
"resolved": "http://registry.npm.taobao.org/@types/lodash/download/@types/lodash-4.14.110.tgz",
"integrity": "sha1-+wdJj4QVKUfzDqCdiSB8oHEjRh4="
},
"@types/node": {
"version": "14.11.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz",
"integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA=="
}
}
}
This diff is collapsed.
/*
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>
*/
// 引入模块 包
let $ = require('topcam.scriptfunc').argv();
let fs = require('fs');
let _ = require('lodash');
let mode = $.ikm ? "topcam" : "aimdfm";
let IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
let GEN = $.gen;
let GUI = $.gui || {};
let Job = $.job || $.job_name;
let JobId = $.job_id;
let db = $.db || IKM.db
let PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
let database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
let 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 } });
}
}
let Status = 'ok';
let resultData = [];
let par = PAR;
let default_par = {
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 stepList = GEN.getStepList({job:job})
stepList = stepList.filter((step:string) => {
var reg = new RegExp(par.step,"ig")
return reg.test(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";
}
\ No newline at end of file
......@@ -123,6 +123,8 @@ console.log("=============================:template");
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
require("topsin.genmath")
var genMath = new GenMath();
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
......@@ -792,8 +794,55 @@ function slBoxOptimize(props){
// 文字放大
function slOptimize(props) {
var x_scale = 1;
var y_scale = 1.2;
var info = gui.showForm({
title : '请手动匹配以下信息',
showcheck : 1,gen:GEN,
defaultsize:[200,100],
ui: {
type: 'ScrollArea',
property: { widget_resizable: true, frame_shape: 'NoFrame', align: 'Top' },
child: {
type: 'VBoxLayout',
property: { margin: 2, spacing: 5, align: 'Top' },
pack: { stretch: 0 },
child:[{
type: "FormGridLayout",
property: { columns: 1, label_alignment: 'Top | Right', margin: 10, spacing: 20 },
pack: { stretch: 0 },
child:[{
name : 'font_symbol',
pack: { label: '文字symbol' },
type : 'LineEdit',
setter: function(obj){ obj.setText() },
units: 'um',
property: { enabled: true, value:"200" }
},
{
name : 'x_scale',
pack: { label: '文字距离x方向放大倍数' },
type : 'LineEdit',
setter: function(obj){ obj.setText() },
property: { value:1,enabled: true }
},
{
name : 'y_scale',
pack: { label: '文字距离y方向放大倍数' },
setter: function(obj){ obj.setText() },
type : 'LineEdit',
property: {value:1.2, enabled: true }
},
{
type: "stretch"
}]
}]
}
}
});
if(!info){throw "未填写参数"}
info = JSON.parse(JSON.stringify(info))
var x_scale = info.x_scale;
var y_scale = info.y_scale;
// 1. step过滤
var workstep = props.workstep;
// 2.过滤工作层
......@@ -817,6 +866,8 @@ function slOptimize(props) {
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.zoomHome();
work_layers.forEach(function(layer){
GEN.workLayer({name:layer,display_number:2,clear_before:'yes'})
GEN.selChangeSym({symbol:"r" + info.font_symbol})
var font_layer = layer + par.silk_suffix;
var tmp1 = font_layer + "_1";
var tmp2 = font_layer + "_2";
......@@ -841,18 +892,9 @@ function slOptimize(props) {
GEN.selChangeSym({symbol:"r1000"})
// 转铜皮 获取每一个铜皮的limits信息
GEN.selContourize()
var fast_features = GEN.getFeatures({job:job,step:step,layer:tmp3,options:"feat_index"})
var fast_features = GEN.getFeatures({job:job,step:step,layer:tmp3,options:"feat_index",surface:1,units:"mm "})
fast_features = featsToLimits(fast_features)
fast_features.forEach(function(item){
var index = item.index;
GEN.selLayerFeat({layer:tmp3, index:index,operation:"select"});
if(GEN.getSelectCount() > 0){
item.limit = GEN.getLayerLimits({job:job,step:step,layer:tmp3,units:'mm', options:"select"})
item.limit.xsize = Number(item.limit.xsize);
item.limit.xmin = Number(item.limit.xmin);
item.limit.ysize = Number(item.limit.ysize);
item.limit.ymin = Number(item.limit.ymin);
item.xc = item.limit.xsize / 2 + item.limit.xmin
item.yc = item.limit.ysize / 2 + item.limit.ymin
if(item.limit.xsize > item.limit.ysize) {
item.x_scale = x_scale
item.y_scale = y_scale
......@@ -860,8 +902,6 @@ function slOptimize(props) {
item.y_scale = x_scale
item.x_scale = y_scale
}
GEN.selClearFeature()
}
})
fast_features.forEach(function(item){
GEN.workLayer({name:bk2,display_number:2,clear_before:'yes'})
......@@ -870,7 +910,7 @@ function slOptimize(props) {
GEN.COM("filter_area_xy,x="+item.limit.xmax+",y=" + item.limit.ymax)
GEN.COM("filter_area_end,layer=,filter_name=popup,operation=select,area_type=rectangle,inside_area=yes,intersect_area=yes")
if(GEN.getSelectCount() > 0 ) {
GEN.selTransform({mode:'anchor',oper:'scale',x_anchor: item.xc,y_anchor: item.yc,x_scale:item.x_scale,y_scale:item.y_scale})
GEN.selTransform({mode:'anchor',oper:'scale',x_anchor: item.limit.xc,y_anchor: item.limit.yc,x_scale:item.x_scale,y_scale:item.y_scale})
}
})
......@@ -977,6 +1017,56 @@ function slOptimize(props) {
var bk2_tmp = bk2 + "_tmp"
GEN.workLayer({name:font_layer,display_number:1,clear_before:'yes'});
var tmp_con = GEN.MOUSE({type:'r',text:"Please Select"});
var info = gui.showForm({
title : '请手动匹配以下信息',
showcheck : 1,gen:GEN,
defaultsize:[200,100],
ui: {
type: 'ScrollArea',
property: { widget_resizable: true, frame_shape: 'NoFrame', align: 'Top' },
child: {
type: 'VBoxLayout',
property: { margin: 2, spacing: 5, align: 'Top' },
pack: { stretch: 0 },
child:[{
type: "FormGridLayout",
property: { columns: 1, label_alignment: 'Top | Right', margin: 10, spacing: 20 },
pack: { stretch: 0 },
child:[{
name : 'font_symbol',
pack: { label: '文字symbol' },
type : 'LineEdit',
setter: function(obj){ obj.setText() },
units: 'um',
property: { enabled: true, value:"200" }
},
{
name : 'x_scale',
pack: { label: '文字距离x方向放大倍数' },
type : 'LineEdit',
setter: function(obj){ obj.setText() },
property: { value:1,enabled: true }
},
{
name : 'y_scale',
pack: { label: '文字距离y方向放大倍数' },
setter: function(obj){ obj.setText() },
type : 'LineEdit',
property: {value:1.2, enabled: true }
},
{
type: "stretch"
}]
}]
}
}
});
if(!info){throw "未填写参数"}
info = JSON.parse(JSON.stringify(info))
var x_scale = info.x_scale;
var y_scale = info.y_scale;
GEN.workLayer({name:font_layer,display_number:1,clear_before:'yes'});
GEN.COM("filter_area_strt")
GEN.COM("filter_area_xy,x="+tmp_con.x1+",y="+tmp_con.y1)
......@@ -1059,10 +1149,13 @@ function slOptimize(props) {
GEN.selTransform({mode:'anchor',oper:"rotate",x_anchor:limits.xc,y_anchor:limits.yc,angle:360 - angle})
GEN.selMoveOther({target_layer:bk2,invert:'no',dx:0,dy:0,size:0})
}
GEN.deleteLayer({job:job, layer:[tmp_layer]})
} else {
flag = false
}
if(GEN.isLayerExists({job:job, layer:bk2_tmp})) {
GEN.deleteLayer({job:job, layer:[bk2_tmp]})
}
}
// 将ok的移动到文字层
......@@ -1070,7 +1163,6 @@ function slOptimize(props) {
GEN.selDelete()
GEN.workLayer({name:bk2,display_number:2,clear_before:'yes'})
GEN.selMoveOther({target_layer:font_layer,invert:'no',dx:0,dy:0,size:0})
GEN.PAUSE("check");
[tmp1,tmp2,tmp3,bk,bk2,"_ok","_fail"].forEach(function(v){
if(GEN.isLayerExists({job:job, layer:v})){GEN.deleteLayer({job:job,layer:[v]})}
})
......@@ -1336,3 +1428,30 @@ function surfaceAnalysis(props){
props.xc = props.limit.xsize / 2 + props.limit.xmin
props.yc = props.limit.ysize / 2 + props.limit.ymin
}
function featsToLimits(feats) {
feats.forEach(function(item) {
if(item.feats) {
var polygon = genMath.profile2Polygon(item.feats.join("\n"),0)
var res = polygon.reduce(function(a,b){
a.xmin = b.x > a.xmin ? a.xmin : b.x;
a.ymin = b.y > a.ymin ? a.ymin : b.y;
a.xmax = b.x < a.xmax ? a.xmax : b.x;
a.ymax = b.y < a.ymax ? a.ymax : b.y;
return a
}, {
xmin: polygon[0].x,
ymin: polygon[0].y,
xmax: polygon[0].x,
ymax: polygon[0].y
})
res.xsize = Math.abs(res.xmax - res.xmin)
res.ysize = Math.abs(res.ymax - res.ymin)
res.xc = res.xmin + res.xsize/2
res.yc = res.ymin + res.ysize/2
item.limits = res
item.limit = res
}
})
return feats
}
\ No newline at end of file
"use strict";
/*
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>
*/
// 引入模块 包
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: "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 stepList = GEN.getStepList({ job: job });
stepList = stepList.filter(function (step) {
var reg = new RegExp(par.step, "ig");
return reg.test(step);
});
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.closeStep();
});
// 保存
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',
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>
*/
// 引入模块 包
let $ = require('topcam.scriptfunc').argv();
let fs = require('fs');
let _ = require('lodash');
let mode = $.ikm ? "topcam" : "aimdfm";
let IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
let GEN = $.gen;
let GUI = $.gui || {};
let Job = $.job || $.job_name;
let JobId = $.job_id;
let db = $.db || IKM.db
let PAR = {}
if ($.par) { PAR = $.par } else if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); }
if (mode === "aimdfm") {
let database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
let 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 } });
}
}
let Status = 'ok';
let resultData = [];
let par = PAR;
let default_par = {
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 stepList = GEN.getStepList({job:job})
stepList = stepList.filter((step:string) => {
var reg = new RegExp(par.step,"ig")
return reg.test(step)
})
stepList.forEach((step:string) => {
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.closeStep()
})
// 保存
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
{
"compilerOptions": {
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
"removeComments": false, /* Do not emit comments to output. */
"strict": true, /* Enable all strict type-checking options. */
"noImplicitThis": false, /* Raise error on 'this' expressions with an implied 'any' type. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
"skipLibCheck": true, /* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}
......@@ -11,9 +11,6 @@ var JobId = $.job_id;
try {
GEN.getTool({units:"mm"})
GEN.renameStep({job:'demo',name:'pcb_1',new_name:'pcb_a'})
return "Done"
} catch (e) {
return "Error"
......
......@@ -193,9 +193,9 @@ function _do_script(argv) {
params_info.par = JSON.parse(IKM.crud('selectMap',{
table: 'pdm_workprocess',
field: ['script_parameter'],
where: { name: script_name }
}).script_parameter)
// PAR = (!scrinfo.parameter_value || scrinfo.parameter_value == "") ? {} : JSON.parse(scrinfo.parameter_value);
where: { id: ARGS["process_id"] }
}).script_parameter);
_.merge(params_info, jobinfo);
var res = func.call({}, params_info);
return res;
......
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