Jump to content
jcd

Import tcl script variable into macro

Recommended Posts

How can I run a tcl script through a macro using *evaltclscript and then import a variable from that tcl script to use in the same macro, such as the userpage.mac file ?

 

Thank you.

 

Any help is appreciated.

Share this post


Link to post
Share on other sites

Hi,

variables in tcl script seem to be not available in macro file

I think you don't need to use macro file, because all of its functions can be (and will be) done by tcl

example buttongroup, button in macro file => are tk buttons

macro commands in macro file => are same as hypermesh tcl commands

you can use tcl script to retrieve / add / remove buttons with your own procs to utility tab

example

set frmUtilTab [hm_winfo utilitywindow]

set frmMacros [winfo children $frmUtilTab]

set WMgr [winfo manager $frmMacros]

set WMgrOptions [$WMgr info $frmMacros]

set frmMyUtils [frame .frmMyUtils]

pack $frmMyUtils -in $frmUtilTab -fill both -expand 1

set btnDemo [::ttk::button $frmMyUtils.btnDemo -text Hello -command {tk_messageBox -message "This is a demo"}]

pack $btnDemo -anchor center

 

#if you want to restore original utility functions as in macro file:

pack forget $frmMyUtils

eval $WMgr

  1. $WMgrOptions
jcd likes this

Share this post


Link to post
Share on other sites
15 hours ago, tinh said:

Hi,

variables in tcl script seem to be not available in macro file

I think you don't need to use macro file, because all of its functions can be (and will be) done by tcl

example buttongroup, button in macro file => are tk buttons

macro commands in macro file => are same as hypermesh tcl commands

you can use tcl script to retrieve / add / remove buttons with your own procs to utility tab

example

set frmUtilTab [hm_winfo utilitywindow]

set frmMacros [winfo children $frmUtilTab]

set WMgr [winfo manager $frmMacros]

set WMgrOptions [$WMgr info $frmMacros]

set frmMyUtils [frame .frmMyUtils]

pack $frmMyUtils -in $frmUtilTab -fill both -expand 1

set btnDemo [::ttk::button $frmMyUtils.btnDemo -text Hello -command {tk_messageBox -message "This is a demo"}]

pack $btnDemo -anchor center

 

#if you want to restore original utility functions as in macro file:

pack forget $frmMyUtils

eval $WMgr

  1. $WMgrOptions

@tinh : I tried the above code, however I only want to edit the buttons shown when the User button is clicked on the utility tab, rather than the entire utility tab, how could I go about doing that ?

Share this post


Link to post
Share on other sites

Hi, what do you mean "edit the buttons"?

if you want to run tcl script by macro buttons, example

*createbutton(5,"Demo script",-1,0,10,BUTTON,"Run your script",EvalTcl,"C:/users/demo/documents/yourscript.tcl")

Share this post


Link to post
Share on other sites
14 hours ago, tinh said:

Hi, what do you mean "edit the buttons"?

if you want to run tcl script by macro buttons, example

*createbutton(5,"Demo script",-1,0,10,BUTTON,"Run your script",EvalTcl,"C:/users/demo/documents/yourscript.tcl")

@tinh : I understand that. However what I meant to say was, I only wanted to show the Demo button when I click on the User button on the utility tab. The code that you specified shows the demo button directly when I click on the utility tab.

 

The User button that is shown in the image below appears to the bottom right when the utility menu is clicked in Hypermesh. My aim is to create some buttons to be displayed when Utility -> User is clicked , and I need to do this using a tcl script rather than a macro.

 

How should I go about it ?

UtilityMacros.png

Edited by jcd
Added image

Share this post


Link to post
Share on other sites

Hi,

I see, there is no direct command. but you can do like this:

- open ...\hm\bin\win64\globalpage.mac to edit

- looking for macro definition " *beginmacro(macroSetActivePage) ", and add a command inside it:

 

*beginmacro(macroSetActivePage)

        //Purpose: Sets the active page in the macro meu to passed argument.

       *setactivepage($1)

        //add below command to customize your own page by tcl:

       *evaltclstring("p_ShowMyUserPage $1",0)

*endmacro()

 

- define tcl procedure "p_ShowMyUserPage" in a tcl file and source it first

or define it in ...\hm\bin\win64\hmcustom.tcl (will be sourced whenever opening hm)

proc p_ShowMyUserPage {Page} {
      if {$Page!=5} {catch {place forget .frmUserPage}; return}
      if {![winfo exists .frmUserPage]} {
          frame .frmUserPage
          pack [::ttk::button .frmUserPage.btnDemo -text Demo \
               -command {tk_messageBox -message "This is a demo"}]
          #add your buttons here\
          .....
      }
      set frmUserMac [winfo children [hm_winfo utilitywindow]]
      set y [expr [winfo height $frmUserMac]-200]
      place .frmUserPage -in $frmUserMac -x 0 -y $y
}

 

