Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 304|回复: 11

[求助] 谁有90度检查的源码

[复制链接]
发表于 2025-4-29 09:51:06 | 显示全部楼层 |阅读模式
谁有90度检查的源码
发表于 2025-5-6 14:56:17 | 显示全部楼层

回帖奖励 +10 SKILL币

我也很关心
发表于 2025-5-9 17:06:52 | 显示全部楼层
  1. ;余弦函数求角度,再反余弦求度数
  2. degree = axlRadToDeg(acos((LenA*LenA+LenB*LenB-LenC*LenC)/(2*LenA*LenB)))
复制代码

评分

参与人数 1SKILL币 +10 收起 理由
xieeyawen + 10

查看全部评分

 楼主| 发表于 2025-5-12 08:44:40 | 显示全部楼层

原来如此,感谢大佬解惑
 楼主| 发表于 2025-5-15 16:40:42 | 显示全部楼层
本帖最后由 xieeyawen 于 2025-5-29 16:49 编辑
  1. 见楼下
复制代码
 楼主| 发表于 2025-5-15 17:17:00 | 显示全部楼层

看楼下我贴了代码,但是可能功能不是特别好,代码水平有限。
 楼主| 发表于 2025-5-15 17:18:28 | 显示全部楼层

还是不会的,不过我自己在楼下写了一个,你看下有没有好办法优化,有些找不出来,另外有些45度的报出来,但是其实是没问题的
 楼主| 发表于 2025-5-19 09:19:21 | 显示全部楼层

