Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Замяна на текст във файлове по зададен критерий

Featured Replies

Здравейте!

 

Порових се из интернет, но не намерих това, което ме интересува, затова реших да попитам тук.

 

Ситуацията е следната:

 

Имам папка с много файлове с разширение .mtl. Това е файлов формат, който се използва от 3д софтуери и служи за опсание на материали, които да се прилагат към даден 3д обект. Самият файл съдържа имена на материали, и определени данни за тях.

 

Изглежда ето така(примерен вариант):

newmtl 3_SkinFoot
d 1
Kd 1 1 1
map_Kd C:/Users/Public/Documents/My DAZ 3D Library/Runtime/textures/DAZ/Characters/MilWom/V4/V4LanaRRLimbsM.jpg

newmtl 6_Eyelash
d 1
Ns 0.902174
Ni 0
Ka 0 0 0
Kd 0 0 0
Ks 0.603922 0.6 0.584314
Km 0.001
map_D C:/Users/Public/Documents/My DAZ 3D Library/Runtime/textures/DAZ/Characters/MilWom/V4/V4LanaRRTR.jpg

newmtl 5_Sclera
d 1
Kd 1 1 1
map_Kd C:/Users/Public/Documents/My DAZ 3D Library/Runtime/Textures/DAZ/Characters/MilWom/V4/V4LanaRREyesM.jpg
map_D C:/Users/Public/Documents/My DAZ 3D Library/Runtime/textures/DAZ/Characters/MilWom/V4/V4LanaRREyesTr.jpg

newmtl 5_Pupil
d 1
Kd 0.564706 0.564706 0.564706
map_Kd C:/Users/Public/Documents/My DAZ 3D Library/Runtime/Textures/DAZ/Characters/MilWom/V4/V4LanaRREyesM.jpg

 Какво трябва да се случи:

 

1- взима се първия файл в папката с разшрение .mtl

2- търси се ред, започващ с "newmtl 6_Eyelash"(това е име на метариал)

3- ако се изпълни 2, се търси за ред, започващ с "Ks"

4- реда, започващ с "Ks" трябва да се появи преди ред, започващ с "map". Това е нужно с цел да сме сигурни, че "Ks" ще е за "newmtl 6_Eyelash", а не за следващия или по следващия материал.

5- ако условие 2, 3 и 4 са изпълнени реда, започващ с "Ks" се заменя с такъв, чието съдържание е:

"Ks 0.0000 0.0000 0.0000".

6- файла се презаписва със същото име и разширение

7- минава се на следващия файл и така до края на наличните .mtl файлове.

 

Не ми е проблем да напиша скрипт, който ще прави всичко описано, но за да се изпъни ще трябва да се използва отделна програма, което си е неудобство.

 

Преди време flare написа обфускатор на Питон, което занчи, че Питон може отново да се ползва, ама се налага инсталиране на Питон.

 

Не знам дали целия процес може да се направи с bat файл. Това ще е най-лесният начин, ама дали е възможен ще помоля знаещите да кажат.

 

Почти съм сигурен, че може да ползва и Visual Basic скрипт, който да се стартира без нуждата от инсталиране на отделен софтуер, ама от vbs нищо не разбирам.

 

Някой може ли да помогне със съвет, готов код или нещо друго?

  • Автор

Не го знам този формат. Прати един файл, да мога да разбера как точно свършва реда и започва нов ред.

От тук можеш да изтеглиш.

 

Важно е файла, който ще прави промените да може да се редактира и да не се налага след това компилиране или нещо подобно. Във въпросните файлове ще трябва да се заменят и други стойности, ама процеса на търсенето им е същия:

- първо т.2 - т.е. търси се името на даден материал в самия файл

- т.3 - търси се за стойност, може да е "Ni"

- т. 5 - задава се новата стойност.

 

Презаписването на файла си е същото.

 

Май целия процес ще се усложни прекалено много.

Поне знаеш ли как започва реда и как свършва.


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


Или напиши скрипта, който казваш, че можеш да напишеш и го коментирай колкото може по подробно

  • Автор

Поне знаеш ли как започва реда и как свършва.

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

