def update_shape(self, change=None): d = self.declaration edges = TopTools_ListOfShape() wires = [] for c in self.children(): if not isinstance(c, OccShape): continue if c.shape is None: raise ValueError("Cannot build wire from empty shape: %s" % c) self.extract_edges(c, edges) else: for edge in d.edges: if isinstance(edge, TopoDS_Edge): edges.Append(edge) else: wires.append(edge) builder = BRepBuilderAPI_MakeWire() builder.Add(edges) for w in wires: builder.Add(w) if not builder.IsDone(): log.warning('Edges must be connected %s' % d) wire = builder.Wire() if d.reverse: wire.Reverse() self.curve = BRepAdaptor_CompCurve(wire) self.shape = wire
def _loop_topo(self, edges=True): if self.done: self._reinitialize() topologyType = topods_Edge if edges else topods_Vertex seq = [] hashes = [] # list that stores hashes to avoid redundancy occ_seq = TopTools_ListOfShape() while self.wire_explorer.More(): # loop edges if edges: current_item = self.wire_explorer.Current() # loop vertices else: current_item = self.wire_explorer.CurrentVertex() current_item_hash = current_item.__hash__() if not current_item_hash in hashes: hashes.append(current_item_hash) occ_seq.Append(current_item) self.wire_explorer.Next() # Convert occ_seq to python list occ_iterator = TopTools_ListIteratorOfListOfShape(occ_seq) while occ_iterator.More(): topo_to_add = topologyType(occ_iterator.Value()) seq.append(topo_to_add) occ_iterator.Next() self.done = True return iter(seq)
def to_TopTools_ListOfShape(shapes): """ Create TopTools_ListOfShape from a list of shapes. :param list(OCCT.TopoDS.TopoDS_Shape) shapes: List of shapes. :return: TopTools_ListOfShape :rtype: OCCT.TopTools.TopTools_ListOfShape """ lst = TopTools_ListOfShape() for s in shapes: lst.Append(s) return lst
def thick_solid(event=None): S = BRepPrimAPI_MakeBox(150, 200, 110).Shape() topo = TopologyExplorer(S) vert = next(topo.vertices()) shapes = TopTools_ListOfShape() for f in topo.faces_from_vertex(vert): shapes.Append(f) _thick_solid = BRepOffsetAPI_MakeThickSolid(S, shapes, 15, 0.01) display.EraseAll() display.DisplayShape(_thick_solid.Shape()) display.FitAll()
def update_shape(self, change=None): splitter = BOPAlgo_Splitter() d = self.declaration tools = TopTools_ListOfShape() if d.shape1: shape = d.shape1 splitter.AddArgument(shape) else: shape = None if d.shape2: tools.Append(d.shape2) for c in self.children(): if shape: tools.Append(c.shape) else: shape = c.shape splitter.AddArgument(shape) splitter.SetTools(tools) splitter.Perform() if splitter.HasErrors(): raise ValueError("Could not split shape %s" % d) self.shape = splitter.Shape()
def update_shape(self, change=None): d = self.declaration shape = self.get_shape_to_offset() faces = TopTools_ListOfShape() for f in self.get_faces(shape): faces.Append(f) assert not faces.IsEmpty() offset_mode = self.offset_modes[d.offset_mode] join_type = self.join_types[d.join_type] thick_solid = BRepOffsetAPI_MakeThickSolid() thick_solid.MakeThickSolidByJoin( shape, faces, d.offset, d.tolerance, offset_mode, d.intersection, False, join_type, ) self.shape = thick_solid.Shape()
def _loop_topo(self, edges=True): wexp = self.wire_explorer = BRepTools_WireExplorer(self.wire) items = set() # list that stores hashes to avoid redundancy occ_seq = TopTools_ListOfShape() get_current = wexp.Current if edges else wexp.CurrentVertex while wexp.More(): current_item = get_current() if current_item not in items: items.add(current_item) occ_seq.Append(current_item) wexp.Next() # Convert occ_seq to python list seq = [] topology_type = TopoDS.Edge_ if edges else TopoDS.Vertex_ occ_iterator = TopTools_ListIteratorOfListOfShape(occ_seq) while occ_iterator.More(): topo_to_add = topology_type(occ_iterator.Value()) seq.append(topo_to_add) occ_iterator.Next() return seq
from OCCT.BOPAlgo import BOPAlgo_Options from OCCT.BRepAlgoAPI import BRepAlgoAPI_Fuse from OCCT.TopTools import TopTools_ListOfShape from OCCT.Exchange import ExchangeBasic from OCCT.Visualization import BasicViewer fn = './models/wing_assy.brep' wing_assy = ExchangeBasic.read_brep(fn) fn = './models/fuse_assy.brep' fuse_assy = ExchangeBasic.read_brep(fn) BOPAlgo_Options.SetParallelMode_(True) bop = BRepAlgoAPI_Fuse() args = TopTools_ListOfShape() args.Append(wing_assy) bop.SetArguments(args) tools = TopTools_ListOfShape() tools.Append(fuse_assy) bop.SetTools(tools) print('Starting fuse...') start = time.time() bop.Build() print('Complete in ', time.time() - start, ' seconds.') v = BasicViewer() v.add(bop.Shape()) v.start()
def _loop_topo(self, topologyType, topologicalEntity=None, topologyTypeToAvoid=None): ''' this could be a faces generator for a python TopoShape class that way you can just do: for face in srf.faces: processFace(face) ''' topoTypes = { TopAbs_VERTEX: TopoDS_Vertex, TopAbs_EDGE: TopoDS_Edge, TopAbs_FACE: TopoDS_Face, TopAbs_WIRE: TopoDS_Wire, TopAbs_SHELL: TopoDS_Shell, TopAbs_SOLID: TopoDS_Solid, TopAbs_COMPOUND: TopoDS_Compound, TopAbs_COMPSOLID: TopoDS_CompSolid } assert topologyType in topoTypes.keys(), '%s not one of %s' % ( topologyType, topoTypes.keys()) self.topExp = TopExp_Explorer() # use self.myShape if nothing is specified if topologicalEntity is None and topologyTypeToAvoid is None: self.topExp.Init(self.myShape, topologyType) elif topologicalEntity is None and topologyTypeToAvoid is not None: self.topExp.Init(self.myShape, topologyType, topologyTypeToAvoid) elif topologyTypeToAvoid is None: self.topExp.Init(topologicalEntity, topologyType) elif topologyTypeToAvoid: self.topExp.Init(topologicalEntity, topologyType, topologyTypeToAvoid) seq = [] hashes = [] # list that stores hashes to avoid redundancy occ_seq = TopTools_ListOfShape() while self.topExp.More(): current_item = self.topExp.Current() current_item_hash = current_item.__hash__() if not current_item_hash in hashes: hashes.append(current_item_hash) occ_seq.Append(current_item) self.topExp.Next() # Convert occ_seq to python list occ_iterator = TopTools_ListIteratorOfListOfShape(occ_seq) while occ_iterator.More(): topo_to_add = self.topoFactory[topologyType](occ_iterator.Value()) seq.append(topo_to_add) occ_iterator.Next() if self.ignore_orientation: # filter out those entities that share the same TShape # but do *not* share the same orientation filter_orientation_seq = [] for i in seq: _present = False for j in filter_orientation_seq: if i.IsSame(j): _present = True break if _present is False: filter_orientation_seq.append(i) return filter_orientation_seq else: return iter(seq)
def _loop_topo(self, topology_type, topological_entity=None, topology_type_to_avoid=None): """ this could be a faces generator for a python TopoShape class that way you can just do: for face in srf.faces: processFace(face) """ allowed_types = self.topo_types.keys() if topology_type not in allowed_types: raise TypeError('%s not one of %s' % (topology_type, allowed_types)) shape = self.shape if shape is None: return [] topo_exp = TopExp_Explorer() # use self.myShape if nothing is specified if topological_entity is None and topology_type_to_avoid is None: topo_exp.Init(shape, topology_type) elif topological_entity is None and topology_type_to_avoid is not None: topo_exp.Init(shape, topology_type, topology_type_to_avoid) elif topology_type_to_avoid is None: topo_exp.Init(topological_entity, topology_type) elif topology_type_to_avoid: topo_exp.Init(topological_entity, topology_type, topology_type_to_avoid) items = set() # list that stores hashes to avoid redundancy occ_seq = TopTools_ListOfShape() while topo_exp.More(): current_item = topo_exp.Current() if current_item not in items: items.add(current_item) occ_seq.Append(current_item) topo_exp.Next() # Convert occ_seq to python list seq = [] factory = self.topo_factory[topology_type] occ_iterator = TopTools_ListIteratorOfListOfShape(occ_seq) while occ_iterator.More(): topo_to_add = factory(occ_iterator.Value()) seq.append(topo_to_add) occ_iterator.Next() if not self.ignore_orientation: return seq # else filter out those entities that share the same TShape # but do *not* share the same orientation filter_orientation_seq = [] for i in seq: present = False for j in filter_orientation_seq: if i.IsSame(j): present = True break if present is False: filter_orientation_seq.append(i) return filter_orientation_seq
while aFaceExplorer.More(): aFace = topods.Face(aFaceExplorer.Current()) if face_is_plane(aFace): aPlane = geom_plane_from_face(aFace) # We want the highest Z face, so compare this to the previous faces aPnt = aPlane.Location() aZ = aPnt.Z() if aZ > zMax: zMax = aZ faceToRemove = aFace aFaceExplorer.Next() facesToRemove = TopTools_ListOfShape() facesToRemove.Append(faceToRemove) myBody = BRepOffsetAPI_MakeThickSolid(myBody.Shape(), facesToRemove, -thickness / 50.0, 0.001) # Set up our surfaces for the threading on the neck neckAx2_Ax3 = gp_Ax3(neckLocation, gp_DZ()) aCyl1 = Geom_CylindricalSurface(neckAx2_Ax3, myNeckRadius * 0.99) aCyl2 = Geom_CylindricalSurface(neckAx2_Ax3, myNeckRadius * 1.05) # Set up the curves for the threads on the bottle's neck aPnt = gp_Pnt2d(2.0 * math.pi, myNeckHeight / 2.0) aDir = gp_Dir2d(2.0 * math.pi, myNeckHeight / 4.0) anAx2d = gp_Ax2d(aPnt, aDir) aMajor = 2.0 * math.pi