sabaru Napisano 16 Listopad 2015 Napisano 16 Listopad 2015 Czy jest może jakiś skrypt na przechwytywanie współrzędnych do 3ds max 9. Chciałbym aby umiał przechwycić nazwę modelu, położenie x , y, z oraz obrót modelu rx, ry, rz. Albo może ktoś wie jak napisać taki skrypt. Próbowałem coś znaleźć na ten temat w necie ale nawet za bardzo nie wiem pod jakim hasłem szukać.
deshu Napisano 16 Listopad 2015 Napisano 16 Listopad 2015 A co miałby skrypt robić z tymi danymi? Wypluwac po prostu do listenera?
sabaru Napisano 16 Listopad 2015 Autor Napisano 16 Listopad 2015 Tak dokładnie. Później chciałbym je skopiować do innego programu.
sabaru Napisano 20 Listopad 2015 Autor Napisano 20 Listopad 2015 Naprawdę nikt nie zna takiego skryptu, a ni nie wie jak zabrać się za jego pisanie. Chciałbym żeby skrypt generował współrzędne w ten sposób nazwaobiektu = createObject(id, x, y, z, rx, ry, rz) ze współrzędnymi to miało by być tak sterowiec = createObject(17519, -2203.31, -1688.382, 498.741, 0, 0, 0)
deshu Napisano 20 Listopad 2015 Napisano 20 Listopad 2015 (edytowane) Dobra, łap: for id = 1 to selection.count do ( obj = selection[id] idStr = id as String nameStr = obj.name as String posx = obj.pos.x as String posy = obj.pos.y as String posz = obj.pos.z as String rotx = obj.rotation.x_rotation as String roty = obj.rotation.y_rotation as String rotz = obj.rotation.z_rotation as String toPrint = nameStr + " = createobject(" + idStr \ + ", " + posx + ", " + posy + ", " + posz + ", " \ + rotx + ", " + roty + ", " + rotz + ")" print toPrint ) Output dla dwóch zaznaczonych w scenie obiektów: "GeoSphere001 = createobject(1, 108.391, 11.5543, 9.50745, 25.373, 16.2679, 37.6989)" "Box001 = createobject(2, -2.75103, 8.2531, 0.0, 3.50231, -0.467376, 7.5915)" W maksie obiekty nie mają swojego publicznego id (przynajmniej nic mi o tym nie wiadomo). Więc zastąpiłem je indexem selekcji (kolejność zaznaczenia obiektów) Edytowane 20 Listopad 2015 przez deshu
sabaru Napisano 20 Listopad 2015 Autor Napisano 20 Listopad 2015 (edytowane) A dałbyś radę jeszcze zrobić żeby w 3ds max można było uruchomić skrypt bezpośrednio w 3ds max w postaci np. takiego okienka http://s2.ifotos.pl/img/generator_srqqrqp.jpg Próbowałem zrobić takie okienko visual maxscript editor ale coś nie chce działać. No i czy by była możliwość dodania do skryptu możliwości zmiany IDE, np. ostanie IDE to 17519 i po zmienieniu w polu IDE start na 17520 skrypt generuje kod w ten sposób Stary wygenerowany kod box1 = createObject(17517, -2203.31, -1688.382, 498.741, 0, 0, 0) box2 = createObject(17518, -2203.31, -1688.382, 498.741, 0, 0, 0) box3 = createObject(17519, -2203.31, -1688.382, 498.741, 0, 0, 0) Nowy wygenerowany kod box4 = createObject(17520, -2203.31, -1688.382, 498.741, 0, 90.0, 0) box5 = createObject(17521, -2203.31, -1688.382, 498.741, 0, 0, 0) box6 = createObject(17522, -2203.31, -1688.382, 498.741, 0, 0, 0) Jeżeli z tym ID się nie da to trudno. No i jak usnąć cudzysłów na początku i końcu generowanego kodu bo próbowałem w skrypcie to zrobić ale też nie działa. Co do createObject to w MTA ustawia obiekty. Tutaj dokładniejszy opis https://wiki.multitheftauto.com/wiki/CreateObject Edytowane 20 Listopad 2015 przez sabaru
deshu Napisano 20 Listopad 2015 Napisano 20 Listopad 2015 Co do usuwania cudzysłowów - nie da się. Możesz to zrobić w notepad++ (usuwanie pierwszego i ostatniego znaku w linii) Co do reszty: fn printout = ( for id = 1 to selection.count do ( obj = selection[id] idStr = (dial.spiner.value + id - 1) as String nameStr = obj.name as String posx = obj.pos.x as String posy = obj.pos.y as String posz = obj.pos.z as String rotx = obj.rotation.x_rotation as String roty = obj.rotation.y_rotation as String rotz = obj.rotation.z_rotation as String toPrint = nameStr + " = createobject(" + idStr \ + ", " + posx + ", " + posy + ", " + posz + ", " \ + rotx + ", " + roty + ", " + rotz + ")" print toPrint ) ) rollout dial "tytul" width:200 ( spinner spiner type:#integer button btnApply "guzik" on btnApply pressed do printout () ) createDialog dial
sabaru Napisano 20 Listopad 2015 Autor Napisano 20 Listopad 2015 Jest jeszcze jeden mały błąd. Skrypt przy niektórych obiektach źle przechwytuje współrzędne. Właściwie dopisuje na końcu "e". Co ciekawe nie przy każdym obiekcie tak się dzieje. Robi takie coś "Box03 = createobject(5, 392.259, 496.829, 0.0, -90.0, 1.70755e-006, -108.435)" "Box06 = createobject(5, 601.629, 256.766, -7.62939e-006, 0.0, 0.0, 0.0)" Może wiesz czemu tak jest?
deshu Napisano 20 Listopad 2015 Napisano 20 Listopad 2015 (edytowane) Tak się dzieje bo: 3ds Max. Musisz sobie napisać skrypt ktory to wyszukuje i zamienia na 0 Ewentualnie można popróbowac pokonwertowac na float, albu double. Albo pomnożyć przez 10000, zamienić na integer i potem podzielić na 10000. Nie wiem:) Edytowane 20 Listopad 2015 przez deshu
sabaru Napisano 20 Listopad 2015 Autor Napisano 20 Listopad 2015 (edytowane) Wygląda jakby skrypt nie lubił oryginalnych nazw dawanych automatycznie przez 3ds max podczas tworzenia np. boxa. Jak tylko zmieniłem nazwę to poprawnie przechwytuje współrzędne. edit// a jednak nie Dałbyś radę dopisać do skryptu opcje która np. po zaznaczeniu w okienku generuje kod z takim samym ID dla każdego obiektu jeżeli nazwa modeli jest taka sama. Czyli coś takiego. budynek05 = createobject(30, 27.4547, -105.66, -23.8076, 0.0, 0.0, 60.1199)" "budynek05 = createobject(30, -8.70721, -54.6655, -28.4138, 0.0, 0.0, 0.0)" "budynek05 = createobject(30, 56.651, -34.6399, 31.958, 19.3619, 8.01371, 44.0946) Edytowane 20 Listopad 2015 przez sabaru
sabaru Napisano 20 Listopad 2015 Autor Napisano 20 Listopad 2015 (edytowane) No ok spróbuje. To chociaż powiedź dlaczego nie mogę w skrypcie dać większej liczby niż 100. Chciałby móc wpisywać dowolną. edit// wiem już, wystarczy dodać range:[0,18630,0] Edytowane 20 Listopad 2015 przez sabaru
deshu Napisano 20 Listopad 2015 Napisano 20 Listopad 2015 Jak wpadniesz na coś nie do pokonania przez pare h to pisz. Ja nie jestem expertem. Sam większość googlam.
sabaru Napisano 21 Listopad 2015 Autor Napisano 21 Listopad 2015 (edytowane) Jak zmusić skrypt żeby w wygenerowanym kodzie w listenter wyświetlał cudzysłów. Dodanie takiego czegoś + " " " w skrypcie powoduje błąd. Co ciekawe większość znaków działa ale ten nie. I może ktoś wie jak zrobić rozwijaną listę. Chodzi mi o to że z listy sobie wybieram nazwę "true" lub "false" i po wciśnięciu przycisku skrypt w listenter generuje mi w kodzie słowo "true". Edytowane 21 Listopad 2015 przez sabaru
sabaru Napisano 21 Listopad 2015 Autor Napisano 21 Listopad 2015 Jakoś doszedłem jak zrobić żeby można było wybrać z listy jakieś słowo ale nigdzie nie mogę znaleźć jak przypisać żeby mi to dodawało w wygenerowanym kodzie. Skrypt wygląda tak fn printout = ( for id = 1 to selection.count do ( obj = selection[id] idStr = (dial.spiner.value + id - 1) as String nameStr = obj.name as String toPrint = " print toPrint ) ) rollout dial "tytul" width:200 ( spinner spiner type:#integer -- mozliwosc wyboru ide dropdownlist klik1 items:#("true", "false") -- mozliwosc wyboru z listy kilku opcji button btnApply "guzik" -- tworzt przycisk on btnApply pressed do printout () ) createDialog dial Chciałbym żeby po wybraniu danego słowa skrypt generował kod w ten sposób. Jak wybiorę słowo false to w kodzie pokazuje w ten sposób A jak to drugie to w ten sposób [code] Ktoś pomoże?
deshu Napisano 22 Listopad 2015 Napisano 22 Listopad 2015 Łap: fn printout = ( for id = 1 to selection.count do ( obj = selection[id] idStr = (dial.spiner.value + id - 1) as String nameStr = obj.name as String ddListValue = dial.klik1.items[dial.klik1.selection] as String toPrint = " print toPrint ) ) rollout dial "tytul" width:200 ( spinner spiner type:#integer -- mozliwosc wyboru ide dropdownlist klik1 items:#("true", "false") -- mozliwosc wyboru z listy kilku opcji button btnApply "guzik" -- tworzt przycisk on btnApply pressed do printout () ) createDialog dial - - - Połączono posty - - - Jak zmusić skrypt żeby w wygenerowanym kodzie w listenter wyświetlał cudzysłów. Dodanie takiego czegoś + " " " w skrypcie powoduje błąd. Co ciekawe większość znaków działa ale ten nie. Trzeba dodać escape character przed cudzysłowem który ma być częścią tekstu. W ten sposób jest traktowany jako treść, a nie zakończenie/otwarcie Stringa. https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/MAXScript-Help/files/GUID-7F17449E-C377-445C-AC15-CD3BA88A975B-htm.html Np: print " \" "
sabaru Napisano 22 Listopad 2015 Autor Napisano 22 Listopad 2015 Chciałby jeszcze aby skrypt generował to samo id dla np. 4 zaznaczonych obiektów. Sposób zaznaczenia obiektów miałby wyglądać w ten sposób Jak jest ustawiony znak w skrypcie to kod wygląda w ten sposób A jak go nie ma ustawionego to w ten sposób Jedynie do czego doszedłem to jak dodać możliwość zaznaczania i odznaczania ale żeby to coś robiło to nie wiem.
sabaru Napisano 22 Listopad 2015 Autor Napisano 22 Listopad 2015 fn printout = ( for id = 1 to selection.count do ( obj = selection[id] idStr = (dial.spiner.value + id - 1) as String -- ustawia obiektowi dowolne IDE idStr2 = (dial.interior.value + id - 1) as String -- ustawia interior idStr3 = (dial.alpha.value + id - 1) as String -- ustawia alphe idStr4 = (dial.model.value + id - 1) as String -- ustawia IDE modelu idStr5 = (dial.scale.value + id - 1) as String -- ustawia scale idStr6 = (dial.dimension.value + id - 1) as String -- ustawia dimension nameStr = obj.name as String -- pobiera nazwę obiektu ddListValue = dial.breakable.items[dial.breakable.selection] as String -- wybor opcji z listy ddListValue2 = dial.collisions.items[dial.collisions.selection] as String -- włącza lub wyłącza kolizje ddListValue3 = dial.doublesided.items[dial.doublesided.selection] as String -- toPrint = " print toPrint ) ) rollout dial "Creator MTA" width:200 ( spinner spiner range:[0,18630,0] type:#integer -- (numer obiektu) label lbl1 "numer modelu" pos:[15,5] spinner interior range:[0,24,0] type:#integer -- (id interioru) label lbl2 "id interioru" pos:[15,23] spinner alpha range:[0,999999,255] type:#integer -- (id alpha) label lbl3 "alpha" pos:[15,42] spinner model range:[0,18630,0] type:#integer -- (ide model) label lbl4 "IDE modelu" pos:[15,62] spinner scale range:[0,999999,1] type:#integer -- (scale) label lbl5 "scale" pos:[15,80] spinner dimension range:[0,999999,0] type:#integer -- (dimension) label lbl6 "dimension" pos:[15,98] dropdownlist breakable "breakable" items:#("true", "false") -- mozliwosc wyboru z listy kilku opcji dropdownlist collisions "collisions" items:#("true", "false") -- dropdownlist doublesided "doublesided" items:#("true", "false") -- button btnApply "generuj" -- tworzt przycisk checkbox chk1 pos:[76,60] on btnApply pressed do printout () ) createDialog dial
deshu Napisano 23 Listopad 2015 Napisano 23 Listopad 2015 (edytowane) fn printout = ( for id = 1 to selection.count do ( obj = selection[id] idStr = (dial.spiner.value + id - 1) as String -- ustawia obiektowi dowolne IDE idStr2 = (dial.interior.value + id - 1) as String -- ustawia interior idStr3 = (dial.alpha.value + id - 1) as String -- ustawia alphe idStr4 = ( if dial.chk1.checked then (dial.model.value + id - 1) as String else dial.model.value as String )-- ustawia IDE modelu idStr5 = (dial.scale.value + id - 1) as String -- ustawia scale idStr6 = (dial.dimension.value + id - 1) as String -- ustawia dimension nameStr = obj.name as String -- pobiera nazwę obiektu ddListValue = dial.breakable.items[dial.breakable.selection] as String -- wybor opcji z listy ddListValue2 = dial.collisions.items[dial.collisions.selection] as String -- włącza lub wyłącza kolizje ddListValue3 = dial.doublesided.items[dial.doublesided.selection] as String -- toPrint = " print toPrint ) ) rollout dial "Creator MTA" width:200 ( spinner spiner range:[0,18630,0] type:#integer -- (numer obiektu) label lbl1 "numer modelu" pos:[15,5] spinner interior range:[0,24,0] type:#integer -- (id interioru) label lbl2 "id interioru" pos:[15,23] spinner alpha range:[0,999999,255] type:#integer -- (id alpha) label lbl3 "alpha" pos:[15,42] spinner model range:[0,18630,0] type:#integer -- (ide model) label lbl4 "IDE modelu" pos:[15,62] spinner scale range:[0,999999,1] type:#integer -- (scale) label lbl5 "scale" pos:[15,80] spinner dimension range:[0,999999,0] type:#integer -- (dimension) label lbl6 "dimension" pos:[15,98] dropdownlist breakable "breakable" items:#("true", "false") -- mozliwosc wyboru z listy kilku opcji dropdownlist collisions "collisions" items:#("true", "false") -- dropdownlist doublesided "doublesided" items:#("true", "false") -- button btnApply "generuj" -- tworzt przycisk checkbox chk1 pos:[76,60] on btnApply pressed do printout () ) createDialog dial Gdy chekcbox przy IDE modelu jest zanzaczony (if dial.chk1.checked then), wartośc przy "model" rośnie o 1, gdy jest odznaczone (else) jest ustawiana na sztywno na dial.model.value Polecam zaglądać w helpa. Można tam znaleźć parametry każdego elementu UI. Dla checkboxa: http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_D23A42EA_7B69_4DEF_9D6E_C6C85F884268_htm Edytowane 23 Listopad 2015 przez deshu
sabaru Napisano 24 Listopad 2015 Autor Napisano 24 Listopad 2015 Może jeszcze podpowiesz jak zrobić żeby po wpisaniu w polu "edittext" jakiegoś słowa i wciśnięciu przycisku, skrypt w listenter generował ten wpisany tekst. Mi to jakoś nie wychodzi. fn printout = ( for id = 1 to selection.count do ( obj = selection[id] nameStr = obj.name as String idStr = (dial.spiner.value + id - 1) as String toPrint = "txd = engineLoadTXD" + "(" + "\"" + nameStr + ".txd" + "\"" + "," + idStr + ")" print toPrint ) ) rollout dial "tytul" width:200 ( spinner spiner type:#integer label lbl1 "IDE start" pos:[9,5] edittext folder width:100 pos:[88,24] label lbl2 "Nazwa folderu" pos:[10,24] button btnApply "guzik" pos:[80,45] on btnApply pressed do printout () ) createDialog dial
deshu Napisano 24 Listopad 2015 Napisano 24 Listopad 2015 Może jeszcze podpowiesz jak zrobić żeby po wpisaniu w polu "edittext" jakiegoś słowa i wciśnięciu przycisku, skrypt w listenter generował ten wpisany tekst. Mi to jakoś nie wychodzi. Tak jak mówiłem, zerkaj w helpa, tam znajdziesz wszystkie parametry, czyli rzeczy dostępne po kropce. Np: dialog.edittext.text http://docs.autodesk.com/3DSMAX/16/ENU/MAXScript-Help/files/GUID-FC73C160-735C-4F65-A71D-722D63BBB591.htm fn printout = ( for id = 1 to selection.count do ( nazwafolderu = dial.folder.text as String toPrint = "folder: " + nazwafolderu print toPrint ) ) rollout dial "tytul" width:200 ( spinner spiner type:#integer label lbl1 "IDE start" pos:[9,5] edittext folder width:100 pos:[88,24] label lbl2 "Nazwa folderu" pos:[10,24] button btnApply "guzik" pos:[80,45] on btnApply pressed do printout () ) createDialog dial
sabaru Napisano 29 Listopad 2015 Autor Napisano 29 Listopad 2015 Powracając do tematu. Na podstawie tego co podałeś napisałem kilka skryptów. Same skrypty działają dobrze ale tylko w tedy jeżeli każdy z nich jest uruchomiony osobno. Gdy uruchomię np. dwa naraz to przy próbie użycia jednego z nich pojawia się błąd MAXScript Rollout Handler Exception: -- Unknown property: "folder2" in Rollout:dial i najczęściej w skrypcie jest zaznaczona ta linijka nazwafolderu2 = dial.folder2.text as String Dziwne jest to też że ten błąd też nie zawsze występuje. Niekiedy skrypty działają dobrze. Może wiesz co jest nie tak? Jeżeli będzie taka potrzeba to podeśle ci skrypty.
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się