Улучшение извлечения свойств в 3ds Max

Опубликовано 30.01.2026 | Перевод с испанского
Оптимизированный код для улучшения извлечения свойств в 3ds Max с помощью улучшенной версии getUserProp в MaxScript.

Функция getUserProp в MaxScript имеет ошибки с давних версий 3ds Max, что влияет на восстановление значений, хранящихся в пользовательских свойствах объектов. Для решения этой проблемы разработана улучшенная версия, которая оптимизирует извлечение данных и обеспечивает более точную обработку.

Решение давней ошибки

Проблема с оригинальной функцией MaxScript заключается в том, что она не всегда возвращает правильные значения при работе с булевыми, числовыми или текстовыми данными. Эта ошибка присутствует с 3ds Max 9 и никогда не была официально исправлена. Чтобы избежать этих ошибок, разработана новая реализация, которая улучшает стабильность при восстановлении данных.

Основные характеристики улучшенного getUserProp

Применение в скриптах автоматизации

Этот скрипт особенно полезен для разработчиков, работающих с пользовательскими инструментами в 3ds Max, поскольку обеспечивает более точный доступ к данным, хранящимся в пользовательских свойствах объектов. Его применение распространяется на:

Оптимизация для продвинутых рабочих процессов

Реализация этой новой версии облегчает получение надежных данных в среде 3ds Max. Ее цель — улучшить согласованность и стабильность при использовании пользовательских свойств, избегая распространенных проблем при извлечении информации.

Код улучшенного скрипта


-- Verifica si una cadena contiene solo números
fn isNumeral txt = (
 s= txt as string
 for i = 1 to s.count do(
  if(findString "0123456789" s[i]) == undefined then(
   return false
  )
 ) 
 return true
)

-- Función mejorada de getUserProp
fn getUserProp2 obj =(
 local ss = (getUserPropBuffer obj) as stringStream
 if ss != undefined then(
  while (eof ss) != true do(
   local txt = readline ss 
   local arr = filterstring txt " = " 

   if arr[2] != undefined then( 
    if (arr[2] == "true") or (arr[2] == "false") or ((isNumeral arr[2]) == true ) then( 
     txt = arr[1] + "=" + arr[2]

     execute txt
     readline ss 
    )else(
     arr[2] = "@\"" + arr[2]
     append arr[2] "\""
     txt = arr[1] + "=" + arr[2] 

     execute txt
     readline ss 
    )
   )else( 
    txt = arr[1] + "=" + "\"\""

    execute txt
    readline ss 
   )
  )
 )else(
  return(); 
 )

Объяснение кода

Этот скрипт является эффективным решением для разработчиков, работающих с данными, хранящимися в 3ds Max, устраняя ошибки и повышая надежность восстановления информации в их проектах.