Liste deroulante choix constante

Bonjour,
je recherche depuis cette apres midi une solution a mon probleme , mais je n' ai pas trouver , surement j'utilise les mauvais termes pour mes recherches , donc si quelqu 'un peux m' aider ça serait sympa .
j' ai 6 constantes ( lien vers des fichiers ) et je voudrais en selectionner une soit par menu deroulant soit par bouton , pour rentrer dans un sous vi .
en fait je veux selectionner le fichier en entrée depuis la face avant .
merci pour l' aide d' avance
Résolu !
Accéder à la solution.

Voici comment procéder. Les termes en gras sont ceux de la version anglaise de LabVIEW. La correspondance avec la version française devrait être évidente.
Clic droit sur le menu déroulant (depuis face avant ou diagrame, peu importe) pour afficher son menu contextuel
Create >> Property Node >> Item Names
Clic droit sur le noeud de propriétés >> mettre en écriture par l'entrée correspondante du menu contextuel
Relier le tableau des constantes au noeud de propriétés
Pour les constantes, pourquoi ne pas utiliser directement des Path Constant ? Pour les trouver : Functions palette >> File I/O >> File Constants >> Path Constant
A condition qu'il existe, la définition du fichier est plus facile car, au lieu de le taper à la main ou de le copier, il suffit de faire un clic droit sur la constante >> Browse for path... pour sélectionner le fichier désiré.

