SoftimageRu Форум -> Мелкие скрипты и разработки

Новости • Форум • Помощь • Поиск • Участники • Календарь • База


Страницы: (16) « Первая ... 5 6 [7] 8 9 ... Последняя »  ( Перейти к первому непрочитанному сообщению ) Ответ в темуОтвет      Создание новой темыНовая тема   

> Мелкие скрипты и разработки, То, что недостойно отдельной темы   
eistan
Профиль
Статус: леонардо
Группа: Заслуженные артисты
Рейтинг: 2
Gescort
а зачем нужная команда GetValue? к примеру в твоем replace скрипте она берет име обьект и плюсует к нему стринг названия координат
Код
oPosX = xsi.GetValue(str(oObjs[i]) + ".kine.global.posx")

когда как простое
Код
oPosX = str(oObjs[i]) + ".kine.global.posx"

выдает тоже самое значение


а все, понял) мы же тут не имя берем а координаты, просто подумал как то много текста пишется каждый раз ".kine.global.posx", мне казалось как то проще берутся координаты в одну две строчки, или есть способ сократить ? к примеру взять ".kine.global"
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQAOLYahooMSN
Цитировать сообщение Дата 18.06.2015 - 13:33 Top
eistan
Профиль
Статус: леонардо
Группа: Заслуженные артисты
Рейтинг: 2
и еще можно ли как то таким же способом получить координаты выделенной вершины? или нескольких
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQAOLYahooMSN
Цитировать сообщение Дата 18.06.2015 - 22:07 Top
maxFox
Профиль
Статус: нажиматель кнопок
Группа: Элита
Рейтинг: 17
eistan для работы с вершинами или полигонами есть объект subselection
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 18.06.2015 - 23:26 Top
eistan
Профиль
Статус: леонардо
Группа: Заслуженные артисты
Рейтинг: 2
maxFox
не знаю что ты имел ввиду) но вопрос был про питон и как вывести строкой
Код
oPosX = xsi.GetValue(str(oObjs[i]) + ".kine.global.posx")

вершины, полигоны или грани, вобщем нашел SubComponent, но как из него получить .kine.global.posx ?
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQAOLYahooMSN
Цитировать сообщение Дата 19.06.2015 - 08:46 Top
Gescort
Профиль
Статус: слон
Группа: Заслуженные артисты
Рейтинг: 3
eistan Большинство моих старых скриптов написаны так, как сейчас бы я писать уже точно не стал. GetValue я теперь стараюсь не пользоваться, только в тех случаях когда без этого никак не обойтись или совсем лень получать нужные данные правильно.

Вот код для работы с сабкомпонентами.
Код
xsi = Application
oSel = xsi.Selection
for i in range(0, oSel.Count):
   if str(oSel[i].Type) == "pntSubComponent":
       oVertexColl = oSel[i].SubComponent.ComponentCollection
       for j in range(oVertexColl.Count):
           xsi.LogMessage("Vertex " + str(oVertexColl[j].Index) + \
                          "; X: " + str(oVertexColl[j].Position.X) + \
                          "; Y: " + str(oVertexColl[j].Position.Y) + \
                          "; Z: " + str(oVertexColl[j].Position.Z))


maxFox а где про сабселекшн посмотреть, а то в хелпе что-то не находится или это и есть сабкомпоненты?
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 19.06.2015 - 09:07 Top
eistan
Профиль
Статус: леонардо
Группа: Заслуженные артисты
Рейтинг: 2
Gescort
Спасибо! то что надо!
пока тренируюсь, изучаю команды, сделал такую простенькую штуку без условий, выделяем вершину, запускаем скрипт и тыкаем на обьект, он встает на вершину, раньше помню нужен был такой тулз, но не мог сделать) простой но иногда полезный, добавлю еще к нему штуки, а как кстати получить нормали с точки? чтоб еще и повернуть обьект по нормали, и конвертить это в ротейшн

Код
xsi = Application
oSel = xsi.Selection
elem = oSel(0).SubComponent.ComponentCollection
posx = elem(0).Position.X
posy = elem(0).Position.Y
posz = elem(0).Position.Z

