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 -
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
arullakshmiarullakshmi 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 Duohey, 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:38Hoek 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,
Drewsimplicity:
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; -
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
-
Hi, I am making a Bot class. This function rotateTo makes the bot rotate towards some coordinates, xTarget and yTarget. There are two targetRadians lines because it is easier to read for me. The target radians shows the angle of the target from the b
-
DaRT with Windows 8.1 not working on some machines
Problem: x64 bit DaRT8/801/8.1 not recognizing the OS and utlities are greyed out/unavailable on some machines. System: Windows 8.1 x64 Steps taken: Tried different DaRT toolset versions, set BIOS SATA operation to different modes, tried both UEFI an
-
I dont know a lot about computers so please go easy. I have videos stored on my Windows 7 PC. can they be transferred to my IPad2 so that I can watch them?
-
Upgrading Acrobat from v7 to v9
I have acrobat professional 7. Can I upgrade to acrobat standard 9, or do I have to upgrade to acrobat 9 professional? Thank you.
-
Hi All, I am quite new to OA frame work. I got a requirement where in need to change the behaviour of check box of a stanard OA Page. When ever the page is opened the check box is being checked, we want to make this unchecked. We tried to do personil