Similar Messages

  • How to avoid using constants ?

    Hello,
    I am starting a new project and I am thinking of a way to avoid using constants.
    For example, in a report, it selects all the order with types ZLN and ZLB.
    I know that I have several possibilities :
    - hard code it in the program (using constants which I want to avoid)
    - create a specific table with all the types that I want to select (this may be the best solution but it can be very long -> too much table to create)
    - put the parameter in the selection screen (but then we have to put default values which come back to the same problem)
    So, I didn't found any perfect solution, Do you know what is the method recommended by SAP ?
    What kind of technics did you use in you projects ?
    Thank you for your help !

    Hi Friend ,
    As you taught , there are  multiple  ways to handle the constants in the program.
    But finally time & efficency matters alot  .
    so my  idea would be  i will  list all the constant & get the quick understanding of the constant type's.
    For example : Order type is Customizing data  which will maintained  by Fun.Consultant  , so i will give work for him to maitain the Varient against  Order type in the TVARC table .so that  in the program  i will declare one order type vraible  under atselection-screen event i will write select Query to get the vaule from the TVARC table which will be maintaine . we can write the execption also with sy-subrc <> o.if it is not maintianed .so far all customizing data fields  this would be the best way for constants maintaining outside your program  .
    Similarly if any system constants then we can get it in runtime  with SYST table parameters .
    if there are any  ABAP Program Constants  ( Titles,labels ,case condition parameters,ect) maintain in the tprogram ext elements , or you can generically maintain a Utility class where you can create an attribute  so that whereeven you want you can reuse the same  .
    Regards,

  • Where used list doesn't work for global data

    Hi,
    When i try to do where used list on a constant in an include, it doesn't give the results for classes.
    The class contains the include in a method that uses the constant, and the where used list for that constant doesn't find the appearance of the constant in the class.
    I tried to look for oss note that solves the problem but i couldn't find any.

    I tried to update the navigation index but it still doesn't work. from my debuging i found out that it just doesn't look in classes, all classes. I mean even in the where used itself there is not an option for used in classes. I checked it and it's a generic problem of the where used list for global data.
    Edited by: Cohen Lior on Apr 14, 2010 6:52 PM

  • List of objects in Jsp

    Hi All,
    I have list of object. each object has some fields. ex. item, type, zone. I want to retrieve it in jsp. Now i am using
    <%List itemList = (List)session.getAttribute(Constants.ITEM); %>
    <%     for(int i =0;i<itemList.size();i++){
    NhopItemDef nhopItemDef= (NhopItemDef)itemList.get(i);
    if(nhopItemDef!=null){
    if(nhopItemDef.getItemType().trim().equals(Constants.BED_ZONE)){
    %>
    <tr >
    <td class="tb_dred_left_bf" height="30">
    <html:hidden property="item" value="<%=nhopItemDef.getItem()%>"/>
    <%=nhopItemDef.getItem()%>
    </td>
    Please let me know how to implement it using logic:iterate or c:foreach. which is the best way to implement?
    please provide some example codes here.
    Thanks & regards
    arullakshmi

    arullakshmi wrote:
    Hi All,
    I have list of object. each object has some fields. ex. item, type, zone. I want to retrieve it in jsp. Example:<c:forEach var="item" items="${itemList}">
      <tr>
        <td>${item.name}</td>
        <td>${item.type}</td>
        <td>${item.zone}</td>
      </tr>
    </c:forEach>For more information, check out a good [JSTL tutorial|http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSTL.html].
    ~

  • Error in formula processing - List price has null value

    I have created a freight/special charge modifier where the qualifier in it is if terms = credit card, then execute.  The formula in this modifier is List Price * Numeric Constant.  However when I test this I get a Note:  Error in formula processing - List price has null value.  The List price is NOT null.  I'm not sure why I'm getting this error...

    Hi,
    Thanks for the update.
    Actually, my problem got resolved. After analyzing the debug file myself, I narrowed down the error as below
    Normal flow Formula Processing begin
    In ---Routine:QP_PREQ_GRP.Formula_Processing---
    PRICING_PHASE_ID: 2
    Processing Formula ID :7512
    Line Index: 1
    Start Formula...
    Formula Line Type = ML, Step = 1
    Before populating formula stepvalues temp table
    Other Exception ORA-01403: no data found
    Exception occurred. Formula value returned is
    Formula return status: U
    Formula Base Price :
    Error returned by QP_FORMULA_PRICE_CALC_PVT.Calculate
    And, as per the oracle support note "Error Returned By Qp_formula_price_calc_pvt.Calculate [ID 1282519.1]", after setting the profile value to N, the issue is resolved.
    With Regards,
    Vishal Majithia

  • Facebook Module for Mailing List?

    Hello,
    I'd like to created a tab on our Facebook Fan page to allow our fans to easily subscribe to our mailing list (much like Constant Contact, MailChimp, etc offer). I can't find any way to do this with Business Catalyst. Is this offered? Or is there a work-around?
    Thank you!

    Have you one saved email per individual, or several emails per individual? Are the individual's email addresses in the headers of the email, or buried in the body? Can you post a sample (edit it to suppress the actual addresses)? Are all the emails in a single mailbox? Are there emails in the mailbox that are not from the list?
    AK

  • Mail stuck "cannot send using server"....

    but the real issue is that the list of addressees is so long that I cannot see the buttons at the bottom, so I cannot click them to dismiss the error and try something else. Only way out of Mail is to force quit (menus are unresponsive) and if I relaunch Mail the email comes up again after a short time with the same error and again no way to dismiss it.
    Once I get back to Mail without the error I'll be able to send using the correct SMTP server, but I can't get past this point.
    Thank you in advance for your help.
    Mac OS X 10.5.8, iMac Core Duo

    hey, i think i know the problem.
    i use my mail sometimes to send to long lists of emails for my company.  (better solution is use a mailing list service like constant contact or mail chimp if you do this on a regular basis).
    anyway, some smtp's limit the number of people you can send to at a time.  i don't know what this number is, and i notice that it's different depending on which server i'm using (like hotmail i think let's me send to more)
    in any case, the best thing to do is copy the whole list of addressee's to text edit or whatever, and break it up into smaller batches so that you are not sending to more than 50-100 people at a time (you have to experiment).
    it's annoying that it doesn't tell you what the problem is, but it happened to me before and this was the solution.
    let me know if this was your problem or not.

  • Automate Creation of Folder based on Filename

    Hi,
    I am a total newbie to Automator, and although I have some programming background, I have not wrapped my brain around how this wonderful tool works yet. I need to perform a task on several hundred files and I need to do it soon, so no time to learn and play with Automator right now.
    I was wondering if someone can give me a true step by step instructions for creating a script that will do the following:
    This is how I would like the flow to behave:
    1. I select a file and run the script (hopefully based on a keystroke). The script will then:
    2. Create a new folder in the same directory as the file.
    3. Name the new folder based on the filename (minus the extension) of the above selected file.
    4. Move the selected file into the new folder.
    So basically I am enveloping the selected file in a new folder that is named the same as the file itself (minus the extension).
    Thank you in advance.

    OK, I reworked and tested it, so I think I've got all the oddities found. I wound up just using an AppleScript, since about the only thing Automator was used for was getting Finder Items (and it didn't do so well at that). Paste the script into the Script Editor and save it as an application (make sure the Startup Screen option is unchecked). You can either drop items on it or double-click it, in which case it will prompt for items. Document files are the only things processed, and packages/bundles are handled correctly (getting subfolders will not go into them), so you don't have to worry about things like application bundles and .rtfd files.
    <pre style="
    font-family: Monaco, 'Courier New', Courier, monospace;
    font-size: 10px;
    margin: 0px;
    padding: 5px;
    border: 1px solid #000000;
    width: 720px; height: 340px;
    color: #000000;
    background-color: #FFDDFF;
    overflow: auto;"
    title="this text can be pasted into the Script Editor">
    -- make new folders with the name of document files, then move them into their respective new folders
    -- the following properties affect the operation of the script
    property GetFiles : false -- get individual files?  true chooses files, false chooses folders
    property GetSubFolders : true -- get contents of subfolders?  true gets contents of subfolders, false skips them
    property DestinationFolder : "" -- if a folder path is specified, it is used as the destination for file moves
    on run -- application double-clicked
    if GetFiles then
    choose file with prompt "Choose a file:" default location (path to desktop) with multiple selections allowed without invisibles
    else
    choose folder with prompt "Choose a folder:" default location (path to desktop) with multiple selections allowed without invisibles
    end if
    open the result
    end run
    on open TheItems -- items dropped onto the application
    if DestinationFolder is not missing value then try -- verify destination path
    DestinationFolder as alias
    on error
    set DestinationFolder to (choose folder with prompt "Invalid destination folder path - where do you want to move the items?")
    end try
    set SkippedItems to {} -- this will be a list of skipped items (errors)
    set TheFiles to {} -- this will be a list of items to process
    repeat with AnItem in TheItems -- expand folders
    set AnItem to the contents of AnItem
    set FileInfo to (info for AnItem)
    if (folder of FileInfo) and not (package folder of FileInfo) then -- a folder
    if GetSubFolders then
    repeat with SubItem in (ListFiles from AnItem)
    set the end of TheFiles to (contents of SubItem)
    end repeat
    else
    tell application "Finder" to (get files of AnItem) as alias list
    set TheFiles to TheFiles & the result
    end if
    else
    set the end of TheFiles to AnItem
    end if
    end repeat
    repeat with MyFile in TheFiles -- do stuff with the resulting items
    set {TheClass, TheName, TheExtension, TheContainer} to (GetTheNames from MyFile)
    if TheClass is «class docf» then try -- just document files
    tell application "Finder"
    if DestinationFolder is not missing value then
    make new folder at DestinationFolder with properties {name:TheName}
    else
    make new folder at TheContainer with properties {name:TheName}
    end if
    move MyFile to the result
    end tell
    on error ErrorMessage -- the folder already exists, permissions, etc
    log ErrorMessage
    set the end of SkippedItems to (TheName & TheExtension)
    -- set the end of SkippedItems to (AnItem as text) -- the full file path
    end try
    end repeat
    if SkippedItems is not {} then -- handle skipped items
    set AlertText to "Error with moving files to folders"
    if (count SkippedItems) is greater than 1 then
    set TheMessage to ((count SkippedItems) as text) & space & "items were skipped:"
    else
    set TheMessage to "1 " & "item was skipped:"
    end if
    set {TempTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, return}
    set {SkippedItems, AppleScript's text item delimiters} to {SkippedItems as text, TempTID}
    display alert AlertText message TheMessage & return & SkippedItems
    end if
    end open
    to GetTheNames from SomeFile
    get a class, name, extension, and container from a file path
    parameters - SomeFile [mixed]: a file path
    returns [list] - item 1 [constant]: the class of the file object
    item 2 [text]: the name of the file
            item 3 [text]: the .extension (if no extension, the value returned is "")
    item 4 [alias]: the containing folder of the file
    set SomeFile to SomeFile as alias -- the Finder likes aliases
    tell application "Finder"
    set TheClass to class of (get properties of SomeFile)
    set TheName to name of SomeFile
    set TheExtension to name extension of SomeFile
    if TheExtension is in {missing value, ""} then
    set TheExtension to ""
    else
    set TheExtension to "." & TheExtension
    end if
    set TheName to text 1 thru -((count TheExtension) + 1) of TheName -- just the name part
    set TheContainer to (container of SomeFile) as alias
    end tell
    return {TheClass, TheName, TheExtension, TheContainer}
    end GetTheNames
    to ListFiles from SomeItem
    return a list of files contained in SomeItem, drilling down into subfolders (not packages)
    parameters - SomeItem [mixed]: the item to get the contents of
      returns [list]: a list of aliases
    set {FilesList, SomeItem} to {{}, SomeItem as text}
    set FileInfo to (info for SomeItem as alias)
    if (folder of FileInfo) and not (package folder of FileInfo) then -- a folder
    try
    tell application "Finder" to set SubItems to (items of folder SomeItem)
    on error
    return {}
    end try
    repeat with AnItem in SubItems -- drill down
    set FilesList to FilesList & (ListFiles from AnItem)
    end repeat
    else
    set the end of FilesList to (SomeItem as alias)
    end if
    return FilesList
    end ListFiles
    </pre>

  • Why Not Use WHEN OTHERS - Friday Question

    There are several people on this forum that abhor use of WHEN OTHERS in the same vein as GOTO (which really is a bad practice).  I have an open mind and am looking for the reason it should be avoided.
    When used to output the state during unexpected exceptions, WHEN OTHES can dramatically reduce debug time.  The only bad exception handler is WHEN OTHERS THEN NULL.  Error logging to a table is important and should include the back trace and call stack in addition to listing pertinent parameter, constant and variable values.  I consider this debug instrumentation.  If you write perfect code or you don't have end users that are very creative in finding bugs that occur because of the convoluted way they get to the code that causes the error you don't need it.  Or you like the thrill of the hunt going slogging through thousands of lines of code to try to figure out what caused the error.  I am lazy and want to have it spelled out for me.  Below is my error logging table (CODE is  a session level transaction identifier used for filtering) and my error logging procedure is equivalent to DBMS_OUTPUT.PUT_LINE.  This makes it easy to take other people's code and replace DBMS_OUTPUT with my error logging.  This becomes very useful for debugging triggers since there is no standard output device.
    CREATE TABLE SUPPORT.MESSAGE_LOGS
      CODE        INTEGER                           NOT NULL,
      TEXT        VARCHAR2(4000 BYTE)               NOT NULL,
      CREATED_ON  TIMESTAMP(6)                      NOT NULL,
      CREATED_BY  VARCHAR2(100 BYTE)                NOT NULL,
      OSUSER      VARCHAR2(100 BYTE),
      MACHINE     VARCHAR2(100 BYTE),
      PROGRAM     VARCHAR2(100 BYTE),
      BACK_TRACE  CLOB,
      CALL_STACK  CLOB
    Typical insert is:
    INSERT INTO message_logs (
                  code,
                  text,
                  created_on,
                  created_by,
                  osuser,
                  machine,
                  program,
                  back_trace,
                  call_stack )
    VALUES      (
                  utilities.get_xaction_sequence,
                  pv_text,
                  SYSTIMESTAMP,
                  UPPER ( utilities.get_session_user ),
                  UPPER ( utilities.get_osuser ),
                  UPPER ( utilities.get_machine ),
                  UPPER ( utilities.get_program ),
                  DBMS_UTILITY.format_error_backtrace,
                  DBMS_UTILITY.format_call_stack
    Typical error text:
    ERROR in UTILITIES.CREATE_FILE: ORA-29280: invalid directory path
    Directory = FILEDIR
    File Name = _Revoke_From_COGNOS_ALL_Script19-MAR-12.SQL
    Linesize = 32000
    Text - 1st chacters = -- File created on 19-Mar-2012 11:16:38

    Hoek wrote:
    C'mon Ed, now shirley you must have an opinion regarding the use of WHEN OTHERS?
    Feel free to share it with us
    My opinion is that I hate it when an application -- any application, under any framework, in any language -- swallows an error message.  As to getting into the weeds of WHEN OTHERS, I tend to agree that it should be avoided but am open to arguments for exceptions.  Does that sound like waffling?  It's not intended to be.  Here's where I have to make a confession.  When I transitioned from the role of "developer" (we called them "programmer/analyst" then) to dba, my shop was also transitioning from IBM's IMS database (hierarchical) to relational databases - first DB2, then as client-sever architecture came in they settled on Oracle as the C/S database.  Because I was viewed as an "early adopter" and had been doing some development work on our first client-server apps, I was tagged to become our first Oracle DBA. (My first oracle db was v7.3 on Win 3.11)   As a result of that path, I never really got heavily into development with PL/SQL.  I can do OK on  individual procedures - mostly for one-off or stand-alone use. But I never developed that mental framework and toolbox of procedures that only comes with working heavily in a language.  
    Don't call me Shirley

  • Strokes on multiple objects are not consistent in size

    Recently, I've noticed that when I have an image and I apply a stroke to it...it looks either bigger or smaller than another image that I would apply the same stroke to. For example: Picture A has a 1 pt stroke. Picture B has a 1 pt stroke, however, it is much thinner than the 1 pt stroke on Picture A.
    I use a lot of pictures in proposals and it there have been so many times that I'll stroke a picture at 1 pt and another at 1 pt only to have to increase/decrease the stroke pt so that it matches the 1 pt stroke.
    Does that make sense???
    What causes this and can I fix it??
    Thanks!

    It sounds like you have the "Adjust Scaling Percentage" radio button enabled in the general preferences. With that enabled, the stroke will change size when you scale a frame, but the size listed will remain constant until you select "reset scaling to 100%" in the control panel menu.
    Peter

  • [python] setting a variable in a loaded module from the main script

    Hi,
    I have have two python scripts, one generally controlling my desktop wallpaper, the other downloads the APOD picture from the net and sets it as my wallpaper.
    At the moment I can get the wallpaper script to load the apod script as a module to use its functionality.
    The problem comes when I try to get the module to recognise variables set from the parent script:
    I have both scripts using the variable  'verbose' to control how much output is printed, (which can be set from the command line options).
    How do I get the 'verbose' variable in the imported module to be the same as the variable set by the script?
    I can get it into an imported function using a keyword assignment when called, 'download(verbose=options.verbose)', but this is forgotten when other functions are called.
    I have also tried making it a global variable.
    I assume it is because I am importing the module and setting the default value before the main script sets its value, but I cant see a way round this.
    Any ideas?
    Many thanks,
    Drew

    simplicity:
    test1.py
    #!/usr/bin/python3
    __version__ = 1
    from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
    import test2
    def_msg = 3
    def function1(msg=def_msg):
    print('1 message level here is {0}' .format(msg))
    def function2():
    print('2 message level here is {0}' .format(msg))
    def function3(msg=def_msg):
    msg = def_msg
    print('3 message level here is {0}' .format(msg))
    def function4():
    print('4 message level here is {0}' .format(msg))
    def main(msg=def_msg):
    print('m message level here is {0}' .format(msg))
    function1(msg=msg)
    function2()
    function3()
    function4()
    test2.main(msg=msg)
    function2()
    if __name__ == "__main__":
    parser = OptionParser(usage = "usage: %prog [options] command", version="%prog {0}" .format(__version__),
    description = "Test script 1.")
    parser.set_defaults()
    standard = OptionGroup(parser, "Standard Options")
    ## Standard Options
    standard.add_option("-q", "--quiet",
    action="store_true", dest="quiet", default=False, #help=SUPPRESS_HELP)
    help="only display warnings and errors")
    standard.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False, #help=SUPPRESS_HELP)
    help="display all output")
    standard.add_option("--debug",
    action="store_true", dest="debug", default=False, #help=SUPPRESS_HELP)
    help="debug mode: detailed output of commands")
    standard.add_option("--really-quiet",
    action="store_true", dest="reallyquiet", default=False, help=SUPPRESS_HELP)
    #help="only display errors")
    standard.add_option("--silent",
    action="store_true", dest="silent", default=False, help=SUPPRESS_HELP)
    #help="don't display any output")
    parser.add_option_group(standard)
    (options, args) = parser.parse_args()
    ## message level
    if options.debug == True:
    msg = 5
    elif options.verbose == True:
    msg = 4
    elif options.quiet == True:
    msg = 2
    elif options.reallyquiet == True:
    msg = 1
    elif options.silent == True:
    msg = 0
    else:
    msg = 3
    main(msg=msg)
    test2.py
    #!/usr/bin/python3
    __version__ = 1
    from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
    #from test1 import msg
    def_msg = 3
    #msg = 3
    def function1(msg=def_msg):
    print('1 message level here is {0}' .format(msg))
    def function2(msg=def_msg):
    print('2 message level here is {0}' .format(msg))
    def function3():
    print('3 message level here is {0}' .format(msg))
    def main(msg=def_msg):
    #from test1 import msg
    #import test1
    #msg = test1.msg
    print('m message level here is {0}' .format(msg))
    function1(msg=msg)
    function2()
    function3()
    if __name__ == "__main__":
    parser = OptionParser(usage = "usage: %prog [options] command", version="%prog {0}" .format(__version__),
    description = "Test script 2.")
    parser.set_defaults()
    standard = OptionGroup(parser, "Standard Options")
    ## Standard Options
    standard.add_option("-q", "--quiet",
    action="store_true", dest="quiet", default=False, #help=SUPPRESS_HELP)
    help="only display warnings and errors")
    standard.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False, #help=SUPPRESS_HELP)
    help="display all output")
    standard.add_option("--debug",
    action="store_true", dest="debug", default=False, #help=SUPPRESS_HELP)
    help="debug mode: detailed output of commands")
    standard.add_option("--really-quiet",
    action="store_true", dest="reallyquiet", default=False, help=SUPPRESS_HELP)
    #help="only display errors")
    standard.add_option("--silent",
    action="store_true", dest="silent", default=False, help=SUPPRESS_HELP)
    #help="don't display any output")
    parser.add_option_group(standard)
    (options, args) = parser.parse_args()
    ## message level
    if options.debug == True:
    msg = 5
    elif options.verbose == True:
    msg = 4
    elif options.quiet == True:
    msg = 2
    elif options.reallyquiet == True:
    msg = 1
    elif options.silent == True:
    msg = 0
    else:
    msg = 3
    main(msg=msg)
    else:
    msg = def_msg
    I think I understand why it gives the results it does when run as 'test1.py -v'
    I was just wondering if there was an easier way to get the second script to take and remember the variable without having to write variable=value into the function call every single time? However this is the only way I have found so far.
    The actual code:
    wallpaper.py:
    #!/usr/bin/python3
    #Filename: wallpaper.py
    __version__ = '6.2.0'
    import os, sys
    from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
    #import warnings
    import random
    #import apod
    ##### CONFIG #####
    ## Global Variables
    root = '/home/wallpaper'
    feh_wallpaper_file = os.path.expanduser('~/.fehbg')
    filter_file = os.path.expanduser('~/.config/openbox/wallpaper/mask')
    config_path = os.path.expanduser('~/.config/openbox/wallpaper')
    list_default = 'default-list'
    list_alt = 'alt-list'
    menu_default = 'menu-folders'
    menu_alt = 'alt-menu'
    lockfile='/tmp/wallpaper.lock'
    valid_list_list = 'alt-list', 'default-list'
    def_msg = 3
    ##### LOCK v2.2 #####
    def LockScript(fun, lock=lockfile, msg=def_msg):
    """Locks the script before starting a function."""
    if msg >= 5:
    print('Lock :: Locking Script')
    from os import O_CREAT, O_EXCL
    try:
    fd = os.open(lock, O_CREAT+O_EXCL)
    if msg >= 5:
    print('Lock :: created lock file')
    except OSError:
    if msg >= 1:
    print('Error :: Already running function {0}...' .format(fun))
    sys.exit(1)
    try:
    fun(msg=msg)
    finally:
    try:
    os.remove(lock)
    if msg >= 6:
    print('Lock :: Removed Lock File')
    except:
    if msg >= 1:
    print('Lock :: Error :: Lockfile missing')
    ##### CURRENT INFO #####
    def get_filter(msg=def_msg):
    """Retrieves the filter."""
    f = open(filter_file, 'r')
    i = f.read()
    f.close()
    if msg >= 6:
    print('Got Filter :: {0}' .format(i))
    return i
    def get_info(msg=def_msg):
    """Returns the path and name of the current wallpaper."""
    with open(feh_wallpaper_file, 'r') as f:
    a = f.read()
    b = a[15:-1]
    f.close()
    name = os.path.basename(b)
    try:
    import apod
    if name == 'apod':
    path = os.path.join(apod.archive_folder, apod.thisyear)
    w = os.listdir(path)
    w.sort()
    wnum = len(w) -1
    name = w[wnum]
    else:
    path = os.path.dirname(b)
    except:
    path = os.path.dirname(b)
    if msg >= 5:
    print('current wallpaper :: {0} {1}' .format(path, name))
    return path, name
    def get_next(c, z, msg=def_msg):
    """Gets the next number in the sequence of length z."""
    if c == (len(z) - 1):
    n = 0
    else:
    n = c + 1
    if msg >= 6:
    print('next number is {0}' .format(n))
    return n
    def get_prev(c, z, msg=def_msg):
    """Gets the previous number in the sequence of length z."""
    if c == 0:
    p = (len(z) - 1)
    else:
    p = c - 1
    if msg >= 6:
    print('previous number is {0}' .format(p))
    return p
    def current_wallpaper_info(msg=def_msg):
    """Print the details of the current wallpaper."""
    name = get_info(msg=msg)[1]
    path = get_info(msg=msg)[0]
    folder = os.path.basename(path)
    mask = get_filter(msg=msg)
    try:
    import apod
    if path.startswith(apod.archive_folder) or name.startswith('APOD'):
    title = apod.get_name(fname=name, msg=msg)
    print('currently the wallpaper is "{0}", {1}' .format(title, name))
    elif not mask == '':
    print('currently the wallpaper is {0} from folder {1} using mask {2}' .format(name, folder, mask))
    else:
    print('currently the wallpaper is {0} from folder {1}' .format(name, folder))
    except:
    print('currently the wallpaper is {0} from folder {1}' .format(name, folder))
    ##### SET WALLPAPER FUNCTIONS #####
    def set_filter(i=None, msg=def_msg, mask_file=filter_file):
    """Sets the filter."""
    if test:
    f = open(mask_file, 'r')
    else:
    f = open(mask_file, 'w')
    if i == None:
    if msg >= 5:
    print('clearing filter')
    if test:
    print('exec :: Clear filter')
    else:
    f.write('')
    else:
    if msg >= 4:
    print('Setting filter as "{0}"' .format(i))
    if test:
    print('exec :: Writing filter as :: "{0}"' .format(i))
    else:
    f.write(i)
    f.close()
    def set_wallpaper(name, path_in=get_info()[0], msg=def_msg):
    """Set the wallpaper."""
    spath = path_in.split(':')
    path = spath[0]
    try:
    mask = spath[1]
    set_filter(mask, msg=msg)
    except:
    pass
    full = os.path.join(path, name)
    if msg >= 4:
    print("setting {0} as wallpaper" .format(name))
    if test:
    print("exec :: feh --bg-scale {0}" .format(full))
    else:
    os.system("feh --bg-scale {0}" .format(full))
    #def set_default(d=default_file):
    # """Sets the default walllpaper."""
    # set_wallpaper(d[1], d[0])
    def set_wallpaper_last(msg=def_msg):
    """Set the wallpaper as the last image."""
    ## alternativly use "eval `cat ~/.fehbg`"
    full = os.path.join(get_info()[0], get_info()[1])
    if msg >= 4:
    print("setting {0} as wallpaper" .format(full))
    if test:
    print("exec :: feh --bg-scale {0}" .format(full))
    else:
    os.system("feh --bg-scale {0}" .format(full))
    def change_folder(folder0, mask=None, msg=def_msg):
    """Change Wallpaper folder (optional filter) relative from root dir."""
    folder_split = folder0.split(':')
    folder = folder_split[0]
    path = os.path.join(root, folder)
    if not os.path.exists(path): # Path does not exist
    if msg >= 1:
    print('Fatal Error :: path does not exist')
    print('avaliable folders are {0}' .format(avaliable_folders()))
    sys.exit()
    if msg >= 4:
    print('changing folder to {0}' .format(folder))
    f1 = os.listdir(path)
    try:
    if folder_split[1]:
    mask = folder_split[1]
    f2 = []
    for i in f1:
    if i.find(mask) > -1:
    f2.append(i)
    f = f2
    if len(f) == 0:
    if msg >= 2:
    print('Warning :: invalid filter')
    raise
    set_filter(mask, msg=msg)
    else: # print('null mask')
    if msg >= 2:
    print('Warning :: null filter')
    raise
    except:
    if msg >= 5:
    print('No filter used, clearing')
    set_filter(msg=msg)
    f = f1
    if len(f) == 0:
    if msg >= 1:
    print('Fatal Error :: no files in path')
    sys.exit()
    r = random.randrange(0,len(f))
    if msg >= 5:
    print('chosing random number:: {0}' .format(r))
    set_wallpaper(f[r], path, msg=msg)
    def avaliable_folders(r=root, msg=def_msg):
    """Returns a list of avaliable folders in the root wallpaper directory."""
    allfolders = os.listdir(r)
    folders = []
    for f in allfolders:
    if not f.startswith("."):
    folders.append(f)
    return folders
    ##### DEFAULT / ALT SEQUENCE LISTS #####
    def strip_opt(p):
    #q1 = p.replace(' ','')
    #q2 = q1.replace('\t','')
    #q3 = q2.replace('\n','')
    q = p.replace(' ','').replace('\t','').replace('\n','')
    return q
    def check_list(l, path=config_path, dl=list_default, al=list_alt, msg=def_msg, returnF=False):
    """Checks to see (and returns) valid path to list."""
    if l == 'default' or l == 'def' or l == None :
    if msg >= 4:
    print('using default list')
    return os.path.join(path, dl)
    elif l == 'alt':
    if msg >= 4:
    print('using alternative list')
    return os.path.join(path, al)
    else:
    try:
    if not os.path.exists(os.path.join(path, l)):
    if msg >= 1:
    print('Error :: list does not exist')
    raise
    elif not os.path.isfile(os.path.join(path, l)):
    if msg >= 1:
    print('Error :: list not a file')
    raise
    else:
    try:
    c = valid_list_list.index(l)
    if msg >= 6:
    print('list name has been validated')
    except:
    if msg >= 2:
    print('Warnimg :: list used has not been vaildated by script')
    print('Warnimg :: if valid; add to the list of valid lists')
    if msg >= 5:
    print('path exists')
    return os.path.join(path, l)
    except:
    if returnF == True:
    return False
    else:
    if msg >= 2:
    print('Warning :: using default list')
    return os.path.join(config_path, dl)
    def get_seq(msg=def_msg):
    """Returns the sequence of current wallpaper and curr position."""
    mask = get_filter(msg=msg)
    path = get_info(msg=msg)[0]
    name = get_info(msg=msg)[1]
    list1 = os.listdir(path)
    if mask == '':
    list0 = list1
    else:
    list2 = []
    for i in list1:
    if i.find(mask) > -1:
    list2.append(i)
    try: # check the filter is currently being used
    num = list2.index(name)
    #print('wallpaper in filtered list')
    list0 = list2
    except: # filter is out of date
    if msg >= 5:
    print('wallpaper not in filtered list... clearing')
    list0 = list1
    set_filter(msg=msg) # clear filter
    list0.sort()
    try: # needed if current wallpaper has been removed
    num = list0.index(name)
    if msg >= 5:
    print('current wallpaper info ::')
    print('name : {0}, number : {1}' .format(name, num))
    return num, list0
    except:
    if msg >= 1:
    print('Error :: get_seq :: Current wallpaper file missing :: name : {0}' .format(name))
    return 0, list0
    def list_sequence(com='next', seq=None, msg=def_msg):
    cname = get_info(msg=msg)[1]
    if seq == None:
    list_dir = get_info(msg=msg)[0]
    list_file = get_seq(msg=msg)[1]
    if msg >= 4:
    print('Changing wallpaper in sequence using current folder:mask')
    else:
    ## Build a list.
    a = check_list(seq, msg=msg)
    list_dir = []
    list_file = []
    with open(a, 'r') as f:
    for line in f:
    i = line.split(',')
    list_dir.append(os.path.join(root, strip_opt(i[0])))
    list_file.append(strip_opt(i[1]))
    set_filter(msg=msg) # flush mask if using a list
    if msg >= 4:
    print('Changing wallpaper in sequence using list file')
    try:
    c = list_file.index(cname)
    if msg >= 5:
    print('found current wallpaper in list at position {0}' .format(c))
    if com == 'random':
    n = random.randrange(0, len(list_file))
    if msg >= 4:
    print('setting random wallpaper from sequence')
    elif com == 'prev':
    n = get_prev(c, list_file)
    if msg >= 4:
    print('setting previous wallpaper in sequence')
    elif com == 'next':
    n = get_next(c, list_file)
    if msg >= 4:
    print('setting next wallpaper in sequence')
    elif com == 'first':
    if msg >= 4:
    print('setting first wallpaper in sequence')
    n = 0
    else:
    if msg >= 2:
    print('Warning :: Unknown commmand')
    n = 0
    except:
    if msg >= 4:
    print('Warning :: not found current wallpaper in list / folder')
    print('using first file in list / folder')
    n = 0
    if seq == None:
    set_wallpaper(list_file[n], list_dir, msg=msg)
    else:
    set_wallpaper(list_file[n], list_dir[n], msg=msg)
    def toggle_list(d='default', com='toggle', msg=def_msg):
    """Removes the current file from the list."""
    a = check_list(d, msg=msg)
    file_list = []
    mod_file = []
    cname = get_info(msg=msg)[1]
    cpath = get_info(msg=msg)[0]
    if os.path.dirname(cpath) == root:
    cdir = os.path.basename(cpath)
    elif os.path.dirname(os.path.dirname(cpath)) == root:
    cdir = os.path.join(os.path.basename(os.path.dirname(cpath)), os.path.basename(cpath))
    else:
    print('error')
    sys.exit()
    cmask = get_filter(msg=msg)
    if cmask == '':
    cdmask = cdir
    else:
    cdmask = '{0}:{1}' .format(cdir, cmask)
    in_list = False
    with open(a) as f:
    for line in f:
    i = line.split(',')
    if cname == strip_opt(i[1]):
    if msg >= 6:
    print('file in list')
    in_list = True
    else:
    if msg >= 6:
    print('file not in list')
    file_list.append(strip_opt(i[1]))
    mod_file.append('{0} , {1} \n' .format(strip_opt(i[0]), strip_opt(i[1])))
    if in_list and com != 'rmfile' :
    if msg >= 3:
    print('Removed file from list')
    if test:
    for j in mod_file:
    print('writing newline: {0}' .format(j))
    else:
    with open(a, 'w') as newf:
    for j in mod_file:
    newf.writelines(j)
    elif not in_list and com != 'addfile':
    mod_file.append('{0} , {1} \n' .format(cdmask, cname))
    if msg >= 3:
    print('Added wallpaper to list')
    if test:
    for j in mod_file:
    print('writing newline: {0}' .format(j))
    else:
    with open(a, 'w') as newf:
    for j in mod_file:
    newf.writelines(j)
    else:
    if com == 'addfile':
    if msg >= 2:
    print('Warning :: File already in list')
    elif com == 'rmfile':
    if msg >= 2:
    print('Warning :: File not in list')
    else:
    if msg >= 1:
    print('Error :: UNKNOWN :: TOG LIST FUNCTION')
    ##### OPENBOX MENU #####
    def gen_obmenu():
    import oblib
    for i in avaliable_folders():
    oblib.item(i, 'wallpaper.py --silent --change {0}' .format(i))
    def gen_obmenu_simple(name=None, i=None):
    import oblib
    if name == None:
    oblib.pipe_start()
    else:
    oblib.menu_start(name, i)
    oblib.item('Deafult', 'wallpaper.py --silent --default')
    oblib.sep()
    oblib.item('APOD', 'wallpaper.py --silent --apod')
    oblib.item('APOD Save', 'wallpaper.py --silent --apod-save')
    oblib.item('Random', 'wallpaper.py --silent --random')
    if name == None:
    oblib.pipe_end()
    else:
    oblib.menu_end()
    def gen_obmenu_standard():
    import oblib
    oblib.pipe_start()
    oblib.item('Deafult', 'wallpaper.py --silent --default')
    oblib.sep()
    oblib.item('APOD', 'wallpaper.py --silent --apod')
    oblib.item('APOD Save', 'wallpaper.py --silent --apod-save')
    oblib.sep()
    oblib.menu_start('Change Set')
    obmenu_change_set()
    oblib.menu_end()
    apod.obmenu_archive_folders(t='menu')
    oblib.item('Toggle List', 'wallpaper.py --silent --toggle')
    oblib.item('Random', 'wallpaper.py --silent --random')
    oblib.pipe_end()
    def gen_obmenu_alt():
    import oblib
    oblib.pipe_start()
    oblib.sep('Alt Menu')
    obmenu_change_set('alt')
    oblib.pipe_end()
    def obmenu_change_set(a='default', dl=menu_default, al=menu_alt):
    import oblib
    menu = check_list(a, dl=dl, al=al, returnF=True)
    if menu != False:
    f = open(menu, 'r')
    for line in f:
    i = line.split(',')
    oblib.item(strip_opt(i[0]), 'wallpaper.py --change {0}' .format(strip_opt(i[1])))
    f.close()
    else:
    for i in avaliable_folders():
    oblib.item(i, 'wallpaper.py --change {0}' .format(i))
    ##### TEST FUNCTIONS #####
    def parser_options():
    print('Options are: {0}' .format(options))
    print('Args are : {0}' .format(args))
    print('Command is : {0}' .format(command))
    def meta_info():
    if options.meta_source == None:
    print('No source specifieed')
    else:
    print('Script launched from source :: {0}' .format(options.meta_source))
    def test_module():
    #pass
    #print(check_list(args[0]))
    new_mod()
    def new_mod():
    #if path == None:
    # print('No path specified, using pwd')
    # path = os.curdir
    #need_new_name = False
    #print('Checking filenames in {0}' .format(path))
    #for name in os.listdir(path):
    # if name.find(" ") > -1:
    # print("Warning :: > < in {0}" .format(name))
    # need_new_name = True
    # if name.find("'") > -1:
    # print("Warning :: >'< in {0}" .format(name))
    # need_new_name = True
    # if name.find("&") > -1:
    # print("Warning :: >&< in {0}" .format(name))
    # need_new_name = True
    # if name.find('"') > -1:
    # print('Warning :: >"< in {0}' .format(name))
    # need_new_name = True
    # if need_new_name:
    # new_name = name.replace('"', "").replace(" ", "_").replace("&", "and").replace("'", "")
    # if re_name:
    # print("Renaming to new name:: {0}" .format(new_name))
    # os.rename(os.path.join(path, name), os.path.join(path, new_name))
    # else:
    # print("Suggested new name:: {0}" .format(new_name))
    # need_new_name = False
    pass
    ##### SANITISE WALLPAPER FILE NAMES #####
    def sane_names(path=None, re_name=False, msg=def_msg):
    """Check file names in a path."""
    if path == None:
    print('No path specified, using pwd')
    path = os.curdir
    need_new_name = False
    print('Checking filenames in {0}' .format(path))
    for name in os.listdir(path):
    if name.find(" ") > -1:
    print("Warning :: > < in {0}" .format(name))
    need_new_name = True
    if name.find("'") > -1:
    print("Warning :: >'< in {0}" .format(name))
    need_new_name = True
    if name.find("&") > -1:
    print("Warning :: >&< in {0}" .format(name))
    need_new_name = True
    if name.find('"') > -1:
    print('Warning :: >"< in {0}' .format(name))
    need_new_name = True
    if need_new_name:
    new_name = name.replace('"', "").replace(" ", "_").replace("&", "and").replace("'", "")
    if re_name:
    print("Renaming to new name:: {0}" .format(new_name))
    os.rename(os.path.join(path, name), os.path.join(path, new_name))
    else:
    print("Suggested new name:: {0}" .format(new_name))
    need_new_name = False
    print('File name check complete')
    ##### MAIN FUNCTION #####
    def Main(msg=def_msg):
    """Chooses which command to run."""
    if options.direction != None: # a dircetion has been set
    list_sequence(com=options.direction, seq=options.whichlist, msg=msg)
    elif command == 'last':
    set_wallpaper_last(msg=msg)
    elif command == 'info':
    current_wallpaper_info(msg=msg)
    ## change folder
    elif options.newfolder != None:
    change_folder(options.newfolder, msg=msg)
    ## apod
    elif command == 'apod':
    #apod.download2(msg=msg, test=test)
    try:
    import apod
    apod.download2(msg=msg, test=test)
    except:
    pass
    elif command == 'apod-save':
    #apod.apod_save('today', msg=msg, test=test)
    try:
    import apod
    apod.apod_save('today', msg=msg, test=test)
    except:
    pass
    ## list management
    elif options.toggle != None:
    toggle_list(options.whichlist, com=options.toggle, msg=msg)
    ## openbox menu
    elif command == 'obmenu':
    gen_obmenu_standard()
    elif command == 'obmenu-simple':
    gen_obmenu_simple()
    elif command == 'obmenu-alt':
    gen_obmenu_alt()
    ## filename check
    elif command == 'sane-name':
    sane_names(path=options.sane_path, re_name=options.sane_rename, msg=msg)
    ## cycle
    elif command == 'cycle':
    print('ERROR :: function not implemented')
    elif command == 'testmod':
    test_module()
    elif options.whichlist != None: # a list but no direction specified
    list_sequence(seq=options.whichlist, msg=msg)
    elif command == "TestNone":
    print('Test mode null op[tion')
    elif command == None: ## no command specified
    pass
    else:
    print('Error :: no valid command found')
    ##### SCRIPT STARTUP #####
    if __name__ == "__main__":
    # def parse_change(option, opt_str, value, parser):
    # parser.values.command = 'change'
    # parser.values.newfolder = value
    # def parse_smask(option, opt_str, value, parser):
    # parser.values.command = 'set-mask'
    # parser.values.mask = value
    def parse_cycle(option, opt_str, value, parser):
    parser.values.command = 'cycle'
    parser.values.interval = value
    def parse_msglevel(option, opt_str, value, parser):
    parser.values.msg = value
    # def parse_addfile(option, opt_str, value, parser):
    # parser.values.command = 'addfile'
    # parser.values.whichlist = value
    # def parse_rmfile(option, opt_str, value, parser):
    # parser.values.command = 'rmfile'
    # parser.values.whichlist = value
    parser = OptionParser(usage = "usage: %prog [options] command", version="%prog {0}" .format(__version__),
    description = "Drews Script to the manage wallpapers using feh.")
    parser.set_defaults(command=None, whichlist=None, direction=None, toggle=None, newfolder=None)
    standard = OptionGroup(parser, "Standard Options")
    metaopt = OptionGroup(parser, "Meta Info Options", "Further datails about the script startup useful for debugging")
    gapod = OptionGroup(parser, "APOD Options", "Controls for the Astronomy Picture of the Day. ")
    obmenu = OptionGroup(parser, "Openbox Menu", "Support for openbox xml menu generation. ")
    #groupalt = OptionGroup(parser, "Alternative Wallpapers")
    gplist = OptionGroup(parser, "List Support")
    namecheck = OptionGroup(parser, "Filename Support")
    direction = OptionGroup(parser, "Direction Commands")
    ## Standard Options
    standard.add_option("-q", "--quiet",
    action="store_true", dest="quiet", default=False, #help=SUPPRESS_HELP)
    help="only display warnings and errors")
    standard.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False, #help=SUPPRESS_HELP)
    help="display all output")
    standard.add_option("--debug",
    action="store_true", dest="debug", default=False, #help=SUPPRESS_HELP)
    help="debug mode: detailed output of commands")
    standard.add_option("--really-quiet",
    action="store_true", dest="reallyquiet", default=False, help=SUPPRESS_HELP)
    #help="only display errors")
    standard.add_option("--silent",
    action="store_true", dest="silent", default=False, help=SUPPRESS_HELP)
    #help="don't display any output")
    standard.add_option('-t', "--test",
    action="store_true", dest="test", default=False, #help=SUPPRESS_HELP)
    help="test mode :: only print output")
    standard.add_option("--test-mod",
    action="store_const", const="testmod", dest="command", #help=SUPPRESS_HELP)
    help="test mode :: use test function module")
    standard.add_option("--test-none",
    action="store_const", const="TestNone", dest="command", #help=SUPPRESS_HELP)
    help="test mode :: no command specified")
    parser.add_option("--info", '-i',
    action="store_const", const="info", dest="command",
    help="Displays information about the current wallpaper.")
    parser.add_option("--last", '-l',
    action="store_const", const="last", dest="command",
    help="Sets the wallpaper as the last picture")
    direction.add_option('-n', "--next",
    action="store_const", const="next", dest="direction",
    help="Sets the next wallpaper in the sequence")
    direction.add_option('-p', "--prev", '--previous',
    action="store_const", const="prev", dest="direction",
    help="Sets the previous wallpaper in the sequence")
    direction.add_option('-r', '--rand', "--random",
    action="store_const", const="random", dest="direction",
    help="Sets a random wallpaper from the sequence")
    direction.add_option('-1', '--first', "--safe",
    action="store_const", const="first", dest="direction",
    help="Sets the first wallpaer in the sequence")
    gplist.add_option('-d', "--default",
    action="store_const", const="default", dest="whichlist",
    help="Uses the wallpapers from the default file list")
    gplist.add_option("--alt",
    action="store_const", const="alt", dest="whichlist",
    help="Uses the wallpapers from the alternative list")
    parser.add_option("--change", '-c',
    metavar="Folder[:Filter]", dest="newfolder",
    help="Changes the wallpaper folder, optional filter.")
    gapod.add_option('-a', "--apod",
    action="store_const", const="apod", dest="command",
    help="downloads and sets the wallpaper as todays APOD picture")
    gapod.add_option("--apod-save",
    action="store_const", const="apod-save", dest="command",
    help="Saves todays APOD picture")
    # gapod.add_option("--apod-last",
    # action="store_const", const="apod-last", dest="command",
    # help="Sets the wallpaper as yesterdays APOD picture")
    # gapod.add_option("--apod-force",
    # action="store_const", const="apod-force", dest="command",
    # help="force the download of todays APOD picture")
    gplist.add_option("--add-to-list",
    action="store_const", const='rmfile', dest='toggle',
    help="Adds the current wallpaper to the list.")
    gplist.add_option("--remove-from-list",
    action="store_const", const='addfile', dest='toggle',
    help="Removes the current wallpaper from a list.")
    gplist.add_option("--toggle-list", '--toggle',
    action="store_const", const='toggle', dest='toggle',
    help="Adds/Removes the current wallpaper from a list.")
    gplist.add_option("--list",
    metavar="LIST", dest='whichlist',
    help="Sets which list to use.")
    obmenu.add_option("--obmenu",
    action="store_const", const="obmenu", dest="command",
    help="Prints the standard openbox menu.")
    obmenu.add_option("--obmenu-simple",
    action="store_const", const="obmenu-simple", dest="command",
    help="Prints the simple openbox menu.")
    obmenu.add_option("--obmenu-alt",
    action="store_const", const="obmenu-alt", dest="command", #help=SUPPRESS_HELP)
    help="Prints the alternative openbox menu.")
    namecheck.add_option("--name-check",
    action="store_const", const="sane-name", dest="command",
    help="Checks if wallpaper names are valid.")
    namecheck.add_option("--name-path",
    metavar="PATH", dest="sane_path", default=None,
    help="Which folder to check.")
    namecheck.add_option("--rename",
    action="store_true", dest="sane_rename", default=False,
    help="If to rename invalid files.")
    metaopt.add_option("--meta-from",
    metavar="Source", dest='meta_source', default=None,
    help="Details from where the script was launched from")
    parser.add_option_group(direction)
    parser.add_option_group(gplist)
    parser.add_option_group(gapod)
    parser.add_option_group(obmenu)
    #parser.add_option_group(standard)
    #parser.add_option_group(metaopt)
    #parser.add_option_group(namecheck)
    (options, args) = parser.parse_args()
    test = options.test
    #debug = options.debug
    #verbose = options.verbose
    #quiet = options.quiet
    ## message level
    if options.debug == True:
    msg = 5
    elif options.verbose == True:
    msg = 4
    elif options.quiet == True:
    msg = 2
    elif options.reallyquiet == True:
    msg = 1
    elif options.silent == True:
    msg = 0
    else:
    msg = 3
    #if options.command == None:
    # try: # try and find a command
    # command = args[0]
    # except:
    # pass
    #else:
    # command = options.command
    command = options.command
    if options.debug:
    parser_options()
    meta_info()
    LockScript(Main, msg=msg) # start the script
    else:
    pass
    apod.py
    #!/usr/bin/python3
    #Filename: apod.py
    __version__ = '3.2.0'
    import os, sys
    from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
    import shutil
    from datetime import date
    #print('loaded apod')
    ##### VARIABLES #####
    ## Files and Paths
    #apod_archive_folder = '/home/wallpaper/apod_archive'
    archive_folder = '/home/wallpaper/apod_archive'
    save_folder = '/home/wallpaper/Space'
    tmpdir = '/tmp/wallpaper/apod'
    html_file = os.path.join(tmpdir, 'apod-html')
    img_file = os.path.join(tmpdir, 'apod-img')
    index_file = os.path.join(tmpdir, 'apod-index')
    work = os.path.expanduser('~/.config/openbox/apod')
    date_file = os.path.join(work, 'apod-date')
    apodfile = os.path.join(work, 'apod')
    apodlast = os.path.join(work, 'apod-last')
    namefile = os.path.join(work, 'apod-names')
    video_dir = os.path.join(work, 'apod-videos')
    errs = os.path.join(work, 'archive-errors')
    dtoday = str(date.today()) # todays date
    thisyear = dtoday[:4]
    saveprefix = 'APOD-'
    ## Defaults
    def_test = False
    def_msg = 3
    def_command = None
    def_apodset = True
    def_archive_apod = True # Keep all APOD pictures
    def_clear_apod = False
    def_force_apod = False
    def_cutoff = None
    store_file_list = ''
    ##### LOCK v2 #####
    ## Lock v2
    def LockScript(fun, lock='/tmp/apod.lock', msg=def_msg):
    """Locks the script before starting a function."""
    from os import O_CREAT, O_EXCL
    try: # lock the function
    fd = os.open(lock, O_CREAT+O_EXCL)
    #print('created lock file')
    except OSError:
    print('Already running function {0}...' .format(fun))
    sys.exit(1)
    try:
    fun(msg)
    finally:
    try: # release lock
    os.remove(lock)
    except:
    print('Error :: Lockfile missing !!!')
    ##### DEFINITIONS #####
    def get_date(dfile=date_file):
    check_file(dfile, create=True, msg=1)
    f = open(dfile)
    return f.read()
    def check_dir(d, create=False, msg=def_msg):
    """Check if path exists."""
    if not os.path.exists(d):
    if msg > 3:
    print('Error : folder missing...')
    if create:
    try:
    os.makedirs(d)
    if msg > 3 :
    print('...created folder')
    return True
    except:
    print('Fatal Error :: could not create directory {0}' .format(d))
    sys.exit()
    else:
    return False
    elif not os.path.isdir(d):
    print('Fatal Error :: this is not a directory')
    sys.exit()
    else:
    return True
    def check_file(f, create=False, msg=def_msg):
    """Check if path exists."""
    if not os.path.exists(f):
    #if msg > 3:
    # print('Error : file missing...')
    if create:
    check_dir(os.path.dirname(f), create=create, msg=msg)
    if msg > 5:
    print('creating file {0}' .format(f))
    try:
    q = open(f, 'w')
    q.write('')
    q.close()
    return True
    except:
    if msg >= 1:
    print('Fatal Error :: could not create file {0}' .format(f))
    sys.exit()
    else:
    if msg >= 5:
    print('file {0} does not exist' .format(f))
    return False
    else:
    if msg >= 5:
    print('file {0} exists' .format(f))
    return True
    def copy_file(ffrom, fto, msg=def_msg, test=def_test):
    """Copy files, from to (with test option)."""
    if test:
    print('[[copy command: {0} to {1}]]' .format(ffrom, fto))
    else:
    try:
    shutil.copy(ffrom, fto)
    except:
    if not os.path.exists(ffrom):
    print('Warning: error copying file, does not exist')
    elif os.path.isdir(ffrom):
    print('Fatal Error :: file being copied is a directory!')
    sys.exit()
    else:
    print('Fatal Error :: UNKNOWN ERROR during copy')
    sys.exit()
    def download_files(hfile=html_file, ifile=img_file, datefile=date_file, msg=def_msg, test=def_test, apodset=def_apodset, day='today', archive_apod=def_archive_apod):
    """Download the APOD html and img."""
    import urllib.request
    import socket
    timeout = 10
    socket.setdefaulttimeout(timeout)
    if day == 'today':
    url = 'http://antwrp.gsfc.nasa.gov/apod/astropix.html'
    name = dtoday
    year = thisyear
    else:
    url = 'http://antwrp.gsfc.nasa.gov/apod/ap{0}.html' .format(day)
    name = day
    if day[:1] == '9' :
    name = '19{0}-{1}-{2}' .format(day[:2], day[2:4], day[4:])
    else:
    name = '20{0}-{1}-{2}' .format(day[:2], day[2:4], day[4:])
    year = name[:4]
    try:
    response = urllib.request.urlopen(url)
    html = response.read()
    if msg > 3:
    print('downloaded html data for {0}' .format(day))
    check_file(hfile, create=True, msg=msg)
    f = open(hfile, 'wb')
    f.write(html)
    f.close()
    except:
    if msg >= 1:
    print('ERROR :: page not found :: exiting.')
    sys.exit(1)
    if day == 'today':
    t = open(datefile, 'w')
    t.write(dtoday)
    t.close()
    if msg > 3:
    print('updated date file with todays date')
    if msg > 3:
    print('copying over yesterdays APOD image')
    copy_file(apodfile, apodlast, msg=msg, test=test)
    found_img = False
    with open(hfile, 'r', encoding='latin-1') as g:
    for line in g:
    if 'IMG SRC' in line:
    i = line.split('"')
    if msg > 4:
    print('found image : {0}' .format(i[1]))
    found_img = True
    try:
    img_responce = urllib.request.urlopen(os.path.join('http://antwrp.gsfc.nasa.gov/apod/', i[1]))
    img_data = img_responce.read()
    except:
    print('error in img download')
    check_dir(errs, create=True, msg=1)
    check_file(os.path.join(errs, name), create=True, msg=0)
    else:
    if msg >= 5:
    print('read img data')
    check_file(ifile, create=True, msg=0)
    if msg >= 5:
    print('created img file')
    with open(ifile, 'wb') as l:
    l.write(img_data)
    if msg >= 3:
    print('downloaded image for {0}' .format(day))
    if day == 'today':
    copy_file(ifile,apodfile, msg=msg, test=test)
    if archive_apod:
    apod_archive(msg=msg, test=test, dfile=ifile, year=year, name=name)
    if not found_img :
    if msg >= 3:
    print('video :: not found image line in file from {0}' .format(i))
    check_file(os.path.join(video_dir, name), create=True, msg=0)
    if day == 'today':
    print('Warning : no image line in html file')
    copy_file(apodlast,apodfile, msg=msg, test=test)
    os.remove(hfile)
    os.remove(ifile)
    def apod_archive(dfile=img_file, msg=def_msg, test=def_test, year=thisyear, name=dtoday):
    """Archive APOD picture."""
    arch_file = os.path.join(archive_folder, year, name)
    check_dir(os.path.join(archive_folder, year), msg=msg, create=True)
    if check_file(arch_file, create=False, msg=msg):
    if msg > 3:
    print('APOD picture already archived')
    else:
    if msg > 3:
    print('Archiving APOD picture')
    copy_file(dfile, arch_file, msg=msg, test=test)
    def apod_save(day='current', sfolder=save_folder, msg=def_msg, test=def_test, prefix=saveprefix):
    """Save APOD picture as best of APOD."""
    with open(os.path.expanduser('~/.fehbg'), 'r') as f:
    a = f.read()
    b = a[15:-1]
    f.close()
    if day == 'today' or b[-4:] == 'apod':
    source = apodfile
    sfile = prefix + dtoday
    elif day == 'current':
    if not (os.path.dirname(b) == archive_folder or os.path.dirname(os.path.dirname(b)) == archive_folder ):
    print('picture is not in the recognised apod archive folder')
    sys.exit()
    source = b
    sfile = prefix+ b[-10:]
    else:
    if msg >= 1:
    print('unknown file specified')
    sys.exit(1)
    if msg > 3:
    print('Saving APOD picture to Save folder')
    copy_file(source, os.path.join(sfolder, sfile), msg=msg, test=test)
    def set_apod(a=apodfile, msg=def_msg, test=def_test, apodset=def_apodset ):
    """Sets the APOD wallpaper."""
    if not apodset:
    if msg > 3:
    print('Skipping setting APOD picture')
    else:
    if msg > 3:
    print('Setting APOD picture')
    if test:
    print("exec :: feh --bg-scale {0}" .format(a))
    else:
    os.system("feh --bg-scale {0}" .format(a))
    def clear_date(msg=def_msg, test=False):
    """Clears the date file."""
    if msg > 3:
    print('reseting date')
    if not test:
    t = open(datefile, 'w')
    t.write('')
    t.close()
    ##### APOD NAMES #####
    def get_name(fname=None, names=namefile, msg=def_msg, rerun=True, prefix=saveprefix):
    """Returns the name of an APOD file."""
    name_index = []
    title_index = []
    with open(names, 'r') as f:
    for line in f:
    i = line.split(',', 3)
    name_index.append(i[0])
    title_index.append(i[3])
    if fname == None:
    if msg >= 4:
    print('getting todays date')
    date = get_date()
    elif fname.startswith(prefix):
    if msg >= 4:
    print('removing save prefix from name')
    date = fname[len(prefix):]
    else:
    date = fname
    try:
    c = name_index.index(date)
    return title_index[c][:-2]
    except:
    if rerun:
    if msg >= 2:
    print('Warning :: name not in index, recreating')
    download_apod_index(msg=msg)
    build_name_list(msg=msg)
    get_name(fname=fname, names=names, msg=msg, rerun=False)
    else:
    if msg >= 1:
    print('Error :: name not in index, please recreate')
    def regen_index(msg=def_msg, cutoff=None):
    download_apod_index(msg=msg)
    build_name_list(msg=msg, cutoff=cutoff)
    def file_status(date, msg=def_msg, cutoff=None):
    """Status of an APOD Picture."""
    downloaded_files = [] # files in main apod download folder
    archive_files = [] # files in sub folder
    archive_download = [] # files from archive download
    videolist = []
    for i in os.listdir(archive_folder):
    if os.path.isdir(os.path.join(archive_folder,i)):
    for j in os.listdir(os.path.join(archive_folder, i)):
    j1 = j[2:]
    j2 = j1.replace('-','')
    archive_files.append(j2)
    else:
    i1 = i[2:]
    i2 = i1.replace('-','')
    downloaded_files.append(i2)
    for i in os.listdir(video_dir):
    videolist.append(i)
    if date[:1] == '9' :
    tdate = '19{0}' .format(date)
    else:
    tdate = '20{0}' .format(date)
    if cutoff == None:
    cutoff = '1995' # apod started 1995 06 16
    if tdate <= cutoff:
    return 'cut-off'
    try:
    downloaded_files.index(date)
    if msg >= 5:
    print('picture has been downloaded')
    return 'downloaded' #print('picture from {0} has already been downloaded' .format(pagedate))
    except:
    pass
    try:
    archive_files.index(date)
    if msg >= 5:
    print('picture has been downloaded')
    return 'archived' #print('picture from {0} has already been downloaded' .format(pagedate))
    except:
    pass
    try:
    archive_download.index(date)
    if msg >= 5:
    print('picture has been downloaded by archive retrieval')
    return 'retrieved'
    except:
    pass
    try:
    videolist.index(date)
    if msg >= 5:
    print('picture is a video')
    return 'video file'
    except:
    if msg >= 5:
    print('picture is missing')
    return 'missing'
    def download_apod_index(msg=def_msg, index=index_file):
    """Downloads the apod index file."""
    import urllib.request
    try:
    response = urllib.request.urlopen('http://antwrp.gsfc.nasa.gov/apod/archivepix.html')
    html = response.read()
    if msg > 3:
    print('downloaded apod index')
    check_file(index, create=True, msg=msg)
    f = open(index, 'wb')
    f.write(html)
    f.close()
    except:
    if msg >= 1:
    print('Fatal Error :: index page not found')
    sys.exit()
    def build_name_list(msg=def_msg, index=index_file, names=namefile, cutoff=None):
    """Builds a name list."""
    check_file(names, create=True, msg=msg)
    data = []
    with open(index, 'r') as f:
    for line in f:
    if '<a href="ap' in line:
    i = line.split(':', 1)
    imgdate = i[1][13:19]
    imgname = i[1][26:-9]
    status = file_status(date=imgdate, msg=msg, cutoff=None)
    if imgdate[:1] == '9' :
    imgfile = '19{0}-{1}-{2}' .format(imgdate[:2], imgdate[2:4], imgdate[4:])
    else:
    imgfile = '20{0}-{1}-{2}' .format(imgdate[:2], imgdate[2:4], imgdate[4:])
    if msg >= 3:
    print('found file : date = {0} : status = {1} : filename = {2}' .format(imgdate, status, imgfile))
    data.append('{0},{1},{2},{3} \n' .format(imgfile, imgdate, status, imgname))
    if msg >= 4:
    print('finished parsing index file')
    with open(namefile, 'w') as newf:
    for j in data:
    newf.writelines(j)
    if msg >= 4:
    print('written new name list')
    ##### MACROS #####
    def download2(msg=def_msg, test=def_test, apodset=def_apodset, force_apod=def_force_apod, clear_apod=def_clear_apod, archive_apod=def_archive_apod):
    """Downloads and sets APOD picture."""
    if clear_apod:
    clear_date(msg=msg, test=test)
    if force_apod:
    if msg >= 3:
    print('download forced')
    if get_date() != dtoday or force_apod:
    download_files(msg=msg, test=test, archive_apod=archive_apod)
    else:
    if msg >= 2:
    print('apod has already been downloaded today')
    set_apod(msg=msg, test=test, apodset=apodset) # #set apod picture
    def archive_download(msg=def_msg, newindex=False, cutoff=None, test=def_test):
    """Search and download missing pictures from the APOD archive pages"""
    if newindex:
    regen_index(msg=msg, cutoff=cutoff)
    target_dates = []
    with open(namefile, 'r') as g:
    for line in g:
    i = line.split(',')
    if i[2] == 'missing':
    if file_status(date=i[1], msg=msg) == 'missing':
    target_dates.append(i[1])
    if msg >= 4:
    print('target list built')
    target_dates.sort()
    for j in target_dates:
    if msg >= 4:
    print('')
    download_files(msg=msg, test=test, day=j, archive_apod=True)
    ##### OPENBOX MENU #####
    def gen_obmenu_standard():
    import oblib
    oblib.pipe_start()
    oblib.item('APOD', 'apod.py --update')
    oblib.item('APOD Save', 'apod.py --save')
    oblib.item('APOD Force', 'apod.py --force')
    oblib.pipe_end()
    def obmenu_archive_folders(t='pipe'):
    import oblib
    years = []
    for i in os.listdir(archive_folder):
    if os.path.isdir(os.path.join(archive_folder,i)):
    years.append(i)
    years.sort()
    years.reverse()
    if t == 'pipe':
    oblib.pipe_start()
    else:
    oblib.menu_start('Apod Archive')
    for k in years:
    oblib.item('Apod: {0}' .format(k), 'wallpaper.py --change {0}/{1}' .format(archive_folder, k))
    if t == 'pipe':
    oblib.pipe_end()
    else:
    oblib.menu_end()
    ##### TEST FUNCTIONS #####
    def parser_options():
    print('Options are: {0}' .format(options))
    print('Args are : {0}' .format(args))
    print('Command is : {0}' .format(options.command))
    def meta_info():
    if options.meta_source == None:
    print('No source specifieed')
    else:
    print('Script launched from source :: {0}' .format(options.meta_source))
    def test_module(msg=def_msg):
    pass
    #gen_obmenu_arfolders()
    #unicode_test()
    #apod_archive_download(msg=msg)
    #print(check_list(args[0]))
    #regen_index(msg=msg)
    #print(get_name(fname=None, msg=msg))
    #print(len(saveprefix))
    ##### MAIN FUNCTION #####
    def Apod_Main(msg=def_msg):
    """Main functions."""
    command = options.command
    check_dir(work, create=True, msg=msg)
    if options.regen_index :
    regen_index(msg=msg, cutoff=options.cutoff)
    if command == None:
    command = 'pass'
    if command == "download":
    if msg > 3:
    print('Updating APOD')
    download2(msg=msg, test=options.test, apodset=options.apodset, force_apod=options.force, clear_apod=options.clear, archive_apod=options.archive)
    elif command == "download-only":
    if msg > 3:
    print('Downloading APOD picture only')
    download2(msg=msg, test=options.test, apodset=False, force_apod=options.force, clear_apod=options.clear, archive_apod=False)
    elif command == "last":
    if msg > 3:
    print('Setting last APOD')
    set_apod(apodlast, msg=msg, test=options.test, apodset=options.apodset)
    elif command == "save-today":
    apod_save('today', msg=msg, test=options.test)
    elif command == "save":
    apod_save('current', msg=msg, test=options.test)
    elif command == "set":
    if msg > 3:
    print('Setting APOD')
    set_apod(msg=msg, test=options.test, apodset=options.apodset)
    elif command == "restore":
    if msg > 3:
    print('Restoreing yesterdays APOD picture.')
    copy_file(apodlast, apodfile, msg=msg, test=options.test)
    set_apod(msg=msg, test=options.test, apodset=options.apodset)
    elif command == 'retrieve':
    archive_download(msg=msg, newindex=options.newindex, cutoff=options.cutoff)
    elif command == 'testmod':
    test_module(msg=msg)
    elif command == "TestNone":
    print('Test mode null op[tion')
    elif command == "pass":
    if msg >= 4:
    print('pass option has been called')
    elif not command == None:
    if msg >= 2:
    print('Warning :: Unrecognised command specified')
    #pass
    else:
    if msg >= 2:
    print('Warning :: no commands found, using default option')
    set_apod(msg=msg, test=options.test, apodset=options.apodset)
    ##### SCRIPT STARTUP #####
    if __name__ == "__main__":
    parser = OptionParser(usage = "usage: %prog [download options] [command]", version="%prog {0}" .format(__version__),
    description = "Script to manage APOD wallpapers.")
    parser.set_defaults(archive=def_archive_apod, apodset=def_apodset, command=None)
    standard = OptionGroup(parser, "Standard Options")
    doptions = OptionGroup(parser, "Download Options")
    aoptions = OptionGroup(parser, "Archive Options")
    metaopt = OptionGroup(parser, "Meta Info Options", "Further datails about the script startup useful for debugging")
    standard.add_option("-q", "--quiet",
    action="store_true", dest="quiet", default=False,
    help="only display warnings and errors")
    standard.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False,
    help="display all output")
    standard.add_option("--debug",
    action="store_true", dest="debug", default=False,
    help="debug mode: detailed output of commands")
    standard.add_option("--really-quiet",
    action="store_true", dest="reallyquiet", default=False, help=SUPPRESS_HELP)
    #help="only display errors")
    standard.add_option("--silent",
    action="store_true", dest="silent", default=False, help=SUPPRESS_HELP)
    #help="don't display any output")
    standard.add_option('-t', "--test",
    action="store_true", dest="test", default=False, help=SUPPRESS_HELP)
    #help="test mode :: only print output")
    standard.add_option("--test-mod",
    action="store_const", const="testmod", dest="command", help=SUPPRESS_HELP)
    #help="test mode :: use test function module")
    standard.add_option("--test-none", "--pass",
    action="store_const", const="TestNone", dest="command", help=SUPPRESS_HELP)
    #help="test mode :: no command specified")
    parser.add_option('-a', '-u', '--update',
    action="store_const", const="download", dest="command",
    help="Downloads and sets the wallpaper as todays APOD picture")
    parser.add_option("--save",
    action="store_const", const="save", dest="command",
    help="Saves the curent APOD wallpaper")
    parser.add_option("--set",
    action="store_const", const="set", dest="command",
    help="Sets wallpaper as APOD")
    parser.add_option('--download-only',
    action="store_const", const="download-only", dest="command",
    help="Only downloads todays APOD picture")
    parser.add_option("--last",
    action="store_const", const="last", dest="command",
    help="Sets the wallpaper as yesterdays APOD picture")
    parser.add_option("--restore",
    action="store_const", const="restore", dest="command", help=SUPPRESS_HELP)
    #help="Restores yesterdays APOD picture as todays.")
    aoptions.add_option("--retrieve", '--populate',
    action="store_const", const="retrieve", dest="command",
    help="Retrives archive APOD images from the APOD archive")
    aoptions.add_option("--regen-index",
    action="store_true", dest="regen_index", default=False,
    help="Regenerates the APOD index file")
    aoptions.add_option("--no-index",
    action="store_false", dest="newindex", default=True, help=SUPPRESS_HELP)
    #help="Do not build a nex index")
    aoptions.add_option("--cut-off",
    metavar="Date", dest='cutoff', default=def_cutoff,
    help="Cut off date for downloading archive pictures")
    # parser.add_option("--get-name",
    # metavar="NAME", dest="getname", default=None,
    # help="Returns the name of a pictures name")
    doptions.add_option("--force",
    action="store_true", dest="force", default=def_force_apod,
    help="Force the download of todays APOD picture")
    doptions.add_option("--clear",
    action="store_true", dest="clear", default=def_clear_apod, help=SUPPRESS_HELP)
    #help="resets the date of last APOD download.")
    doptions.add_option("--archive",
    action="store_true", dest="archive",
    help="If to archive a picture after download")
    doptions.add_option("--no-archive",
    action="store_false", dest="archive",
    help="If to archive a picture after download")
    doptions.add_option("--force-set",
    action="store_true", dest="apodset", help=SUPPRESS_HELP)
    #help="If to set the wallpaper as APOD.")
    doptions.add_option("--no-set",
    action="store_false", dest="apodset", help=SUPPRESS_HELP)
    #help="Skips setting APOD as wallpaper")
    metaopt.add_option("--meta-from",
    metavar="Source", dest='meta_source', default=None,
    help="Details from where the script was launched from")
    parser.add_option_group(doptions)
    parser.add_option_group(aoptions)
    parser.add_option_group(standard)
    #parser.add_option_group(metaopt)
    (options, args) = parser.parse_args()
    ## message level
    if options.debug == True:
    msg = 5
    elif options.verbose == True:
    msg = 4
    elif options.quiet == True: # warnings
    msg = 2
    elif options.reallyquiet == True: # errors only
    msg = 1
    elif options.silent == True: # no output
    msg = 0
    else:
    msg = 3
    if options.debug:
    parser_options()
    meta_info()
    LockScript(Apod_Main, msg=msg)

  • Spotlight in "Open Dialog" fail to find "Numbers" file

    Hi,
    when i use the spotlight search tool inside the open dialog box from Numbers it seem to be unable to find "Numbers file".
    Let say I have 4 files on my Hard Drive :
    - FileName1.xls
    - FileName1.Numbers
    - FileName2.xls
    - FileName2.Numbers
    If I type "FileName" in Finder > Spotlight It get all the 4 files.
    If I type "FileName" in Numbers > Open Dialog > Spotlight it get :
    - FileName1.xls
    - FileName2.xls
    Either I check or not different search options (filename / content / Start / My iMac ...)
    Any idea what's wrong ?
    Thank you.

    Bonjour,
    Concernant votre dernier message :
    oui, j'ai vu votre capture. C'est du Page, pas du Numbers :-) une différence serait possible, mais lire la suite ci-dessous...
    La corruption d'index est une piste. Mais comme Spotlight trouve mes fichiers dans d'autres conditions, cela indiquerait un Index correct. Toutefois, ce point est très technique et je ne ferrais aucun pari sur la "mécanique" d'Index Spotlight. J'ai donc utilisé l'outils recommandé dans la discussion donnée en lien (je n'aime pas trop l'idée qu'un outil tiers bidouille les entrailles de l'OS d'Apple, mais bon). Apparemment l`'outils détruit l'index et Spotlight se met au travail et ré-index le disque.
    Mais cela n'a rien changé.
    j'aimerais approfondire un peu si vous le coulez bien. Avec 37 805 points vous devez avoir quelques ressources en réserves ;-)
    Appelons ça le "bogue" ; même s'il peut s'agir d'un problème de paramètre quelconque modifié maladroitement dans mes préférences systèmes ... En explorant différentes pistes et en vous les soumettant je peux peut être vous mettre sur la voix d'une solution qui ne vous vient pas immédiatement à l'esprit car très spécifique à mon cas particulier.
    Nous sommes d'accord sur ce point : la recherche dans Numbers > Ouvrir est une implémentation de Spotlight. Manifestement cette implémentation est pleines d'options et présente des différences significatives avec le Bureau.
    Exemple 1 :
    Dans Finder la recherche par type > autre est un champ vide.
    Dans Numbers la recherche par type > autre est une liste de choix.
    Il semble que Spotlight dans Numbers ne prennent en considération que les fichiers que Numbers peut ouvrir. Et pour cela il se base sur l'extension. Et le bogue fait penser que les développeurs auraient oublié l'extension ".numbers" !
    ------------ EDIT
    J'ai effacé tout une série de tests tant la découverte finale est la plus importante ...
    En modifiant l'extension d'une application en .numbers elle est apparue dans ma fenêtre Numbers !
    J'en conclu que "mon" Numbers n'affiche via spotlight QUE les fichiers portant une extension compatible (xls, cwk, txt) ET que le fichier est de type "binaire / app / ???".
    L'erreur serait sur ce dernier aspect : les fichiers numbers ne sont PAS des fichiers "binaire / app".
    Ou orienter les recherches, puisque, manifestement, ça marche sur votre Mac ?
    Merci d'avoir étudier cette longue réponse.
    --Edit
    Numbers trouve les .php (des fichiers text assimilable à des executables) mais ils sont grisés donc impossible de les ouvrir.
    Là je dis, ça devient du n'importe quoi .... :-(

  • LabVIEW Equivalent of 'Whos' command in MATLAB

    Hi 
    Similar to 'Whos' command in MATLAB I wanted to list all the constant and controls (if possible) I used in my LabVIEW code. Does anyone know if its possible with any additional code or Toolkit. 
    Thanks in advance. 
    Thanks & Regards,
    Kunal Raithatha.
    CTD - CLAD (I wish I can take off that A, and maybe use it later to replace D :-)
    Easy Tip :- "To copy an image to a VI icon, drag the image file and place it on the icon
    located in the upper right corner of the front panel or block diagram" ...If you know any
    more reply back.

    Smercurio_fc
    Pupose is to enlist name and value of constants n controls I used in quite a big VI, values of the constants are often manipulated to adjust the requirement. It will be good at the end if I can print them altogether. 
    Thank You.
    Thanks & Regards,
    Kunal Raithatha.
    CTD - CLAD (I wish I can take off that A, and maybe use it later to replace D :-)
    Easy Tip :- "To copy an image to a VI icon, drag the image file and place it on the icon
    located in the upper right corner of the front panel or block diagram" ...If you know any
    more reply back.

  • Assembling jar with dependent classes

    For efficient Applet use I'd like to copy selectively into a jar my applet classes plus all classes they are dependent on from a set of libraries, thus producing the minimum jar library with which the applets can run (obviously classes which are part of the standard JRE are not to be included.
    Now I can see, in outline, how to write a program to achieve this, but I have this feeling I've read about such a facility somewhere. I thought it was in ANT but I can't find it in the ANT documentation now. If someone knows of a utility (preferably free) that can do this please can you save me the trouble.

    Well, I think I've found one on sourceforge: http://genjar.sourceforge.net/
    I've also found out how to get dependant classes from a .class file relatively simply. Class references are listed in the Constants Table which is near the start of the .class file format. I've written a piece of code which seems to fetch them OK.
    package org.igis.assjar;
    * <p>Read a class file stream and return all the referenced classes from the
    * class.</p>
    * @author  malcolmm
    public class GetClassRefs {
        private static final byte CONSTANT_Class = 7;
        private static final byte CONSTANT_FieldRef = 9;
        private static final byte CONSTANT_MethodRef = 10;
        private static final byte CONSTANT_InterfaceMethodRef = 11;
        private static final byte CONSTANT_String = 8;
        private static final byte CONSTANT_Integer = 3;
        private static final byte CONSTANT_Float = 4;
        private static final byte CONSTANT_Long = 5;
        private static final byte CONSTANT_Double = 6;
        private static final byte CONSTANT_NameAndType = 12;
        private static final byte CONSTANT_Utfs = 1;
        private static final int [] lengths = new int[13];
        static {
            lengths[CONSTANT_Class] = 3;
            lengths[CONSTANT_FieldRef] = 5;
            lengths[CONSTANT_MethodRef] = 5;
            lengths[CONSTANT_InterfaceMethodRef] = 5;
            lengths[CONSTANT_String] = 3;
            lengths[CONSTANT_Integer] = 5;
            lengths[CONSTANT_Float] = 5;
            lengths[CONSTANT_Long] = 9;
            lengths[CONSTANT_Double] = 9;
            lengths[CONSTANT_NameAndType] = 5;
            lengths[CONSTANT_Utfs] = 1;
        private final static int magic = 0xcafebabe;
        String mainClass;
        String [] refs;
        /** Creates a new instance of GetClassRefs */
        public GetClassRefs(java.io.InputStream ins) throws java.io.IOException,java.lang.ClassFormatError {
            java.io.DataInputStream in = new java.io.DataInputStream(ins);
            Object[] constTable;
            int nRefs;
            if(in.readInt() != magic)
                throw new ClassFormatError("Bad class magic");
            in.skipBytes(4);
            int cpCount = in.readUnsignedShort();
            constTable = new Object[cpCount];
            nRefs = 0;
            for(int i = 1; i < cpCount; i++) {
                int tag = in.readUnsignedByte();
                switch(tag) {
                    case CONSTANT_Utfs:
                        String clsName = in.readUTF();
                        if(clsName.length() > 0) {
                            if(clsName.charAt(0) == '[') {
                                do
                                    clsName = clsName.substring(1);
                                while(clsName.charAt(0) == '[');
                                if(clsName.charAt(0) == 'L' && clsName.endsWith(";"))
                                    clsName = clsName.substring(1, clsName.length() - 1);
                            constTable[i] = clsName;
                        break;
                    case CONSTANT_Class:
                        nRefs++;
                        constTable[i] = new Integer(in.readUnsignedShort());
                        break;
                    case CONSTANT_Long:
                    case CONSTANT_Double:
                        i++;
                        in.skipBytes(8);
                        break;
                    default:
                        if(tag < 0 || tag >= lengths.length || lengths[tag] == 0)
                            throw new ClassFormatError("Invalid constants tag " + tag);
                        in.skipBytes(lengths[tag] - 1);
                        break;
            in.skipBytes(2);
            int thisClass = in.readUnsignedShort();
            if(!(constTable[thisClass] instanceof Integer))
                throw new ClassFormatError("Invalid main class index");
            int cpp = ((Integer)constTable[thisClass]).intValue();
            if(!(constTable[cpp] instanceof String))
                throw new ClassFormatError("Invalid main class pointer");
            mainClass = (String)constTable[cpp];
            refs = new String[nRefs - 1];
            int j = 0;
            for(int i = 1; i < constTable.length; i++) {
                Object entry = constTable;
    if(entry instanceof Integer) {
    int idx = ((Integer)entry).intValue();
    if(idx < 1 || idx >= constTable.length)
    throw new ClassFormatError("Out of range class reference");
    if(constTable[idx] instanceof String) {
    if(i == thisClass)
    mainClass = (String)constTable[idx];
    else
    refs[j++] = (String)constTable[idx];
    else
    throw new ClassFormatError("Class reference not string");
    public String getMainClass() {
    return mainClass;
    public String[] getRefs() throws ClassFormatError {
    return refs;

  • Creating Routings via LSMW

    Hi all,
    Can anyone give me some pointers when creating Routings via LSMW. I see there are two standard uploads in RCPTRA01 and RCPTRA02. However, the mapping structures seem to be different between the two.
    I need to add PRT's material assignments and long texts to the routing.
    Any help greatly appreciated.

    Hi,
    Use standard batch/Direct input : RCPTRA02
    Source Fields
            MATERIAL_ROUTING          Material
                PLNAL                          C(002)    Group Counter
                MATNR                          C(018)    Article Number
                WERKS                          C(004)    Site
                OPERATION_ROUTING         Operations
                    PLNAL                          C(002)    Group Counter
                    VORNR                          C(004)    Operation/Activity Number
                    STEUS                          C(004)    Control Key
                    ARBPL                          C(008)    Work center
                    WERKS                          C(004)    Site
                    LTXA1                          C(040)    Operation short text
                    MEINH                          C(003)    Quantity unit for operation (batch input)
                    BMSCH                          C(017)    Base quantity (Batch input)
                    LAR02                          C(006)    Activity Type
                    VGE02                          C(003)    Unit for the standard value (batch input)
                    VGW02                          C(011)    Standard Value (Batch Input)
                    LAR03                          C(006)    Activity Type
                    VGE03                          C(003)    Unit for the standard value (batch input)
                    VGW03                          C(011)    Standard Value (Batch Input)
                COMPONENT_ROUTING         Components
                    PLNAL                          C(002)    Group Counter
                    VORNR                          C(004)    Operation/Activity Number
                    POSNR                          C(004)    BOM Item Number
                    MATNR                          C(018)    Article Number
                    WERKS                          C(004)    Site
    Field Mapping and Rule
           RC271_DS                       Work center structure for direct input (for datasets)
               Fields
                   TCODE                        Transaction Code
                                       Rule :   Constant
                                       Code:    RC271_DS-TCODE = 'CA01'.
                   STTAG                        Character Field Length = 10
                                       Rule :   Constant
                                       Code:    RC271_DS-STTAG = '18.03.2014'.
                   AENNR                        Change Number
                   REVLV                        Revision Level
                   WERKS                        Site
                                       Rule :   Transfer (MOVE)
                                       Code:    RC271_DS-WERKS = MATERIAL_ROUTING-WERKS.
                   PROFIDNETZ                   Profile
                   PLNNR                        Key for Task List Group
                   PLNAL                        Group Counter
                                       Rule :   Transfer (MOVE)
                                       Code:    RC271_DS-PLNAL = MATERIAL_ROUTING-PLNAL.
                   STATU                        Status
                                       Rule :   Constant
                                       Code:    RC271_DS-STATU = '4'.
                   VAGRP                        Responsible Planner Group/Department
                                       Rule :   Constant
                                       Code:    RC271_DS-VAGRP = 'KD1'.
                   VBELN                        Sales Document
                   POSNR                        Character field of length 6
                   PSPNR                        Work Breakdown Structure Element (WBS Element)
    MAPL_DI_DS                     Assign routing to article for direct input (for datasets)
        Fields
            ACTTYP                       Processing type for objects to be imported
                                Code:    MAPL_DI_DS-ACTTYP = 'H'.
            MATNR                        Article Number
                                Rule :   Transfer (MOVE)
                                Code:    MAPL_DI_DS-MATNR = MATERIAL_ROUTING-MATNR.
            WERKS                        Site
                                Rule :   Transfer (MOVE)
                                Code:    MAPL_DI_DS-WERKS = MATERIAL_ROUTING-WERKS.
            PLNAL                        Group Counter
                                Rule :   Transfer (MOVE)
                                Code:    MAPL_DI_DS-PLNAL = MATERIAL_ROUTING-PLNAL.
            LIFNR                        Vendor Account Number
            KUNR                         Account Number of Customer
            SUCHFELD                     Search Field for Customer-Specific Task List Selection
            VBELN                        Sales Document
            POSNR                        Sales Document Line Item (Batch Input Field)
            PSPNR                        Work Breakdown Structure Element (WBS Element)
    PLKO_DI_DS                     Header structure for direct input (for datasets)
        Fields
            ACTTYP                       Processing type for objects to be imported
                                Code:    PLKO_DI_DS-ACTTYP = 'H'.
            PLNAL                        Group Counter
                                Rule :   Transfer (MOVE)
                                Code:    PLKO_DI_DS-PLNAL = MATERIAL_ROUTING-PLNAL.
            VERWE                        Use by user or system
                                Rule :   Constant
                                Code:    PLKO_DI_DS-VERWE = '1'.
            WERKS                        Site
                                Rule :   Transfer (MOVE)
                                Code:    PLKO_DI_DS-WERKS = MATERIAL_ROUTING-WERKS.
            STATU                        Status
                                Rule :   Constant
                                Code:    PLKO_DI_DS-STATU = '4'.
            PLNME                        Unit of measure for the task list (batch input)
                                Rule :   Constant
                                Code:    PLKO_DI_DS-PLNME = 'KG'.
            LOSVN                        From lot size (BTCI)
                                Rule :   Constant
                                Code:    PLKO_DI_DS-LOSVN = '0'.
            LOSBS                        To lot size (BTCI)
                                Rule :   Constant
                                Code:    PLKO_DI_DS-LOSBS = '999999999'.
            VAGRP                        Responsible planner group/department
                                Rule :   Constant
                                Code:    PLKO_DI_DS-VAGRP = 'KD1'.
            KTEXT                        Task list description
                                Rule :   Constant
                                Code:    PLKO_DI_DS-KTEXT = 'Article Routing'.
            TXTSP                        Single-Character Indicator
    PLPO_DI_DS                     Routing/item structure for direct input (for datasets)
        Fields
            ACTTYP                       Processing type for objects to be imported
                                Code:    PLPO_DI_DS-ACTTYP = 'H'.
            PLNAL                        Group Counter
                                Rule :   Transfer (MOVE)
                                Code:    PLPO_DI_DS-PLNAL = OPERATION_ROUTING-PLNAL.
            PLNFL                        Sequence
                                Rule :   Constant
                                Code:    PLPO_DI_DS-PLNFL = '000000'.
            VORKN                        Node number (batch input)
            VORNR                        Operation/Activity Number
                                Rule :   Transfer (MOVE)
                                Code:    PLPO_DI_DS-VORNR = OPERATION_ROUTING-VORNR.
            UVOKN                        Node number (batch input)
            UVORN                        Suboperation
            STEUS                        Control key
                                Rule :   Transfer (MOVE)
                                Code:    PLPO_DI_DS-STEUS = OPERATION_ROUTING-STEUS.
            ARBID                        Object ID (batch input)
            OBJTY                        Object types of the CIM resource
            ARBPL                        Work center
                                Rule :   Transfer (MOVE)
                                Code:    PLPO_DI_DS-ARBPL = OPERATION_ROUTING-ARBPL.
            WERKS                        Site
                                Rule :   Transfer (MOVE)
                                Code:    PLPO_DI_DS-WERKS = OPERATION_ROUTING-WERKS.
            KTSCH                        Standard text key
            LTXA1                        Operation short text
                                Rule :   Transfer (MOVE)
                                Code:    PLPO_DI_DS-LTXA1 = OPERATION_ROUTING-LTXA1.
    MEINH                        Quantity unit for operation (batch input)
                        Rule :   Transfer (MOVE)
                        Code:    PLPO_DI_DS-MEINH = OPERATION_ROUTING-MEINH.
    UMREN                        Denominator for conversion from unit to base unit (BTCI)
                        Rule :   Constant
                        Code:    PLPO_DI_DS-UMREN = '1'.
    UMREZ                        Numerator for converting from unit to base unit (BTCI)
                        Rule :   Constant
                        Code:    PLPO_DI_DS-UMREZ = '1'.
    BMSCH                        Base quantity (Batch input)
                        Rule :   Transfer (MOVE)
                        Code:    PLPO_DI_DS-BMSCH = OPERATION_ROUTING-BMSCH.
    ZMERH                        Break time (batch input)
    ZEIER                        Unit for break time (batch input)
    LAR01                        Activity Type
    VGE01                        Unit for the standard value (batch input)
    VGW01                        Standard Value (Batch Input)
    LAR02                        Activity Type
    VGE02                        Unit for the standard value (batch input)
                        Rule :   Transfer (MOVE)
                        Code:    PLPO_DI_DS-VGE02 = OPERATION_ROUTING-VGE02.
    VGW02                        Standard Value (Batch Input)
                        Rule :   Transfer (MOVE)
                        Code:    PLPO_DI_DS-VGW02 = OPERATION_ROUTING-VGW02.
    LAR03                        Activity Type
    VGE03                        Unit for the standard value (batch input)
                        Rule :   Transfer (MOVE)
                        Code:    PLPO_DI_DS-VGE03 = OPERATION_ROUTING-VGE03.
    VGW03                        Standard Value (Batch Input)
                        Rule :   Transfer (MOVE)
                        Code:    PLPO_DI_DS-VGW03 = OPERATION_ROUTING-VGW03.
    PLMZ_DI_DS                     Article component allocation for direct input(for datasets)
        Fields
            ACTTYP                       Processing type for objects to be imported
                                Rule :   Constant
                                Code:    PLMZ_DI_DS-ACTTYP = 'H'.
            PLNAL                        Group Counter
                                Rule :   Transfer (MOVE)
                                Code:    PLMZ_DI_DS-PLNAL = COMPONENT_ROUTING-PLNAL.
            PLNFL                        Sequence
                                Rule :   Constant
                                Code:    PLMZ_DI_DS-PLNFL = '000000'.
            PLNKN                        Node number (batch input)
            VORNR                        Operation/Activity Number
                                Rule :   Transfer (MOVE)
                                Code:    PLMZ_DI_DS-VORNR = COMPONENT_ROUTING-VORNR.
            STLTY                        BOM category
                                Rule :   Constant
                                Code:    PLMZ_DI_DS-STLTY = 'M'.
            STLNR                        Bill of material
                                Rule :   Constant
                                Code:    PLMZ_DI_DS-STLNR = '00000005'.
            STLAL                        Alternative BOM
                                Rule :   Constant
                                Code:    PLMZ_DI_DS-STLAL = '01'.
            STLKN                        Node number (batch input)
            POSNR                        BOM Item Number
                                Rule :   Transfer (MOVE)
                                Code:    PLMZ_DI_DS-POSNR = COMPONENT_ROUTING-POSNR.
    WERKS                        Site
                        Rule :   Transfer (MOVE)
                        Code:    PLMZ_DI_DS-WERKS = COMPONENT_ROUTING-WERKS.
    BOMAT                        Article Number
                        Rule :   Transfer (MOVE)
                        Code:    PLMZ_DI_DS-BOMAT = COMPONENT_ROUTING-MATNR.
    STLST                        Order level
    STLWG                        Order path
    STLTY_W                      BOM category
                        Rule :   Constant
                        Code:    PLMZ_DI_DS-STLTY_W = 'M'.
    STLNR_W                      Bill of material
                        Rule :   Constant
                        Code:    PLMZ_DI_DS-STLNR_W = '00000005'.
    STLAL_W                      Alternative BOM
                        Rule :   Constant
                        Code:    PLMZ_DI_DS-STLAL_W = '01'.
    Map the extra fields according to your requirement. Hope you'll find the code helpful.

Maybe you are looking for