xieeyawen 发表于 2025-4-29 09:51:06

谁有90度检查的源码

谁有90度检查的源码

xieeyawen 发表于 2025-5-19 09:20:21

yonglee9x 发表于 2025-5-6 14:56
我也很关心

axlCmdRegister("cedg9" 'check_etch_degree90 ?cmdType "interactive")
procedure(check_etch_degree90()
                (setq curVisible9 (axlVisibleGet));保存当前的显示层
    (axlVisibleDesign nil);隐藏显示层
    (axlClearSelSet)
                prog( ( layername
                     layerlist
                     layername
                     LayerType
                     )
       layerlist = axlGetParam("paramLayerGroup:ETCH")->groupMembers
       
        foreach( layername layerlist LayerType=axlDBGetLayerType(layername)
                                               
                if(        LayerType != "PLANE"
                        then
                        sprintf(ss "ETCH/%s" layername)
                        axlVisibleLayer(ss, t)               
                        axlVisibleLayer("PIN/TOP", t)
                        axlVisibleLayer("PIN/BOTTOM", t)
                        axlVisibleLayer("VIA CLASS/TOP", t)
                        axlVisibleUpdate(t)        ))
                        num=0.6
                        c=0
                        i = 0
                       
        interface()
        form_angle = (axlFormCreate (gensym) "./angle.form" `("E" "OUTER") 'Callbackt)
        axlFormDisplay(form_angle)
        axlFormSetField(form_angle , "widths" ,num)
                        );ENDPROG               
                        );ENDprocedure
               
procedure(numb( )
prog(()       
        axlClearSelSet()
        axlVisibleDesign(nil)
        layerlist = axlGetParam("paramLayerGroup:ETCH")->groupMembers
       
foreach( layername layerlist
        LayerType=axlDBGetLayerType(layername)
               
                if(        LayerType!="PLANE"
                        then
                        sprintf(ss "ETCH/%s" layername)
                        axlVisibleLayer(ss, t)
                       
                        axlVisibleLayer("PIN/TOP", t)
                        axlVisibleLayer("PIN/BOTTOM", t)
                        axlVisibleLayer("VIA CLASS/TOP", t)
                        axlVisibleUpdate(t)        )
                        );endforeach
                               
                num=axlFormGetField(form_angle, "widths")
                num=atof(num)       
        axlSetFindFilter(?enabled list( "noall" "Clines")?onButtons list("noall" "Clines"))
                        axlAddSelectAll()
                        clines=axlGetSelSet()
                       
                                c1=0
                                x = nil
                                i = 0
                                alllist1=nil
                        foreach(clineclines
                       
                                        segs=cline->segments
                                        n=length(segs)
                                               
                                when((n>1)
                                        for(i 1 n-1
                                                seg1=nthelem(i segs)
                                                seg2=nthelem(i+1 segs)
                                                               
                                                wid1=seg1->width
                                                wid2=times(wid1 num)
                                                               
                                                start1=nthelem(1 seg1->startEnd)
                                                end1=nthelem(2 seg1->startEnd)
                                                end2=nthelem(2 seg2->startEnd)
                                                               
                                                len1=axlDistance(start1 end1)
                                                len2=axlDistance(end1 end2)
                                                                       
                                        when((len1>wid2)&&(len2>wid2)               
                                                        x1=nthelem(1 start1)
                                                        y1=nthelem(2 start1)
                                                        x2=nthelem(1 end1)
                                                        y2=nthelem(2 end1)
                                                        x3=nthelem(1 end2)
                                                        y3=nthelem(2 end2)
                        if((expt((x1-x2) 2)+expt((y1-y2) 2)+expt((x3-x2) 2)+expt((y3-y2) 2)>=expt((x3-x1) 2)+expt((y3-y1) 2))
                                                        then
                                                        axlHighlightObject(seg1 nil)
                                                        axlHighlightObject(seg2 nil)       
                          layers=seg1->layer
                                alllist1=append1(alllist1 list(layers end1))
                               
                                        c1++)
                                        );endwhen
                                        )
                                        ));endforeach

        axlFormSetField(form_angle , "total_count" ,c1)
        axlFormSetField(form_angle , "nonce" ,i)
        axlClearSelSet()                                 
        )
        )               
;*****************************************               
procedure(one_count()
prog(()
       
if((axlFormGetField(form_angle, "check_1")==t)&&(axlFormGetField(form_angle, "check_2")==t) then
        alllist=append(alllist1 alllist2)
        c=c1+c2
        else
if(axlFormGetField(form_angle, "check_1")==tthen
        alllist=alllist1
        c=c1
        else
if(axlFormGetField(form_angle, "check_2")==tthen
        alllist=alllist2
        c=c2
        )))
        axlVisibleDesign(nil)
        alist=nthelem(i alllist)
        cpoint=nthelem(2 alist)
        llayer=nthelem(1 alist)
       
                xx1 = car(cpoint)
                yy1 = cadr(cpoint)
                axlVisibleLayer("PIN/TOP", t)
                axlVisibleLayer("PIN/BOTTOM", t)
                axlVisibleLayer("VIA CLASS/TOP", t)
                axlVisibleLayer(llayer, t)
               
                pcbunit = car(axlDBGetDesignUnits())
if(("millimeters" == pcbunit)
                then
               
                xx2 = xx1+1.27
                yy2 = yy1+1.27
                xx1 = xx1-1.27
                yy1 = yy1-1.27
        axlWindowBoxSet( list(xx1:yy1 xx2:yy2))       
else   
                xx2 = xx1+50
                yy2 = yy1+50
                xx1 = xx1-50
                yy1 = yy1-50
        axlWindowBoxSet( list(xx1:yy1 xx2:yy2))
       
        axlClearSelSet()
        )))
;******************************************       
       
        defun(interface ()       
        FORMFILE_90angle = outfile("./angle90.form")       
       
          fprintf(FORMFILE_90angle "FILE_TYPE=FORM_DEFN VERSION=2\n")      
    fprintf(FORMFILE_90angle "FORM\n")                                 
    fprintf(FORMFILE_90angle "FIXED\n")                                 
    fprintf(FORMFILE_90angle "PORT 23 11\n")                        
    fprintf(FORMFILE_90angle "HEADER \"Check Right Angle\"\n")
    fprintf(FORMFILE_90angle "\n")   
    fprintf(FORMFILE_90angle "TILE\n")   
       
          fprintf(FORMFILE_90angle "GROUP \"check list\"blue_a\n")
          fprintf(FORMFILE_90angle "GLOC 1 0\n")         
          fprintf(FORMFILE_90angle "GSIZE 22 10\n")         
          fprintf(FORMFILE_90angle "ENDGROUP\n")
       
          fprintf(FORMFILE_90angle "FIELD check_1\n")      
    fprintf(FORMFILE_90angle "FLOC 2 2\n")
    fprintf(FORMFILE_90angle "CHECKLIST \"right angle\"\n")
    fprintf(FORMFILE_90angle "ENDFIELD\n")
       
          fprintf(FORMFILE_90angle "FIELD check_2\n")      
    fprintf(FORMFILE_90angle "FLOC 2 4\n")
    fprintf(FORMFILE_90angle "CHECKLIST \"small corner\"\n")
    fprintf(FORMFILE_90angle "ENDFIELD\n")
       
          fprintf(FORMFILE_90angle "FIELD bmpos1\n")
          fprintf(FORMFILE_90angle "TLOC 16 2\n")
          fprintf(FORMFILE_90angle "THUMBNAIL\"d:/os1.bmp\" \n")
          fprintf(FORMFILE_90angle "FSIZE 2 2\n" )
          fprintf(FORMFILE_90angle "ENDFIELD\n\n")
       
          fprintf(FORMFILE_90angle "FIELD bmpos2\n")
          fprintf(FORMFILE_90angle "TLOC 16 4\n")
          fprintf(FORMFILE_90angle "THUMBNAIL\"d:/os2.bmp\" \n")
          fprintf(FORMFILE_90angle "FSIZE 2 2\n" )
          fprintf(FORMFILE_90angle "ENDFIELD\n\n")
       
       
          fprintf(FORMFILE_90angle "TEXT \"total:\" \n")
    fprintf(FORMFILE_90angle "TLOC1 11\n")            
    fprintf(FORMFILE_90angle "ENDTEXT\n\n")
       
          fprintf(FORMFILE_90angle "TEXT \"currently:\n")
    fprintf(FORMFILE_90angle "TLOC11 11\n")            
    fprintf(FORMFILE_90angle "ENDTEXT\n\n")
   
       
          fprintf(FORMFILE_90angle "TEXT \" \" total_count\n")
          fprintf(FORMFILE_90angle "TLOC 5 11\n")
          fprintf(FORMFILE_90angle "STRFILLIN 4 5\n")
          fprintf(FORMFILE_90angle "ENDTEXT\n")
               
    fprintf(FORMFILE_90angle "TEXT \" \" nonce\n")
                fprintf(FORMFILE_90angle "TLOC 18 11\n")
                fprintf(FORMFILE_90angle "STRFILLIN 4 5\n")
                fprintf(FORMFILE_90angle "ENDTEXT\n")
                       
                fprintf(FORMFILE_90angle "TEXT \" \" widths\n")
                fprintf(FORMFILE_90angle "TLOC 10 7\n")
                fprintf(FORMFILE_90angle "STRFILLIN 3 3\n")
                fprintf(FORMFILE_90angle "ENDTEXT\n")
               
          fprintf(FORMFILE_90angle "FIELD up\n")
    fprintf(FORMFILE_90angle "FLOC 1 15\n")
    fprintf(FORMFILE_90angle "MENUBUTTON \"prev..\" 4 3\n")
    fprintf(FORMFILE_90angle "ENDFIELD\n")
       
          fprintf(FORMFILE_90angle "FIELD next_to\n")      
    fprintf(FORMFILE_90angle "FLOC 10 15\n")
    fprintf(FORMFILE_90angle "MENUBUTTON \"next..\" 4 3\n")
    fprintf(FORMFILE_90angle "ENDFIELD\n")
   
    fprintf(FORMFILE_90angle "FIELD Done\n")      
    fprintf(FORMFILE_90angle "FLOC 17 15\n")
    fprintf(FORMFILE_90angle "MENUBUTTON \"Bye\" 4 3\n")
    fprintf(FORMFILE_90angle "ENDFIELD\n")
       
          fprintf(FORMFILE_90angle "FIELD check\n")      
    fprintf(FORMFILE_90angle "FLOC 15 7\n")
    fprintf(FORMFILE_90angle "MENUBUTTON \"check\" 3 3\n")
    fprintf(FORMFILE_90angle "ENDFIELD\n")
       
          fprintf(FORMFILE_90angle "\n")
    fprintf(FORMFILE_90angle "ENDTILE\n")
    fprintf(FORMFILE_90angle "\n")
    fprintf(FORMFILE_90angle "ENDFORM\n")
       
    close(FORMFILE_90angle)
    deleteFile("angle90.form")
       
);endprocedure

    (procedureCallback(form_angle)
    (prog (cpoint)      
    case( form_angle->curField      
            
                        ("up"
                        i--
                        if((i<1) then
                        i=c)
                        one_count()
                        axlFormSetField(form_angle , "nonce" ,i)
                       
                        if((i<1)
                        i=c)
                        t)
                       
                        ("next_to"
                        i++
                        if((i>c)
                        i=1)
            one_count()
                        axlFormSetField(form_angle , "nonce" ,i)
                        t)
                       
                        ("Done"
                        (axlVisibleSet curVisible9);还原保存的显示层
      (axlVisibleUpdate t);还原保存的显示层
      axlFormClose(form_angle)
                        t)                       
                       
                       
                        ("check"
                       
if((axlFormGetField(form_angle, "check_1")==t)&&(axlFormGetField(form_angle, "check_2")==t)
            then
                        numb()
                        shortline()
                        c=c1+c2
                        axlFormSetField(form_angle , "total_count" ,c1+c2)
                else
if(axlFormGetField(form_angle, "check_1")==tthen
                        numb()
                        c=c1
                else       
if(axlFormGetField(form_angle, "check_2")==tthen
                        shortline()
                        c=c2
                        )
                t)))
                       
                )))       
               
               
procedure(shortline()
prog( (m
       num
       layerlist
       layername
       LayerType
       clines
       cline
       segs

       n
       i
       ss
       end1 end2 end3
       seg1 seg2 seg3 wid1 wid2 len2
       x1 x2 x3 x4 y1 y2 y3 y4
       start1
      
       )                       
num=axlFormGetField(form_angle, "widths")
num=atof(num)
        axlVisibleDesign(nil)
        layerlist = axlGetParam("paramLayerGroup:ETCH")->groupMembers
        foreach( layername layerlist
                LayerType=axlDBGetLayerType(layername)
               
                if(        LayerType!="PLANE"
                        then
                        sprintf(ss "ETCH/%s" layername)
                        axlVisibleLayer(ss, t)
                        axlVisibleLayer("PIN/TOP", t)
                        axlVisibleLayer("PIN/BOTTOM", t)
                        axlVisibleLayer("VIA CLASS/TOP", t)
                        axlVisibleUpdate(t)        ))
        axlSetFindFilter(?enabled list( "noall" "Clines")?onButtons list("noall" "Clines"))
                axlAddSelectAll()
                clines=axlGetSelSet()
                        c2=0
                        i=0       
                        alllist2=nil
                foreach(clineclines
                                        segs=cline->segments
                                        n=length(segs)
                                               
                                when((n>3)
                                        for(i 2 n-2
                                                        seg1=nthelem(i segs)
                                                        seg2=nthelem(i+1 segs)
                                                        seg3=nthelem(i+2 segs)
                                                       
                                                        wid1=seg1->width
                                                        wid2=times(wid1 num)
                                                               
                                                        start1=nthelem(1 seg1->startEnd)
                                                        end1=nthelem(2 seg1->startEnd)
                                                        end2=nthelem(2 seg2->startEnd)
                                                        end3=nthelem(2 seg3->startEnd)
                                                       
                                                        ;len1=axlDistance(start1 end1)
                                                        len2=axlDistance(end1 end2)
                                                        ;len3=axlDistance(end2 end3)
                                                        ;len2<wid2
                                                       
                                                        x1=nthelem(1 start1)
                                                        y1=nthelem(2 start1)
                                                        x2=nthelem(1 end1)
                                                        y2=nthelem(2 end1)
                                                        x3=nthelem(1 end2)
                                                        y3=nthelem(2 end2)
                                                        y4=nthelem(2 end3)
                                                        x4=nthelem(1 end3)
                                                       
m=((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3))/(sqrt(expt((x2-x1) 2)+expt((y2-y1) 2))*sqrt(expt((x4-x3) 2)+expt((y4-y3) 2)))
                       
if(((cos(3.1415926*91/180)<m)&&(m<cos(3.1415926*89/180)))&&(len2<wid2)
                                       
                                                        then
                                                        axlHighlightObject(seg1 nil)
                                                        axlHighlightObject(seg2 nil)
                                                        axlHighlightObject(seg3 nil)                                                       
                                        layers=seg2->layer
                                        alllist2=append1(alllist2 list(layers end1))
                                       
                                        c2++)
                                        ))       
                                        );endforeach               
       
    axlFormSetField(form_angle , "total_count" ,c2)
        axlFormSetField(form_angle , "nonce" ,i)
        axlClearSelSet()
                        );ENDPROG               
                        );ENDprocedure

补充内容 (2025-11-17 15:39):
fprintf(FORMFILE_90angle "TEXT \"currently:\n")
fprintf(FORMFILE_90angle "TLOC11 11\n")            
fprintf(FORMFILE_90angle "ENDTEXT\n\n")

yonglee9x 发表于 2025-5-6 14:56:17

我也很关心

vivienluo 发表于 2025-5-9 17:06:52

;余弦函数求角度,再反余弦求度数
degree = axlRadToDeg(acos((LenA*LenA+LenB*LenB-LenC*LenC)/(2*LenA*LenB)))

xieeyawen 发表于 2025-5-12 08:44:40

vivienluo 发表于 2025-5-9 17:06


原来如此,感谢大佬解惑

xieeyawen 发表于 2025-5-15 16:40:42

本帖最后由 xieeyawen 于 2025-5-29 16:49 编辑

见楼下

xieeyawen 发表于 2025-5-15 17:17:00

yonglee9x 发表于 2025-5-6 14:56
我也很关心

看楼下我贴了代码,但是可能功能不是特别好,代码水平有限。

xieeyawen 发表于 2025-5-15 17:18:28

vivienluo 发表于 2025-5-9 17:06


还是不会的,不过我自己在楼下写了一个,你看下有没有好办法优化,有些找不出来,另外有些45度的报出来,但是其实是没问题的

xieeyawen 发表于 2025-5-19 09:19:21

yonglee9x 发表于 2025-5-6 14:56
我也很关心

别人提供的思路:
获取cline seg的长度(axlMPythag),判断是首尾连接后,直接用勾股定理判断,会有一点误差,最长边需要加入误差冗余值(我设置的是0.01),因为小数点计算的时候会有点偏差

xieeyawen 发表于 2025-5-19 09:21:09

xieeyawen 发表于 2025-5-19 09:20


找到别人写的代码,使用还不错
页: [1] 2
查看完整版本: 谁有90度检查的源码