
def place_steps(doc,placement,board_thickness):
    """ place_steps(doc,placement,board_thickness)->place step models on board 

        list of models and path to step files is set at start of this script
                 model_tab_filename= "" &   step_path="" """
    model_file=pythonopen(model_tab_filename, "r")
    model_lines=model_file.readlines()
    model_file.close()   
    model_dict=[]
    if IDF_diag==1:
        model_file=pythonopen(IDF_diag_path+"/missing_models.lst", "w")
    keys=[]
    #prev_step="*?.*?" #hope nobody will insert this step filename
    step_dict=[]
    for model_line in model_lines:
        model_records=split_records(model_line)  
        if len(model_records)>1 and model_records[0] and not model_records[0] in keys:
           keys.append(model_records[0])  
           model_dict.append((str(model_records[0]).replace('"',''),str(model_records[1]).replace('"','')))
    model_dict=dict(model_dict)
    validkeys=filter(lambda x:x in  [place_item[2] for place_item in placement], model_dict.keys())
    FreeCAD.Console.PrintMessage("Step models to be loaded for footprints: "+str(validkeys)+"\n")
    grp=doc.addObject("App::DocumentObjectGroup", "Step Lib")

    for validkey in validkeys:            
         # Store Object List before inserting STP  Model
         prevObj = doc.Objects
         # Reset new Object List 
         newObj = []
         # Reset new Object List Counter
         newObjCnt=0
         # Inserting STP Model
         ImportGui.insert(step_path+model_dict[validkey],FreeCAD.ActiveDocument.Name)
         # Store Object List after inserting STP Model
         aftObj = doc.Objects
         # Check the differences and store to List
         for d in aftObj:
           if not d in prevObj:
             newObj.append(d)

         # Loop through all new added Objects
         for impPart in newObj:
           impPart.ViewObject.Visibility=0
           # Label: validKey if only 1 Object is available; validkey+"0001" for second object ...
           if newObjCnt>0:
             st = "%s%04d" % (validkey, newObjCnt)
             impPart.Label=st
           else:
             impPart.Label=validkey
           # Debug Message to Console
           FreeCAD.Console.PrintMessage("New Object  "+str(d.Name)+": "+str(impPart.Label)+"\n")            
           # Add Object to Group
           grp.addObject(impPart)
           # Add Object to Step Dictionary
           step_dict.append((impPart.Label,impPart))
           # Increment Counter
           newObjCnt+=1
           
         #partName=FreeCAD.ActiveDocument.ActiveObject.Name
#         impPart=FreeCAD.ActiveDocument.ActiveObject
         #impPart.Shape=FreeCAD.ActiveDocument.ActiveObject.Shape
         #impPart.ViewObject.DiffuseColor=FreeCAD.ActiveDocument.ActiveObject.ViewObject.DiffuseColor
#         impPart.ViewObject.Visibility=0
#         impPart.Label=validkey
#         grp.addObject(impPart)
#         step_dict.append((validkey,impPart))
         FreeCAD.Console.PrintMessage("Reading step file "+str(model_dict[validkey])+" for footprint "+str(validkey)+"\n")
    step_dict=dict(step_dict)
    grp=doc.addObject("App::DocumentObjectGroup", "Step Models")
    for place_item in placement:
      if step_dict.has_key(place_item[2]):
        step_model=doc.addObject("Part::Feature",place_item[0]+"_s")
        FreeCAD.Console.PrintMessage("Adding STEP model "+str(place_item[0])+"\n")
        #if prev_step!=place_item[2]:
        #   model0=Part.read(step_path+"/"+model_dict[place_item[2]])
        #   prev_step=place_item[2]
        step_model.Shape=step_dict[place_item[2]].Shape
        step_model.ViewObject.DiffuseColor=step_dict[place_item[2]].ViewObject.DiffuseColor
        z_pos=0
        rotateY=0
        if place_item[6]=='BOTTOM':
           rotateY=pi
           z_pos=-board_thickness
        placmnt=Base.Placement(Base.Vector(place_item[3],place_item[4],z_pos),toQuaternion(rotateY,place_item[5]*pi/180,0))
        step_model.Placement=placmnt
        grp.addObject(step_model)

        # Check if more than one Object is available
        newObjCnt=1
        st = "%s%04d" % (place_item[2], newObjCnt)
        FreeCAD.Console.PrintMessage("Has Key  "+st+"? "+"\n")            
        while step_dict.has_key(st):

          cntst = "%04d" %newObjCnt
          FreeCAD.Console.PrintMessage("Has Key  "+st+"! "+"\n")            
          step_model=doc.addObject("Part::Feature",place_item[0]+"_s"+cntst)
          step_model.Shape=step_dict[st].Shape
          step_model.ViewObject.DiffuseColor=step_dict[st].ViewObject.DiffuseColor
          step_model.Placement=placmnt
          grp.addObject(step_model)
          newObjCnt+=1
          st = "%s%04d" % (place_item[2], newObjCnt)
          
          


      else: 
        if IDF_diag==1:
            model_file.writelines(str(place_item[0])+" "+str(place_item[2])+"\n")
    if IDF_diag==1:
      model_file.close() 

