def export_STEPFile_single(shape, filename, tol=1.0E-6): """ Exports a .stp file containing the input shapes Parameters ---------- shape : TopoDS_Shape filename : string The output filename """ step = STEPCAFControl_Writer() step.SetNameMode(True) step.SetPropsMode(True) h_doc = TDocStd_Document() x_app = XCAFApp_Application.GetApplication().GetObject() x_app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), h_doc) doc = h_doc.GetObject() h_shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) shape_tool = h_shape_tool.GetObject() Interface_Static_SetCVal("write.step.schema", "AP214") # transfer shapes print(filename) shape_tool.AddShape(shape) step.Transfer(h_doc, STEPControl_AsIs) status = step.Write(filename) assert(status == IFSelect_RetDone)
def test_write_step_file(self): ''' Exports a colored box into a STEP file ''' ### initialisation h_doc = Handle_TDocStd_Document() assert (h_doc.IsNull()) # Create the application app = XCAFApp_Application.GetApplication().GetObject() app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), h_doc) # Get root assembly doc = h_doc.GetObject() h_shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) l_Colors = XCAFDoc_DocumentTool_ColorTool(doc.Main()) shape_tool = h_shape_tool.GetObject() colors = l_Colors.GetObject() ### create the shape to export test_shape = BRepPrimAPI_MakeBox(100., 100., 100.).Shape() ### add shape shp_label = shape_tool.AddShape(test_shape) ### set a color for this shape r = 1 g = b = 0.5 red_color = Quantity_Color(r, g, b, 0) colors.SetColor(shp_label, red_color, XCAFDoc_ColorGen) # write file WS = XSControl_WorkSession() writer = STEPCAFControl_Writer(WS.GetHandle(), False) writer.Transfer(h_doc, STEPControl_AsIs) status = writer.Write("./test_io/test_ocaf_generated.stp") assert status assert os.path.isfile("./test_io/test_ocaf_generated.stp")
def read_step_file_shapes(filename): _shapes = [] # create an handle to a document h_doc = TDocStd_Document() # Create the application app = XCAFApp_Application.GetApplication().GetObject() app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), h_doc) # Get root assembly doc = h_doc.GetObject() h_shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetNameMode(True) status = step_reader.ReadFile(filename) if status == IFSelect_RetDone: step_reader.Transfer(doc) labels = TDF_LabelSequence() shape_tool = h_shape_tool.GetObject() h_shape_tool.GetObject().GetFreeShapes(labels) print("Number of shapes at root :%i" % labels.Length()) for i in range(labels.Length()): label = labels.Value(i + 1) a_shape = h_shape_tool.GetObject().GetShape(label) _shapes.append(a_shape) return _shapes
def test_write_step_file(self): ''' Exports a colored box into a STEP file ''' ### initialisation doc = TDocStd_Document(TCollection_ExtendedString("pythonocc-doc")) self.assertTrue(doc is not None) # Get root assembly shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) colors = XCAFDoc_DocumentTool_ColorTool(doc.Main()) ### create the shape to export test_shape = BRepPrimAPI_MakeBox(100., 100., 100.).Shape() ### add shape shp_label = shape_tool.AddShape(test_shape) ### set a color for this shape r = 1 g = b = 0.5 red_color = Quantity_Color(r, g, b, 0) colors.SetColor(shp_label, red_color, XCAFDoc_ColorGen) # write file WS = XSControl_WorkSession() writer = STEPCAFControl_Writer(WS, False) writer.Transfer(doc, STEPControl_AsIs) status = writer.Write("./test_io/test_ocaf_generated.stp") self.assertTrue(status) self.assertTrue(os.path.isfile("./test_io/test_ocaf_generated.stp"))
def replaceShape(self, uid, modshape): """Replace referred shape with modshape of component with uid The modified part is a located instance of a referred shape stored at doc root. The user doesn't have access to this root shape. In order to modify this referred shape, the modified instance shape is moved back to the original location at doc root, then saved.""" shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(self.doc.Main()) # shape is stored at label entry '0:1:1:n' n = int(self.label_dict[uid]['ref_entry'].split(':')[-1]) color = self.part_dict[uid]['color'] labels = TDF_LabelSequence() shape_tool.GetShapes(labels) label = labels.Value(n) # nth label at root # If shape instance was moved from its root location to its instance # location, 'unmove' it to relocate it back to the root location. if self.part_dict[uid]['loc']: modshape.Move(self.part_dict[uid]['loc'].Inverted()) # Replace oldshape in self.doc shape_tool.SetShape(label, modshape) color_tool.SetColor(modshape, color, XCAFDoc_ColorGen) shape_tool.UpdateAssemblies() self.parse_doc() # generate new part_dict
def __init__(self, name="name", tol=1.0E-10): self.name = name self.step = STEPCAFControl_Writer() self.step.SetNameMode(True) self.doc = TDocStd_Document(TCollection_ExtendedString("")) self.x_app = XCAFApp_Application.GetApplication() self.x_app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), self.doc) self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) Interface_Static_SetCVal("write.step.schema", "AP214") Interface_Static_SetCVal('write.step.unit', 'mm')
def __init__(self, document=None, filename=None): """Supply one or the other: document or STEP filename.""" self.uid = 1 self.indent = 0 self.output = "" self.fname = filename if filename: self.doc = self.read_file(filename) elif document: self.doc = document self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) else: print("Supply one or the other: document or STEP filename.")
def __init__(self, title): # Create the application and document doc = TDocStd_Document(TCollection_ExtendedString(title)) app = XCAFApp_Application_GetApplication() app.NewDocument(TCollection_ExtendedString("MDTV-XCAF"), doc) self.app = app self.doc = doc # Initialize tools self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) self.shape_tool.SetAutoNaming(True) self.color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) self.layer_tool = XCAFDoc_DocumentTool_LayerTool(doc.Main()) self.l_materials = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) self.allChildLabels = []
def read_step_file_with_attribute2(filename): """ Read a step file and returns a shape (geometrical information). This uses the XDE of OCCD and will also be able to extract the attribute information such as colour or name or layer. """ h_doc = Handle_TDocStd_Document() # print "Empty Doc?", h_doc.IsNull() ### Create the application app = XCAFApp_Application.GetApplication().GetObject() app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), h_doc) ### Get tools, here only enable the colour attribute doc = h_doc.GetObject() h_shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) h_colour_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) # l_Layers = XCAFDoc_DocumentTool_LayerTool(doc.Main()) # l_materials = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) shape_tool = h_shape_tool.GetObject() colour_tool = h_colour_tool.GetObject() ### Read files STEPReader = STEPCAFControl_Reader() STEPReader.SetColorMode(True) # STEPReader.SetLayerMode(True) # STEPReader.SetNameMode(True) # STEPReader.SetMatMode(True) status = STEPReader.ReadFile(filename) STEPReader.Reader().PrintCheckLoad(True, 0) if status == IFSelect_RetDone: STEPReader.Transfer(doc.GetHandle()) ### Get root assembly shapeLabels = TDF_LabelSequence() shape_tool.GetFreeShapes(shapeLabels) # print ('Number of shapes at root :%i'%shapeLabels.Length()) ### Here we only have one solid in the model so we directly use the first solid ### If there are more, please use the for loop to get all solids shape = shape_tool.GetShape(shapeLabels.Value(1)) topo = Topo(shape) # for i in range(shapeLabels.Length()): # #print(Labels.Value(i+1).Tag()) # shape=shape_tool.GetShape(shapeLabels.Value(i+1)) # shapes.append(shape) return [topo, colour_tool]
def __init__(self, document=None, filename=None): """Supply one or the other: document or STEP filename.""" self.indent = 0 self.output = "" self.fname = filename # Initialize self._share_dict self._share_dict = {'0:1:1': 0} # {entry: ser_nbr} if filename: self.doc = self.read_file(filename) elif document: self.doc = document self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) else: print("Supply one or the other: document or STEP filename.")
class ExportCAFMethod (object): def __init__(self, name="name", tol=1.0E-10): self.name = name self.step = STEPCAFControl_Writer() self.step.SetNameMode(True) self.h_doc = TDocStd_Document() self.x_app = XCAFApp_Application.GetApplication().GetObject() self.x_app.NewDocument( TCollection_ExtendedString("MDTV-CAF"), self.h_doc) self.doc = self.h_doc.GetObject() self.h_shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) self.shape_tool = self.h_shape_tool.GetObject() Interface_Static_SetCVal("write.step.schema", "AP214") def Add(self, shape, name="name"): """ STEPControl_AsIs translates an Open CASCADE shape to its highest possible STEP representation. STEPControl_ManifoldSolidBrep translates an Open CASCADE shape to a STEP manifold_solid_brep or brep_with_voids entity. STEPControl_FacetedBrep translates an Open CASCADE shape into a STEP faceted_brep entity. STEPControl_ShellBasedSurfaceModel translates an Open CASCADE shape into a STEP shell_based_surface_model entity. STEPControl_GeometricCurveSet translates an Open CASCADE shape into a STEP geometric_curve_set entity. """ label = self.shape_tool.AddShape(shape) self.step.Transfer(self.h_doc, STEPControl_AsIs) def Write(self, filename=None): if not filename: filename = self.name path, ext = os.path.splitext(filename) if not ext: ext = ".stp" status = self.step.Write(path + ext) assert(status == IFSelect_RetDone)
class TreeModel(): """XCAF Tree Model of hierarchical CAD assembly data""" def __init__(self, title): # Create the application and document doc = TDocStd_Document(TCollection_ExtendedString(title)) app = XCAFApp_Application_GetApplication() app.NewDocument(TCollection_ExtendedString("MDTV-XCAF"), doc) self.app = app self.doc = doc # Initialize tools self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) self.shape_tool.SetAutoNaming(True) self.color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) self.layer_tool = XCAFDoc_DocumentTool_LayerTool(doc.Main()) self.l_materials = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) self.allChildLabels = [] def getChildLabels(self, label): """Return list of child labels directly below label.""" itlbl = TDF_ChildIterator(label, True) childlabels = [] while itlbl.More(): childlabels.append(itlbl.Value()) itlbl.Next() return childlabels def getAllChildLabels(self, label, first=True): """Return list of all child labels (recursively) below label. This doesn't find anything at the second level down because the component labels of root do not have children, but rather they have references.""" print("Entering 'getAllChildLabels'") if first: self.allChildLabels = [] childLabels = self.getChildLabels(label) print(f"len(childLabels) = {len(childLabels)}") self.allChildLabels += childLabels print(f"len(allChildLabels) = {len(self.allChildLabels)}") for lbl in childLabels: self.getAllChildLabels(lbl, first=False) return self.allChildLabels def saveDoc(self, filename="foo.caf"): """Save doc to file (for educational purposes) (not working yet) https://www.opencascade.com/doc/occt-7.4.0/overview/html/occt_user_guides__ocaf.html#occt_ocaf_11 """ frmte = TCollection_ExtendedString("Xml-XCAF") #frmta = TCollection_AsciiString("MDTV-CAF") self.app.DefineFormat(TCollection_AsciiString("DocumentFormat"), TCollection_AsciiString("MDTV-CAF"), TCollection_AsciiString("caf"), XmlXCAFDrivers_DocumentRetrievalDriver(), XmlXCAFDrivers_DocumentStorageDriver(frmte)) logger.debug("Saving doc to file") savefilename = TCollection_ExtendedString(filename) self.app.SaveAs(self.doc, savefilename)
def read_file(self, fname): """Read STEP file and return <TDocStd_Document>.""" # Create the application, empty document and shape_tool doc = TDocStd_Document(TCollection_ExtendedString("STEP")) app = XCAFApp_Application_GetApplication() app.NewDocument(TCollection_ExtendedString("MDTV-XCAF"), doc) self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) self.shape_tool.SetAutoNaming(True) # Read file and return populated doc step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile(fname) if status == IFSelect_RetDone: step_reader.Transfer(doc) return doc
def createDoc(self): """Create XCAF doc with an empty assembly at entry 0:1:1:1. This is done only once in __init__.""" # Create the application and document with empty rootLabel title = "Main document" doc = TDocStd_Document(TCollection_ExtendedString(title)) app = XCAFApp_Application_GetApplication() app.NewDocument(TCollection_ExtendedString("MDTV-XCAF"), doc) shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) # type(doc.Main()) = <class 'OCC.Core.TDF.TDF_Label'> # 0:1 doc.Main().EntryDumpToString() # 0:1:1 shape_tool is at this label entry # 0:1:2 color_tool at this entry # 0:1:1:1 rootLabel created at this entry rootLabel = shape_tool.NewShape() self.setLabelName(rootLabel, "Top") return doc
def addComponent(self, shape, name, color): """Add new shape to top assembly of self.doc & return uid""" labels = TDF_LabelSequence() shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(self.doc.Main()) shape_tool.GetShapes(labels) try: rootLabel = labels.Value(1) # First label at root except RuntimeError as e: print(e) return newLabel = shape_tool.AddComponent(rootLabel, shape, True) # Get referrred label and apply color to it refLabel = TDF_Label() # label of referred shape isRef = shape_tool.GetReferredShape(newLabel, refLabel) if isRef: color_tool.SetColor(refLabel, color, XCAFDoc_ColorGen) self.setLabelName(newLabel, name) logger.info('Part %s added to root label', name) shape_tool.UpdateAssemblies() self.doc = self.doc_linter() # This gets color to work self.parse_doc() entry = newLabel.EntryDumpToString() uid = entry + '.0' # this should work OK since it is new return uid
def test_read_step_file(self): ''' Reads the previous step file ''' # create an handle to a document doc = TDocStd_Document(TCollection_ExtendedString("pythonocc-doc")) # Get root assembly shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) l_colors = XCAFDoc_DocumentTool_ColorTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile("./test_io/test_ocaf.stp") if status == IFSelect_RetDone: step_reader.Transfer(doc) labels = TDF_LabelSequence() color_labels = TDF_LabelSequence() shape_tool.GetFreeShapes(labels) self.assertEqual(labels.Length(), 1) sub_shapes_labels = TDF_LabelSequence() self.assertFalse(shape_tool.IsAssembly(labels.Value(1))) shape_tool.GetSubShapes(labels.Value(1), sub_shapes_labels) self.assertEqual(sub_shapes_labels.Length(), 0) l_colors.GetColors(color_labels) self.assertEqual(color_labels.Length(), 1) label_shp = labels.Value(1) a_shape = shape_tool.GetShape(label_shp) self.assertFalse(a_shape.IsNull())
def test_read_step_file(self): ''' Reads the previous step file ''' # create an handle to a document h_doc = Handle_TDocStd_Document() # Create the application app = XCAFApp_Application.GetApplication().GetObject() app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), h_doc) # Get root assembly doc = h_doc.GetObject() h_shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) l_colors = XCAFDoc_DocumentTool_ColorTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile("./test_io/test_ocaf.stp") if status == IFSelect_RetDone: step_reader.Transfer(doc.GetHandle()) labels = TDF_LabelSequence() color_labels = TDF_LabelSequence() shape_tool = h_shape_tool.GetObject() h_shape_tool.GetObject().GetFreeShapes(labels) assert (labels.Length() == 1) sub_shapes_labels = TDF_LabelSequence() assert (not shape_tool.IsAssembly(labels.Value(1))) shape_tool.GetSubShapes(labels.Value(1), sub_shapes_labels) assert (sub_shapes_labels.Length() == 0) l_colors.GetObject().GetColors(color_labels) assert (color_labels.Length() == 1) label_shp = labels.Value(1) a_shape = h_shape_tool.GetObject().GetShape(label_shp) assert (not a_shape.IsNull())
def change_label_name(self, uid, name): """Change the name of component with uid.""" entry, _ = uid.split('.') entry_parts = entry.split(':') if len(entry_parts) == 4: # first label at root j = 1 k = None elif len(entry_parts) == 5: # part is a component of label at root j = int(entry_parts[3]) # number of label at root k = int(entry_parts[4]) # component number shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(self.doc.Main()) labels = TDF_LabelSequence() # labels at root of self.doc shape_tool.GetShapes(labels) label = labels.Value(j) comps = TDF_LabelSequence() # Components of root_label subchilds = False is_assy = shape_tool.GetComponents(label, comps, subchilds) target_label = comps.Value(k) self.setLabelName(target_label, name) shape_tool.UpdateAssemblies() print(f"Name {name} set for part with uid = {uid}.") self.parse_doc()
class TreeModel(): """XCAF Tree Model of heirarchical CAD assembly data.""" def __init__(self, title): # Create the application and document doc = TDocStd_Document(TCollection_ExtendedString(title)) app = XCAFApp_Application_GetApplication() app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), doc) self.app = app self.doc = doc # Initialize tools self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) self.shape_tool.SetAutoNaming(True) self.color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) self.layer_tool = XCAFDoc_DocumentTool_LayerTool(doc.Main()) self.l_materials = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) self.allChildLabels = [] def getChildLabels(self, label): """Return list of child labels directly below label.""" itlbl = TDF_ChildIterator(label, True) childlabels = [] while itlbl.More(): childlabels.append(itlbl.Value()) itlbl.Next() return childlabels def getAllChildLabels(self, label, first=True): """Return list of all child labels (recursively) below label. This doesn't find anything at the second level down because the component labels of root do not have children, but rather they have references.""" print("Entering 'getAllChildLabels'") if first: self.allChildLabels = [] childLabels = self.getChildLabels(label) print(f"len(childLabels) = {len(childLabels)}") self.allChildLabels += childLabels print(f"len(allChildLabels) = {len(self.allChildLabels)}") for lbl in childLabels: self.getAllChildLabels(lbl, first=False) return self.allChildLabels def saveDoc(self, filename): """Save doc to file (for educational purposes) (not working yet) """ logger.debug("Saving doc to file") savefilename = TCollection_ExtendedString(filename) self.app.SaveAs(self.doc, savefilename)
def saveStep(self): """Export self.doc to STEP file.""" prompt = 'Choose filename for step file.' fnametuple = QFileDialog.getSaveFileName( None, prompt, './', "STEP files (*.stp *.STP *.step)") fname, _ = fnametuple if not fname: print("Save step cancelled.") return # Reconstruct XCAFDoc related code from stepXD.StepImporter labels = TDF_LabelSequence() shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) shape_tool.GetShapes(labels) logger.info('Number of labels at root : %i', labels.Length()) try: rootlabel = labels.Value(1) # First label at root except RuntimeError: return name = rootlabel.GetLabelName() logger.info('Name of root label: %s', name) isAssy = shape_tool.IsAssembly(rootlabel) logger.info("First label at root holds an assembly? %s", isAssy) # Modify self.doc by adding active part to rootlabel. #Standard_Boolean expand = Standard_False; //default #TDF_Label aLabel = myAssembly->AddComponent (aShape [,expand]); newLabel = shape_tool.AddComponent(rootlabel, self.activePart, True) #set a name to newlabel (as a reminder using OCAF), use: #TCollection_ExtendedString aName ...; #// contains the desired name for this Label (ASCII) #TDataStd_Name::Set (aLabel, aName); newName = TCollection_ExtendedString( self._nameDict[self.activePartUID]) TDataStd_Name.Set(newLabel, newName) logger.info('Name of new part: %s', newName) #myAssembly->UpdateAssemblies(); shape_tool.UpdateAssemblies() # initialize the STEP exporter step_writer = STEPCAFControl_Writer() # transfer shapes and write file step_writer.Transfer(self.doc) status = step_writer.Write(fname) assert status == IFSelect_RetDone
from OCC.Core.TopLoc import TopLoc_Location from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_Transform from OCC.Display.SimpleGui import init_display filename = '../assets/models/as1-oc-214.stp' # create an handle to a document h_doc = Handle_TDocStd_Document() # Create the application app = XCAFApp_Application.GetApplication().GetObject() app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), h_doc) # Get root assembly doc = h_doc.GetObject() h_shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) h_color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) h_layer_tool = XCAFDoc_DocumentTool_LayerTool(doc.Main()) h_mat_tool = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile(filename) if status == IFSelect_RetDone: step_reader.Transfer(doc.GetHandle()) shape_tool = h_shape_tool.GetObject()
def externalGeometryAssembly(self): # Create a TDoc holding the assembly of structure parts with external geometry. When assembled, write the STEP file # Initialize the writer shapes = [] step_writer = STEPCAFControl_Writer() step_writer.SetNameMode(True) step_writer.SetPropsMode(True) # create the handle to a document doc = TDocStd_Document(TCollection_ExtendedString("ocx-doc")) # Get root assembly shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) shape_tool.SetAutoNaming(False) l_colors = XCAFDoc_DocumentTool_ColorTool(doc.Main()) l_layers = XCAFDoc_DocumentTool_LayerTool(doc.Main()) l_materials = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) aBuilder = BRep_Builder() # Loop over all Panels panelchildren = [] for panel in self.model.panels: OCXCommon.LogMessage(panel, self.logging) guid = self.model.getGUID(panel) children = self.model.getPanelChildren(guid) panelchildren = panelchildren + children # Build the Panel compound compound = TopoDS_Compound() aBuilder.MakeCompound(compound) label = shape_tool.AddShape(compound) pname = panel.get('name') tname = TDataStd_Name() tname.Set(TCollection_ExtendedString(pname)) label.AddAttribute(tname) for child in children: object = self.model.getObject(child) name = object.get('name') extg = ExternalGeometry(self.model, object, self.dict, self.logging) # Init the creator extg.readExtGeometry() # Read the Brep if extg.IsDone(): aBuilder.Add(compound, extg.Shape()) tname = TDataStd_Name() label = shape_tool.AddShape(extg.Shape()) tname.Set(TCollection_ExtendedString(name)) label.AddAttribute(tname) # Root brackets compound = TopoDS_Compound() aBuilder.MakeCompound(compound) label = shape_tool.AddShape(compound) tname = TDataStd_Name() tname.Set(TCollection_ExtendedString('Brackets')) label.AddAttribute(tname) for br in self.model.brackets: guid = self.model.getGUID(br) name = br.get('name') if guid not in panelchildren: extg = ExternalGeometry(self.model, br, self.dict, self.logging) # Init the creator extg.readExtGeometry() # Read the Brep if extg.IsDone(): aBuilder.Add(compound, extg.Shape()) tname = TDataStd_Name() label = shape_tool.AddShape(extg.Shape()) tname.Set(TCollection_ExtendedString(name)) label.AddAttribute(tname) # Root plates compound = TopoDS_Compound() aBuilder.MakeCompound(compound) label = shape_tool.AddShape(compound) tname = TDataStd_Name() tname.Set(TCollection_ExtendedString('Plates')) label.AddAttribute(tname) for pl in self.model.plates: guid = self.model.getGUID(pl) name = pl.get('name') if guid not in panelchildren: extg = ExternalGeometry(self.model, pl, self.dict, self.logging) # Init the creator extg.readExtGeometry() # Read the Brep if extg.IsDone(): aBuilder.Add(compound, extg.Shape()) tname = TDataStd_Name() label = shape_tool.AddShape(extg.Shape()) tname.Set(TCollection_ExtendedString(name)) label.AddAttribute(tname) # Root pillars compound = TopoDS_Compound() aBuilder.MakeCompound(compound) label = shape_tool.AddShape(compound) tname = TDataStd_Name() tname.Set(TCollection_ExtendedString('Pillars')) label.AddAttribute(tname) for pil in self.model.pillars: guid = self.model.getGUID(pil) name = pil.get('name') if guid not in panelchildren: extg = ExternalGeometry(self.model, pil, self.dict, self.logging) # Init the creator extg.readExtGeometry() # Read the Brep if extg.IsDone(): aBuilder.Add(compound, extg.Shape()) tname = TDataStd_Name() label = shape_tool.AddShape(extg.Shape()) tname.Set(TCollection_ExtendedString(name)) label.AddAttribute(tname) step_writer.Perform( doc, TCollection_AsciiString(self.model.ocxfile.stem + '.stp')) return
XCAFDoc_DocumentTool_LayerTool, XCAFDoc_DocumentTool_MaterialTool) from OCC.Core.STEPCAFControl import STEPCAFControl_Reader from OCC.Core.IFSelect import IFSelect_RetDone from OCC.Core.TDF import TDF_LabelSequence from OCC.Display.SimpleGui import init_display filename = '../assets/models/as1_pe_203.stp' _shapes = [] # create an handle to a document doc = TDocStd_Document(TCollection_ExtendedString("pythonocc-doc")) # Get root assembly shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) l_colors = XCAFDoc_DocumentTool_ColorTool(doc.Main()) l_layers = XCAFDoc_DocumentTool_LayerTool(doc.Main()) l_materials = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile(filename) if status == IFSelect_RetDone: step_reader.Transfer(doc) labels = TDF_LabelSequence()
def parse_doc(self): """Generate new part_dict & label_dict. part_dict (dict of dicts) is used primarily for 3D display part_dict = {uid: {'shape': , 'name': , 'color': , 'loc': }} label_dict (dict of dicts) is used primarily for tree view display label_dict = {uid: {'entry': , 'name': , 'parent_uid': , 'ref_entry': , 'is_assy': }} """ # Initialize dictionaries & list self._share_dict = {'0:1:1': 0} # {entry: ser_nbr} self.part_dict = {} self.label_dict = {} # Temporary use during unpacking self.parent_uid_stack = [] # uid of parent (topmost first) self.assy_entry_stack = ['0:1:1'] # [entries of containing assemblies] self.assy_loc_stack = [] # applicable <TopLoc_Location> locations shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(self.doc.Main()) # Find root label of self.doc labels = TDF_LabelSequence() shape_tool.GetShapes(labels) root_label = labels.Value(1) # First label at root nbr = labels.Length() # number of labels at root logger.debug('Number of labels at doc root : %i', nbr) # Get root label information # The first label at root holds an assembly, it is the Top Assy. # Through this label, the entire assembly is accessible. # There is no need to explicitly examine other labels at root. root_name = root_label.GetLabelName() root_entry = root_label.EntryDumpToString() root_uid = self.get_uid_from_entry(root_entry) loc = shape_tool.GetLocation(root_label) # <TopLoc_Location> self.assy_loc_stack.append(loc) self.assy_entry_stack.append(root_entry) self.label_dict = { root_uid: { 'entry': root_entry, 'name': root_name, 'parent_uid': None, 'ref_entry': None, 'is_assy': True } } self.parent_uid_stack.append(root_uid) top_comps = TDF_LabelSequence() # Components of Top Assy subchilds = False is_assy = shape_tool.GetComponents(root_label, top_comps, subchilds) if top_comps.Length(): # if is_assy: logger.debug("") logger.debug("Parsing components of label entry %s)", root_entry) self.parse_components(top_comps, shape_tool, color_tool) else: print("Something is wrong.")
def OCC_read_file(self, filename): ####################################################################### ## HR 14/7/20 ## All python-occ intialisation for 3D view ## Adapted from src/Extend/DataExchange.py script from python-occ, here: ## https://github.com/tpaviot/pythonocc-core # Changed to odict to allow direct mapping to step_dict (see later) output_shapes = odict() # Create an handle to a document doc = TDocStd_Document(TCollection_ExtendedString("pythonocc-doc")) # Get root assembly shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) #layer_tool = XCAFDoc_DocumentTool_LayerTool(doc.Main()) #mat_tool = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) step_reader.SetGDTMode(True) status = step_reader.ReadFile(filename) if status == IFSelect_RetDone: step_reader.Transfer(doc) print('Transfer done') locs = [] def _get_sub_shapes(lab, loc): l_subss = TDF_LabelSequence() shape_tool.GetSubShapes(lab, l_subss) #print("Nb subshapes :", l_subss.Length()) l_comps = TDF_LabelSequence() shape_tool.GetComponents(lab, l_comps) #print("Nb components :", l_comps.Length()) #print() name = lab.GetLabelName() print("Name :", name) if shape_tool.IsAssembly(lab): l_c = TDF_LabelSequence() shape_tool.GetComponents(lab, l_c) for i in range(l_c.Length()): label = l_c.Value(i + 1) if shape_tool.IsReference(label): label_reference = TDF_Label() shape_tool.GetReferredShape(label, label_reference) loc = shape_tool.GetLocation(label) locs.append(loc) _get_sub_shapes(label_reference, loc) locs.pop() elif shape_tool.IsSimpleShape(lab): shape = shape_tool.GetShape(lab) loc = TopLoc_Location() for l in locs: loc = loc.Multiplied(l) c = Quantity_Color(0.5, 0.5, 0.5, Quantity_TOC_RGB) # default color colorSet = False if (color_tool.GetInstanceColor(shape, 0, c) or color_tool.GetInstanceColor(shape, 1, c) or color_tool.GetInstanceColor(shape, 2, c)): color_tool.SetInstanceColor(shape, 0, c) color_tool.SetInstanceColor(shape, 1, c) color_tool.SetInstanceColor(shape, 2, c) colorSet = True n = c.Name(c.Red(), c.Green(), c.Blue()) print(' Instance color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) if not colorSet: if (color_tool.GetColor(lab, 0, c) or color_tool.GetColor(lab, 1, c) or color_tool.GetColor(lab, 2, c)): color_tool.SetInstanceColor(shape, 0, c) color_tool.SetInstanceColor(shape, 1, c) color_tool.SetInstanceColor(shape, 2, c) n = c.Name(c.Red(), c.Green(), c.Blue()) print(' Shape color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) shape_disp = BRepBuilderAPI_Transform( shape, loc.Transformation()).Shape() if not shape_disp in output_shapes: output_shapes[shape_disp] = [lab.GetLabelName(), c] for i in range(l_subss.Length()): lab_subs = l_subss.Value(i + 1) shape_sub = shape_tool.GetShape(lab_subs) c = Quantity_Color(0.5, 0.5, 0.5, Quantity_TOC_RGB) # default color colorSet = False if (color_tool.GetInstanceColor(shape_sub, 0, c) or color_tool.GetInstanceColor(shape_sub, 1, c) or color_tool.GetInstanceColor(shape_sub, 2, c)): color_tool.SetInstanceColor(shape_sub, 0, c) color_tool.SetInstanceColor(shape_sub, 1, c) color_tool.SetInstanceColor(shape_sub, 2, c) colorSet = True n = c.Name(c.Red(), c.Green(), c.Blue()) print(' Instance color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) if not colorSet: if (color_tool.GetColor(lab_subs, 0, c) or color_tool.GetColor(lab_subs, 1, c) or color_tool.GetColor(lab_subs, 2, c)): color_tool.SetInstanceColor(shape, 0, c) color_tool.SetInstanceColor(shape, 1, c) color_tool.SetInstanceColor(shape, 2, c) n = c.Name(c.Red(), c.Green(), c.Blue()) print(' Shape color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) shape_to_disp = BRepBuilderAPI_Transform( shape_sub, loc.Transformation()).Shape() # position the subshape to display if not shape_to_disp in output_shapes: output_shapes[shape_to_disp] = [ lab_subs.GetLabelName(), c ] def _get_shapes(): labels = TDF_LabelSequence() shape_tool.GetFreeShapes(labels) print("Number of shapes at root: ", labels.Length()) for i in range(labels.Length()): root_item = labels.Value(i + 1) print('Root item: ', root_item) _get_sub_shapes(root_item, None) # HR 15/7/20 # # Want to link existing node IDs from create_tree() with OCC # First try: assume file-read order is same for both... # ...and also OCC only gets "simple parts", i.e. leaves... # ...which is corrected for below # # MUST CORRECT IN FUTURE TO BE SINGLE FILE-READ METHOD... # ...FOR BOTH GRAPH AND OCC/SHAPE DATA _get_shapes() self.shapes = output_shapes # return self.output_shapes # Get all TopoDS_Solid objects in OCC dict OCC_list = [ k for k in self.shapes.keys() if type(k) in self.topo_types ] # Get all leaves in step_dict (could also just get list from leaves method) tree_list = [k for k in self.step_dict.keys() if k in self.leaves] # Map master IDs to OCC objects self.OCC_dict = dict(zip(tree_list, OCC_list))
def load_stp_undr_top(self): """Paste step root label under 1st label at self.doc root Add a simple component to the first label at self.doc root. Set the component name to be the name of the step file. Then assign the label of the referred shape to 'targetLabel'. Finally, copy step root label onto 'targetLabel'. This works when copying file 'as1-oc-214.stp' to 0:1:1:2 (n=2) but does not get part color at higher values of n. Also doesn't work with file 'as1_pe_203.stp' loaded at any value of n. ??? """ prompt = 'Select STEP file to import' fnametuple = QFileDialog.getOpenFileName( None, prompt, './', "STEP files (*.stp *.STP *.step)") fname, _ = fnametuple # fname = /path/to/some/filename.ext base = os.path.basename(fname) # filename.ext filename, ext = os.path.splitext(base) logger.debug("Load file name: %s", fname) if not fname: print("Load step cancelled") return # Get the step data tmodel = TreeModel("STEP") step_shape_tool = tmodel.shape_tool step_color_tool = tmodel.color_tool step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile(fname) if status == IFSelect_RetDone: logger.info("Transfer doc to STEPCAFControl_Reader") step_reader.Transfer(tmodel.doc) # Delint tmodel.doc & make new tools step_doc = self.doc_linter(tmodel.doc) step_shape_tool = XCAFDoc_DocumentTool_ShapeTool(step_doc.Main()) step_color_tool = XCAFDoc_DocumentTool_ColorTool(step_doc.Main()) # Get root label of step data step_labels = TDF_LabelSequence() step_shape_tool.GetShapes(step_labels) steprootLabel = step_labels.Value(1) # Make a simple box and add it as a component myBody = BRepPrimAPI_MakeBox(4, 4, 4).Shape() _ = self.addComponent(myBody, filename, Quantity_ColorRGBA()) step_shape_tool.UpdateAssemblies() # Get target label of self.doc labels = TDF_LabelSequence() # labels at root shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(self.doc.Main()) shape_tool.GetShapes(labels) n = labels.Length() # number of labels at root print(n) targetLabel = labels.Value(n) # of ref shape of comp just added # Copy source label to target label self.copy_label(steprootLabel, targetLabel) shape_tool.UpdateAssemblies() # Repair self.doc by cycling through save/load self.doc = self.doc_linter() # Build new self.part_dict & tree view self.parse_doc()
class StepAnalyzer(): """A class that analyzes the structure of an OCAF document.""" def __init__(self, document=None, filename=None): """Supply one or the other: document or STEP filename.""" self.uid = 1 self.indent = 0 self.output = "" self.fname = filename if filename: self.doc = self.read_file(filename) elif document: self.doc = document self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(self.doc.Main()) else: print("Supply one or the other: document or STEP filename.") def read_file(self, fname): """Read STEP file and return <TDocStd_Document>.""" # Create the application, empty document and shape_tool doc = TDocStd_Document(TCollection_ExtendedString("STEP")) app = XCAFApp_Application_GetApplication() app.NewDocument(TCollection_ExtendedString("MDTV-XCAF"), doc) self.shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) self.shape_tool.SetAutoNaming(True) # Read file and return populated doc step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile(fname) if status == IFSelect_RetDone: step_reader.Transfer(doc) return doc def dump(self): """Return assembly structure in indented outline form. Format of lines: Component Name [entry] => Referred Label Name [entry] Components are shown indented w/r/t line above.""" if self.fname: self.output += f"Assembly structure of file: {self.fname}\n\n" else: self.output += "Assembly structure of doc:\n\n" self.indent = 0 # Find root label of step doc labels = TDF_LabelSequence() self.shape_tool.GetShapes(labels) nbr = labels.Length() rootlabel = labels.Value(1) # First label at root # Get information from root label name = rootlabel.GetLabelName() entry = rootlabel.EntryDumpToString() is_assy = self.shape_tool.IsAssembly(rootlabel) if is_assy: # If 1st label at root holds an assembly, it is the Top Assy. # Through this label, the entire assembly is accessible. # There is no need to explicitly examine other labels at root. self.output += f"{self.uid}\t[{entry}] {name}\t" self.uid += 1 self.indent += 2 top_comps = TDF_LabelSequence() # Components of Top Assy subchilds = False is_assy = self.shape_tool.GetComponents(rootlabel, top_comps, subchilds) self.output += f"Number of labels at root = {nbr}\n" if top_comps.Length(): self.find_components(top_comps) return self.output def find_components(self, comps): """Discover components from comps (LabelSequence) of an assembly. Components of an assembly are, by definition, references which refer to either a shape or another assembly. Components are essentially 'instances' of the referred shape or assembly, and carry a location vector specifing the location of the referred shape or assembly. """ for j in range(comps.Length()): c_label = comps.Value(j + 1) # component label <class 'TDF_Label'> c_name = c_label.GetLabelName() c_entry = c_label.EntryDumpToString() ref_label = TDF_Label() # label of referred shape (or assembly) is_ref = self.shape_tool.GetReferredShape(c_label, ref_label) if is_ref: # just in case all components are not references ref_entry = ref_label.EntryDumpToString() ref_name = ref_label.GetLabelName() indent = "\t" * self.indent self.output += f"{self.uid}{indent}[{c_entry}] {c_name}" self.output += f" => [{ref_entry}] {ref_name}\n" self.uid += 1 if self.shape_tool.IsAssembly(ref_label): self.indent += 1 ref_comps = TDF_LabelSequence() # Components of Assy subchilds = False _ = self.shape_tool.GetComponents(ref_label, ref_comps, subchilds) if ref_comps.Length(): self.find_components(ref_comps) self.indent -= 1
from OCC.Display.SimpleGui import init_display filename = '../assets/models/as1_pe_203.stp' _shapes = [] # create an handle to a document h_doc = Handle_TDocStd_Document() # Create the application app = XCAFApp_Application.GetApplication().GetObject() app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), h_doc) # Get root assembly doc = h_doc.GetObject() h_shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) l_colors = XCAFDoc_DocumentTool_ColorTool(doc.Main()) l_layers = XCAFDoc_DocumentTool_LayerTool(doc.Main()) l_materials = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile(filename) if status == IFSelect_RetDone: step_reader.Transfer(doc.GetHandle()) labels = TDF_LabelSequence()
def read_step_file_with_names_colors(filename): """ Returns list of tuples (topods_shape, label, color) Use OCAF. """ if not os.path.isfile(filename): raise FileNotFoundError("%s not found." % filename) # the list: output_shapes = {} # create an handle to a document doc = TDocStd_Document(TCollection_ExtendedString("pythonocc-doc")) # Get root assembly shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) #layer_tool = XCAFDoc_DocumentTool_LayerTool(doc.Main()) #mat_tool = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) step_reader.SetGDTMode(True) status = step_reader.ReadFile(filename) if status == IFSelect_RetDone: step_reader.Transfer(doc) locs = [] def _get_sub_shapes(lab, loc): #global cnt, lvl #cnt += 1 #print("\n[%d] level %d, handling LABEL %s\n" % (cnt, lvl, _get_label_name(lab))) #print() #print(lab.DumpToString()) #print() #print("Is Assembly :", shape_tool.IsAssembly(lab)) #print("Is Free :", shape_tool.IsFree(lab)) #print("Is Shape :", shape_tool.IsShape(lab)) #print("Is Compound :", shape_tool.IsCompound(lab)) #print("Is Component :", shape_tool.IsComponent(lab)) #print("Is SimpleShape :", shape_tool.IsSimpleShape(lab)) #print("Is Reference :", shape_tool.IsReference(lab)) #users = TDF_LabelSequence() #users_cnt = shape_tool.GetUsers(lab, users) #print("Nr Users :", users_cnt) l_subss = TDF_LabelSequence() shape_tool.GetSubShapes(lab, l_subss) #print("Nb subshapes :", l_subss.Length()) l_comps = TDF_LabelSequence() shape_tool.GetComponents(lab, l_comps) #print("Nb components :", l_comps.Length()) #print() name = lab.GetLabelName() print("Name :", name) if shape_tool.IsAssembly(lab): l_c = TDF_LabelSequence() shape_tool.GetComponents(lab, l_c) for i in range(l_c.Length()): label = l_c.Value(i + 1) if shape_tool.IsReference(label): #print("\n######## reference label :", label) label_reference = TDF_Label() shape_tool.GetReferredShape(label, label_reference) loc = shape_tool.GetLocation(label) #print(" loc :", loc) #trans = loc.Transformation() #print(" tran form :", trans.Form()) #rot = trans.GetRotation() #print(" rotation :", rot) #print(" X :", rot.X()) #print(" Y :", rot.Y()) #print(" Z :", rot.Z()) #print(" W :", rot.W()) #tran = trans.TranslationPart() #print(" translation :", tran) #print(" X :", tran.X()) #print(" Y :", tran.Y()) #print(" Z :", tran.Z()) locs.append(loc) #print(">>>>") #lvl += 1 _get_sub_shapes(label_reference, loc) #lvl -= 1 #print("<<<<") locs.pop() elif shape_tool.IsSimpleShape(lab): #print("\n######## simpleshape label :", lab) shape = shape_tool.GetShape(lab) #print(" all ass locs :", locs) loc = TopLoc_Location() for l in locs: #print(" take loc :", l) loc = loc.Multiplied(l) #trans = loc.Transformation() #print(" FINAL loc :") #print(" tran form :", trans.Form()) #rot = trans.GetRotation() #print(" rotation :", rot) #print(" X :", rot.X()) #print(" Y :", rot.Y()) #print(" Z :", rot.Z()) #print(" W :", rot.W()) #tran = trans.TranslationPart() #print(" translation :", tran) #print(" X :", tran.X()) #print(" Y :", tran.Y()) #print(" Z :", tran.Z()) c = Quantity_Color(0.5, 0.5, 0.5, Quantity_TOC_RGB) # default color colorSet = False if (color_tool.GetInstanceColor(shape, 0, c) or color_tool.GetInstanceColor(shape, 1, c) or color_tool.GetInstanceColor(shape, 2, c)): color_tool.SetInstanceColor(shape, 0, c) color_tool.SetInstanceColor(shape, 1, c) color_tool.SetInstanceColor(shape, 2, c) colorSet = True n = c.Name(c.Red(), c.Green(), c.Blue()) print(' instance color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) if not colorSet: if (color_tool.GetColor(lab, 0, c) or color_tool.GetColor(lab, 1, c) or color_tool.GetColor(lab, 2, c)): color_tool.SetInstanceColor(shape, 0, c) color_tool.SetInstanceColor(shape, 1, c) color_tool.SetInstanceColor(shape, 2, c) n = c.Name(c.Red(), c.Green(), c.Blue()) print(' shape color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) shape_disp = BRepBuilderAPI_Transform( shape, loc.Transformation()).Shape() if not shape_disp in output_shapes: output_shapes[shape_disp] = [lab.GetLabelName(), c] for i in range(l_subss.Length()): lab_subs = l_subss.Value(i + 1) #print("\n######## simpleshape subshape label :", lab) shape_sub = shape_tool.GetShape(lab_subs) c = Quantity_Color(0.5, 0.5, 0.5, Quantity_TOC_RGB) # default color colorSet = False if (color_tool.GetInstanceColor(shape_sub, 0, c) or color_tool.GetInstanceColor(shape_sub, 1, c) or color_tool.GetInstanceColor(shape_sub, 2, c)): color_tool.SetInstanceColor(shape_sub, 0, c) color_tool.SetInstanceColor(shape_sub, 1, c) color_tool.SetInstanceColor(shape_sub, 2, c) colorSet = True n = c.Name(c.Red(), c.Green(), c.Blue()) print(' instance color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) if not colorSet: if (color_tool.GetColor(lab_subs, 0, c) or color_tool.GetColor(lab_subs, 1, c) or color_tool.GetColor(lab_subs, 2, c)): color_tool.SetInstanceColor(shape, 0, c) color_tool.SetInstanceColor(shape, 1, c) color_tool.SetInstanceColor(shape, 2, c) n = c.Name(c.Red(), c.Green(), c.Blue()) print(' shape color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) shape_to_disp = BRepBuilderAPI_Transform( shape_sub, loc.Transformation()).Shape() # position the subshape to display if not shape_to_disp in output_shapes: output_shapes[shape_to_disp] = [lab_subs.GetLabelName(), c] def _get_shapes(): labels = TDF_LabelSequence() shape_tool.GetFreeShapes(labels) #global cnt #cnt += 1 print() print("Number of shapes at root :", labels.Length()) print() for i in range(labels.Length()): root_item = labels.Value(i + 1) _get_sub_shapes(root_item, None) _get_shapes() return output_shapes
def read_step_file_with_names_colors(filename): """ Returns list of tuples (topods_shape, label, color) Use OCAF. """ # the list: output_shapes = [] # create an handle to a document doc = TDocStd_Document(TCollection_ExtendedString("pythonocc-doc")) # Get root assembly shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) #layer_tool = XCAFDoc_DocumentTool_LayerTool(doc.Main()) #mat_tool = XCAFDoc_DocumentTool_MaterialTool(doc.Main()) step_reader = STEPCAFControl_Reader() step_reader.SetColorMode(True) step_reader.SetLayerMode(True) step_reader.SetNameMode(True) step_reader.SetMatMode(True) status = step_reader.ReadFile(filename) if status == IFSelect_RetDone: step_reader.Transfer(doc) shape_tool.SetAutoNaming(True) #lvl = 0 locs = [] #cnt = 0 def _get_label_name(lab): entry = TCollection_AsciiString() TDF_Tool.Entry(lab, entry) n = TDataStd_Name() lab.FindAttribute(TDataStd_Name_GetID(), n) if n: return n.Get().PrintToString() return "No Name" def _get_sub_shapes(lab, loc): #global cnt, lvl #cnt += 1 #print("\n[%d] level %d, handling LABEL %s\n" % (cnt, lvl, _get_label_name(lab))) #print() #print(lab.DumpToString()) #print() #print("Is Assembly :", shape_tool.IsAssembly(lab)) #print("Is Free :", shape_tool.IsFree(lab)) #print("Is Shape :", shape_tool.IsShape(lab)) #print("Is Compound :", shape_tool.IsCompound(lab)) #print("Is Component :", shape_tool.IsComponent(lab)) #print("Is SimpleShape :", shape_tool.IsSimpleShape(lab)) #print("Is Reference :", shape_tool.IsReference(lab)) #users = TDF_LabelSequence() #users_cnt = shape_tool.GetUsers(lab, users) #print("Nr Users :", users_cnt) l_subss = TDF_LabelSequence() shape_tool.GetSubShapes(lab, l_subss) #print("Nb subshapes :", l_subss.Length()) l_comps = TDF_LabelSequence() shape_tool.GetComponents(lab, l_comps) #print("Nb components :", l_comps.Length()) #print() if shape_tool.IsAssembly(lab): l_c = TDF_LabelSequence() shape_tool.GetComponents(lab, l_c) for i in range(l_c.Length()): label = l_c.Value(i + 1) if shape_tool.IsReference(label): #print("\n######## reference label :", label) label_reference = TDF_Label() shape_tool.GetReferredShape(label, label_reference) loc = shape_tool.GetLocation(label) #print(" loc :", loc) #trans = loc.Transformation() #print(" tran form :", trans.Form()) #rot = trans.GetRotation() #print(" rotation :", rot) #print(" X :", rot.X()) #print(" Y :", rot.Y()) #print(" Z :", rot.Z()) #print(" W :", rot.W()) #tran = trans.TranslationPart() #print(" translation :", tran) #print(" X :", tran.X()) #print(" Y :", tran.Y()) #print(" Z :", tran.Z()) locs.append(loc) #print(">>>>") #lvl += 1 _get_sub_shapes(label_reference, loc) #lvl -= 1 #print("<<<<") locs.pop() elif shape_tool.IsSimpleShape(lab): #print("\n######## simpleshape label :", lab) shape = shape_tool.GetShape(lab) #print(" all ass locs :", locs) loc = TopLoc_Location() for i in range(len(locs)): #print(" take loc :", locs[i]) loc = loc.Multiplied(locs[i]) #trans = loc.Transformation() #print(" FINAL loc :") #print(" tran form :", trans.Form()) #rot = trans.GetRotation() #print(" rotation :", rot) #print(" X :", rot.X()) #print(" Y :", rot.Y()) #print(" Z :", rot.Z()) #print(" W :", rot.W()) #tran = trans.TranslationPart() #print(" translation :", tran) #print(" X :", tran.X()) #print(" Y :", tran.Y()) #print(" Z :", tran.Z()) shape = BRepBuilderAPI_Transform(shape, loc.Transformation()).Shape() c = Quantity_Color() # colorSet = False # if (color_tool.GetInstanceColor(shape, 0, c) or # color_tool.GetInstanceColor(shape, 1, c) or # color_tool.GetInstanceColor(shape, 2, c)): # for i in (0, 1, 2): # color_tool.SetInstanceColor(shape, i, c) # colorSet = True # n = c.Name(c.Red(), c.Green(), c.Blue()) # #print(' instance color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) # if not colorSet: color_tool.GetColor(lab, 0, c) color_tool.GetColor(lab, 1, c) color_tool.GetColor(lab, 2, c) #for i in (0, 1, 2): # color_tool.SetInstanceColor(shape, i, c) #n = c.Name(c.Red(), c.Green(), c.Blue()) #print(' shape color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) # for i in range(l_subss.Length()): # lab = l_subss.Value(i+1) # print("\n######## simpleshape subshape label :", lab) # shape_sub = shape_tool.GetShape(lab) # c = Quantity_Color() # colorSet = False # if (color_tool.GetInstanceColor(shape_sub, 0, c) or # color_tool.GetInstanceColor(shape_sub, 1, c) or # color_tool.GetInstanceColor(shape_sub, 2, c)): # for i in (0, 1, 2): # color_tool.SetInstanceColor(shape_sub, i, c) # colorSet = True # n = c.Name(c.Red(), c.Green(), c.Blue()) # #print(' instance color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) # if not colorSet: # if (color_tool.GetColor(lab, 0, c) or # color_tool.GetColor(lab, 1, c) or # color_tool.GetColor(lab, 2, c)): # for i in (0, 1, 2): # color_tool.SetInstanceColor(shape, i, c) # n = c.Name(c.Red(), c.Green(), c.Blue()) # #print(' shape color Name & RGB: ', c, n, c.Red(), c.Green(), c.Blue()) output_shapes.append([shape, _get_label_name(lab), c]) def _get_shapes(): labels = TDF_LabelSequence() shape_tool.GetFreeShapes(labels) #global cnt #cnt += 1 print() print("Number of shapes at root :", labels.Length()) print() root = labels.Value(1) _get_sub_shapes(root, None) _get_shapes() return output_shapes