别人提供的思路:
获取cline seg的长度(axlMPythag),判断是首尾连接后,直接用勾股定理判断,会有一点误差,最长边需要加入误差冗余值(我设置的是0.01),因为小数点计算的时候会有点偏差
 楼主| 发表于 2025-5-19 09:20:21 | 显示全部楼层
  1. axlCmdRegister("cedg9" 'check_etch_degree90 ?cmdType "interactive")
  2. procedure(check_etch_degree90()
  3.                 (setq curVisible9 (axlVisibleGet))  ;保存当前的显示层
  4.     (axlVisibleDesign nil);隐藏显示层
  5.     (axlClearSelSet)
  6.                 prog( ( layername
  7.                        layerlist
  8.                        layername
  9.                        LayerType
  10.                        )
  11.          layerlist = axlGetParam("paramLayerGroup:ETCH")->groupMembers
  12.        
  13.         foreach( layername layerlist LayerType=axlDBGetLayerType(layername)
  14.                                                
  15.                 if(        LayerType != "PLANE"  
  16.                         then
  17.                         sprintf(ss "ETCH/%s" layername)
  18.                         axlVisibleLayer(ss, t)               
  19.                         axlVisibleLayer("PIN/TOP", t)
  20.                         axlVisibleLayer("PIN/BOTTOM", t)
  21.                         axlVisibleLayer("VIA CLASS/TOP", t)
  22.                         axlVisibleUpdate(t)        ))
  23.                         num=0.6
  24.                         c=0
  25.                         i = 0
  26.                        
  27.         interface()
  28.         form_angle = (axlFormCreate (gensym) "./angle.form" `("E" "OUTER") 'Callback  t)
  29.         axlFormDisplay(form_angle)
  30.         axlFormSetField(form_angle , "widths" ,num)
  31.                         );ENDPROG               
  32.                         );ENDprocedure  
  33.                
  34. procedure(numb( )
  35. prog(()       
  36.         axlClearSelSet()
  37.         axlVisibleDesign(nil)
  38.         layerlist = axlGetParam("paramLayerGroup:ETCH")->groupMembers
  39.        
  40. foreach( layername layerlist
  41.         LayerType=axlDBGetLayerType(layername)
  42.                
  43.                 if(        LayerType!="PLANE"  
  44.                         then
  45.                         sprintf(ss "ETCH/%s" layername)
  46.                         axlVisibleLayer(ss, t)
  47.                        
  48.                         axlVisibleLayer("PIN/TOP", t)
  49.                         axlVisibleLayer("PIN/BOTTOM", t)
  50.                         axlVisibleLayer("VIA CLASS/TOP", t)
  51.                         axlVisibleUpdate(t)        )
  52.                         );endforeach
  53.                                
  54.                 num=axlFormGetField(form_angle, "widths")
  55.                 num=atof(num)       
  56.         axlSetFindFilter(?enabled list( "noall" "Clines")  ?onButtons list("noall" "Clines"))
  57.                         axlAddSelectAll()
  58.                         clines=axlGetSelSet()
  59.                        
  60.                                 c1=0
  61.                                 x = nil
  62.                                 i = 0
  63.                                 alllist1=nil
  64.                         foreach(cline  clines
  65.                        
  66.                                         segs=cline->segments
  67.                                         n=length(segs)
  68.                                                
  69.                                 when((n>1)
  70.                                         for(i 1 n-1
  71.                                                 seg1=nthelem(i segs)
  72.                                                 seg2=nthelem(i+1 segs)
  73.                                                                
  74.                                                 wid1=seg1->width
  75.                                                 wid2=times(wid1 num)
  76.                                                                
  77.                                                 start1=nthelem(1 seg1->startEnd)
  78.                                                 end1=nthelem(2 seg1->startEnd)
  79.                                                 end2=nthelem(2 seg2->startEnd)
  80.                                                                
  81.                                                 len1=axlDistance(start1 end1)
  82.                                                 len2=axlDistance(end1 end2)
  83.                                                                        
  84.                                         when((len1>wid2)&&(len2>wid2)               
  85.                                                         x1=nthelem(1 start1)
  86.                                                         y1=nthelem(2 start1)
  87.                                                         x2=nthelem(1 end1)
  88.                                                         y2=nthelem(2 end1)
  89.                                                         x3=nthelem(1 end2)
  90.                                                         y3=nthelem(2 end2)
  91.                         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))
  92.                                                         then
  93.                                                         axlHighlightObject(seg1 nil)
  94.                                                         axlHighlightObject(seg2 nil)       
  95.                             layers=seg1->layer
  96.                                 alllist1=append1(alllist1 list(layers end1))
  97.                                
  98.                                         c1++)
  99.                                         );endwhen
  100.                                         )
  101.                                         ));endforeach

  102.         axlFormSetField(form_angle , "total_count" ,c1)
  103.         axlFormSetField(form_angle , "nonce" ,i)
  104.         axlClearSelSet()                                   
  105.         )
  106.         )               
  107. ;*****************************************               
  108. procedure(one_count()
  109. prog(()
  110.        
  111. if((axlFormGetField(form_angle, "check_1")==t)&&(axlFormGetField(form_angle, "check_2")==t) then
  112.         alllist=append(alllist1 alllist2)
  113.         c=c1+c2
  114.         else
  115. if(axlFormGetField(form_angle, "check_1")==t  then
  116.         alllist=alllist1
  117.         c=c1
  118.         else
  119. if(axlFormGetField(form_angle, "check_2")==t  then
  120.         alllist=alllist2
  121.         c=c2
  122.         )))
  123.         axlVisibleDesign(nil)
  124.         alist=nthelem(i alllist)
  125.         cpoint=nthelem(2 alist)
  126.         llayer=nthelem(1 alist)
  127.        
  128.                 xx1 = car(cpoint)
  129.                 yy1 = cadr(cpoint)
  130.                 axlVisibleLayer("PIN/TOP", t)
  131.                 axlVisibleLayer("PIN/BOTTOM", t)
  132.                 axlVisibleLayer("VIA CLASS/TOP", t)
  133.                 axlVisibleLayer(llayer, t)
  134.                
  135.                 pcbunit = car(axlDBGetDesignUnits())
  136. if(("millimeters" == pcbunit)
  137.                 then
  138.                
  139.                 xx2 = xx1+1.27
  140.                 yy2 = yy1+1.27
  141.                 xx1 = xx1-1.27
  142.                 yy1 = yy1-1.27
  143.         axlWindowBoxSet( list(xx1:yy1 xx2:yy2))       
  144. else   
  145.                 xx2 = xx1+50
  146.                 yy2 = yy1+50
  147.                 xx1 = xx1-50
  148.                 yy1 = yy1-50
  149.         axlWindowBoxSet( list(xx1:yy1 xx2:yy2))
  150.        
  151.         axlClearSelSet()
  152.         )))
  153. ;******************************************       
  154.        
  155.         defun(interface ()       
  156.         FORMFILE_90angle = outfile("./angle90.form")       
  157.        
  158.           fprintf(FORMFILE_90angle "FILE_TYPE=FORM_DEFN VERSION=2\n")      
  159.     fprintf(FORMFILE_90angle "FORM\n")                                 
  160.     fprintf(FORMFILE_90angle "FIXED\n")                                 
  161.     fprintf(FORMFILE_90angle "PORT 23 11\n")                        
  162.     fprintf(FORMFILE_90angle "HEADER "Check Right Angle"\n")
  163.     fprintf(FORMFILE_90angle "\n")     
  164.     fprintf(FORMFILE_90angle "TILE\n")   
  165.        
  166.           fprintf(FORMFILE_90angle "GROUP "check list"blue_a\n")
  167.           fprintf(FORMFILE_90angle "GLOC 1 0\n")           
  168.           fprintf(FORMFILE_90angle "GSIZE 22 10\n")         
  169.           fprintf(FORMFILE_90angle "ENDGROUP\n")  
  170.        
  171.           fprintf(FORMFILE_90angle "FIELD check_1\n")      
  172.     fprintf(FORMFILE_90angle "FLOC 2 2\n")
  173.     fprintf(FORMFILE_90angle "CHECKLIST "right angle"\n")  
  174.     fprintf(FORMFILE_90angle "ENDFIELD\n")
  175.        
  176.           fprintf(FORMFILE_90angle "FIELD check_2\n")      
  177.     fprintf(FORMFILE_90angle "FLOC 2 4\n")
  178.     fprintf(FORMFILE_90angle "CHECKLIST "small corner"\n")  
  179.     fprintf(FORMFILE_90angle "ENDFIELD\n")
  180.        
  181.           fprintf(FORMFILE_90angle "FIELD bmpos1\n")
  182.           fprintf(FORMFILE_90angle "TLOC 16 2\n")
  183.           fprintf(FORMFILE_90angle "THUMBNAIL"d:/os1.bmp" \n")
  184.           fprintf(FORMFILE_90angle "FSIZE 2 2\n" )
  185.           fprintf(FORMFILE_90angle "ENDFIELD\n\n")
  186.        
  187.           fprintf(FORMFILE_90angle "FIELD bmpos2\n")
  188.           fprintf(FORMFILE_90angle "TLOC 16 4\n")
  189.           fprintf(FORMFILE_90angle "THUMBNAIL"d:/os2.bmp" \n")
  190.           fprintf(FORMFILE_90angle "FSIZE 2 2\n" )
  191.           fprintf(FORMFILE_90angle "ENDFIELD\n\n")
  192.        
  193.        
  194.           fprintf(FORMFILE_90angle "TEXT "total:" \n")
  195.     fprintf(FORMFILE_90angle "TLOC  1 11\n")            
  196.     fprintf(FORMFILE_90angle "ENDTEXT\n\n")
  197.        
  198.           fprintf(FORMFILE_90angle "TEXT "currently:\n")
  199.     fprintf(FORMFILE_90angle "TLOC  11 11\n")            
  200.     fprintf(FORMFILE_90angle "ENDTEXT\n\n")
  201.    
  202.        
  203.           fprintf(FORMFILE_90angle "TEXT " " total_count\n")
  204.           fprintf(FORMFILE_90angle "TLOC 5 11\n")
  205.           fprintf(FORMFILE_90angle "STRFILLIN 4 5\n")
  206.           fprintf(FORMFILE_90angle "ENDTEXT\n")
  207.                
  208.     fprintf(FORMFILE_90angle "TEXT " " nonce\n")
  209.                 fprintf(FORMFILE_90angle "TLOC 18 11\n")
  210.                 fprintf(FORMFILE_90angle "STRFILLIN 4 5\n")
  211.                 fprintf(FORMFILE_90angle "ENDTEXT\n")
  212.                        
  213.                 fprintf(FORMFILE_90angle "TEXT " " widths\n")
  214.                 fprintf(FORMFILE_90angle "TLOC 10 7\n")
  215.                 fprintf(FORMFILE_90angle "STRFILLIN 3 3\n")
  216.                 fprintf(FORMFILE_90angle "ENDTEXT\n")
  217.                
  218.           fprintf(FORMFILE_90angle "FIELD up\n")  
  219.     fprintf(FORMFILE_90angle "FLOC 1 15\n")
  220.     fprintf(FORMFILE_90angle "MENUBUTTON "prev.." 4 3\n")  
  221.     fprintf(FORMFILE_90angle "ENDFIELD\n")
  222.        
  223.           fprintf(FORMFILE_90angle "FIELD next_to\n")      
  224.     fprintf(FORMFILE_90angle "FLOC 10 15\n")
  225.     fprintf(FORMFILE_90angle "MENUBUTTON "next.." 4 3\n")  
  226.     fprintf(FORMFILE_90angle "ENDFIELD\n")
  227.    
  228.     fprintf(FORMFILE_90angle "FIELD Done\n")      
  229.     fprintf(FORMFILE_90angle "FLOC 17 15\n")
  230.     fprintf(FORMFILE_90angle "MENUBUTTON "Bye" 4 3\n")  
  231.     fprintf(FORMFILE_90angle "ENDFIELD\n")
  232.        
  233.           fprintf(FORMFILE_90angle "FIELD check\n")      
  234.     fprintf(FORMFILE_90angle "FLOC 15 7\n")
  235.     fprintf(FORMFILE_90angle "MENUBUTTON "check" 3 3\n")  
  236.     fprintf(FORMFILE_90angle "ENDFIELD\n")
  237.        
  238.           fprintf(FORMFILE_90angle "\n")
  239.     fprintf(FORMFILE_90angle "ENDTILE\n")
  240.     fprintf(FORMFILE_90angle "\n")
  241.     fprintf(FORMFILE_90angle "ENDFORM\n")
  242.        
  243.     close(FORMFILE_90angle)
  244.     deleteFile("angle90.form")
  245.        
  246. );endprocedure

  247.     (procedure  Callback(form_angle)  
  248.     (prog (cpoint)        
  249.     case( form_angle->curField      
  250.             
  251.                         ("up"
  252.                         i--
  253.                         if((i<1) then
  254.                         i=c)
  255.                         one_count()
  256.                         axlFormSetField(form_angle , "nonce" ,i)
  257.                        
  258.                         if((i<1)
  259.                         i=c)
  260.                         t)
  261.                        
  262.                         ("next_to"
  263.                         i++
  264.                         if((i>c)
  265.                         i=1)
  266.             one_count()
  267.                         axlFormSetField(form_angle , "nonce" ,i)
  268.                         t)
  269.                        
  270.                         ("Done"
  271.                         (axlVisibleSet curVisible9)  ;还原保存的显示层
  272.       (axlVisibleUpdate t);还原保存的显示层
  273.       axlFormClose(form_angle)
  274.                         t)                       
  275.                        
  276.                        
  277.                         ("check"
  278.                        
  279. if((axlFormGetField(form_angle, "check_1")==t)&&(axlFormGetField(form_angle, "check_2")==t)
  280.             then
  281.                         numb()
  282.                         shortline()
  283.                         c=c1+c2
  284.                         axlFormSetField(form_angle , "total_count" ,c1+c2)
  285.                 else
  286. if(axlFormGetField(form_angle, "check_1")==t  then
  287.                         numb()
  288.                         c=c1
  289.                 else       
  290. if(axlFormGetField(form_angle, "check_2")==t  then
  291.                         shortline()
  292.                         c=c2
  293.                         )
  294.                 t)))
  295.                        
  296.                 )))       
  297.                
  298.                
  299. procedure(shortline()
  300. prog( (m
  301.        num
  302.        layerlist
  303.        layername
  304.        LayerType
  305.        clines
  306.        cline
  307.        segs

  308.        n
  309.        i
  310.        ss
  311.        end1 end2 end3
  312.        seg1 seg2 seg3 wid1 wid2 len2
  313.        x1 x2 x3 x4 y1 y2 y3 y4
  314.        start1
  315.       
  316.        )                       
  317. num=axlFormGetField(form_angle, "widths")
  318. num=atof(num)
  319.         axlVisibleDesign(nil)
  320.         layerlist = axlGetParam("paramLayerGroup:ETCH")->groupMembers
  321.         foreach( layername layerlist
  322.                 LayerType=axlDBGetLayerType(layername)
  323.                
  324.                 if(        LayerType!="PLANE"  
  325.                         then
  326.                         sprintf(ss "ETCH/%s" layername)
  327.                         axlVisibleLayer(ss, t)
  328.                         axlVisibleLayer("PIN/TOP", t)
  329.                         axlVisibleLayer("PIN/BOTTOM", t)
  330.                         axlVisibleLayer("VIA CLASS/TOP", t)
  331.                         axlVisibleUpdate(t)        ))
  332.         axlSetFindFilter(?enabled list( "noall" "Clines")  ?onButtons list("noall" "Clines"))
  333.                 axlAddSelectAll()
  334.                 clines=axlGetSelSet()
  335.                         c2=0
  336.                         i=0       
  337.                         alllist2=nil
  338.                 foreach(cline  clines
  339.                                         segs=cline->segments
  340.                                         n=length(segs)
  341.                                                
  342.                                 when((n>3)
  343.                                         for(i 2 n-2
  344.                                                         seg1=nthelem(i segs)
  345.                                                         seg2=nthelem(i+1 segs)
  346.                                                         seg3=nthelem(i+2 segs)
  347.                                                        
  348.                                                         wid1=seg1->width
  349.                                                         wid2=times(wid1 num)
  350.                                                                
  351.                                                         start1=nthelem(1 seg1->startEnd)
  352.                                                         end1=nthelem(2 seg1->startEnd)
  353.                                                         end2=nthelem(2 seg2->startEnd)
  354.                                                         end3=nthelem(2 seg3->startEnd)
  355.                                                        
  356.                                                         ;len1=axlDistance(start1 end1)
  357.                                                         len2=axlDistance(end1 end2)
  358.                                                         ;len3=axlDistance(end2 end3)
  359.                                                         ;len2<wid2
  360.                                                        
  361.                                                         x1=nthelem(1 start1)
  362.                                                         y1=nthelem(2 start1)
  363.                                                         x2=nthelem(1 end1)
  364.                                                         y2=nthelem(2 end1)
  365.                                                         x3=nthelem(1 end2)
  366.                                                         y3=nthelem(2 end2)
  367.                                                         y4=nthelem(2 end3)
  368.                                                         x4=nthelem(1 end3)
  369.                                                        
  370. 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)))
  371.                        
  372. if(((cos(3.1415926*91/180)<m)&&(m<cos(3.1415926*89/180)))&&(len2<wid2)
  373.                                        
  374.                                                         then
  375.                                                         axlHighlightObject(seg1 nil)
  376.                                                         axlHighlightObject(seg2 nil)
  377.                                                         axlHighlightObject(seg3 nil)                                                       
  378.                                         layers=seg2->layer
  379.                                         alllist2=append1(alllist2 list(layers end1))
  380.                                        
  381.                                         c2++)
  382.                                         ))       
  383.                                         );endforeach               
  384.        
  385.     axlFormSetField(form_angle , "total_count" ,c2)
  386.         axlFormSetField(form_angle , "nonce" ,i)
  387.         axlClearSelSet()
  388.                         );ENDPROG               
  389.                         );ENDprocedure
复制代码
 楼主| 发表于 2025-5-19 09:21:09 | 显示全部楼层

找到别人写的代码,使用还不错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号 )

GMT+8, 2025-7-13 00:47 , Processed in 0.213935 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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