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 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_read_step_file(self) -> None: """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 __init__(self, binary=True): if binary: self._fmt = 'BinXCAF' self._ext = '.xbf' else: self._fmt = 'XmlXCAF' self._ext = '.xml' # Get application self._app = XCAFApp_Application.GetApplication() if binary: binxcafdrivers.DefineFormat(self._app) else: xmlxcafdrivers.DefineFormat(self._app) # Initialize document fmt = TCollection_ExtendedString(self._fmt) self._doc = TDocStd_Document(fmt) self._app.InitDocument(self._doc) # Exchange data self._shape = None self._step_writer = None self._step_fp = None self._init_tool()
def test_write_step_file(self) -> None: """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.0, 100.0, 100.0).Shape() ### add shape shp_label = shape_tool.AddShape(test_shape) ### set a color for this shape r = 1.0 g = b = 0.5 red_color = Quantity_Color(r, g, b, Quantity_TypeOfColor.Quantity_TOC_RGB) 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 __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, 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 = []
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)
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 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 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
def test_create_doc(self) -> None: """Creates an OCAF app and an empty document""" # create an handle to a document doc = TDocStd_Document(TCollection_ExtendedString("MDTV-CAF")) self.assertFalse(doc is None)
from OCC.Core.XCAFDoc import (XCAFDoc_ShapeTool, XCAFDoc_ColorTool, XCAFDoc_LayerTool, XCAFDoc_MaterialTool) from OCC.Core.STEPCAFControl import STEPCAFControl_Reader from OCC.Core.IFSelect import IFSelect_RetDone from OCC.Core.TDF import TDF_LabelSequence, TDF_Label, TDF_Tool from OCC.Core.TDataStd import TDataStd_Name, TDataStd_Name_GetID from OCC.Core.TCollection import TCollection_ExtendedString, TCollection_AsciiString from OCC.Core.Quantity import Quantity_Color from OCC.Core.TopLoc import TopLoc_Location from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_Transform from OCC.Display.SimpleGui import init_display filename = './models/as1-oc-214.stp' # 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()) 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)
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
def test_create_doc(self): ''' Creates an OCAF app and an empty document ''' # create an handle to a document doc = TDocStd_Document(TCollection_ExtendedString("MDTV-CAF")) self.assertFalse(doc.IsNull())
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))
class XdeDocument(object): """ Wrapper class to work with Extended Data Exchange. :param bool binary: If *True*, the document will be saved in a binary format. If *False*, the document will be saved in an XML format. """ def __init__(self, binary=True): if binary: self._fmt = 'BinXCAF' self._ext = '.xbf' else: self._fmt = 'XmlXCAF' self._ext = '.xml' # Get application self._app = XCAFApp_Application.GetApplication() if binary: binxcafdrivers.DefineFormat(self._app) else: xmlxcafdrivers.DefineFormat(self._app) # Initialize document fmt = TCollection_ExtendedString(self._fmt) self._doc = TDocStd_Document(fmt) self._app.InitDocument(self._doc) # Exchange data self._shape = None self._step_writer = None self._step_fp = None self._init_tool() def _init_tool(self): self._tool = XCAFDoc_DocumentTool.ShapeTool(self._doc.Main()) @property def main_label(self): """ :return: The main label of the document. :rtype: afem.exchange.xde.XdeLabel """ return XdeLabel(self._doc.Main()) @property def shapes_label(self): """ :return: The shapes label of the document. :rtype: afem.exchange.xde.XdeLabel """ return XdeLabel(XCAFDoc_DocumentTool.ShapesLabel_(self._doc.Main())) def open(self, fn): """ Open a document. :param str fn: The filename. :return: *True* if opened, *False* if not. :rtype: bool """ if not fn.endswith(self._ext): fn += self._ext txt = TCollection_ExtendedString(fn) status, self._doc = self._app.Open(txt, self._doc) if status != PCDM_RS_OK: return False self._init_tool() return True def save_as(self, fn): """ Save the document. :param str fn: The filename. :return: *True* if sucessfully saved, *False* if not. :rtype: bool """ if not fn.endswith(self._ext): fn += self._ext txt = TCollection_ExtendedString(fn) status = self._app.SaveAs(self._doc, txt) return status == PCDM_SS_OK def close(self): """ Close the document. :return: None. """ self._doc.Close() def read_step(self, fn): """ Read and translate a STEP file. :param str fn: The filename. :return: The shapes label. :rtype: afem.exchange.xde.Label. :raise RuntimeError: If the file cannot be read. """ reader = STEPCAFControl_Reader() reader.SetNameMode(True) reader.SetColorMode(True) status = reader.Perform(fn, self._doc) if not status: raise RuntimeError("Error reading STEP file.") self._shape = Shape.wrap(reader.Reader().OneShape()) label = XCAFDoc_DocumentTool.ShapesLabel_(self._doc.Main()) return XdeLabel(label) def transfer_step(self, schema='AP203', units=None): """ Transfer the document in preparation for STEP export. :param str schema: Schema for STEP file ('AP203', or 'AP214'). :param units: Units to convert STEP file to. :type units: str or None :return: *True* if transferred, *False* otherwise. :rtype: bool """ self._step_writer = STEPCAFControl_Writer() self._step_writer.SetNameMode(True) self._step_writer.SetColorMode(True) Interface_Static.SetCVal('write.step.schema', schema) try: units = units_dict[units] except KeyError: units = Settings.units Interface_Static.SetCVal('write.step.unit', units) self._step_writer.Transfer(self._doc) tw = self._step_writer.ChangeWriter().WS().TransferWriter() self._step_fp = tw.FinderProcess() return True def set_shape_name(self, shape, name): """ Set the name of the STEP entity for the given shape. The shape(s) should be transferred before naming them. :param afem.topology.entities.Shape shape: The shape (or sub-shape). :param str name: The name. :return: *True* if name is set, *False* otherwise. :rtype: bool """ if self._step_writer is None: raise RuntimeError('Document has not been transferred.') item = stepconstruct.FindEntity(self._step_fp, shape.object) if not item: return False item.SetName(TCollection_HAsciiString(name)) return True def write_step(self, fn, schema='AP203', units=None): """ Write the document to a STEP file. :param str fn: The filename. :param str schema: Schema for STEP file ('AP203', or 'AP214'). :param units: Units to convert STEP file to. :type units: str or None :return: *True* if written successfully, *False* otherwise. """ if self._step_writer is None: self.transfer_step(schema, units) status = self._step_writer.Write(fn) return int(status) < int(IFSelect_RetError) def is_top_level(self, label): """ Check if label is top-level as opposed to a component of assembly or a sub-shape. :param afem.exchange.xde.XdeLabel label: The label :return: *True* if top-level, *False* otherwise. :rtype: bool """ return self._tool.IsTopLevel(label.object) def is_sub_shape(self, label, shape): """ Check if the shape is a sub-shape of the shape stored on the label. :param afem.exchange.xde.XdeLabel label: The label :param afem.topology.entities.Shape shape: The shape. :return: *True* if a sub-shape, *False* otherwise. :rtype: bool """ return self._tool.IsSubShape(label.object, shape.object) def find_shape(self, shape, find_instance=False): """ Find the label corresponding to the shape. This method searches only top-level shapes. :param afem.topology.entities.Shape shape: The shape. :param bool find_instance: If *False*, search for the non-located shape in an assembly. If *True*, search for the shape with the same location. :return: The shape label if found, *None* otherwise. :rtype: afem.exchange.xde.XdeLabel """ label = self._tool.FindShape(shape.object, find_instance) if not label: return None return XdeLabel(label) def new_shape(self): """ Create a new top-level label. :return: The label. :rtype: afem.exchange.xde.XdeLabel """ return XdeLabel(self._tool.NewShape()) def set_shape(self, label, shape): """ Set the shape of the top-level label. :param afem.exchange.xde.XdeLabel label: The label. :param afem.topology.entities.Shape shape: The shape. :return: None. """ self._tool.SetShape(label.object, shape.object) def add_shape(self, shape, name=None, make_assy=True): """ Add a new top-level shape. :param afem.topology.entities.Shape shape: The shape. :param str name: The label name. :param bool make_assy: If *True*, then treat compounds as assemblies. :return: The shape label. :rtype: afem.exchange.xde.XdeLabel """ label = XdeLabel(self._tool.AddShape(shape.object, make_assy)) if name is not None: label.set_name(name) return label def remove_shape(self, label, remove_completely=True): """ Remove a shape. :param afem.exchange.xde.XdeLabel label: The label. :param bool remove_completely: If *True*, removes all shapes. If *False*, only remove the shape with the same location. :return: *True* if removed, or *False* if not removed because it is not a free or top-level shape. :rtype: bool """ return self._tool.RemoveShape(label.object, remove_completely) def get_shapes(self): """ Get a list containing all top-level shapes. :return: List of top-level shapes. :rtype: list(afem.exchange.xde.XdeLabel) """ labels = TDF_LabelSequence() self._tool.GetShapes(labels) return [XdeLabel(label) for label in labels] def get_shape_by_name(self, name): """ Get a shape label by its name. This only applies to top-level shapes and will return the first match. :param str name: The name. :return: The label or *None* if not found. :rtype: afem.exchange.xde.XdeLabel or None """ for label in self.get_shapes(): if label.name == name: return label def find_subshape(self, label, shape): """ Find a label for the sub-shape stored on the given label. :param afem.exchange.xde.XdeLabel label: The label. :param afem.topology.entities.Shape shape: The sub-shape. :return: The sub-shape label if found, *None* otherwise. :rtype: afem.exchange.xde.XdeLabel or None """ sub_label = TDF_Label() status, sub_label = self._tool.FindSubShape(label.object, shape.object, sub_label) if not status: return None return XdeLabel(sub_label) def add_subshape(self, label, shape, name=None): """ Add a label for a sub-shape stored on the shape of the label. :param afem.exchange.xde.XdeLabel label: The label. :param afem.topology.entities.Shape shape: The sub-shape. :param str name: The name of the sub-shape label. :return: The sub-shape label. :rtype: afem.exchange.xde.XdeLabel """ label = XdeLabel(self._tool.AddSubShape(label.object, shape.object)) if name is None: return label label.set_name(name) return label def set_auto_naming(self, mode): """ Set the option to auto-name shape labels. This only applies to top-level shapes. :param bool mode: The mode. If *True*, added shapes are automatically named based on their type (e.g., "SOLID", "SHELL", etc.). :return: None. """ self._tool.SetAutoNaming_(mode)
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
from OCC.Core.XCAFApp import XCAFApp_Application from OCC.Core.XCAFDoc import (XCAFDoc_DocumentTool_ShapeTool, XCAFDoc_DocumentTool_ColorTool, 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:
def read_file(self): """Build self.tree (treelib.Tree()) containing CAD data read from a step file. Each node of self.tree contains the following: (Name, UID, ParentUID, {Data}) where the Data keys are: 'a' (isAssy?), 'l' (TopLoc_Location), 'c' (Quantity_Color), 's' (TopoDS_Shape) """ logger.info("Reading STEP file") doc = TDocStd_Document(TCollection_ExtendedString("STEP")) # Create the application app = XCAFApp_Application_GetApplication() app.NewDocument(TCollection_ExtendedString("MDTV-CAF"), doc) # Get root shapes shape_tool = XCAFDoc_DocumentTool_ShapeTool(doc.Main()) shape_tool.SetAutoNaming(True) self.color_tool = XCAFDoc_DocumentTool_ColorTool(doc.Main()) layer_tool = 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(self.filename) if status == IFSelect_RetDone: logger.info("Transfer doc to STEPCAFControl_Reader") step_reader.Transfer(doc) # Test round trip by writing doc back to another file. logger.info("Doing a 'short-circuit' Round Trip test") doctype = type(doc) # <class 'OCC.Core.TDocStd.TDocStd_Document'> logger.info(f"Writing {doctype} back to another STEP file") self.testRTStep(doc) # Save doc to file (for educational purposes) (not working yet) logger.debug("Saving doc to file") savefilename = TCollection_ExtendedString('../doc.txt') app.SaveAs(doc, savefilename) labels = TDF_LabelSequence() color_labels = TDF_LabelSequence() shape_tool.GetShapes(labels) self.shape_tool = shape_tool logger.info('Number of labels at root : %i' % labels.Length()) try: label = labels.Value(1) # First label at root except RuntimeError: return name = self.getName(label) logger.info('Name of root label: %s' % name) isAssy = shape_tool.IsAssembly(label) logger.info("First label at root holds an assembly? %s" % isAssy) if isAssy: # If first label at root holds an assembly, it is the Top Assembly. # Through this label, the entire assembly is accessible. # No need to examine other labels at root explicitly. topLoc = TopLoc_Location() topLoc = shape_tool.GetLocation(label) self.assyLocStack.append(topLoc) entry = label.EntryDumpToString() logger.debug("Entry: %s" % entry) logger.debug("Top assy name: %s" % name) # Create root node for top assy newAssyUID = self.getNewUID() self.tree.create_node(name, newAssyUID, None, { 'a': True, 'l': None, 'c': None, 's': None }) self.assyUidStack.append(newAssyUID) topComps = TDF_LabelSequence() # Components of Top Assy subchilds = False isAssy = shape_tool.GetComponents(label, topComps, subchilds) logger.debug("Is Assembly? %s" % isAssy) logger.debug("Number of components: %s" % topComps.Length()) logger.debug("Is Reference? %s" % shape_tool.IsReference(label)) if topComps.Length(): self.findComponents(label, topComps) else: # Labels at root can hold solids or compounds (which are 'crude' assemblies) # Either way, we will need to create a root node in self.tree newAssyUID = self.getNewUID() self.tree.create_node(os.path.basename(self.filename), newAssyUID, None, { 'a': True, 'l': None, 'c': None, 's': None }) self.assyUidStack = [newAssyUID] for j in range(labels.Length()): label = labels.Value(j + 1) name = self.getName(label) isAssy = shape_tool.IsAssembly(label) logger.debug("Label %i is assembly?: %s" % (j + 1, isAssy)) shape = shape_tool.GetShape(label) color = self.getColor(shape) isSimpleShape = self.shape_tool.IsSimpleShape(label) logger.debug("Is Simple Shape? %s" % isSimpleShape) shapeType = shape.ShapeType() logger.debug("The shape type is: %i" % shapeType) if shapeType == 0: logger.debug( "The shape type is OCC.Core.TopAbs.TopAbs_COMPOUND") topo = TopologyExplorer(shape) #topo = aocutils.topology.Topo(shape) logger.debug("Nb of compounds : %i" % topo.number_of_compounds()) logger.debug("Nb of solids : %i" % topo.number_of_solids()) logger.debug("Nb of shells : %i" % topo.number_of_shells()) newAssyUID = self.getNewUID() for i, solid in enumerate(topo.solids()): name = "P%s" % str(i + 1) self.tree.create_node(name, self.getNewUID(), self.assyUidStack[-1], { 'a': False, 'l': None, 'c': color, 's': solid }) elif shapeType == 2: logger.debug( "The shape type is OCC.Core.TopAbs.TopAbs_SOLID") self.tree.create_node(name, self.getNewUID(), self.assyUidStack[-1], { 'a': False, 'l': None, 'c': color, 's': shape }) elif shapeType == 3: logger.debug( "The shape type is OCC.Core.TopAbs.TopAbs_SHELL") self.tree.create_node(name, self.getNewUID(), self.assyUidStack[-1], { 'a': False, 'l': None, 'c': color, 's': shape }) return True