本帖最后由 Yumaotuo 于 2018-4-26 11:35 编辑
1、案例描述
设置货架的行数、列数,自动根据其行列数绘制相应行列数的全局表,并自动填充行表头和列表头,在全局表内填入1表示相应货格可以放置货物,然后货架对全局表进行全面检索,根据1的位置将货物放置到相应货格,摆放成想要的图案。 2、模型布局
3、代码编写
代码主要集中在放置到层、放置到列、重置触发、进入触发、离开触发中。
重置触发
//计算图形总共需要临时实体的个数 int baynum = rackgetnrofbays(current);//统计货架列数和行数以便绘制全局表 int levelnum = rackgetnroflevels(current); settablesize("xin",levelnum,baynum);//对全局表的行列数进行绘制 //对全局表的行表头、列表头填写以便对照 for(int i = 1;i <= levelnum;i++) { settableheader("xin",1,i,concat("第",numtostring(levelnum+1-i),"行")); } for(int j = 1;j <= baynum;j++) { settableheader("xin",2,j,concat("第",numtostring(j),"列")); } //对全局表进行 1 的扫描,计算1的个数 int rownum = gettablerows("xin"); int colnum = gettablecols("xin"); int sum; for(int i = 1;i <= rownum;i++) { for(intj = 1;j <= colnum;j++) { sum= sum+gettablenum("xin", i, j); } } setlabel(current,1,sum);//赋值标签以备关闭进入端口
进入触发
//如果货架当前数量等于图形所需数量则关闭进入端口,等待处理一段时间再打开 int zongshu = getlabel(current,1); int rackcontent = content(current); //int input = getinput(current); if(rackcontent == zongshu) { closeinput(current); } 离开触发
//货物离开后发现货架有空余的货格那么打开端口继续进货 int zongshu = getlabel(current,1); int rackcontent = content(current); if(rackcontent+1 == zongshu) { openinput(current); } 放置到列
//通过对全局表的每一个值进行扫描,获取数值1所在的列值 int input = getinput(current); int rownum = gettablerows("xin");//统计全局表的行列数,动态变化 int colnum = gettablecols("xin"); int sum = 0; int baynum = 0; for(int i = 1;i <= rownum;i++)//对全局表每一行扫描 { for(intj = 1;j <= colnum;j++)//对全局表每一列扫描 { sum= sum+gettablenum("xin", i, j); if(sum== input)//如果sum等于了进入数量,说明扫描到了1,那么获取其列号j { baynum= j; i= rownum+1;//找到1就不在执行最初的for循环 pt("(");//打印出临时实体坐标值(列,行) pd(baynum); pt(","); break; } //如果第一遍的货架排放完成后,那么执行下面的语句对货架填补 if(sum!= input&&i == rownum) { for(intk = 1;k <= rownum;k++) { for(intm = 1;m <= colnum;m++) { intpanduan = gettablenum("xin",k,m);//判断表格中的位置是否是关键1的位置 intcellnum = rackgetcellcontent(current,m,rownum+1-k);//获取上面关键位置1所代表的货架上关键货格的当前容量 if(panduan== 1&&cellnum == 0)//如果此位置是1关键位置,并且关键货格没有货物那么填补货物 { baynum= m; k= rownum+1; break; } } } } } } return baynum;
放置到层
//通过对全局表的每一个值进行扫描,获取数值1所在的 行 值 int input = getinput(current); int rownum = gettablerows("xin");//统计全局表的行列数,动态变化 int colnum = gettablecols("xin"); int sum = 0; int levelnum = 0; for(int i = 1;i <= rownum;i++) { for(intj = 1;j <= colnum;j++) { sum= sum+gettablenum("xin", i, j); if(sum== input)//如果sum等于了进入数量,说明扫描到了1,那么获取其行号i { levelnum= rownum+1-i;//由于货架的行号和全局表行号相反,要进行简单处理 i= rownum+1; pd(levelnum);//打印出临时实体坐标值 pt(");"); pr(); break; } //如果第一遍的货架排放完成后,那么执行下面的语句对货架填补 if(sum!= input&&i == rownum) { for(intk = 1;k <= rownum;k++) { for(intm = 1;m <= colnum;m++) { int panduan =gettablenum("xin",k,m);//判断表格中的位置是否是关键1的位置 intcellnum = rackgetcellcontent(current,m,rownum+1-k);//获取上面关键位置1所代表的货架上关键货格的当前容量 if(panduan== 1&&cellnum == 0)//如果此位置是1关键位置,并且关键货格没有货物那么填补货物 { levelnum= rownum+1-k; k = rownum+1; break; } } } } } } return levelnum; 本模型通过利用for循环进行检索,及相应货架、全局表脚本语言进行编写,大家可以编写不同的逻辑来尝试一下~~~
|