Skocz do zawartości

Skrypt na przechwytywanie współrzędnych


sabaru

Rekomendowane odpowiedzi

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ć.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 23
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

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)

Odnośnik do komentarza
Udostępnij na innych stronach

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 przez deshu
Odnośnik do komentarza
Udostępnij na innych stronach

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 przez sabaru
Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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?

Odnośnik do komentarza
Udostępnij na innych stronach

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 przez deshu
Odnośnik do komentarza
Udostępnij na innych stronach

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 przez sabaru
Odnośnik do komentarza
Udostępnij na innych stronach

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 przez sabaru
Odnośnik do komentarza
Udostępnij na innych stronach

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 przez sabaru
Odnośnik do komentarza
Udostępnij na innych stronach

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?

Odnośnik do komentarza
Udostępnij na innych stronach

Ł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 " \" "

Odnośnik do komentarza
Udostępnij na innych stronach

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

 

377ed8b060cbb.jpg

 

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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 przez deshu
Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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ę



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności