• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Allegro X PCB Editor
  3. Procedure in the while loop

Stats

  • State Suggested Answer
  • Replies 11
  • Answers 2
  • Subscribers 160
  • Views 10447
  • Members are here 0
More Content

Procedure in the while loop

JuriV
JuriV over 2 years ago

Hi everybody,

I want to execute a procedure until the Escape key will be pressed.

Example:

continue = t
while( continue

        ....execute procedure

if (cancel or escape) then
continue = nil

);end while

How could I Do that?

Thanks

  • Sign in to reply
  • Cancel
Parents
  • B Bruekers
    0 B Bruekers over 2 years ago

    What are you planning  to do in the loop? 

    If it is some user interaction with selection then use the axlEnterEvent() .

    Otherwise look at the axlCancelOff, axlCancelOn, axlCancelTest  functions.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • JuriV
    0 JuriV over 2 years ago in reply to B Bruekers

    Hi B Bruekers,

    I have a code to align the vias (vertical or horizonthal). I want to align the VIAS inside of the while loop. The VIAs are selected using

    dbid_vias = axlGetSelSet(axlSingleSelectBox()). For example I select three VIAs to aligne them, then next four VIAs, then next ten Vias and so on.

    This function should work until Escape (or another termination) is pressed, which means "No more VIAs to aligned".

    I hope this explained a function.

    Best regards

    Juri

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • B Bruekers
    0 B Bruekers over 2 years ago in reply to JuriV

    Then you need to use axlEnterEvent().  So something like this:

    ;start "myselection" from the command line of Allegro
    axlCmdRegister( "myselection" 'SelectonLoop  ?cmdType "interactive")

    procedure( SelectonLoop()
        let( (loop msg event StartXY)
             axlSetFindFilter( ?enabled '("noall" "vias") ?onButtons "vias")
            msg= "Select vias"
            loop = t
            while( loop
                event = axlEnterEvent(list('PICK 'PICK_EXTEND 'PICK_TOGGLE 'STARTDRAG 'STARTDRAG_EXTEND 'STARTDRAG_TOGGLE 'STOPDRAG 'STOPDRAG_EXTEND 'STOPDRAG_TOGGLE ) msg nil)
                caseq(event->type
                    (PICK                  when(axlAddSelectPoint(event->xy), doSomethingWithSelection()))
                    (PICK_EXTEND     when(axlAddSelectPoint(event->xy), doSomethingWithSelection()))
                    (PICK_TOGGLE     when(axlSubSelectPoint(event->xy), doSomethingWithSelection()))
                    (STARTDRAG
                        axlAddSimpleRbandDynamics(event->xySnap "box" ?var_point 0-car(event->xySnap):0-cadr(event->xySnap))
                        StartXY= event->xy
                    )
                    ((STARTDRAG_EXTEND STARTDRAG_TOGGLE)
                        axlAddSimpleRbandDynamics(event->xySnap "box" ?var_point 0-car(event->xySnap):0-cadr(event->xySnap))
                        StartXY= event->xy
                    )
                    (STOPDRAG                  
                        axlClearDynamics()
                        when(axlAddSelectBox(list(StartXY event->xy))
                            doSomethingWithSelection()
                        )
                        StartXY = 0
                    )
                    (STOPDRAG_EXTEND     axlClearDynamics(), when(axlAddSelectBox(list(StartXY event->xy)), doSomethingWithSelection()),    StartXY=0 )
                    (STOPDRAG_TOGGLE    axlClearDynamics(), when(axlSubSelectBox(list(StartXY event->xy)), doSomethingWithSelection()),    StartXY=0 )
                    (DONE         
                        doSomethingWithSelection()
                        loop = nil
                    )
                    (CANCEL     
                        loop = nil
                    )
                )
            )
        )
    )

    procedure( doSomethingWithSelection()
        let( (selectedItems)
            when(selectedItems = axlGetSelSet()
                pp(selectedItems)
            )
        )
    )

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • JuriV
    0 JuriV over 2 years ago in reply to B Bruekers

    OK, Thank you.
    I used such function for PICK, but not for CANCEL or DONE. Are CANCEL and DONE like Escape or the popup for RMB with Cancel and Done functions should be define?

    Best regards

    Juri

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Reply
  • JuriV
    0 JuriV over 2 years ago in reply to B Bruekers

    OK, Thank you.
    I used such function for PICK, but not for CANCEL or DONE. Are CANCEL and DONE like Escape or the popup for RMB with Cancel and Done functions should be define?

    Best regards

    Juri

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Children
  • B Bruekers
    0 B Bruekers over 2 years ago in reply to JuriV

    The DONE and CANCEL are by default defined in the RMB as well through the general user interface (like F2 key binding)
    So, any DONE or CANCEL event is caught by the axlEnterEvent() and ends up in the DONE/CANCEL case statement.


    You can define a own RMB menu with extra functionality, like 'oops', align H, align V, etc.  Each RMB item can call a function to deal with the operation.

    You need to implement the Oops functionality with axlDBTransactionStart(), axlDBTransactionMark(), axlDBTransactionOops() and axlDBTransactionCommit().

    A small tip, before any axlDBTransactionMark() you need to do a axlClearSelSet(). Otherwise an 'oops' event will cause an issue where previous selected items are 'highlighted' and cannot be selected again.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • JuriV
    0 JuriV over 2 years ago in reply to B Bruekers

    Thank you very much, I will try it

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • JuriV
    0 JuriV over 2 years ago in reply to JuriV

    I tested the function "axlEnterEvent" again. By Mouse CLICK the Message "This is a Test CLICK" appears. If Escape (CANCEL) is pressed - "End of Loop". But how the DONE could be used? You mentioned the CANCEL and DONE should be connected to the RMB automaticaly.

    Hier is the code:

    procedure( EnterEvent()
    let(( loop event)
    eventMask = '( PICK CANCEL DONE)
    loop = t
    while( loop   
       
         event = axlEnterEvent(eventMask, nil, t)
         case(event -> type
        
         ('PICK             
        printf("This is a Test CLICK")  

         ); end PICK

     ('CANCEL
         printf("End of Loop")
         loop=nil        
     );end CANCEL
     
     ('DONE
         printf("End of Loop")
         loop=nil
     );end DONE

        );end while
      );end case     
     );end let
    );end procedure

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • B Bruekers
    0 B Bruekers over 2 years ago in reply to JuriV

    You must bind the SKILL function to a command line function : axlCmdRegister( "EnterEvent" 'EnterEvent  ?cmdType "interactive")

    Doing so and starting the command from the command line results in:

    scriptmode +e

    EnterEvent

    EnterEvent

    prepopup 143.484 -183.964

    pop Done

    End of Loop DONE

    generaledit

    EnterEvent

    EnterEvent

    prepopup 107.355 -201.512

    pop Cancel

    End of Loop CANCEL

    generaledit

    (I've added a Done and Cancel to the printf())

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • JuriV
    0 JuriV over 2 years ago in reply to B Bruekers

    Ok, Thanks.
    This works in Command Mode only, not in the SKILL Mode. That is my mistake.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Cadence Guidelines

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information