# coding: utf-8
#
# Copyright © 2020 MSC.Software Corporation
#  
# Permission to use Scripts
#  
# Permission is granted to MSC.Software customers with valid licenses of the MSC Apex™ software 
# to use script files posted on this page (collectively “Scripts”) solely for customers’ own authorized 
# internal use in conjunction with licensed use of the MSC Apex software.  
# No other use is permitted.  No license to MSC Apex or other software is granted under this Permission.
#  
# SCRIPTS ARE PROVIDED ON AN "AS-IS" BASIS, WITH NO WARRANTIES OF ANY KIND.  USE OF THE SCRIPTS IS AT CUSTOMER'S SOLE RISK.
#  
# IN NO EVENT SHALL MSC.SOFTWARE CORPORATION, ITS AFFILIATES, SUBSIDIARIES, SUPPLIERS, AGENTS, REPRESENTATIVES OR EMPLOYEES BE LIABLE FOR ANY 
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, TORT, 
# STRICT LIABILITY, OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION USE OF THE SCRIPTS, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
#  
# Customer shall indemnify, defend and hold MSC.Software Corporation, its affiliates, subsidiaries, suppliers, agents, 
# employees or representatives (collectively, “Indemnified Parties”) harmless from and against any third-party claims 
# brought against Indemnified Parties rising out of or in connection with Customer’s use of the Scripts.
#

# Author: Larry Pearce
# Revised by: Larry Pearce
# Revision History
# Date         Change                                 By
# 2020-07-29   Original code                          Larry Pearce

import apex

def processEdgeAndCurve(selectedData):
    # Input:   variable        datatype          description
    #          selectedData    entityCollection  selected items
    # Output:  variable       datatype           description
    #          <none>
    #
    # The selected data should be geometric curves and/or edges.
    # This script echoes the length of selected edges/curves to the standard output.

    # I am not returning the information to the form because it could be a lot of information that
    # would require a spreadsheet for the output.  This could be added in the future.

    returnData = []
    
    totalLength = 0.0
    for data in selectedData:
        entType = data.getEntityType()
        if entType == apex.EntityType.Curve:
            print("Curve: " + data.getName())
            print("Curve Length: %7.4g" % (data.getLength()))
            returnData.append(["Curve", data.getLength()])
        elif entType == apex.EntityType.Edge:
            print("Edge Length: %7.4g" % (data.getLength()))
            returnData.append(["Edge", data.getLength()])
        totalLength += data.getLength()
    print(" ")
    print("Total length of all selected: %7.4g" % (totalLength))
    
    returnData.append(["Total", totalLength])

    return returnData


def getAllEdgesAndCurves():

    myModel = apex.currentModel()
    parts = myModel.getParts(True)
    _selected = apex.entityCollection()
    curves = apex.entityCollection()
    surfs  = apex.entityCollection()
    solids = apex.entityCollection()
    edges  = apex.entityCollection()
    for part in parts:
        curves += part.getCurves()
        surfs  += part.getSurfaces()
        solids += part.getSolids()

    _selected.extend(curves)

    for surf in surfs:
        edges += surf.getExteriorEdges()
        edges += surf.getInteriorEdges()
    for solid in solids:
        edges += solid.getExteriorEdges()
        edges += solid.getInteriorEdges()

    _selected.extend(edges)

    return _selected


def main(dict={}):
    # Define a dictionary of unit systems
    unitSystems = {}
    unitSystems["inch"] = r'''in-slinch-s-lbf'''
    unitSystems["feet"] = r'''ft-slug-s-lbf'''
    unitSystems["mm"]   = r'''mm-t-s-N'''
    unitSystems["m"]    = r'''m-kg-s-N'''

    myModel = apex.currentModel()

    apex.setScriptUnitSystem(unitSystemName = unitSystems[dict["unit"]]) # set the unit system to report data

    print("Selected base unit: "+dict["unit"])

    _selected = apex.selection.getCurrentSelection()

    if _selected.len() == 0:
        if "test" in dict.keys():
            _selected = getAllEdgesAndCurves()
        else:
            print("Nothing selected!")
            return

    # Extract information for the selected entities
    
    data = processEdgeAndCurve(_selected)

    if "test" in dict.keys(): return data