oPick = xsi.PickObject("Select Source", "Select Source")

xsi.SetValue(str(oPick.Value("PickedElement")) + ".kine.global.posx", posx, "")
xsi.SetValue(str(oPick.Value("PickedElement")) + ".kine.global.posy", posy, "")
xsi.SetValue(str(oPick.Value("PickedElement")) + ".kine.global.posz", posz, "")
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQAOLYahooMSN
Цитировать сообщение Дата 19.06.2015 - 10:09 Top
Gescort
Профиль
Статус: слон
Группа: Заслуженные артисты
Рейтинг: 3
eistan
Еще вчера не успел написать. Вот у тебя была фраза
Цитата
SubComponent, но как из него получить .kine.global.posx

Наверное стоит сделать пояснения по доступу к параметрам объектов.
Сделал вспомагательную картинку.
Итак, в сцене есть какие-либо объекты: камера, ее рут и интерест, лайт и грид. Все они будут x3dObject, сам SceneRoot тоже x3dObject. Чтобы узнать все что с ним можно сделать в хелпе SDK пробиваем этот x3dObject и перейдем на страницу: http://docs.autodesk.com/SI/2015/ENU/Softi.../X3DObject.html
Сейчас интерес в свойствах Parameters и Properties. Параметры - это те значения, которые есть у исследуемого класса. Код:
Код
xsi = Application
oSel = xsi.Selection
for i in range(0, oSel.Count):
   oProp = oSel[i].Parameters
   for j in range(0, oProp.Count):
       xsi.LogMessage(oProp[j])

Если нагляднее по моей картике, для выделенного грида (x3dObject) - это Имя объекта, кинематика, значения сабдивижн и др. Выделяем visibility и для него это весь набор чекбоксов и жругих переключалок, которые у него есть.
Свойства же позволяют исследовать вложенную структуру для объекта (правда с определенной долей условности, т.к. могут быть вызваны для объекта не всегда). Код:
Код
xsi = Application
oSel = xsi.Selection
for i in range(0, oSel.Count):
   oProp = oSel[i].Properties
   for j in range(0, oProp.Count):
       xsi.LogMessage(oProp[j])

Для выделенного грида это kine, visibility, ambientLight, displlay и geomapprox, т.е. все квадратики с градиентом если смотреть по эксплореру + сюда же будут попадать кастомные параметры. Для выделенного кластера - его амбиентлайт и материал. Для кластера Texture_Coordinates - возможность добраться до проекций и их свойств.

