Hey Unaided, buen ejercicio!
A ver si te puedo echar un cable con las preguntas
1. No funciona si la ventana del Texture Editor está en un visor. Solo en views flotantes.
Lo que pasa es que los paneles a, b, c y d (los viewports) son componentes del view manager (una de las vistas), lo suyo sería añadir un fallback buscando en el view manager en caso de que no encuentre el texture editor como vista flotante.
var views = Application.Desktop.ActiveLayout.Views;
var v = views.Find("Texture Editor"); //buscamos en las vistas flotantes
if (!v) var v = views.Find("View Manager").Views.Find("Texture Editor"); //fallback
2. Si se cierra el panel desde la X no elimina la customProperty del PPG. Usar el boton Close.
Todos los PPG tienen un callback OnClosed, simplemente renombra CLOSE_OnClicked por OnClosed y elimina el botón, debería funcionar sin problema
3. La posición de los items la he resuelto de forma un poco rudimentaria. No he sabido hacerlo de modo absoluto si es posible. Esto, unido a que no quiero usar un panel Modal, no me permite establecer una ventana de dimensiones fijas.
Lo has hecho bien, en general no se deben diseñar GUIs con posiciones absolutas y prácticamente en todos los lenguajes/medios existen frameworks para describir las posiciones en relación a otros widgets de forma que la GUI se adapte a los cambios de tamaño (responsive). El PPGLayout de Softimage tiene ciertas limitaciones pero para posicionar elementos funciona.
Lo de las dimensiones es una limitación por diseño, en softimage no puedes cambiar el tamaño de un PPG porque estos se comparten entre objetos y afectarías al resto. Lo que se puede hacer es incrustar tu ppg en una vista (que si se puede redimensionar) y dado que el ppg está organizado de forma relativa todo se ajustará perfectamente.
Por ejemplo si reemplazas la llamada a inspectObj en tu código por una llamada a esta función podrías especificar un tamaño para la vista y tal.
function show(pset, size_x, size_y) {
var v = Desktop.ActiveLayout.CreateView("Property Panel", pset.Name);
v.BeginEdit();
v.Resize(size_x, size_y);
v.SetAttributeValue( "targetcontent", pset.FullName);
v.EndEdit();
}