找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 294|回复: 5
打印 上一主题 下一主题

move silk to center

[复制链接]

19

主题

315

帖子

2106

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2106
跳转到指定楼层
1#
发表于 2016-8-3 17:41 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
有一个move silk to bodycenter的skill,但是他提的text坐标是左下角坐标,移动之后有时候还是会有遮挡器件丝印的问题,求获取text的中心坐标办法
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏1 支持!支持! 反对!反对!

8

主题

468

帖子

2639

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2639
2#
发表于 2016-8-4 08:12 | 只看该作者
axlDBAltOrigin

19

主题

315

帖子

2106

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2106
3#
 楼主| 发表于 2016-8-5 14:07 | 只看该作者
axlCmdRegister( "r2c" 'RefDestoCenter ?cmdType "interactive" ?doneCmd  'ps_RefDestoCenterstop ?cancelCmd 'ps_RefDestoCenterstop )

procedure( RefDestoCenter( )
        let(
                ( lLayer_name
                        PI
                        ps_RefDestoCenter_From_file
                        ps_RefDestoCenter_From
                        sPackageLayer
                        bStop
                        lBlock
                        bSym
                        bLayer
                        lSym
                        lText
                        bText_status
                        dShape
                        dShape_temp
                        fDelta_y
                        fSym_center_x
                        fSym_center_y
                        fSym_left_x
                        fSym_left_y
                        fSym_right_x
                        fSym_right_y
                        fSym_x
                        fSym_y
                        fSym_xy
                        fText_rot
                        lShape
                        lSym_shape_box
                        rText_orient
                )
                if( compareTime("Dec 12 16:35:55 2020" getCurrentTime() )>0 && compareTime("Aug 10 16:35:55 2009" getCurrentTime() )<0 then

                        PI = 3.1415926
                        bStop = t
                        lBlock                
                        lLayer_name = list( "Assembly TOP" "SilkScreen TOP" "Assembly BOTTOM" "SilkScreen BOTTOM" "Move All" )
       
                        ps_RefDestoCenter_From_file = strcat( axlTempDirectory() "./ps_RefDestoCenter_From.form" )
            
            ; create the Move RefDes To Body Center form
            ps_RefDestoCenter_From = outfile( ps_RefDestoCenter_From_file "w" )
                  fprintf( ps_RefDestoCenter_From "FILE_TYPE=FORM_DEFN VERSION=2\n" )
                        fprintf( ps_RefDestoCenter_From "FORM\n" )
                        fprintf( ps_RefDestoCenter_From "FIXED\n" )
                        fprintf( ps_RefDestoCenter_From "PORT 29 20\n" )
                        fprintf( ps_RefDestoCenter_From "HEADER \"ps_RefDestoCenter\"\n" )
               
                        fprintf( ps_RefDestoCenter_From "POPUP <select_layer_name_p>" )
                        fprintf( ps_RefDestoCenter_From "\"a\"\"a\"" )
                        fprintf( ps_RefDestoCenter_From "\n" )
                       
                        fprintf( ps_RefDestoCenter_From "TILE\n" )
       
                  fprintf( ps_RefDestoCenter_From "TEXT \"Select visible layer:\"\n" )
                        fprintf( ps_RefDestoCenter_From "TLOC 2 1\n" )
                        fprintf( ps_RefDestoCenter_From "ENDTEXT\n" )       
                       
                         fprintf( ps_RefDestoCenter_From "FIELD select_layer_name\n" )
                   fprintf( ps_RefDestoCenter_From "FLOC 11 3\n" )
                   fprintf( ps_RefDestoCenter_From "ENUMSET 13\n" )
                   fprintf( ps_RefDestoCenter_From "POP \"select_layer_name_p\"\n" )
                   fprintf( ps_RefDestoCenter_From "ENDFIELD\n" )
       
                        fprintf( ps_RefDestoCenter_From "TEXT \"Move mode:\"\n" )
                        fprintf( ps_RefDestoCenter_From "TLOC 2 5\n" )
                        fprintf( ps_RefDestoCenter_From "ENDTEXT\n" )       
                       
                        fprintf( ps_RefDestoCenter_From "FIELD Layer_mode\n" )
                   fprintf( ps_RefDestoCenter_From "FLOC 11 5\n" )
                  fprintf( ps_RefDestoCenter_From "CHECKLIST \"By Layer\" \"radioLabel\"\n" )
                  fprintf( ps_RefDestoCenter_From "ENDFIELD\n" )
                       
                        fprintf( ps_RefDestoCenter_From "FIELD Sym_mode\n" )
                  fprintf( ps_RefDestoCenter_From "FLOC 11 7\n" )
                  fprintf( ps_RefDestoCenter_From "CHECKLIST \"By Symbol\" \"radioLabel\"\n" )
                  fprintf( ps_RefDestoCenter_From "ENDFIELD\n" )
                       
                        fprintf( ps_RefDestoCenter_From "FIELD aspcRun\n" )
                        fprintf( ps_RefDestoCenter_From "FLOC 16 9\n" )
                        fprintf( ps_RefDestoCenter_From "MENUBUTTON \"Run\" 11 3\n" )
                        fprintf( ps_RefDestoCenter_From "ENDFIELD\n" )
       
                        fprintf( ps_RefDestoCenter_From "FIELD aspcHelp\n" )
                        fprintf( ps_RefDestoCenter_From "FLOC 2 9\n" )
                        fprintf( ps_RefDestoCenter_From "MENUBUTTON \"Help\" 11 3\n" )
                        fprintf( ps_RefDestoCenter_From "ENDFIELD\n" )               
                        fprintf( ps_RefDestoCenter_From "ENDTILE\n" )
                        fprintf( ps_RefDestoCenter_From "ENDFORM\n" )
                        close( ps_RefDestoCenter_From )
       
                        ps_RefDestoCenter_From = axlFormCreate( (gensym) ps_RefDestoCenter_From_file '(e inner) 'ps_RefDestoCenter_Routine t )
                        ps_RefDestoCenter_From = axlMiniStatusLoad( (gensym) ps_RefDestoCenter_From_file  'ps_RefDestoCenter_Routine )
                       
                        ; set default value to form field
                        axlFormBuildPopup( ps_RefDestoCenter_From "select_layer_name" lLayer_name )
                        axlFormSetField( ps_RefDestoCenter_From "select_layer_name" "Assembly TOP" )
                        axlFormSetField( ps_RefDestoCenter_From "Sym_mode" t )
                        axlFormSetFieldVisible( ps_RefDestoCenter_From "aspcRun" 0 )
                        axlFormDisplay( ps_RefDestoCenter_From )
                        deleteFile( ps_RefDestoCenter_From_file )
       
                        ; default visible layer is Assembly Top
                        axlVisibleDesign( nil )
                        axlVisibleLayer( "Board Geometry/Assembly_TOP" t )       
                        axlVisibleLayer( "Board Geometry/Outline" t )       
                        axlVisibleLayer( "Drawing Format/Title_Block" t )                                       
                        axlVisibleLayer( "Drawing Format/Outline" t )       
                        axlVisibleLayer( "Package Geometry/Assembly_Top" t )       
                        axlVisibleLayer( "Ref Des/Assembly_Top" t )       
                        axlVisibleLayer( "Pin/Top" t )               
                        axlFlushDisplay()                                       
                       
                        sPackageLayer = "PACKAGE GEOMETRY/PLACE_BOUND_BOTTOM"                                               
                        axlMsgPut( "Please select a symbol to move its Refdes in By Symbol mode;" )
                        axlMsgPut( "or select a layer to move all the Refdes in By Layer mode!" )
                       
                        while( bStop
                                        bSym = axlFormGetField( ps_RefDestoCenter_From "Sym_mode" )
                                        bLayer = !bSym
                                        while( bStop && bSym
                                                        axlFormSetFieldVisible( ps_RefDestoCenter_From "aspcRun" 0 )
                                                        axlSetFindFilter(?enabled '("NOALL" "symbols" ) ?onButtons '("symbols" ))
                                                        axlMsgPut( "Please select a symbol to Move its Refdes." )
                                                        if(        axlSelect() then
                                                                        lSym = axlGetSelSet( )
                                                                       
                                                                        axlClearSelSet()
                                                                        axlSetFindFilter( ?enabled ( list "NOALL"  "TEXT" ) ?onButtons ( list "NOALL" "TEXT" ) )
                                                            lText = axlGetSelSet( axlAddSelectAll( ) )                                                               
                                                            axlClearSelSet()
                                                                       
                                                                        ; get text block info, store them in a list
                                                                        ; if some block text are not rotate 0, 90, 180 or 270 degree, then need to re-create a some block text
                                                                        ; and get its block info
                                                                        lBlock = nil
                                                                        foreach( dText lText
                                                                                        unless( member( dText->textBlock lBlock )
                                                                                                        lBlock = cons( dText->textBlock lBlock )
                                                                                                        if( dText->rotation == 0.0 || dText->rotation == 180.0
                                                                                                        then
                                                                                                                        fDelta_y = ( cadadr( dText->bBox ) - cadar( dText->bBox ) )*0.32
                                                                                                        else
                                                                                                                        if( dText->rotation == 90.0 || dText->rotation == 270.0
                                                                                                                        then
                                                                                                                                        fDelta_y = ( caadr( dText->bBox ) - caar( dText->bBox ) )*0.32
                                                                                                                        else
                                                                                                                            rText_orient = make_axlTextOrientation(
                                                                                                                                                                        ?textBlock dText->textBlock, ?rotation 0.0,
                                                                                                                                                                        ?mirrored dText->isMirrored, ?justify dText->justify
                                                                                                                                        )
                                                                                                                            bText_status = caar( axlDBCreateText( dText->text, 0:0, rText_orient, dText->layer, nil )        )       
                                                                                                                            fDelta_y =         ( cadadr( bText_status->bBox ) - cadar( bText_status->bBox ) )*0.32       
                                                                                                                            axlDeleteObject( list( bText_status ) )                                                                                                       
                                                                                                                        )
                                                                                                        ); end if
                                                                                                        lBlock = cons( fDelta_y lBlock )
                                                                                        )
                                                                        ); end foreach                    
                                                                        lBlock = reverse( lBlock )
                                       
                                                                        ; move RefDes to Symbol Body Center
                                                                        foreach( dSym lSym
                                                                                        lShape = nil
                                                                                        sPackageLayer = "PACKAGE GEOMETRY/PLACE_BOUND_BOTTOM"               
                                                                                        unless( dSym->isMirrored
                                                                                                        sPackageLayer = "PACKAGE GEOMETRY/PLACE_BOUND_TOP"
                                                                                        )
                                                                                        foreach( dChild dSym->children
                                                                                                        when( dChild->objType == "shape" && dChild->layer == sPackageLayer         
                                                                                                                        lShape = cons( dChild        lShape )                                                                                       
                                                                                                        )
                                                                                        ); end foreach child
                                                                                                                       
                                                                                        ; when one symbol got more than one place boundry shapes,
                                                                                        ; need to find the largest one.
                                                                                        when( lShape
                                                                                                        dShape_temp = car( lShape )
                                                                                                        unless( onep( length( lShape ) )
                                                                                                                        for( n 1 length( lShape ) - 1
                                                                                                                                        dShape = nth( n lShape )
                                                                                                                                        unless(        axlDistance( car( dShape->bBox ) cadr( dShape->bBox ) ) < \
                                                                                                                                                                        axlDistance( car( dShape_temp->bBox ) cadr( dShape_temp->bBox ) )
                                                                                                                                                                        dShape_temp = dShape
                                                                                                                                        )
                                                                                                                        ); end for               
                                                                                                        ); end unless
                                                                                                       
                                                                                                        ; get Shape center
                                                                                                        lSym_shape_box = dShape_temp->bBox
                                                                                                         fSym_left_x  = caar( lSym_shape_box )
                                                                                                         fSym_right_x = caadr( lSym_shape_box )
                                                                                                         fSym_left_y  = cadar( lSym_shape_box )
                                                                                                         fSym_right_y = cadadr( lSym_shape_box )
                                                                                                         fSym_center_x = ( fSym_left_x + fSym_right_x )*0.5
                                                                                                         fSym_center_y = ( fSym_left_y + fSym_right_y )*0.5               
                                                                                                       
                                                                                                        ; get symbol RefDes, and move it to this shape center
       
                                                                                            foreach( dText lText
                                                                                                            when( dText->parent == dSym && dText->text == dSym->refdes && substring( dText->layer 1 7 ) == "REF DES"
                                                                                                                           
                                                                                                                            ; here still need to check original text orientation, and adjust text coordinate about 0.32 times
                                                                                                                            fDelta_y = cadr( member( dText->textBlock lBlock ) )               
                                                                                                                                        if( dText->isMirrored then
                                                                                                                                                        ; if do not care some special degrees, like 90.287
                                                                                                                                                        ; it will be easy
                                                                                                                                                        caseq( round( dSym->rotation / 45.0 )
                                                                                                                                                                (                ( 0 5 6 7 )
                                                                                                                                                                                fText_rot = round( dSym->rotation / 45.0 ) * 45.0
                                                                                                                                                                )
                                                                                                                                                                (                (  1 2 3 4 )
                                                                                                                                                                                fText_rot = round( dSym->rotation / 45.0 ) * 45.0 + 180.0
                                                                                                                                                                )                                       
                                                                                                                                                        );end case       
                                                                                                                                        else
                                                                                                                                                        caseq( round( dSym->rotation / 45.0 )
                                                                                                                                                                (                ( 0 1 2 3 )
                                                                                                                                                                                fText_rot = round( dSym->rotation / 45.0 ) * 45.0
                                                                                                                                                                )       
                                                                                                                                                                (                (  4 5 6 7        )
                                                                                                                                                                                fText_rot = round( dSym->rotation / 45.0 ) * 45.0 + 180.0
                                                                                                                                                                )                                               
                                                                                                                                                        );end case                                               
                                                                                                                                        );end if
                                                                                                                                       
                                                                                                                                        fSym_x = fSym_center_x + fDelta_y*sin( fText_rot * PI / 180.0 )
                                                                                                                                        fSym_y = fSym_center_y - fDelta_y*cos( fText_rot * PI / 180.0 )
                                                                                                                           
                                                                                                                            rText_orient = make_axlTextOrientation(
                                                                                                                                                                        ?textBlock dText->textBlock, ?rotation fText_rot,
                                                                                                                                                                        ?mirrored dText->isMirrored, ?justify dText->justify
                                                                                                                                        )
                                                                                                                                                                                                                                               
                                                                                                                            fSym_xy = fSym_x : fSym_y
                                                                                                                           
                                                                                                                            bText_status = car( axlDBCreateText( dText->text, fSym_xy, rText_orient, dText->layer, dSym )        )
                                                                                                                            when( bText_status
                                                                                                                                            axlDeleteObject(  dText  )
                                                                                                                            )
                                                                                                            ); end when
                                                                                            ); end foreach
                                                                                        ); end when
                                                                        ); end foreach dSym
                                                        else
                                                                        unless( !bStop || axlFormGetField( ps_RefDestoCenter_From "Layer_mode" )
                                                                                        axlMsgPut( "Wrong select, please select symbol!" )
                                                                        )
                                                        ); end if
                                                        bSym = axlFormGetField( ps_RefDestoCenter_From "Sym_mode" )
                                        ); end Symbol mode
                                       
                                        while( bStop && bLayer
                                                        ; in Layer mode, should set Run Button active
                                                        axlFormSetFieldVisible( ps_RefDestoCenter_From "aspcRun" 1 )
                                                       
                                                        axlSetFindFilter(?enabled '("NOALL" "symbols" ) ?onButtons '("symbols" ))
                                                        unless( !bStop || axlFormGetField( ps_RefDestoCenter_From "Sym_mode" )
                                                                        axlMsgPut( "Please select a layer, then click Run Button to move those RefDes on the layer!" )
                                                        )
                                                        when(        axlSelect(?prompt nil)
                                                                        lSym = axlGetSelSet( )
                                                                        axlClearSelSet( )
                                                        )
                                                        bLayer = axlFormGetField( ps_RefDestoCenter_From "Layer_mode" )
                                        ); end layer mode
                        ); end global while loop
                else
            axlUIConfirm("E- the tool is expired, please contact EDA team")
    )
                axlMsgPut( "Done!" )
        )
); end procedure ps_RefDestoCenter

procedure( ps_RefDestoCenter_Routine( ps_RefDestoCenter_From )
  
  let(
    ( sLayer_active
                        PI
                        lBlock
                        lSym
                        lText
                        sPackageLayer
                        bText_status
                        dShape
                        dShape_temp
                        fDelta_y
                        fSym_center_x
                        fSym_center_y
                        fSym_left_x
                        fSym_left_y
                        fSym_right_x
                        fSym_right_y
                        fSym_x
                        fSym_y
                        fSym_xy
                        fText_rot
                        lShape
                        lSym_shape_box
                        rText_orient
                        nCheck_All
    )
    PI = 3.1415926
          case( ps_RefDestoCenter_From->curField
                  ( "select_layer_name"
                                ;axlCancelEnterFun( )
                                ;axlClearSelSet( )

                          sLayer_active = ps_RefDestoCenter_From->curValue
                                 case( sLayer_active
                                        ( "Assembly TOP"
                                                axlVisibleDesign( nil )
                                                axlVisibleLayer( "Board Geometry/Assembly_TOP" t )       
                                                axlVisibleLayer( "Board Geometry/Outline" t )       
                                                axlVisibleLayer( "Package Geometry/Assembly_Top" t )       
                                                axlVisibleLayer( "Ref Des/Assembly_Top" t )
                                                axlVisibleLayer( "Pin/Top" t )               
                                        )
                                        ( "SilkScreen TOP"
                                                axlVisibleDesign( nil )
                                                axlVisibleLayer( "Board Geometry/SilkScreen_TOP" t )       
                                                axlVisibleLayer( "Board Geometry/Outline" t )
                                                axlVisibleLayer( "Package Geometry/SilkScreen_Top" t )       
                                                axlVisibleLayer( "Pin/Top" t )
                                                axlVisibleLayer( "Ref Des/SilkScreen_Top" t )                               
                                                axlVisibleLayer( "Route Keepin/All" t )               
                                                axlVisibleLayer( "Route Keepout/Top" t )       
                                               
                                               
                                        )
                                        ( "Assembly BOTTOM"
                                                ; display related layers, assembly or silkscreen Top/Bottom layer
                                                axlVisibleDesign( nil )
                                                axlVisibleLayer( "Board Geometry/Assembly_Bottom" t )       
                                                axlVisibleLayer( "Board Geometry/Outline" t )       
                                                axlVisibleLayer( "Package Geometry/Assembly_Bottom" t )       
                                                axlVisibleLayer( "Ref Des/Assembly_Bottom" t )
                                                axlVisibleLayer( "Pin/Bottom" t )
                                        )
                                        ( "SilkScreen BOTTOM"
                                                axlVisibleDesign( nil )
                                                axlVisibleLayer( "Board Geometry/SilkScreen_BOTTOM" t )       
                                                axlVisibleLayer( "Board Geometry/Outline" t )
                                                axlVisibleLayer( "Package Geometry/SilkScreen_Bottom" t )       
                                                axlVisibleLayer( "Pin/Bottom" t )
                                                axlVisibleLayer( "Ref Des/SilkScreen_Bottom" t )                               
                                                axlVisibleLayer( "Route Keepin/All" t )               
                                                axlVisibleLayer( "Route Keepout/BOTTOM" t )       
                                               
                                        )
                                        ( "Move All"
                                                axlCancelEnterFun( )
                                                axlClearSelSet( )
                                                axlFormSetField( ps_RefDestoCenter_From "Layer_mode" t )
                                                axlVisibleDesign( nil )
                                                axlVisibleLayer( "Board Geometry/Assembly_TOP" t )       
                                                axlVisibleLayer( "Board Geometry/Outline" t )       
                                                axlVisibleLayer( "Package Geometry/Assembly_Top" t )       
                                                axlVisibleLayer( "Ref Des/Assembly_Top" t )               
                                                axlVisibleLayer( "Board Geometry/SilkScreen_TOP" t )       
                                                axlVisibleLayer( "Package Geometry/SilkScreen_Top" t )       
                                                axlVisibleLayer( "Pin/Top" t )
                                                axlVisibleLayer( "Ref Des/SilkScreen_Top" t )                               
                                                axlVisibleLayer( "Route Keepin/All" t )               
                                                axlVisibleLayer( "Route Keepout/Top" t )       
                                                axlVisibleLayer( "Board Geometry/Assembly_Bottom" t )       
                                                axlVisibleLayer( "Package Geometry/Assembly_Bottom" t )       
                                                axlVisibleLayer( "Ref Des/Assembly_Bottom" t )
                                                axlVisibleLayer( "Board Geometry/SilkScreen_BOTTOM" t )       
                                                axlVisibleLayer( "Package Geometry/SilkScreen_Bottom" t )       
                                                axlVisibleLayer( "Pin/Bottom" t )
                                                axlVisibleLayer( "Ref Des/SilkScreen_Bottom" t )                               
                                                axlVisibleLayer( "Route Keepin/All" t )               
                                                axlVisibleLayer( "Route Keepout/BOTTOM" t )       
                                        )                                       
                                ); end case
                                axlFlushDisplay()       
                                axlShell( "redisplay" )
                  )
                  ( "Sym_mode"
                                axlCancelEnterFun( )
                                axlClearSelSet( )
                  )
                  ( "Layer_mode"
                                axlCancelEnterFun( )
                                axlClearSelSet( )
                  )
                  ( "aspcRun"
                                axlCancelEnterFun( )
                                axlClearSelSet( )
                                sLayer_active = axlFormGetField( ps_RefDestoCenter_From         "select_layer_name" )
                               
                                nCheck_All = 3
                                unless( sLayer_active == "Move All"
                                                nCheck_All = 0
                                )
                                for( i 0 nCheck_All
                                        case( i
                                                ( 0
                                                )
                                                ( 1
                                                        axlVisibleDesign( nil )
                                                        axlVisibleLayer( "Board Geometry/SilkScreen_TOP" t )       
                                                        axlVisibleLayer( "Board Geometry/Outline" t )
                                                        axlVisibleLayer( "Package Geometry/SilkScreen_Top" t )       
                                                        axlVisibleLayer( "Pin/Top" t )
                                                        axlVisibleLayer( "Ref Des/SilkScreen_Top" t )                               
                                                        axlVisibleLayer( "Route Keepin/All" t )               
                                                        axlVisibleLayer( "Route Keepout/Top" t )
                                                        axlFlushDisplay()
                                                )
                                                ( 2
                                                        ; display related layers, assembly or silkscreen Top/Bottom layer
                                                        axlVisibleDesign( nil )
                                                        axlVisibleLayer( "Board Geometry/Assembly_Bottom" t )       
                                                        axlVisibleLayer( "Board Geometry/Outline" t )       
                                                        axlVisibleLayer( "Package Geometry/Assembly_Bottom" t )       
                                                        axlVisibleLayer( "Ref Des/Assembly_Bottom" t )
                                                        axlFlushDisplay()
                                                )
                                                ( 3
                                                        axlVisibleDesign( nil )
                                                        axlVisibleLayer( "Board Geometry/SilkScreen_BOTTOM" t )       
                                                        axlVisibleLayer( "Board Geometry/Outline" t )
                                                        axlVisibleLayer( "Package Geometry/SilkScreen_Bottom" t )       
                                                        axlVisibleLayer( "Pin/Bottom" t )
                                                        axlVisibleLayer( "Ref Des/SilkScreen_Bottom" t )                               
                                                        axlVisibleLayer( "Route Keepin/All" t )               
                                                        axlVisibleLayer( "Route Keepout/BOTTOM" t )       
                                                        axlFlushDisplay()
                                                )
                                        ); end case                        
                                       
                                         axlClearSelSet()
                                         axlSetFindFilter(?enabled '("NOALL" "symbols" ) ?onButtons '("symbols" ))
                                        lSym = axlGetSelSet( axlAddSelectAll( ) )
                                                               
                                        axlClearSelSet()                       
                                        axlSetFindFilter( ?enabled ( list "NOALL"  "TEXT" ) ?onButtons ( list "NOALL" "TEXT" ) )
                            lText = axlGetSelSet( axlAddSelectAll( ) )                                                               
                                                   
                                        ; get text block info, store them in a list
                                        ; if some block text are not rotate 0, 90, 180 or 270 degree, then need to re-create a some block text
                                        ; and get its block info
                                        lBlock = nil
                                        foreach( dText lText
                                                        unless( member( dText->textBlock lBlock )
                                                                        lBlock = cons( dText->textBlock lBlock )
                                                                        if( dText->rotation == 0.0 || dText->rotation == 180.0 then
                                                                                        fDelta_y = ( cadadr( dText->bBox ) - cadar( dText->bBox ) )*0.32
                                                                        else
                                                                                        if( dText->rotation == 90.0 || dText->rotation == 270.0 then
                                                                                                        fDelta_y = ( caadr( dText->bBox ) - caar( dText->bBox ) )*0.32
                                                                                        else
                                                                                            rText_orient = make_axlTextOrientation(
                                                                                                                                        ?textBlock dText->textBlock, ?rotation 0.0,
                                                                                                                                        ?mirrored dText->isMirrored, ?justify dText->justify
                                                                                                        )
                                                                                            bText_status = caar( axlDBCreateText( dText->text, 0:0, rText_orient, dText->layer, nil )        )       
                                                                                            fDelta_y =         ( cadadr( bText_status->bBox ) - cadar( bText_status->bBox ) )*0.32       
                                                                                            axlDeleteObject( list( bText_status ) )                                                                                                       
                                                                                        )
                                                                        ); end if
                                                                        lBlock = cons( fDelta_y lBlock )
                                                        )
                                        ); end foreach                    
                                        lBlock = reverse( lBlock )
                               
                                        ; move RefDes to Symbol Body Center
                                        foreach( dSym lSym
                                                        lShape = nil
                                                        sPackageLayer = "PACKAGE GEOMETRY/PLACE_BOUND_BOTTOM"               
                                                        unless( dSym->isMirrored
                                                                        sPackageLayer = "PACKAGE GEOMETRY/PLACE_BOUND_TOP"
                                                        )
                                                        foreach( dChild dSym->children
                                                                        when( dChild->objType == "shape" && dChild->layer == sPackageLayer         
                                                                                        lShape = cons( dChild        lShape )                                                                                       
                                                                        )
                                                        ); end foreach child
                                                                                                               
                                                        ; when one symbol got more than one place boundry shapes,
                                                        ; need to find the largest one.
                                                        when( lShape
                                                                        dShape_temp = car( lShape )
                                                                        unless( onep( length( lShape ) )
                                                                                        for( n 1 length( lShape ) - 1
                                                                                                        dShape = nth( n lShape )
                                                                                                        unless(        axlDistance( car( dShape->bBox ) cadr( dShape->bBox ) ) < \
                                                                                                                        axlDistance( car( dShape_temp->bBox ) cadr( dShape_temp->bBox ) )
                                                                                                                        dShape_temp = dShape
                                                                                                        )
                                                                                        ); end for               
                                                                        ); end unless
                                                                               
                                                                        ; get Shape center
                                                                        lSym_shape_box = dShape_temp->bBox
                                                                        fSym_left_x  = caar( lSym_shape_box )
                                                                        fSym_right_x = caadr( lSym_shape_box )
                                                                        fSym_left_y  = cadar( lSym_shape_box )
                                                                        fSym_right_y = cadadr( lSym_shape_box )
                                                                        fSym_center_x = ( fSym_left_x + fSym_right_x )*0.5
                                                                        fSym_center_y = ( fSym_left_y + fSym_right_y )*0.5               
                                                                               
                                                                        ; get symbol RefDes, and move it to this shape center
                                                            foreach( dText lText
                                                                            when( dText->parent == dSym && dText->text == dSym->refdes && substring( dText->layer 1 7 ) == "REF DES"
                                                                                           
                                                                                            ; here still need to check original text orientation, and adjust text coordinate about 0.32 times
                                                                                            fDelta_y = cadr( member( dText->textBlock lBlock ) )               
                                                                                                        if( dText->isMirrored then
                                                                                                                        ; if do not care some special degrees, like 90.287
                                                                                                                        ; it will be easy
                                                                                                                        caseq( round( dSym->rotation / 45.0 )
                                                                                                                                (                ( 0 1 2 7 )
                                                                                                                                                fText_rot = round( dSym->rotation / 45.0 ) * 45.0
                                                                                                                                )
                                                                                                                                (                ( 3 4 5 6 )
                                                                                                                                                fText_rot = round( dSym->rotation / 45.0 ) * 45.0 + 180.0
                                                                                                                                )                                       
                                                                                                                        );end case       
                                                                                                        else
                                                                                                                        caseq( round( dSym->rotation / 45.0 )
                                                                                                                                (                ( 0 1 2 7 )
                                                                                                                                                fText_rot = round( dSym->rotation / 45.0 ) * 45.0
                                                                                                                                )       
                                                                                                                                (                ( 3 4 5 6        )
                                                                                                                                                fText_rot = round( dSym->rotation / 45.0 ) * 45.0 + 180.0
                                                                                                                                )                                               
                                                                                                                        );end case                                               
                                                                                                        );end if
                                                                                                                               
                                                                                                        fSym_x = fSym_center_x + fDelta_y*sin( fText_rot * PI / 180.0 )
                                                                                                        fSym_y = fSym_center_y - fDelta_y*cos( fText_rot * PI / 180.0 )
                                                                                                   
                                                                                            rText_orient = make_axlTextOrientation(
                                                                                                                                        ?textBlock dText->textBlock, ?rotation fText_rot,
                                                                                                                                        ?mirrored dText->isMirrored, ?justify dText->justify
                                                                                                        )
                                                                                                                                                                                                                               
                                                                                            fSym_xy = fSym_x : fSym_y
                                                                                                   
                                                                                            bText_status = car( axlDBCreateText( dText->text, fSym_xy, rText_orient, dText->layer, dSym )        )
                                                                                            when( bText_status
                                                                                                            axlDeleteObject(  dText  )
                                                                                            )
                                                                            ); end when
                                                            ); end foreach
                                                        ); end when
                                        ); end foreach dSym
                                ); end for
                               
                                when( nCheck_All > 0
                                          axlVisibleDesign( nil )
                                                axlVisibleLayer( "Board Geometry/Assembly_TOP" t )       
                                                axlVisibleLayer( "Board Geometry/Outline" t )       
                                                axlVisibleLayer( "Package Geometry/Assembly_Top" t )       
                                                axlVisibleLayer( "Ref Des/Assembly_Top" t )               
                                                axlVisibleLayer( "Board Geometry/SilkScreen_TOP" t )       
                                                axlVisibleLayer( "Package Geometry/SilkScreen_Top" t )       
                                                axlVisibleLayer( "Pin/Top" t )
                                                axlVisibleLayer( "Ref Des/SilkScreen_Top" t )                               
                                                axlVisibleLayer( "Route Keepin/All" t )               
                                                axlVisibleLayer( "Route Keepout/Top" t )
                                                axlVisibleLayer( "Board Geometry/Assembly_Bottom" t )       
                                                axlVisibleLayer( "Package Geometry/Assembly_Bottom" t )       
                                                axlVisibleLayer( "Ref Des/Assembly_Bottom" t )
                                                axlVisibleLayer( "Board Geometry/SilkScreen_BOTTOM" t )       
                                                axlVisibleLayer( "Package Geometry/SilkScreen_Bottom" t )       
                                                axlVisibleLayer( "Pin/Bottom" t )
                                                axlVisibleLayer( "Ref Des/SilkScreen_Bottom" t )                               
                                                axlVisibleLayer( "Route Keepin/All" t )               
                                                axlVisibleLayer( "Route Keepout/BOTTOM" t )       
                                                axlFlushDisplay()
                                                axlShell( "redisplay" )                       
                                )                               
                        ); end aspcRun
                  ( "aspcHelp"
                                axlCancelEnterFun( )
                                axlClearSelSet( )
                                nvhtmBrowser( nvmmrbc_HELPPAGE )
                  )
          ); end case
        ); end let
); end ps_RefDestoCenter_Routine


procedure( ps_RefDestoCenterstop()

  axlFormClose( ps_RefDestoCenter_From )
        axlCancelEnterFun( )
        axlClearSelSet( )
        axlFlushDisplay( )
        axlShell( "redisplay" )
        bStop = nil
)

19

主题

315

帖子

2106

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2106
4#
 楼主| 发表于 2016-8-5 14:08 | 只看该作者
求大神帮忙修改代码,实现器件丝印中心对准器件中心,而不是器件左小脚对准器件中心

13

主题

221

帖子

489

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
489
5#
发表于 2016-8-12 14:21 | 只看该作者
谢谢

10

主题

379

帖子

4169

积分

五级会员(50)

Rank: 5

积分
4169
6#
发表于 2016-11-14 12:57 | 只看该作者
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-26 14:43 , Processed in 0.061920 second(s), 32 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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