Создайте файл в максскрипте

Я пытаюсь собрать некоторые данные из материалов по подборкам в maxscript и сохранить их в файл xml. Сначала я пытался с txt-файлом, и я, кажется, застрял.

Вот что у меня есть:

try(DestroyDialog Test)catch()

Rollout Test "TestMt"  width: 200 height: 120
(
    button btn_name "Connection" height: 50 width:80
    button btn_export "Export Mt Data" height:50 width:90

    fn Createtxt = 
        for o in selection do
                (
                    out_name = ((GetDir #export)+"/testmesh3.txt")
                    out_file = createfile out_name

                )   


            on btn_export pressed do
                (
                    Createtxt()
                )
)

Createdialog Test

person Kriscabrera    schedule 17.08.2015    source источник
comment
Что именно застряли? Можете быть более конкретными?   -  person lenz    schedule 17.08.2015
comment
Я получаю ошибку ввода-вывода при запуске скрипта, его попадание или промах при сохранении файла. Я мог бы запустить его один раз, и он сохраняет, но я запускаю его во второй раз, и он терпит неудачу.   -  person Kriscabrera    schedule 18.08.2015
comment
интересно ...... пробую на чистой максимальной сцене, и она работает нормально (пробую на работе, может быть, это труба), поэтому мой вопрос сейчас в том, правильная ли это строка для записи в файл? for o in selection do ( out_name = ((GetDir #export) =/testmesh.txt) out_file = createFile out_name format %,%\n o.name o.material to:out_file ) спасибо за помощь!   -  person Kriscabrera    schedule 18.08.2015


Ответы (2)


Я думаю, что проблема в том, что у вас есть функция Createtxt() внутри функции Createtxt.

попробуй это:

try(DestroyDialog Test)catch()

Rollout Test "TestMt"  width: 200 height: 120
(
    button btn_name "Connection" height: 50 width:80
    button btn_export "Export Mt Data" height:50 width:90


                on btn_export pressed do
                (
                    Createtxt()
                )

    fn Createtxt = 
        for o in selection do
                (
                    out_name = ((GetDir #export)+"/testmesh3.txt")
                    out_file = createfile out_name

                )   



)

Createdialog Test
person R.P. da Costa    schedule 18.08.2015
comment
Я попробовал эту версию и получил функцию или класс Call need, получил: undefined разве это не тот же пример, только с кнопкой поверх функции? не могли бы вы немного объяснить. Спасибо за помощь! - person Kriscabrera; 18.08.2015
comment
Я попытаюсь написать часть. Можете ли вы сказать мне, какие данные о материалах вы хотите получить от выбранного объекта? (при условии, что вы хотите сохранить эти данные в файл) - person R.P. da Costa; 18.08.2015
comment
большое спасибо за помощь, я проверял, могу ли я просто получить имя объекта и имя шейдера и сохранить его в текстовый файл, после дальнейшего изучения некоторой информации люди говорят, что лучше прямо на xml, так как в нем есть инструкции, и его можно использовать позже для чтения. Что вы думаете? Еще раз, спасибо за помощь! - person Kriscabrera; 18.08.2015
comment
У меня уже есть аналогичная функция, я только удалю/переведу некоторые конкретные голландские имена :), которые в ней есть. - person R.P. da Costa; 18.08.2015

Проблема № 1. Здесь ниже вы можете увидеть код, который я написал, который поможет вам назначить материалы для выбранных объектов. (даже на основе внешнего файла библиотеки .mat) он полностью работает.

rollout matTests "MatTester_v01" (


global renderwidth = renderWidth
global renderHeight = renderHeight 

    local outputFolderURL = ""
    local bestandsNaam = ""
    local materiaalNaam = #() 
    local saveFolder = "testen" 


    label usage0 "Step 1 - Give your images a filename"     
    edittext filenaam "" fieldWidth:220 labelOnTop:false    
    label usage1 "Step 2 - Choose a save folder"    

    button save_folder "Save folder" width:250
    label usage "Step 3"
    pickbutton kiesGeo "Select your geometry" width:250
    label usage2 "Step 4"
    button btn_loadmat "Open a .mat library" width:250

    on save_folder pressed do 
    (
        outputFolderURL = getSavepath()
        saveFolder = outputFolderURL
    )

    global obj
    --camlist = #()

    on kiesGeo picked obj do
    (
    select obj 
    )

    on filenaam entered txt do
    (

        bestandsNaam = txt
    )   


    on kies_camera selected i do
        format "You selected '%'!\n" scale_dd.items[i]

    on btn_loadmat pressed do 
    (
        local sel = getCurrentSelection()

        if (sel.count == 0) then ( messagebox "no objects are selected" title:"Error 001 - no objects selected" )
        else 
        (
            local libFile = getOpenFileName caption:"select a material library file" types:"Material Libraries (*.mat)|*.mat"
            if (libFile != undefined) then 
            (
                local tempLib = loadTempMaterialLibrary libFile
                if (tempLib == undefined) then ( messagebox "loading a library file failed" title:"Error 002 - loading a library file failed" )
                else 
                (
                    -- save materials in a array

                    for m in tempLib do (
                        global materiaalNaam = #(m) 
                        print materiaalNaam
                    )

                    local aantalmaterials = templib.count 
                    for iterations = 1 to aantalmaterials do -- begin iterations loop
                    (

                        global welkeImage = iterations
                        function snapMats label size:[renderWidth,renderHeight] folder:"testMats" =
                        (
                            for c in cameras do
                            (
                            local fname = folder + label + "-" + c.name 

                            materiaalNaamString = materiaalNaam as string
                            versie = welkeImage as string

                            render camera:c outputFile:(outputFolderURL + "\\" + bestandsNaam + "-" + versie + ".jpg") outputSize:[renderWidth,renderHeight]    

                            )
                        )

                        snapMats "label"

                    local mat = tempLib[welkeImage]

                    sel.material = mat -- assign geindexerd material to my selected geometry
                    meditmaterials[activeMeditSlot] = mat

                    ) -- end for iterations loop


                )
            )
        )
    )
)
createDialog matTests width:250

В общем, чтобы сохранить что-либо (например, данные материала) в файл .txt, вы можете, например, предложить пользователю сначала выбрать папку.

Вы делаете это, создавая простую кнопку в своем пользовательском интерфейсе. А затем сделайте следующее:

on yourbuttonname_btn pressed do 
(
        inputFolderURL = getSavepath() 
-- this will store the folder URL into the inputFolderURL variable.

)

проблема номер 2. Чтобы действительно сохранить некоторые данные в файл .txt, вы можете сделать что-то вроде: в следующем примере вы можете увидеть, как сохранить vertes.data в файл .txt (но это может легко также быть материальными данными или чем-то еще)

tmesh = snapshotAsMesh selection[1]
out_name = ((GetDir #export)+"/testmesh.txt")
out_file = createfile out_name
num_verts = tmesh.numverts
num_faces = tmesh.numfaces
format "%,%\n" num_verts num_faces to:out_file
for v = 1 to num_verts do
(
 vert = getVert tmesh v
 format "%," vert to:out_file
)
format "\n" to:out_file
for f = 1 to num_faces do
(
 face = getFace tmesh f
 format "%," face to:out_file
)
close out_file
delete tmesh
edit out_name
person R.P. da Costa    schedule 19.08.2015
comment
Большое спасибо, чувак, разбери это и посмотри, что я могу получить! Очень ценю! - person Kriscabrera; 19.08.2015
comment
Спасибо, не надо! вам нужно немного покопаться, но если я прав, то все, что вам нужно, есть. Если это ваш ответ, то, пожалуйста, пометьте свой вопрос как отвеченный. - person R.P. da Costa; 19.08.2015