View Issue Details

IDProjectCategoryView StatusLast Update
0001738File formatsGeneralpublic2017-07-15 11:12
Reporterherman15 Assigned Tovejmarie  
PrioritynormalSeverityfeatureReproducibilityalways
Status closedResolutionfixed 
Product Version0.14 
Summary0001738: IDF Import failure if STP file consists of multiple Objects
DescriptionIDf import script failure if STP file consists of multiple Objects
If multiple Objects are in STP file only first(or last) is placed correctly. All other objects are placed at origin and these parts are not grouped correctly.

Solution:
In IDF.py import script add multi Object support in function place_steps.

i have attached a modified place_step routine which is sufficient for me at least.
TagsSTEP
FreeCAD Information

Relationships

related to 0002369 closedvejmarie FreeCAD STEP import is not grouping parts 
related to 0003076 closedvejmarie File formats 0.17 Colours of Step-File are not imported correctly 

Activities

herman15

2014-09-10 12:00

reporter  

Idf_place_steps.py (4,948 bytes)   
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() 

Idf_place_steps.py (4,948 bytes)   

vejmarie

2017-07-11 07:58

developer   ~0009705

Last edited: 2017-07-11 10:55

It might be fixed in FreeCAD Pull Request 871 which is changing the STEP file importer behavior from absolute to relative placement. We are also better supporting reference shapes into Step and I believe that this bug is fixed even if I could not test it, I had the same behavior on some very complex test case (not IDF but native step)

Kunda1

2017-07-11 17:04

administrator   ~0009716

@herman15 could you possibly test on the latest bleeding edge 0.17 revision ?

Issue History

Date Modified Username Field Change
2014-09-10 12:00 herman15 New Issue
2014-09-10 12:00 herman15 File Added: Idf_place_steps.py
2017-01-11 03:19 Kunda1 Tag Attached: STEP
2017-01-16 18:54 Kunda1 Project FreeCAD => File formats
2017-01-16 18:54 Kunda1 Category Patch => General
2017-02-04 12:20 Kunda1 Relationship added related to 0002369
2017-03-27 12:53 Kunda1 Assigned To => vejmarie
2017-03-27 12:53 Kunda1 Status new => assigned
2017-07-11 07:58 vejmarie Note Added: 0009705
2017-07-11 10:53 Kunda1 Relationship added related to 0003076
2017-07-11 10:55 Kunda1 Note Edited: 0009705
2017-07-11 17:03 Kunda1 Status assigned => resolved
2017-07-11 17:03 Kunda1 Resolution open => fixed
2017-07-11 17:04 Kunda1 Note Added: 0009716
2017-07-15 11:12 Kunda1 Status resolved => closed