Возвращаясь к цитате и конкретно .kine.global.posx. Кинематикс имеет отношение к всему объекту целиком и если задача узнать координаты отдельных точек, то стоит искать их где-то глубже (хотя у тебя и был частный случай для выделения, но все равно общий принцип остается). Итак, x3dObject имеет доступ к ActivePrimitive (http://docs.autodesk.com/SI/2015/ENU/Softi.../Primitive.html)
Интересного здесь ConstructionHistory, Geometry, ICETrees. ConstructionHistory дает возможность пощупать существующие операторы и все что с ними связано, ICETrees - соответственно доступ к айс-операторам.
Переходим в Geometry (http://docs.autodesk.com/SI/2015/ENU/Softi...m/Geometry.html) и здесь как раз информация по поинтам, полигонам и т.д.

Т.е. вся вот эта структура, которая в эксплорере, она довольно наглядно передает с программной точки зрения где что искать. Если не знаем за что браться то первым делом узнаем тип объекта с чем работаем Type, далее находим его в хелпе SDK и смотрим свойства Properties. По возможности прощупываем его Parameters и Properties, чтобы узнать что можно из него достать, ну и что там еще для него в СДК предлагается. Также что-то специфичное может быть в методах объекта.
Чтобы все это более почуствовать - надо больше поработать именно с ObjectModel подходом, без использования GetValue(), который используется в ScriptModel (или как-то так оно звучит).

GetValue() и SetValue() позволяют сразу брать или присваивать значения там, где это надо. Но если мы просто запускаем скрипт, то это всегда логи в скрипт эдиторе. ObjectModel логи не пишет, выполняется вроде бы быстрее.

Сравнение скрипт и обжект:
Код
xsi = Application
oSel = xsi.Selection
for i in range(0, oSel.Count):
   xsi.SetValue(str(oSel[i]) + ".kine.local.posx", 1, "")
   xsi.SetValue(str(oSel[i]) + ".kine.local.posy", 1, "")
   xsi.SetValue(str(oSel[i]) + ".kine.local.posz", 1, "")


Код
xsi = Application
oSel = xsi.Selection
for i in range(0, oSel.Count):
   oSel[i].Kinematics.Local.Parameters("posx").PutValue2(0, 1)
   oSel[i].Kinematics.Local.Parameters("posy").PutValue2(0, 1)
   oSel[i].Kinematics.Local.Parameters("posz").PutValue2(0, 1)


Зачастую писать через ObjectModel дольше и кода больше, но зато всегда остается понятной структура и проще ориентироваться и отлаживать более сложные скрипты, т.к. отдаешь себе отчет в том что делаешь и зачем. Плюс это обязательный вариант при переходе на Си.
Пока это все в голове уложилось тоже не мало времени прошло.
Login require!
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 20.06.2015 - 10:14 Top
Gescort
Профиль
Статус: слон
Группа: Заслуженные артисты
Рейтинг: 3
Потребовалась самому помощь - помогите разобраться как правильно сделать.
Вообщем скрипт-оператор. Общая болванка кода (здесь все стандартно, но для наглядности):
Код
import win32com.client
from win32com.client import constants

null = None
false = 0
true = 1
xsi = Application

def XSILoadPlugin( in_reg ):
   in_reg.RegisterOperator("TestOp")
   in_reg.RegisterCommand("ApplyTestOp","ApplyTestOp")
   return true

def XSIUnloadPlugin( in_reg ):
   strPluginName = in_reg.Name
   Application.LogMessage(str(strPluginName) + str(" has been unloaded."),constants.siVerbose)
   return true

def ApplyTestOp_Init( in_ctxt ):
   oCmd = in_ctxt.Source
   oCmd.Description = "Create an instance of TestOp operator"
   oCmd.SetFlag(constants.siNoLogging,false)
   oArgs = oCmd.Arguments
   oArgs.AddWithHandler("InputObjs","Collection",".[obj].")
   return true

def ApplyTestOp_Execute(InputObjs):
   Application.LogMessage("ApplyTestOp_Execute called",constants.siVerbose)
   newOp = XSIFactory.CreateObject("TestOp")
   newOp.AddOutputPort(str(InputObjs) + ".polymsh")
   newOp.AddInputPort(str(InputObjs) + ".polymsh")
   newOp.Connect()
   return newOp

def TestOp_Define( in_ctxt):
   oCustomOperator = in_ctxt.Source
   oCustomOperator.AlwaysEvaluate = false
   oCustomOperator.Debug = 0
   return true

def TestOp_Init( in_ctxt):
   Application.LogMessage("TestOp_Init called",constants.siVerboseMsg)
   return true

def TestOp_Term( in_ctxt):
   Application.LogMessage("TestOp_Term called",constants.siVerboseMsg)
   return true

def TestOp_Update( in_ctxt):
   input0 = in_ctxt.GetInputValue(0)
   Application.LogMessage("TestOp_Update called",constants.siVerboseMsg)
   output = in_ctxt.OutputTarget
   geomOut = output.Geometry
   geomOut.Set(oGet[0], oGet[1])
   return true

Основные манипуляции (изменение геометрии) происходят в блоке Update, geomOut.Set(oGet[0], oGet[1]) я вывожу полностью готовую геометрию.
В блоке Execute я создаю порты и соответственно здесь у меня есть переменная InputObjs, в которой вся входная информация.

Вопрос в том, где в операторе должна храниться информация о том, с каким выделением надо работать? Допустим у меня задача что-то сделать с выделенными поликами. В Execute информацию о них я знаю спокойно. А дальше она должна куда-то присваиваться. Куда именно? in_ctxt, но тогда как и куда записать.
Что-то я сильно на этом туплю и никак не получается разрулить. На кону новые полезности стоят, а на этом работа стрянет.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 20.06.2015 - 21:30 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 21.06.2015 - 00:21 Top
Gescort
Профиль
Статус: слон
Группа: Заслуженные артисты
Рейтинг: 3
Mr.Core
И все равно возвращает None. Где я допускаю ошибку?
Код
...
def ApplyTestOp_Init(in_ctxt):
   oCmd = in_ctxt.Source
   oCmd.Description = "Create an instance of TestOp operator"
   oCmd.SetFlag(constants.siNoLogging,false)
   in_ctxt.UserData = "TestData"
   return true
...
def TestOp_Update(in_ctxt):
   input0 = in_ctxt.GetInputValue(0)
   Application.LogMessage("TestOp_Update called",constants.siVerboseMsg)
   xsi.LogMessage(in_ctxt.UserData)
   output = in_ctxt.OutputTarget
   return true
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 21.06.2015 - 09:38 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Gescort
тут не подскажу ничего, всегда юзердату использовал в с++ апи
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 21.06.2015 - 13:57 Top
eistan
Профиль
Статус: леонардо
Группа: Заслуженные артисты
Рейтинг: 2
Gescort
ого, благодарствую за такое подробное разьяснение) этого хватит разбираться на долго))