Или напиши скрипта, който казваш, че можеш да напишеш и го коментирай колкото може по подробно

Ще си напиша скрипт. По принцип това е обикновен текстов файл, на който му е сменено разширението.

  • Автор

newmtl 3_SkinFoot
d 1
Kd 1 1 1
map_Kd C:/Users/Public/Documents/My DAZ 3D Library/Runtime/textures/DAZ/Characters/MilWom/V4/V4LanaRRLimbsM.jpg

newmtl 6_Eyelash
d 1
Ns 0.902174
Ni 0
Ka 0 0 0
Kd 0 0 0
Ks 0.603922 0.6 0.584314
Km 0.001
map_D C:/Users/Public/Documents/My DAZ 3D Library/Runtime/textures/DAZ/Characters/MilWom/V4/V4LanaRRTR.jpg

newmtl 5_Sclera
d 1
Kd 1 1 1
map_Kd C:/Users/Public/Documents/My DAZ 3D Library/Runtime/Textures/DAZ/Characters/MilWom/V4/V4LanaRREyesM.jpg
map_D C:/Users/Public/Documents/My DAZ 3D Library/Runtime/textures/DAZ/Characters/MilWom/V4/V4LanaRREyesTr.jpg

newmtl 5_Pupil
d 1
Kd 0.564706 0.564706 0.564706
map_Kd C:/Users/Public/Documents/My DAZ 3D Library/Runtime/Textures/DAZ/Characters/MilWom/V4/V4LanaRREyesM.jpg

Брой редовете, включително празните. 6-тият ред е "newmtl 6_Eyelash" (без кавичките).

Щом се намери ред, на който е записано само newmtl 6_Eyelash" се продължава нататък.

След това, 12-ти ред започва с "Ks", целия ред е "Ks 0.603922 0.6 0.584314", но първите символи, преди интервала са "Ks". Това е важно, защото следващите символи(след "Ks") може да са най-различни.

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

 

lineStr = "Ks 0.603922 0.6 0.584314"

filteredStr = filterString lineStr " " -- стринга се филтрира като се използва интервал за разделяне на "думите"

резултата е масив: #("Ks", "0.603922", "0.6", 0.584314)

т,е, трябва да проверя дали първият елемент от масива е "Ks"

if filteredStr[1] == "Ks" do

и целия ред "Ks 0.603922 0.6 0.584314" се замества с "Ks 0.0000 0.0000 0.0000"

обаче трябва да съм сигурен, че "map_D" не се е появило преди "Ks", защото "newmtl 5_Sclera" също може да има ред, започващ с "Ks", и в този случай ще се презапише грешен ред.

Използвайки maxscript:

(
    filePath = @"C:\Users\miauu\Desktop\NewF\zzz1.mtl"
    infoFile = openFile filePath
    strToMatch01 = "newmtl 6_Eyelash"
    strToMatch02 = "Ks"
    strToStop = "map"
    searchForStr02 = false
    
    while not eof infoFile do
    (
        --    read next line
        lineStr = readLine infoFile
        if lineStr != "" do
        (
            --    get first 3 chars to compare against strToStop
            filteredLineStrArr = filterString lineStr " "
            first3Chars = substring filteredLineStrArr[1] 1 3
            
            if lineStr == strToMatch01 do
            (
                searchForStr02 = true
            )
            if first3Chars == strToMatch01 do
            (
                searchForStr02 = false
            )
            
            if searchForStr02 == true do
            (
                filteredStrArr = filterString lineStr " "
                if filteredStrArr[1] == strToMatch02 do
                (
                    newStr = "Ks 0.0000 0.0000 0.000"
                    searchForStr02 = false
                )
            )
        )
    )
    close infoFile
    free infoFile
)

Остава само новата стойност да се зададе и файла да се запише. Но не знам как това да напише като bat или vbs, та да може да се редактират променливите.

Не знам от къв зор си играеш да променяш specular в .mtl файловете, когато с 3dsMax имаш достатъчно опции да го направиш.

А и се надявам да си наясно, че всичко си зависи от рендера.

  • Автор

Не знам от къв зор си играеш да променяш specular в .mtl файловете, когато с 3dsMax имаш достатъчно опции да го направиш.

