15835255738 发表于 2025-7-14 22:13:35

大佬们,如何等间距复制过孔

目前写了1个代码,无法实现功能,我想要运行skil以后,选择1个过孔,然后上下左右可以等间距复制过孔/*********************************************************************
源码
作者:KLJ
功能:等间距拷贝过孔
优化:KLJ   
更新:
    2025年07月10日

思路,1、选择过孔
    2、axlDBGetPad()获取选择的过孔的DBID,根据DBID获取坐标、网络名称
        3、axlDBCreateVia创建过孔
       
    axlSetFindFilter支持的参数:
        "PINS","VIAS","CLINES","CLINESEGS","LINES","LINESEGS","DRCS","TEXT","SHAPES",
        "SHAPESEGS","BOUNDARY_SHAPES","VOIDS","VOIDSEGS","SYMBOLS","FIGURES","COMPONENTS",
        "FUNCTIONS","NETS","INVISIBLE","NAMEFORM","ALLTYPES","ALL","DYNTHEMALS","GROUPS",
        "GROUPMEMBERS""DYNTHEMALS","GROUPS","GROUPMEMBERS"
       
**********************************************************************/
axlCmdRegister("COpyViaBySameDistance" 'CreateCOpyViaForm_KLJ)
defun(CreateCOpyViaForm_KLJ ()
                time = getCurrentTime()
                time = parseString(time)
                day = nth(1 time)
                month = car(time)
                month = upperCase(month)
                year = nth(3 time)
                date = strcat(" Date: " day " " month " " year)               
                CreateCOpyViaForm()
                COpyViaForm_KLJ=axlFormCreate( (gensym) form_file nil 'CopyVia_CallBack t)
                axlFormDisplay(COpyViaForm_KLJ)
                axlUIWPrint(COpyViaForm_KLJ date)
                axlFormSetField(COpyViaForm_KLJ "Radio2" "true") ;默认勾选SMD
                axlFormSetField(COpyViaForm_KLJ "Units_value" car(axlDBGetDesignUnits()))
               

               
);end defun


defun(CreateCOpyViaForm ()
drain()
form_file = "CopyViaBySameDistance_form.form"
COpyViaForm = outfile(form_file "w")
fprintf(COpyViaForm "#Created by xml2bnfperl utility\n")
fprintf(COpyViaForm "#Coded by Venkata Ramanan/Santa Clara, CA\n\n")
fprintf(COpyViaForm "FILE_TYPE=FORM_DEFN VERSION=2\n")
fprintf(COpyViaForm "FORM AUTOGREYTEXT\n")
fprintf(COpyViaForm "FIXED\n")
fprintf(COpyViaForm "PORT 36 28\n")
fprintf(COpyViaForm "HEADER \"Form Field Type Demo\"\n\n")
fprintf(COpyViaForm "TILE\n\n")

fprintf(COpyViaForm "TEXT Current_Units:\n")
fprintf(COpyViaForm "FLOC 7 0\n")
fprintf(COpyViaForm "TGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDTEXT\n\n")

fprintf(COpyViaForm "TEXT \n")
fprintf(COpyViaForm "FLOC 17 0\n")   
fprintf(COpyViaForm "INFO Units_value 16 1\n") ;
fprintf(COpyViaForm "TGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDTEXT \n\n")

when(car(axlDBGetDesignUnits())=="mils"
    fprintf(COpyViaForm "FIELD Radio1\n")
    fprintf(COpyViaForm "FLOC 8 2\n")
    fprintf(COpyViaForm "CHECKLIST \"19.69\"\"rg\"\n")
    fprintf(COpyViaForm "FGROUP \"Form1\"\n")
    fprintf(COpyViaForm "ENDFIELD \n\n")
   
    fprintf(COpyViaForm "FIELD Radio2\n")
    fprintf(COpyViaForm "FLOC 18 2\n")
    fprintf(COpyViaForm "CHECKLIST \"31.5\"\"rg\"\n")
    fprintf(COpyViaForm "FGROUP \"Form1\"\n")
    fprintf(COpyViaForm "ENDFIELD \n\n")
   
    fprintf(COpyViaForm "FIELD Radio3\n")
    fprintf(COpyViaForm "FLOC 8 4\n")
    fprintf(COpyViaForm "CHECKLIST \"39.37\"\"rg\"\n")
    fprintf(COpyViaForm "FGROUP \"Form1\"\n")
    fprintf(COpyViaForm "ENDFIELD \n\n")
   
    fprintf(COpyViaForm "FIELD Radio4\n")
    fprintf(COpyViaForm "FLOC 18 4\n")
    fprintf(COpyViaForm "CHECKLIST \"50\"\"rg\"\n")
    fprintf(COpyViaForm "FGROUP \"Form1\"\n")
    fprintf(COpyViaForm "ENDFIELD \n\n")
);end when

when(car(axlDBGetDesignUnits())=="millimeters"
    fprintf(COpyViaForm "FIELD Radio1\n")
    fprintf(COpyViaForm "FLOC 8 2\n")
    fprintf(COpyViaForm "CHECKLIST \"0.5\"\"rg\"\n")
    fprintf(COpyViaForm "FGROUP \"Form1\"\n")
    fprintf(COpyViaForm "ENDFIELD \n\n")
   
    fprintf(COpyViaForm "FIELD Radio2\n")
    fprintf(COpyViaForm "FLOC 18 2\n")
    fprintf(COpyViaForm "CHECKLIST \"0.8\"\"rg\"\n")
    fprintf(COpyViaForm "FGROUP \"Form1\"\n")
    fprintf(COpyViaForm "ENDFIELD \n\n")
   
    fprintf(COpyViaForm "FIELD Radio3\n")
    fprintf(COpyViaForm "FLOC 8 4\n")
    fprintf(COpyViaForm "CHECKLIST \"1.0\"\"rg\"\n")
    fprintf(COpyViaForm "FGROUP \"Form1\"\n")
    fprintf(COpyViaForm "ENDFIELD \n\n")
   
    fprintf(COpyViaForm "FIELD Radio4\n")
    fprintf(COpyViaForm "FLOC 18 4\n")
    fprintf(COpyViaForm "CHECKLIST \"1.27\"\"rg\"\n")
    fprintf(COpyViaForm "FGROUP \"Form1\"\n")
    fprintf(COpyViaForm "ENDFIELD \n\n")
);end when

fprintf(COpyViaForm "FIELD Radio5\n")
fprintf(COpyViaForm "FLOC 8 6\n")
fprintf(COpyViaForm "CHECKLIST \"Renew:\"\"rg\"\n")
fprintf(COpyViaForm "FGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDFIELD \n\n")

fprintf(COpyViaForm "FIELD Input\n")
fprintf(COpyViaForm "FLOC 16 6\n")
fprintf(COpyViaForm "FSIZE 4 2\n")
fprintf(COpyViaForm "STRFILLIN 6 32\n")
fprintf(COpyViaForm "FGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDFIELD \n\n\n")

curdesignunit = axlGetParam("paramDesign")->units
fprintf(COpyViaForm "TEXT %L\n" curdesignunit) ;curdesignunit是1个变量
fprintf(COpyViaForm "FLOC 24 6\n")
fprintf(COpyViaForm "TGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDTEXT\n\n")

fprintf(COpyViaForm "FIELD Button_Up\n")
fprintf(COpyViaForm "FLOC 11 11\n")
fprintf(COpyViaForm "MENUBUTTON \"Up\" 11 3\n")
fprintf(COpyViaForm "FGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDFIELD \n\n")

fprintf(COpyViaForm "FIELD Button_Down\n")
fprintf(COpyViaForm "FLOC 11 17\n")
fprintf(COpyViaForm "MENUBUTTON \"Down\" 11 3\n")
fprintf(COpyViaForm "FGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDFIELD \n\n")

fprintf(COpyViaForm "FIELD Button_Left\n")
fprintf(COpyViaForm "FLOC 1 14\n")
fprintf(COpyViaForm "MENUBUTTON \"Left\" 11 3\n")
fprintf(COpyViaForm "FGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDFIELD \n\n")

fprintf(COpyViaForm "FIELD Button_Right\n")
fprintf(COpyViaForm "FLOC 22 14\n")
fprintf(COpyViaForm "MENUBUTTON \"Right\" 11 3\n")
fprintf(COpyViaForm "FGROUP \"Form1\"\n")
fprintf(COpyViaForm "ENDFIELD \n\n")

fprintf(COpyViaForm "ENDTILE\n\n")
fprintf(COpyViaForm "ENDFORM\n\n")

close(COpyViaForm)
)


defun(CopyVia_CallBack (COpyViaForm_KLJ)
    let( (dist field cnt)
          printf("field/value %L = %L (int %L\n)" COpyViaForm_KLJ->curField, COpyViaForm_KLJ->curValue, COpyViaForm_KLJ->curValueInt )
      printf("doneState %L\n" COpyViaForm_KLJ->doneState )
      case(COpyViaForm_KLJ->curField
                  ("Button_Up"
                dist = getDistanceValue(COpyViaForm_KLJ)
                when(dist
                                 CopyViaBySameDimension(0 dist)
                          );end when

                  )
                  ("Button_Down"               
                dist = getDistanceValue(COpyViaForm_KLJ)
                when(dist
                                 CopyViaBySameDimension(0 -dist)
                          );end when
                  )
                  ("Button_Left"
                dist = getDistanceValue(COpyViaForm_KLJ)
                when(dist
                                 CopyViaBySameDimension(-dist 0)
                          );end when
                  )
                  ("Button_Right"   
                dist = getDistanceValue(COpyViaForm_KLJ)
                when(dist
                                 CopyViaBySameDimension(dist 0)
                          );end when       
                  )
                  ("Radio1"   
                  )
                  ("Radio2"          
                  )
                  ("Radio3"          
                  
                  )
                  ("Radio4"                  
                  
                  )
                  ("Input"

                  )
        );end let
);end procedure

if((nequal COpyViaForm_KLJ->doneState 0)
axlFormClose(COpyViaForm_KLJ))
)


; 辅助函数:获取距离值
defun(getDistanceValue (form)
    let((dist)
      Radio_num1 = axlFormGetField(form "Radio1")
      Radio_num2 = axlFormGetField(form "Radio2")
      Radio_num3 = axlFormGetField(form "Radio3")
      Radio_num4 = axlFormGetField(form "Radio4")
      Radio_num5 = axlFormGetField(form "Radio5")
      when(Radio_num1
            when(car(axlDBGetDesignUnits()) == "mils"         dist = float(19.69))
            when(car(axlDBGetDesignUnits()) == "millimeters"dist = float(0.5))
      )
      when(Radio_num2
            when(car(axlDBGetDesignUnits()) == "mils"         dist = float(31.5))
            when(car(axlDBGetDesignUnits()) == "millimeters"dist = float(0.8))
      )
      when(Radio_num3
            when(car(axlDBGetDesignUnits()) == "mils"         dist = float(39.37))
            when(car(axlDBGetDesignUnits()) == "millimeters"dist = float(1.0))
      )
      when(Radio_num4
            when(car(axlDBGetDesignUnits()) == "mils"         dist = float(50))
            when(car(axlDBGetDesignUnits()) == "millimeters"dist = float(1.27))
      )
      when(Radio_num5
            dist = atof(axlFormGetField(form "Input"))
      )
                dist
    );end let
);end defun


defun( CopyViaBySameDimension (x_offset y_offset)
    let((ViaDbid)
      axlSetFindFilter(?enabled (list "noall" "VIAS") ?onButtons (list "VIAS"))
      ;axlClearSelSet()
      axlMsgPut("Select a via as reference...")
      selectedVia = axlSingleSelectPoint()
      ViaDbid = axlGetSelSet(selectedVia)                        ;获取选择对象的DBID
                ;unless(axlOKToProceed() axlShell("done"))
                when(ViaDbid
                padstackName = car(ViaDbid)->name      ;获取焊盘名称
            ViaNet = car(ViaDbid)->net->name       ;获取当前选择过孔的网络名称
                ViaXY= car(ViaDbid)->xy            ;获取当前选择过孔的坐标
                ViaRotation= car(ViaDbid)->via->rotation;获取旋转角度
                ViaMirror= car(ViaDbid)->via->mirrored;获取旋转角度
      );end when
          x = xCoord(ViaXY); 获取x坐标
          y = yCoord(ViaXY); 获取y坐标
                ;点击左右则x变化,y不变
          x = x + x_offset
          ;点击上下则y变化,X不变
          y = y + y_offset
                ;unless(axlOKToProceed() axlShell("done"))
          newVia = axlDBCreateVia(padstackName , x:y , ViaNet, ViaMirror , ViaRotation , nil) ;创建过孔
          when(newVia
                  NewViaDbid = list(car(newVia))
                axlHighlightObject(NewViaDbid)
          );end when
                  
    );end let   
);end defun       
       
       
       
       
       

bingshuihuo 发表于 2025-7-18 08:17:57

赞!!!!!!!!!!!!!!!!!!!!!!

colin 发表于 2025-12-10 17:59:34

牛
页: [1]
查看完整版本: 大佬们,如何等间距复制过孔