что то не могу найти как через питон можно вызвать команду obj import, точнее его диалоговое окно, саму команду можно и в скрипт едиторе посмотреть
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQAOLYahooMSN
Цитировать сообщение Дата 21.06.2015 - 20:25 Top
Gescort
Профиль
Статус: слон
Группа: Заслуженные артисты
Рейтинг: 3
eistan
Правильно, что не можешь - оно герерится на лету. Вот vbs из файла c:\Program Files\Autodesk\Softimage 2015\Application\DSScripts\importexport.vbs

Код
function CreateImportOptionsPPG
'--------'--------'--------'--------'--------'--------'--------'--------'
'Rather than use a SPDL based CustomPSet
'we define the UI on the fly

dim oPSet,oLayout,oItem

set oPSet = ActiveSceneRoot.AddProperty( "CustomProperty",,"Wavefront_Import" )

'
'Create the parameters
'

call oPSet.AddParameter3( "Filename", siString )

' Default 0, range 0 to 1, not-animatable
call oPSet.AddParameter3( "Group", siInt2, 1, 0, 1, false )

call oPSet.AddParameter3( "Material", siBool, 1, , , false )
call oPSet.AddParameter3( "uv", siBool, 1, , , false )
call oPSet.AddParameter3( "uvWrapping", siBool, 1, , , false )
call oPSet.AddParameter3( "hrc", siInt2, 0, 0, 2, false )
call oPSet.AddParameter3( "UserNormal", siBool, 0, , , false )

call oPSet.AddParameter3( "DisplImage", siString )
call oPSet.AddParameter3( "DisplDepth", siFloat, 0.5, 0, 100, false )
call oPSet.AddParameter3( "DisplFlipVert", siBool, 0, , , false )
call oPSet.AddParameter3( "DisplViewDep", siBool, 0, , , false )
call oPSet.AddParameter3( "DisplSubDLevel", siInt4, 1, 0, 8, false )
 
'
' Now define the Layout
'

set oLayout = oPSet.PPGLayout
 
set oItem = oLayout.AddItem( "Filename","",siControlFilePath )
call oItem.SetAttribute( siUIFileFilter, _
      "Wavefront OBJ Files (*.obj)|*.obj|" & _
      "All Files (*.*)|*.*||" )
call oItem.SetAttribute( siUIOpenFile, true )
call oItem.SetAttribute( siUIInitialDir, "project" )
call oItem.SetAttribute( siUIFileMustExist, true )

oLayout.AddGroup "Group"
 set oItem = oLayout.AddEnumControl( "Group", _
  Array("Import as Clusters", 0,_
    "Import as Objects", 1 ), "", siControlRadio )
 call oItem.SetAttribute( siUINoLabel, true )
oLayout.EndGroup