А и се надявам да си наясно, че всичко си зависи от рендера.

Работата е там, че модели, импортнати от DAZ влизат с много гаден Specular Level = 100. Ако са един или два модела не е проблем и ръчно да се пипа всичко, ама когато става въпрос за стотици такива и нещата стават по-сложни. С помощта на максскрипт не ми е проблем да променя или директно .mtl файловете или да отварям моделите един по един в 3дсМакс, и да им променям материала(което е по-бавно и безсмислено). Лошото е, че не винаги 3дсМакс е наличен, та затова търся заобиколен начин, който да не зависи от определен софтуер.

Зависи си от рендера, ама като се ползва такъв, който има проблем с Specular Level = 100 се налага проблема да се решава по друг начин.

Работата е там, че модели, импортнати от DAZ влизат с много гаден Specular Level = 100. Ако са един или два модела не е проблем и ръчно да се пипа всичко, ама когато става въпрос за стотици такива и нещата стават по-сложни. С помощта на максскрипт не ми е проблем да променя или директно .mtl файловете или да отварям моделите един по един в 3дсМакс, и да им променям материала(което е по-бавно и безсмислено). Лошото е, че не винаги 3дсМакс е наличен, та затова търся заобиколен начин, който да не зависи от определен софтуер.

Зависи си от рендера, ама като се ползва такъв, който има проблем с Specular Level = 100 се налага проблема да се решава по друг начин.

Има ли някъде другаде във файловете ред, който да започва с Ks?

Ако не може би има по-просто решение

  • Автор

Има ли някъде другаде във файловете ред, който да започва с Ks?

Ако не може би има по-просто решение

Има. Тук съм сложил само част от кода. Въпросния mtl файл може да съдържа материалите(и техни свойства) на стотици обекти, така че е възможно да има ред, започващ с Ks на много места, Затова е и условието Ks да се намира преди следващия ред, започващ с map, в противен случай може да се промени Ks  на 120 ред по-надолу във файла, което не трябва да става.

Аз първо проверих за разни текстови редактори(notepad ++, ultraedit и др.), ама точно това изискване(Ks да е преди друг ред) нещо не го намирам като възможност.

Има. Тук съм сложил само част от кода. Въпросния mtl файл може да съдържа материалите(и техни свойства) на стотици обекти, така че е възможно да има ред, започващ с Ks на много места, Затова е и условието Ks да се намира преди следващия ред, започващ с map, в противен случай може да се промени Ks  на 120 ред по-надолу във файла, което не трябва да става.

Аз първо проверих за разни текстови редактори(notepad ++, ultraedit и др.), ама точно това изискване(Ks да е преди друг ред) нещо не го намирам като възможност.

Ето една тема с ползване на разни командни инструмент: http://stackoverflow.com/questions/21517723/sed-replace-pattern-only-if-followed-by-empty-line

Разбира се там се търси празен ред след това но скриптовете може лесно да се модифицират

Според мен старите модели V4, M4, K4 не си заслужават, но пък новите не идват с .obj файлове, а на теб те ти трябват.

  • Автор

Ето една тема с ползване на разни командни инструмент: http://stackoverflow.com/questions/21517723/sed-replace-pattern-only-if-followed-by-empty-line

Разбира се там се търси празен ред след това но скриптовете може лесно да се модифицират

Благодаря. Утре се заемам.

  • Автор

Според мен старите модели V4, M4, K4 не си заслужават, но пък новите не идват с .obj файлове, а на теб те ти трябват.

Ами като се експортва към 3дсМакс в Obj формат и си има и mtl файлчета.


(
   
            if first3Chars == strToMatch01 do // Тук май трябва да е strToStop
            (
                searchForStr02 = false
            )
)
Остава само новата стойност да се зададе и файла да се запише. Но не знам как това да напише като bat или vbs, та да може да се редактират променливите.

 

Редактирано от RJ45 (преглед на промените)

  • Автор

За кога ти трябва?

Не е спешно. Може и след няколко дни, че сега други неща излязоха на преден план.

 

 

 

Прав си, трябва да е strToStop. Пуснах кода преди да го тествам и не съм догледал.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.