maya + pyqt. как да намеря *.ui файловете и иконите в тях в pyqt?

Използвам Maya2014 + PyQt4. Всички мои скриптове се съхраняват на сървъра. Имам пътеки:

## a place where all are read python scripts:
PYTHONPATH=X:\tools\Maya\windows\2014\python\
## a place for *.ui files:
# X:\tools\Maya\windows\2014\python\ui\
## a place for *.ico and *.png files:
XBMLANGPATH=X:\tools\Maya\windows\2014\icons\

Когато стартирам скриптове от maya python, няма проблеми. Но за изтегляне на *.ui файлове трябва да посоча пълния път:

form, base = uic.loadUiType('X:/tools/Maya/windows/2014/python/UI/lightSets.ui')

Как мога да зареждам *.ui файлове автоматично, без да посочвам пълен път? Имам много системни променливи и искам да търся в пътищата на тази файлова система. Например, когато работя в python без maya, просто посочете let 'ui/aaa.ui' и файлът ще бъде намерен, тъй като началната точка на пътя е в скрипта за изпълнение на python и от подпапки и файлове вече.

Вторият проблем с *.ui файловете. QtDesigner, докато поддържа, създава такъв начин за всички снимки:

<property name="icon">
  <iconset>
    <normaloff>../../icons/close_btn.png</normaloff>
    ../../icons/close_btn.png
  </iconset>
</property>

И когато зареждам този файл в Maya - тя не може да намери снимка на тези относителни пътища. Вярвам, че проблемът отново е по същия начин, че началният набор не е известно къде и относително вече получен от него грешно.

Сега трябва да посоча пълния път до всички изображения, което затруднява промяната на пътищата и прехвърлянето на скриптове. Като цяло, директният път към всички икони и ресурси, това е лош начин. Кажете ми как да използвам в python maya относителни пътища?

Например искам да използвам този основен път:

X:/tools/Maya/windows/2014/python/

И след това трябва просто да посочите относителни пътища за всичко, което се зарежда от тази папка. Как да го направя?


person MaxKu    schedule 08.05.2015    source източник
comment
поправям го... получавам път като: path = os.path.dirname(unicode(os.path.abspath(file))) и променям работната директория като: os.chdir(path)   -  person MaxKu    schedule 13.05.2015


Отговори (2)


Ако разбирам правилно поста ти, това е моят съвет:

PYTHONPATH работи за други неща като импортиране на модули, а не произволни файлове, предавани като низове. Бих оставил променливата PYTHONPATH сама и бих задал нова. След това бих осъществил достъп до новата променлива от Python, използвайки:

import maya.mel
my_path = maya.mel.eval("getenv MY_NEW_PATH") 

И го добавете към всеки път на низ с помощта на os.join:

import os
form, base = uic.loadUiType(os.join(my_path, 'python/UI/lightSets.ui'))
person chris from local group    schedule 09.05.2015
comment
и че ако тази променлива не съдържа само един път, а като път на променлива, който чрез точка и запетая съдържа различни начини? Разбирам ви правилно, вие предлагате да имам само моя собствена променлива на средата и от нея се отблъсна? моите скриптове се съхраняват в подпапки и се транспортират на други места - в този случай една променлива вече не е подходяща. Мисля, че има начин да разберете същата начална точка, от която е стартиран скриптът. поне в Python това се прави автоматично, но защо Maya преназначава по този начин някъде другаде и дори не мога да разбера къде. - person MaxKu; 11.05.2015
comment
os.getenv('PYTHONPATH') # Резултат: X:/tools/Maya/windows/2014/python/animation_manager/;X:/tools/SOFT/Pixar/RenderManStudio-18.0-maya2014/scripts;X:/tools/SOFT /Pixar/RenderManStudio-18.0-maya2014/rmantree/bin;X:/tools/Maya/windows/2014/python;;x:/tools/SOFT/Exocortex/Alembic/scripts;C:/Program Files/Pixar/RenderManStudio- 18.0-maya2014/scripts;C:/Program Files/Autodesk/Maya2014/vray/scripts # - person MaxKu; 11.05.2015
comment
Тогава, както е предложено от @theodox, защо не внедрите функция за търсене, която обикаля всички възможни пътища, докато намери съвпадение? Като тези тук: stackoverflow.com/a/1724723/3492244 - person chris from local group; 11.05.2015

Запознаването с os.walk() е добра идея тук:

items = []
for directory in list_of_dirs:
    for root, _, files in os.walk(directory):
        for f in files:
            if f.endswith(".ui"):
               items.append(uic.load(os.join(root, f)

това ще ви даде списък с форми, базови двойки за всички UI файлове навсякъде под която и да е от директориите в list_of_dirs

person theodox    schedule 09.05.2015
comment
Ами ако дори не знам буквата на устройството, на което търсенето на папки с елементи? откъде да започна тогава? къде да търся сред 10-те картирани устройства? Мисля, че е необходимо решение, базирано на автоматично търсене, без да се уточнява къде е това - person MaxKu; 11.05.2015
comment
ще намери *.ui файлове и как да накарам скрипта да търси тези икони в *.ui? uic.loadUiType() - зарежда файл и не намира изображения, когато има относителни пътища като ‹normaloff›../../icons/close_btn.png‹/normaloff› - person MaxKu; 11.05.2015
comment
Не искате да използвате walk на произволни устройства: всеки път, когато това се изпълнява, ще тролите огромни количества файлове. Вероятно искате да поставите списък с валидни местоположения за търсене в променливи на средата и след това да го прочетете в списъка. - person theodox; 11.05.2015
comment
Валидирането на uic файловете е отделна работа, бих написал на вносителя безопасно да прочете онези, които може, и да докладва за грешки или предупреждения, когато възникнат. Валидирането на всички тези данни изисква да имате много добра представа какво трябва да има във файловете и е много по-добре да имате процес, при който можете да разчитате, че данните са добри и да получавате добро съобщение за грешка, когато са лоши. - person theodox; 11.05.2015
comment
намирам прост метод: pyPath = os.path.dirname(unicode(os.path.abspath(file), encoding)).replace('\\', '/') Този метод дава ме пътя, където се стартира файлът. Това решава само първия проблем - началната директория за всички файлове. Но какво да кажем за относителните пътища към *.ui файлове? Четене на файла и достъпен за обработка от експозицията. това е функция на uic.loadUiType(). Ако файлът съдържа относителен път - това не е само функция на изображението и дисплеите. как да се справя с този проблем? как да направя функция uic.loadUiType() за намиране на снимки? - person MaxKu; 13.05.2015