private static HashSet <Component> IgnoreComponents(GameObject go)
        {
            ExposeToEditor      exposeToEditor   = go.GetComponent <ExposeToEditor>();
            HashSet <Component> ignoreComponents = new HashSet <Component>();

            if (exposeToEditor != null)
            {
                if (exposeToEditor.Colliders != null)
                {
                    for (int i = 0; i < exposeToEditor.Colliders.Length; ++i)
                    {
                        Collider collider = exposeToEditor.Colliders[i];
                        if (!ignoreComponents.Contains(collider))
                        {
                            ignoreComponents.Add(collider);
                        }
                    }
                }

                if (exposeToEditor.GetType().Name == typeof(MyExposeToEditor).Name)
                {
                    MyExposeToEditor myExposeToEditor = (MyExposeToEditor)exposeToEditor;
                    if (!myExposeToEditor.ShowTransform)
                    {
                        ignoreComponents.Add(go.transform);
                    }
                }

                ignoreComponents.Add(exposeToEditor);
            }

            return(ignoreComponents);
        }
        static public GameObject CubeRegion()
        {
            Resources.UnloadUnusedAssets();
            string     resourcePath = "Prefabs/RegionCube";
            GameObject prefab       = (GameObject)Resources.Load(resourcePath);
            GameObject regionCube   = GameObject.Instantiate(prefab, new Vector3(0, 0, 0), Quaternion.identity);

            BoxRegion boxRegion = regionCube.AddComponent <BoxRegion>();

            boxRegion.color = new Color(0.8f, 0.0f, 0.0f, 0.3f);

            MyExposeToEditor myExposeToEditor = regionCube.AddComponent <MyExposeToEditor>();

            myExposeToEditor.CanTransform             = true;
            myExposeToEditor.CanInspect               = true;
            myExposeToEditor.CanDuplicate             = true;
            myExposeToEditor.CanRename                = true;
            myExposeToEditor.CanCreatePrefab          = false;
            myExposeToEditor.ShowSelectionGizmo       = true;
            myExposeToEditor.AddColliders             = false;
            myExposeToEditor.ShowTransform            = false;
            myExposeToEditor.CanSetLoadTransformToRos = false;

            return(regionCube);
        }
        static public GameObject Device(string deviceType)
        {
            Resources.UnloadUnusedAssets();
            string resourcePath = "Prefabs/" + deviceType;

            GameObject prefab    = (GameObject)Resources.Load(resourcePath);
            GameObject newDevice = GameObject.Instantiate(prefab, new Vector3(0, 0, 0), Quaternion.identity);

            newDevice.name = "<input device name/ID here>";
            newDevice.AddComponent <Lidar>();

            MyExposeToEditor myExposeToEditor = newDevice.AddComponent <MyExposeToEditor>();

            myExposeToEditor.CanTransform             = true;
            myExposeToEditor.CanInspect               = true;
            myExposeToEditor.CanDuplicate             = true;
            myExposeToEditor.CanRename                = true;
            myExposeToEditor.CanCreatePrefab          = false;
            myExposeToEditor.ShowSelectionGizmo       = true;
            myExposeToEditor.AddColliders             = false;
            myExposeToEditor.ShowTransform            = true;
            myExposeToEditor.CanSetLoadTransformToRos = true;

            newDevice.tag = "RosDevice";

            return(newDevice);
        }
        private void Awake()
        {
            m_editorsMap = IOC.Resolve <IEditorsMap>();
            m_editor     = IOC.Resolve <IRuntimeEditor>();
            m_editor.Object.ComponentAdded += OnComponentAdded;

            GameObject[] selectedObjects = m_editor.Selection.gameObjects;
            foreach (GameObject go in m_editor.Selection.gameObjects)
            {
                ExposeToEditor exposeToEditor = go.GetComponent <ExposeToEditor>();
                if (exposeToEditor.GetType().Name == typeof(MyExposeToEditor).Name)
                {
                    MyExposeToEditor myExposeToEditor = (MyExposeToEditor)exposeToEditor;
                    if (myExposeToEditor.CanRename)
                    {
                        Header.SetActive(true);
                    }
                    else
                    {
                        Header.SetActive(false);
                    }
                }
            }
            InputName.text = GetObjectName(selectedObjects);
            InputName.onEndEdit.AddListener(OnEndEditName);

            m_selectedGameObjects = m_editor.Selection.gameObjects.Select(go => new GameObjectWrapper(go)).ToArray();
            IsActiveEditor.Init(m_selectedGameObjects, Strong.PropertyInfo((GameObjectWrapper x) => x.IsActive), string.Empty);


            m_editor.IsBusy = true;
            LayersEditor.LoadLayers(layersInfo =>
            {
                m_editor.IsBusy = false;
                List <RangeOptions.Option> layers = new List <RangeOptions.Option>();

                foreach (LayersInfo.Layer layer in layersInfo.Layers)
                {
                    if (!string.IsNullOrEmpty(layer.Name))
                    {
                        layers.Add(new RangeOptions.Option(string.Format("{0}: {1}", layer.Index, layer.Name), layer.Index));
                    }
                }

                LayerEditor.Options = layers.ToArray();
                LayerEditor.Init(m_editor.Selection.gameObjects, Strong.PropertyInfo((GameObject x) => x.layer), string.Empty);

                List <List <Component> > groups = GetComponentGroups(selectedObjects);
                for (int i = 0; i < groups.Count; ++i)
                {
                    List <Component> group = groups[i];
                    CreateComponentEditor(group);
                }

                UnityEventHelper.AddListener(EditLayersButton, btn => btn.onClick, OnEditLayersClick);
            });
        }
        static public GameObject Trajectory(string name, string defaultTopic)
        {
            GameObject             go        = new GameObject(name);
            SubscribeBoundingBoxes subscribe = go.AddComponent <SubscribeBoundingBoxes>();

            subscribe.Topic = defaultTopic;
            go.AddComponent <VisualizeTrajectory>();
            MyExposeToEditor myExposeToEditor = go.AddComponent <MyExposeToEditor>();

            myExposeToEditor.CanTransform = false;
            go.tag = "RosData";

            return(go);
        }
        static public GameObject BoudingBoxes(string name, string defaultTopic, bool canTransform)
        {
            GameObject             bboxGameObject = new GameObject(name);
            SubscribeBoundingBoxes subscribe      = bboxGameObject.AddComponent <SubscribeBoundingBoxes>();

            subscribe.Topic = defaultTopic;
            bboxGameObject.AddComponent <VisualizeBoundingBoxes>();
            bboxGameObject.AddComponent <VisualizeTrajectory>();
            MyExposeToEditor myExposeToEditor = bboxGameObject.AddComponent <MyExposeToEditor>();

            myExposeToEditor.CanTransform = canTransform;

            bboxGameObject.tag = "RosData";

            return(bboxGameObject);
        }
        static public GameObject ObjFile(string path)
        {
            GameObject       loadedObj        = new Dummiesman.OBJLoader().Load(path);
            MyExposeToEditor myExposeToEditor = loadedObj.AddComponent <MyExposeToEditor>();

            myExposeToEditor.CanTransform             = true;
            myExposeToEditor.CanInspect               = true;
            myExposeToEditor.CanDuplicate             = true;
            myExposeToEditor.CanRename                = true;
            myExposeToEditor.CanCreatePrefab          = false;
            myExposeToEditor.ShowSelectionGizmo       = true;
            myExposeToEditor.AddColliders             = false;
            myExposeToEditor.ShowTransform            = true;
            myExposeToEditor.CanSetLoadTransformToRos = false;

            return(loadedObj);
        }
        static public GameObject PointCloud2(string name, string defaultTopic, bool canTransform)
        {
            GameObject           pc2GameObject = new GameObject(name);
            SubscribePointCloud2 subscribe     = pc2GameObject.AddComponent <SubscribePointCloud2>();
            VisualizePointCloud2 visualize     = pc2GameObject.AddComponent <VisualizePointCloud2>();

            subscribe.Topic = defaultTopic;

            MyExposeToEditor myExposeToEditor = pc2GameObject.AddComponent <MyExposeToEditor>();

            myExposeToEditor.CanTransform  = canTransform;
            myExposeToEditor.ShowTransform = canTransform;

            pc2GameObject.tag = "RosData";

            return(pc2GameObject);
        }
        static public GameObject PointCloud2(string name, string defaultTopic, bool canTransform, bool startSubscribe, Color color)
        {
            GameObject           pc2GameObject = new GameObject(name);//Create gameObj that name is 'name'
            SubscribePointCloud2 subscribe     = pc2GameObject.AddComponent <SubscribePointCloud2>();
            VisualizePointCloud2 visualize     = pc2GameObject.AddComponent <VisualizePointCloud2>();

            subscribe.Topic   = defaultTopic;
            subscribe.Enabled = startSubscribe;

            visualize.PointColor = color;

            MyExposeToEditor myExposeToEditor = pc2GameObject.AddComponent <MyExposeToEditor>();

            myExposeToEditor.CanTransform  = canTransform;
            myExposeToEditor.ShowTransform = canTransform;

            pc2GameObject.tag = "RosData";

            return(pc2GameObject);
        }