# -*- coding: utf-8 -*-

__title__ = "Parametric solid"
__author__ = "Christophe Grellier (Chris_G)"
__license__ = "LGPL 2.1"
__doc__ = "Make a parametric solid from selected faces."

import os
import FreeCAD
import FreeCADGui
import Part
from freecad.Curves import _utils
from freecad.Curves import ICONPATH

TOOL_ICON = os.path.join( ICONPATH, 'solid.svg')

class solid:
    """Make a parametric solid from selected faces"""
    def __init__(self, obj):
        obj.addProperty("App::PropertyLinkSubList", "Faces", "Solid", "List of faces to build the solid")
        obj.Proxy = self

    def execute(self, obj):
        faces = _utils.getShape(obj,"Faces","Face")
        shell = Part.Shell(faces)
        solid = Part.Solid(shell)
        if solid.isValid():
            obj.Shape = solid
        elif shell.isValid():
            obj.Shape = shell
        else:
            obj.Shape = Part.Compound(faces)

class solidVP:
    def __init__(self,vobj):
        vobj.Proxy = self
       
    def getIcon(self):
        return TOOL_ICON

    def attach(self, vobj):
        self.Object = vobj.Object

    def __getstate__(self):
        return {"name": self.Object.Name}

    def __setstate__(self,state):
        self.Object = FreeCAD.ActiveDocument.getObject(state["name"])
        return None

    #def claimChildren(self):
        #return None #[self.Object.Base, self.Object.Tool]

class solidCommand:
    """Make a parametric solid from selected faces"""
    def makeSolidFeature(self,source):
        solidFP = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Solid")
        solid(solidFP)
        solidVP(solidFP.ViewObject)
        solidFP.Faces = source
        FreeCAD.ActiveDocument.recompute()
        #solidFP.ViewObject.LineWidth = 2.0
        #solidFP.ViewObject.LineColor = (0.3,0.5,0.5)

    def Activated(self):
        faces = []
        sel = FreeCADGui.Selection.getSelectionEx()
        if sel == []:
            FreeCAD.Console.PrintError("Select some faces first !\n")
        for selobj in sel:
            if selobj.HasSubObjects:
                for i in range(len(selobj.SubObjects)):
                    if isinstance(selobj.SubObjects[i], Part.Face):
                        faces.append((selobj.Object, selobj.SubElementNames[i]))
            elif selobj.Object.Shape.Faces:
                for i in range(len(selobj.Object.Shape.Faces)):
                    faces.append((selobj.Object, "Face%d"%i))
                selobj.Object.ViewObject.Visibility = False
        if faces:
            self.makeSolidFeature(faces)
        
    def IsActive(self):
        if FreeCAD.ActiveDocument:
            #f = FreeCADGui.Selection.Filter("SELECT Part::Feature SUBELEMENT Face COUNT 1..1000")
            #return f.match()
            return True
        else:
            return False

    def GetResources(self):
        return {'Pixmap' : TOOL_ICON,
                'MenuText': 'Make Solid',
                'ToolTip': 'Make a parametric solid from selected faces'}

FreeCADGui.addCommand('solid', solidCommand())