public static void Reconstruct(Object psdFile, ImportUserData importSettings,
                                       ImportLayerData reconstructRoot, Vector2 documentPivot,
                                       IReconstructor reconstructor)
        {
            string psdPath = GetPsdFilepath(psdFile);

            if (string.IsNullOrEmpty(psdPath))
            {
                return;
            }

            using (var psdDoc = PsdDocument.Create(psdPath))
            {
                ReconstructData data = GetReconstructData(psdDoc, psdPath,
                                                          documentPivot, importSettings,
                                                          reconstructRoot);

                var GO = reconstructor.Reconstruct(reconstructRoot, data, Selection.activeGameObject);
                if (GO != null)
                {
                    EditorGUIUtility.PingObject(GO);
                    Selection.activeGameObject = GO;
                }
            }
        }
        private static ReconstructData GetReconstructData(PsdDocument psdDoc, string psdPath, Vector2 documentPivot,
                                                          ImportUserData importSettings, ImportLayerData reconstructRoot)
        {
            // Get the texture import setting of the PSD
            TextureImporter         psdUnitySettings = (TextureImporter)AssetImporter.GetAtPath(psdPath);
            TextureImporterSettings psdUnityImport   = new TextureImporterSettings();

            psdUnitySettings.ReadTextureSettings(psdUnityImport);

            Vector2         docSize = new Vector2(psdDoc.Width, psdDoc.Height);
            ReconstructData data    = new ReconstructData(docSize, documentPivot, psdUnitySettings.spritePixelsPerUnit);

            reconstructRoot.Iterate(
                layerCallback: layer =>
            {
                if (layer.import == false)
                {
                    return;
                }

                var psdLayer = GetPsdLayerByIndex(psdDoc, layer.indexId);

                Rect layerBounds = new Rect()
                {
                    xMin = psdLayer.Left,
                    xMax = psdLayer.Right,
                    yMin = psdDoc.Height - psdLayer.Bottom,
                    yMax = psdDoc.Height - psdLayer.Top
                };
                data.layerBoundsIndex.Add(layer.indexId, layerBounds);

                string layerDir;
                string layerPath = GetFilePath(psdLayer, importSettings, "png", out layerDir);

                string layerMeshDir;
                string layerMeshPath = GetFilePath(psdLayer, importSettings, "asset", out layerMeshDir);

                Sprite layerSprite         = AssetDatabase.LoadAssetAtPath <Sprite>(layerPath);
                SpriteMesh layerSpriteMesh = AssetDatabase.LoadAssetAtPath <SpriteMesh>(layerMeshPath);

                if (layerSprite == null)
                {
                    layerSprite = ImportLayer(psdDoc, importSettings, layer, psdUnityImport);
                }

                if (layerSpriteMesh == null && importSettings.GenerateSpriteMesh)
                {
                    layerSpriteMesh = GenerateSpriteMesh(layerSprite);
                }

                Vector2 spriteAnchor = Vector2.zero;

                if (layerSprite != null)
                {
                    TextureImporter layerImporter         = (TextureImporter)AssetImporter.GetAtPath(layerPath);
                    TextureImporterSettings layerSettings = new TextureImporterSettings();
                    layerImporter.ReadTextureSettings(layerSettings);

                    if (layerSettings.spriteAlignment == (int)SpriteAlignment.Custom)
                    {
                        spriteAnchor = layerSettings.spritePivot;
                    }
                    else
                    {
                        spriteAnchor = AlignmentToPivot((SpriteAlignment)layerSettings.spriteAlignment);
                    }
                }

                data.AddSprite(layer.indexId, layerSprite, spriteAnchor);

                if (importSettings.GenerateSpriteMesh)
                {
                    data.AddSpriteMesh(layer.indexId, layerSpriteMesh);
                }
            },
                canEnterGroup: checkGroup => checkGroup.import
                );

            return(data);
        }