找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 79|回复: 1

[原创] 使用java语言二次开发一键重排刀号源代码

[复制链接]

2

主题

21

回帖

338

积分

二级士官

积分
338
发表于 昨天 16:08 | 显示全部楼层 |阅读模式

code by 郭祥,2025-10-05 武汉
本代码使用java语言编写,JDK版本为20,需要设置环境变量,要使用本代码需要

有编程功底,因为相关的机床刀具号定义文件文本格式,以及如何辨别工序指派的机床类型本人不会耐心解答

本代码实现了,机床固定刀号锁定,其他刀号指定刀号范围进行重新排刀号,分机床以实现不同机床的刀号调整


刀具映射表文本格式

刀具映射表文本格式

对于表格内容

对于表格内容

通过此参数识别机床

通过此参数识别机床

以下是源代码内容,由本人编写,转载需注明出处


  1. import nxopen.*;
  2. import nxopen.cam.*;
  3. import nxopen.mechatronics.CamBuilder;

  4. import java.io.*;
  5. import java.rmi.RemoteException;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.function.Consumer;

  9. public class SetMacine {
  10.     public static void main(String [] args) throws NXException, java.rmi.RemoteException {
  11.         //取得UG得 Session,标准步骤
  12.         Session theSession = (Session) SessionFactory.get("Session");
  13.         //取得工作部件
  14.         Part workPart = theSession.parts().work();
  15.         //取得部件得显示
  16.         Part displayPart = theSession.parts().display();
  17.         //获取UG得图像窗口session
  18.         UI theUI = (UI) SessionFactory.get("UI");
  19.         //取得当前选中的目标
  20.         CAMObject targ = (CAMObject) theUI.selectionManager().getSelectedTaggedObject(0);
  21.         if(workPart.camsetup().isGroup(targ)){
  22.             NCGroup group = (NCGroup) targ;
  23.             String group_name = group.name();
  24.             //String[] farmat_name = group_name.split("-");
  25.             theSession.listingWindow().open();
  26.             theSession.listingWindow().writeLine("程序组名称= "+group_name);
  27.             //String miaoshu = group.builderProperties(); //读取创建信息
  28.             //theSession.listingWindow().writeLine("程序组信息= "+miaoshu);
  29.             //String[] qiege = miaoshu.split(""");
  30.             //for(String t:qiege){
  31.             //    theSession.listingWindow().writeLine("分割输出="+t);
  32.            // }
  33.             //String Description = qiege[3];
  34.             //theSession.listingWindow().writeLine("Description"+Description);  //输出描述字符,但是描述字符只在UG启动时读取,无法做为参照

  35.             String operatio="";
  36.             nxopen.cam.ProgramOrderGroupBuilder programOrderGroupBuilder1;
  37.             programOrderGroupBuilder1 = workPart.camsetup().camgroupCollection().createProgramOrderGroupBuilder(group);

  38.             nxopen.TaggedObject taggedObject2;
  39.             taggedObject2 = programOrderGroupBuilder1.startUdeSet().udeList().findItem(0);


  40.             nxopen.cam.Ude ude1 = ((nxopen.cam.Ude)taggedObject2);
  41.             nxopen.cam.UdeParameter udeParameter1;
  42.             udeParameter1 = ude1.getParameter("operator_message"); //获取程序组中的操作员信息

  43.             operatio += udeParameter1.stringText();
  44.            // operatio=group.getStringValue("operator_message");
  45.             theSession.listingWindow().writeLine("操作员信息="+operatio);



  46.             String env = System.getenv("TOOL_UPON");
  47.             //theSession.listingWindow().writeLine("TOOL_UPON="+env);
  48.             //String path =  "D:\\BaiduSyncdisk\\TOOL_UPON\\tool_config.xlsx";
  49.             String path = env+"\"+operatio+".txt";
  50.             File testfile = new File(path);
  51.             if(!testfile.exists()){ //如果文件路径下文件没有,就使用默认路径进行
  52.                 path = env+"\"+"DEFAULT"+".txt";
  53.             }
  54.             theSession.listingWindow().writeLine(path);
  55.             //映射表缓存,下面的循环会将文件上的映射表循环读取到其中
  56.             ArrayList<DataStruct> list = new ArrayList<>();
  57.             //刀具号占用情况注册表
  58.             ArrayList<DataStruct> toolNumberRegedit = new ArrayList<>();
  59.             try {
  60.                 File file = new File(path);
  61.                 if(file.exists()){
  62.                    // FileReader fr = new FileReader(file);
  63.                     //处理ANSI格式的编码文件
  64.                     BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path),"GB2312"));
  65.                     String line;
  66.                     while ((line = br.readLine()) != null) {
  67.                         // 处理每行数据
  68.                         //    System.out.println(line);
  69.                        //  theSession.listingWindow().writeLine(line);
  70.                         String[] text = line.split("\\|");
  71.                         DataStruct data = new SetMacine.DataStruct();
  72.                         data.number = Integer.parseInt(text[0]);
  73.                         data.name = text[1];
  74.                         data.lenght_number = Integer.parseInt(text[2]);
  75.                         data.dia_number = Integer.parseInt(text[3]);
  76.                         if(text[4].equals("锁定刀号"))
  77.                         {
  78.                             data.reorder=false;
  79.                         }else{
  80.                             data.reorder = true;  //可重排
  81.                         }
  82.                         data.lowNumber=Integer.parseInt(text[5]); //
  83.                         data.higNumber=Integer.parseInt(text[6]);
  84.                         list.add(data);
  85.                     }
  86.                     br.close();
  87.                     //fr.close();
  88.                     //检查刀具映射
  89.                     checkToolUpon(workPart,list,group,toolNumberRegedit);
  90.                 }else{
  91.                     theUI.nxmessageBox().show("Block Styler",
  92.                             NXMessageBox.DialogType.WARNING,
  93.                             "在指定路径:“"+path+"”下未发现机床配置表文件!");
  94.                 }

  95.             } catch (IOException e) {
  96.                 e.printStackTrace();
  97.             }

  98.             //打印读取到的映射表
  99.             //for(DataStruct ds:list){
  100.                // theSession.listingWindow().writeLine("刀号:"+ ds.number +"  刀名:"+ ds.name + "  刀长号:"+ ds.lenght_number + "  刀经号:"+ ds.dia_number);
  101.            // }
  102.     }else{
  103.             theUI.nxmessageBox().show("Block Styler",
  104.                     NXMessageBox.DialogType.WARNING,
  105.                     "选中的目标不是程序组");
  106.         }
  107.     }



  108.     public static final int getUnloadOption() { return BaseSession.LibraryUnloadOption.IMMEDIATELY; }