oLayout.AddGroup "Hierarchy"
 set oItem = oLayout.AddEnumControl( "hrc", _
  Array( "No Hierarchy", 0, _
   "Null as Parent", 1, _
   "Model as Parent",2 ), "", siControlRadio )
 call oItem.SetAttribute( siUINoLabel, true )
 
oLayout.EndGroup

oLayout.AddItem "UserNormal", "Import Normals as User Normals"

oLayout.AddGroup "Material"
 oLayout.AddItem "Material", "Import Material"
 oLayout.AddItem "uv", "Import UV"
 oLayout.AddItem "uvWrapping", "UV wrapping"
oLayout.EndGroup

oLayout.AddTab "Displacement Options"
 set oItem = oLayout.AddItem( "DisplImage", "Image", siControlFilePath )
  call oItem.SetAttribute( siUIImageFile, true )
  call oItem.SetAttribute( siUIOpenFile, true )
'  call oItem.SetAttribute( siUIInitialDir, "project" )
  call oItem.SetAttribute( siUIFileMustExist, true )
 
 oLayout.AddItem "DisplDepth", "Alpha Depth Factor"
 oLayout.AddItem "DisplFlipVert", "Flip Image Vertically"
 oLayout.AddItem "DisplViewDep", "View Dependent Refinement"
 oLayout.AddItem "DisplSubDLevel", "Subdivision level"

oLayout.Logic = "sub Filename_OnChanged" & vbCrLf & _
"set oFSO = CreateObject(""Scripting.FileSystemObject"")" & vbCrLf & _
"myPath = oFSO.GetParentFolderName( Filename.Value )" & vbCrLf & _
"PPG.PPGLayout.item(""DisplImage"").SetAttribute siUIInitialDir, myPath" & vbCrLf & _
"PPG.refresh" & vbCrLf & _
"end sub"

   oLayout.SetAttribute siUIHelpFile, "<FactoryPath>/Doc/<DocLangPref>/xsidocs.chm::/menubar10.htm"

set CreateImportOptionsPPG = oPSet

end function

SelectObj "Scene_Root"
InspectObj CreateImportOptionsPPG, , , siLock

Только дисплейс кажется будет нерабочим, там еще функцию нужно вставлять.
А вообще если просто задача это окно быстренько вызывать, то оно в списке хоткеев есть вроде.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 21.06.2015 - 22:12 Top
Gescort
Профиль
Статус: слон
Группа: Заслуженные артисты
Рейтинг: 3
Для Bender Bending. ExplodeForBaking.

Не знаю, подходит ли реализация, сделал просто что-то похожее на то что было на видео.
Итого ставим аддон, создаем горячую кнопку/клавишу. Искать в списке команд как explodeForBaking.
Выделяем нужные меши и запускаем. Создается модель, в ней управляющий нуль и переносятся все выделенные меши. У модели кастомное свойство DistanceAtNull, через него управление насколько разбрасывать. Каждому мешу создается айс нода и в нее компаунд, все они завязаны на DistanceAtNull. Разлет объектов идет по экспоненте (не знаю, надо ли), т.е. ближайшие удаляются медленнее, дальние - быстрее.
Чтобы убрать этот ExplodeForBaking дистанцию возвращаем на 0 и фризаем все меши или вручную удаляем из них айс ноды. Если что-то надо подправить - пиши.

Скачать ExplodeForBaking: https://www.dropbox.com/s/vjfhub5znbm2an2/E...Baking.zip?dl=0
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 22.06.2015 - 22:58 Top
eistan
Профиль
Статус: леонардо
Группа: Заслуженные артисты
Рейтинг: 2
Gescort
ух ты, это ж та самая эксплод нода в гудине) круто! иногда полезна для текстурирования, хотя впринципе можно изолейтом обойтись, но это тоже думаю не лишней будет)
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQAOLYahooMSN
Цитировать сообщение Дата 23.06.2015 - 08:48 Top
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Страницы: (16) « Первая ... 5 6 [7] 8 9 ... Последняя » Ответ в темуОтвет      Создание новой темыНовая тема   

 

Текстовая версия