- now click Utility>User button, it will invoke p_ShowMyUserPage with Page=5 and show your buttons

jcd likes this

Share this post


Link to post
Share on other sites

@tinh : I did try the above method as follows,

*beginmacro(macroSetActivePage)
    //  Purpose:    Sets the active page in the macro menu to passed argument.
    *setactivepage($1)
    *evaltclstring("source \"C:/sample.tcl\";",0)
    *evaltclstring("p_ShowMyUserPage $1",0)
*endmacro()

Where sample.tcl has the code,

proc p_ShowMyUserPage {Page} {
      if {$Page!=5} {catch {place forget .frmUserPage}; return}
      if {![winfo exists .frmUserPage]} {
          frame .frmUserPage
          pack [::ttk::button .frmUserPage.btnDemo -text Demo \
               -command {tk_messageBox -message "This is a demo"}]
          #add your buttons here\
          .....
      }
      set frmUserMac [winfo children [hm_winfo utilitywindow]]
      set y [expr [winfo height $frmUserMac]-200]
      place .frmUserPage -in $frmUserMac -x 0 -y $y
}

However, I do not see any output when I click the Utility -> User button. The Hypermesh status bar shows an error message saying,

"Data in file could not be interpreted. Possibly incorrect format."

 

Also, how would I get this to work only for the userpage rather than for all the pages that have macroSetActivePage associated with them ?

Share this post


Link to post
Share on other sites

No no, jcd

please remove the line :

 *evaltclstring("source \"C:/sample.tcl\";",0)

we don't need this line,

and what you have to do is create a tcl file named "hmcustom.tcl" and put it in folder .../hm/bin/win64 

copy codes of proc p_ShowMyUserPage ... and paste into hmcustom.tcl

 

so that proc will be defined everytime you open hypermesh

 

comeback to macro file. after remove line *evaltclstring("source .... ", macroSetActivePage will work whenever you click on User button (and also Disp, Geom/Mesh,...) but when you click User button , an argument with value equal 5 will be passed to proc p_ShowMyUserPage

this proc then simply know that you pressed User button and place a frame with your own buttons on the tab

if you click Disp, Geom/Mesh,... buttons, the argument value is not equal to 5 and proc p_ShowMyUserPage will remove your buttons from Utility tab 

jcd likes this

Share this post


Link to post
Share on other sites
On 3/16/2017 at 9:44 PM, tinh said:

No no, jcd

please remove the line :


 *evaltclstring("source \"C:/sample.tcl\";",0)

we don't need this line,

and what you have to do is create a tcl file named "hmcustom.tcl" and put it in folder .../hm/bin/win64 

copy codes of proc p_ShowMyUserPage ... and paste into hmcustom.tcl

 

so that proc will be defined everytime you open hypermesh

 

comeback to macro file. after remove line *evaltclstring("source .... ", macroSetActivePage will work whenever you click on User button (and also Disp, Geom/Mesh,...) but when you click User button , an argument with value equal 5 will be passed to proc p_ShowMyUserPage

this proc then simply know that you pressed User button and place a frame with your own buttons on the tab

if you click Disp, Geom/Mesh,... buttons, the argument value is not equal to 5 and proc p_ShowMyUserPage will remove your buttons from Utility tab 

@tinh : I did try this and it worked perfectly, however, I still had one small issue.

 

Whenever I open a fresh HyperMesh window, navigate to the Utility frame and then click on User, the button appears perfectly. And if I stay on the utility frame and click on other buttons such as Disp or Abaqus and then click back on the User button, then the button .btnDemo still appears.

 

However, when I click away from the Utility menu and click on the Mask or Model menu and then come back to the Utility menu and click on the User button, the demo button doesnt appear then. It's a really weird occurence, and I'm not even sure how to begin debugging this, since I assume that the macroSetActivePage is called every time I click on the User button, but the demo button inside it still doesnt show up.

 

Any help is appreciated.

Share this post


Link to post
Share on other sites

Hi @jcd

it is due to widget stacking order. Please add raise command to the end of p_ShowMyUserPage, to push it up:

proc p_ShowMyUserPage {Page} {

 #......

    place .frmUserPage -in $frmUserMac -x 0 -y $y

    raise .frmUserPage

}

jcd likes this

Share this post


Link to post
Share on other sites
On 3/25/2017 at 0:12 AM, tinh said:

Hi @jcd

it is due to widget stacking order. Please add raise command to the end of p_ShowMyUserPage, to push it up:

proc p_ShowMyUserPage {Page} {

 #......

    place .frmUserPage -in $frmUserMac -x 0 -y $y

    raise .frmUserPage

}

Yes, this worked perfectly! Thank you.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...