复制代码


系统变量指定的目录结构

系统变量指定的目录结构

2

主题

21

回帖

338

积分

二级士官

积分
338
 楼主| 发表于 昨天 16:13 | 显示全部楼层
接上贴,代码长度限制未发完全,以下是剩下部分
  1. /**
  2.      *
  3.      * @param workPart
  4.      * @param list
  5.      * @param ncGroup
  6.      * @param toolNumberRegedit
  7.      * @throws NXException
  8.      * @throws RemoteException
  9.      */
  10.     public static void checkToolUpon(Part workPart ,
  11.                                      ArrayList<DataStruct> list,
  12.                                      NCGroup ncGroup,
  13.                                      ArrayList<DataStruct> toolNumberRegedit
  14.                                      ) throws NXException, RemoteException {
  15.         //取得UG得 Session,标准步骤
  16.         Session theSession = (Session) SessionFactory.get("Session");
  17.         //循环检查程序组下面的操作是否可以映射
  18.         CAMObject[] cam_list= ncGroup.getMembers();
  19.         for(CAMObject cam:cam_list){
  20.             if(workPart.camsetup().isOperation(cam)){
  21.                 Operation op = (Operation)cam;
  22.                 AddToolNumberRegedit(op,toolNumberRegedit); //向注册列表添加数据
  23.                 //取得UG得 Session,标准步骤
  24.                // Session theSession = (Session) SessionFactory.get("Session");
  25.                 NCGroup ncg = (NCGroup) op.getParent(CAMSetup.View.MACHINE_TOOL);

  26.                 //Tool tool = (Tool)ncg;
  27.                 //tool.
  28.               //  theSession.listingWindow().writeLine("刀具名字="+ncg.name());//打印工序的刀具名称
  29.                 for(DataStruct ds:list){
  30.                     if(ds.name.equals(ncg.name())){

  31.                         if(ds.reorder){//支持重排刀号
  32.                             //theSession.listingWindow().writeLine("重排刀具号");
  33.                             if(checkToolNumber(ds,toolNumberRegedit)) { //检查目前的刀号是否重复,不重复不需要重排
  34.                                 for (int i = ds.lowNumber; i <= ds.higNumber; i++) {
  35.                                     ds.number = i;
  36.                                     if (checkToolNumber(ds, toolNumberRegedit)) {
  37.                                         //theSession.listingWindow().writeLine("刀具号被占用,刀具名:" + ds.name + "刀具号:" + ds.number);//
  38.                                     } else {
  39.                                         ds.lenght_number = i;
  40.                                         ds.dia_number = i;
  41.                                         //theSession.listingWindow().writeLine("新刀具号,刀具名:" + ds.name + "刀具号:" + ds.number);
  42.                                         break;
  43.                                     }
  44.                                 }
  45.                             }
  46.                             AddToolNumberRegedit(ds,toolNumberRegedit); //向注册列表添加数据
  47.                         }

  48.                       //  theSession.listingWindow().writeLine(ncg.name()+"与列表的刀具"+ ds.name+"相等");
  49.                         OperationBuilder cb = workPart.camsetup().camoperationCollection().createBuilder(op);
  50.                         //cb.toolChangeSetting().setTextValue(); //设置刀具名称
  51.                         cb.toolChangeSetting().number().setValue(ds.number);//替换刀号
  52.                        // cb.toolChangeSetting().zoffset().setValue(ds.lenght_number);//这是Z轴偏置\
  53.                        // cb.toolChangeSetting().holderNumber().setValue(ds.lenght_number); //未知参数
  54.                         cb.toolChangeSetting().adjustRegister().setValue(ds.lenght_number); //替换刀长补正
  55.                         cb.commit();
  56.                     }
  57.                 }

  58.             }else{  //如果是一个内置的子程序组
  59.                 if(workPart.camsetup().isGroup(cam)){
  60.                     checkToolUpon(workPart,list,(NCGroup)cam,toolNumberRegedit);
  61.                 }
  62.             }
  63.         }
  64.     }

  65.     /**
  66.      * 向刀具号注册表填充数据
  67.      * @param op
  68.      * @param regeditList
  69.      * @return
  70.      */
  71.     public static DataStruct AddToolNumberRegedit(Operation op,ArrayList<DataStruct> regeditList){

  72.         DataStruct ds = new DataStruct();
  73.         try {
  74.             //取得UG得 Session,标准步骤
  75.             Session theSession = (Session) SessionFactory.get("Session");
  76.             //取得工作部件
  77.             Part workPart = theSession.parts().work();
  78.             NCGroup ncg = (NCGroup) op.getParent(CAMSetup.View.MACHINE_TOOL);
  79.             ds.name = ncg.name(); //刀具名称
  80.             OperationBuilder cb = workPart.camsetup().camoperationCollection().createBuilder(op);
  81.             ds.number=cb.toolChangeSetting().number().value();
  82.             ds.lenght_number=cb.toolChangeSetting().adjustRegister().value();//刀长
  83.             ds.dia_number = cb.toolChangeSetting().cutcomRegister().value(); //刀经
  84.             regeditList.add(ds);
  85.             return ds;
  86.         } catch (NXException e) {
  87.             throw new RuntimeException(e);
  88.         } catch (RemoteException e) {
  89.             throw new RuntimeException(e);
  90.         }
  91.     }

  92.     /**
  93.      *
  94.      * @param ds
  95.      * @param regeditList
  96.      * @return
  97.      */
  98.     public static DataStruct AddToolNumberRegedit(DataStruct ds,ArrayList<DataStruct> regeditList){
  99.             regeditList.add(ds);
  100.             return ds;
  101.     }

  102.     /**
  103.      * 检查刀具是否在占用表中
  104.      * @param op
  105.      * @param regeditList
  106.      * @return
  107.      */
  108.     public static boolean checkToolNumber(Operation op,ArrayList<DataStruct> regeditList){
  109.         try {
  110.             //取得UG得 Session,标准步骤
  111.             Session theSession = (Session) SessionFactory.get("Session");
  112.             //取得工作部件
  113.             Part workPart = theSession.parts().work();
  114.             NCGroup ncg = (NCGroup) op.getParent(CAMSetup.View.MACHINE_TOOL);
  115.             OperationBuilder cb = workPart.camsetup().camoperationCollection().createBuilder(op);
  116.             String name = ncg.name();
  117.             int number=cb.toolChangeSetting().number().value();
  118.             int lenght_number=cb.toolChangeSetting().adjustRegister().value();//刀长
  119.             int dia_number = cb.toolChangeSetting().cutcomRegister().value(); //刀经
  120.             for(DataStruct dds:regeditList){
  121.                 if(number==dds.number){ //刀具号码一样
  122.                     if(name.equals(dds.name)){
  123.                      //   return false; //刀号一样,名称一样,不视为占用,继续进行循环
  124.                     }else{
  125.                         return true;//刀号一样,名称不同,视为占用
  126.                     }
  127.                 }
  128.             }
  129.             return false;
  130.         } catch (NXException e) {
  131.             throw new RuntimeException(e);
  132.         } catch (RemoteException e) {
  133.             throw new RuntimeException(e);
  134.         }
  135.     }

  136.     /**
  137.      * 检查刀具是否在占用表中
  138.      * @param ds
  139.      * @param regeditList
  140.      * @return
  141.      */
  142.     public static boolean checkToolNumber(DataStruct ds,ArrayList<DataStruct> regeditList){
  143.         int number=ds.number;
  144.         int lenght_number=ds.lenght_number;//刀长
  145.         int dia_number = ds.dia_number; //刀经
  146.         for(DataStruct dds:regeditList){
  147.             if(number==dds.number){ //刀具号码一样
  148.                 if(ds.name.equals(dds.name)){
  149.                     //   return false; //刀号一样,名称一样,不视为占用,继续进行循环
  150.                 }else{
  151.                     return true;//刀号一样,名称不同,视为占用
  152.                 }
  153.             }
  154.         }
  155.         return false;
  156.     }


  157.     public static class DataStruct{
  158.         /**
  159.          * 刀具号码
  160.          */
  161.         public int number;//
  162.         /**
  163.          * 刀具名称
  164.          */
  165.         public String name;
  166.         /**
  167.          * 刀长补正号
  168.          */
  169.         public int lenght_number;
  170.         /**
  171.          * 刀经补正号
  172.          */
  173.         public int dia_number;
  174.         /**
  175.          * 当刀具号码已被占用时,是否可以对刀具进行重新排序
  176.          * true= 可重新排序
  177.          * false = 不可重新进行排序,相当于锁定刀号
  178.          */
  179.         public boolean reorder;//是否可重新排序
  180.         /**
  181.          * 重排序可用刀号低范围
  182.          */
  183.         public int lowNumber;
  184.         /**
  185.          * 重排序可用刀号高范围
  186.          */
  187.         public int higNumber;
  188.         public DataStruct(){
  189.             name="";
  190.             number=0;
  191.             lenght_number = 0;
  192.             dia_number = 0;
  193.             reorder = false; //默认不可以重新排序
  194.             lowNumber = 0;
  195.             higNumber = 0;
  196.         }
  197.     }
  198. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

咨询QQ:1359218528|发帖须知!|Archiver|手机版|小黑屋|UG爱好者论坛 ( 京ICP备10217105号-2 )

GMT+8, 2025-10-6 07:13

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表