def write_edge(points_edge, topo_edge): """ Method to recreate an Edge associated to a geometric curve after the modification of its points. :param points_edge: the deformed points array. :param topo_edge: the Edge to be modified :return: Edge (Shape) :rtype: TopoDS_Edge """ # convert Edge to Geom B-spline Curve nurbs_converter = BRepBuilderAPI_NurbsConvert(topo_edge) nurbs_converter.Perform(topo_edge) nurbs_curve = nurbs_converter.Shape() topo_curve = topods_Edge(nurbs_curve) h_geomcurve = BRep_Tool.Curve(topo_curve)[0] h_bcurve = geomconvert_CurveToBSplineCurve(h_geomcurve) bspline_edge_curve = h_bcurve # Edge geometric properties nb_cpt = bspline_edge_curve.NbPoles() # check consistency if points_edge.shape[0] != nb_cpt: raise ValueError("Input control points do not have not have the " "same number as the geometric edge!") else: for i in range(1, nb_cpt + 1): cpt = points_edge[i - 1] bspline_edge_curve.SetPole(i, gp_Pnt(cpt[0], cpt[1], cpt[2])) new_edge = BRepBuilderAPI_MakeEdge(bspline_edge_curve) return new_edge.Edge()
def trimedge(lbound, ubound, occedge): """ This function trims the OCCedge according to the specified lower and upper bound. Parameters ---------- lbound : float The lower bound of the OCCedge. ubound : float The upper bound of the OCCedge. occedge : OCCedge The edge to be trimmed. Returns ------- trimmed edge : OCCedge The trimmed OCCedge. """ adaptor = BRepAdaptor_Curve(occedge) tr = Geom_TrimmedCurve(adaptor.Curve().Curve(), lbound, ubound) tr.SetTrim(lbound, ubound) bspline_handle = geomconvert_CurveToBSplineCurve(tr.BasisCurve()) tr_edge = BRepBuilderAPI_MakeEdge(bspline_handle) return tr_edge.Edge()
def _bspline_curve_from_wire(self, wire): """ Private method that takes a TopoDS_Wire and transforms it into a Bspline_Curve. :param TopoDS_Wire wire: the TopoDS_Face to be converted :rtype: Geom_BSplineSurface """ if not isinstance(wire, TopoDS_Wire): raise TypeError("wire must be a TopoDS_Wire") # joining all the wire edges in a single curve here # composite curve builder (can only join Bspline curves) composite_curve_builder = GeomConvert_CompCurveToBSplineCurve() # iterator to edges in the TopoDS_Wire edge_explorer = TopExp_Explorer(wire, TopAbs_EDGE) while edge_explorer.More(): # getting the edge from the iterator edge = topods_Edge(edge_explorer.Current()) # edge can be joined only if it is not degenerated (zero length) if BRep_Tool.Degenerated(edge): edge_explorer.Next() continue # the edge must be converted to Nurbs edge nurbs_converter = BRepBuilderAPI_NurbsConvert(edge) nurbs_converter.Perform(edge) nurbs_edge = topods_Edge(nurbs_converter.Shape()) # here we extract the underlying curve from the Nurbs edge nurbs_curve = BRep_Tool_Curve(nurbs_edge)[0] # we convert the Nurbs curve to Bspline curve bspline_curve = geomconvert_CurveToBSplineCurve(nurbs_curve) # we can now add the Bspline curve to the composite wire curve composite_curve_builder.Add(bspline_curve, self.tolerance) edge_explorer.Next() # GeomCurve obtained by the builder after edges are joined comp_curve = composite_curve_builder.BSplineCurve() return comp_curve
def parse_face(topo_face): """ Method to parse a single `Face` (a single patch nurbs surface). It returns a matrix with all the coordinates of control points of the `Face` and a second list with all the control points related to the `Edges` of the `Face.` :param Face topo_face: the input Face. :return: control points of the `Face`, control points related to `Edges`. :rtype: tuple(numpy.ndarray, list) """ # get some Face - Edge - Vertex data map information mesh_points_edge = [] face_exp_wire = TopExp_Explorer(topo_face, TopAbs_WIRE) # loop on wires per face while face_exp_wire.More(): twire = topods_Wire(face_exp_wire.Current()) wire_exp_edge = TopExp_Explorer(twire, TopAbs_EDGE) # loop on edges per wire while wire_exp_edge.More(): edge = topods_Edge(wire_exp_edge.Current()) bspline_converter = BRepBuilderAPI_NurbsConvert(edge) bspline_converter.Perform(edge) bspline_tshape_edge = bspline_converter.Shape() h_geom_edge = BRep_Tool_Curve( topods_Edge(bspline_tshape_edge))[0] h_bspline_edge = geomconvert_CurveToBSplineCurve(h_geom_edge) bspline_geom_edge = h_bspline_edge nb_poles = bspline_geom_edge.NbPoles() # Edge geometric properties edge_ctrlpts = TColgp_Array1OfPnt(1, nb_poles) bspline_geom_edge.Poles(edge_ctrlpts) points_single_edge = np.zeros((0, 3)) for i in range(1, nb_poles + 1): ctrlpt = edge_ctrlpts.Value(i) ctrlpt_position = np.array( [[ctrlpt.Coord(1), ctrlpt.Coord(2), ctrlpt.Coord(3)]]) points_single_edge = np.append(points_single_edge, ctrlpt_position, axis=0) mesh_points_edge.append(points_single_edge) wire_exp_edge.Next() face_exp_wire.Next() # extract mesh points (control points) on Face mesh_points_face = np.zeros((0, 3)) # convert Face to Geom B-spline Face nurbs_converter = BRepBuilderAPI_NurbsConvert(topo_face) nurbs_converter.Perform(topo_face) nurbs_face = nurbs_converter.Shape() h_geomsurface = BRep_Tool.Surface(topods.Face(nurbs_face)) h_bsurface = geomconvert_SurfaceToBSplineSurface(h_geomsurface) bsurface = h_bsurface # get access to control points (poles) nb_u = bsurface.NbUPoles() nb_v = bsurface.NbVPoles() ctrlpts = TColgp_Array2OfPnt(1, nb_u, 1, nb_v) bsurface.Poles(ctrlpts) for indice_u_direction in range(1, nb_u + 1): for indice_v_direction in range(1, nb_v + 1): ctrlpt = ctrlpts.Value(indice_u_direction, indice_v_direction) ctrlpt_position = np.array( [[ctrlpt.Coord(1), ctrlpt.Coord(2), ctrlpt.Coord(3)]]) mesh_points_face = np.append(mesh_points_face, ctrlpt_position, axis=0) return mesh_points_face, mesh_points_edge