def _make_ellipse(self): ellipse = gp_Elips(gp_Ax2(gp_Pnt(1, 2, 3), gp.DZ_s()), 4.0, 2.0) return Shape.cast(BRepBuilderAPI_MakeEdge(ellipse).Edge())
def getSVG(shape, opts=None): """ Export a shape to SVG """ d = {"width": 800, "height": 240, "marginLeft": 200, "marginTop": 20} if opts: d.update(opts) # need to guess the scale and the coordinate center uom = guessUnitOfMeasure(shape) width = float(d["width"]) height = float(d["height"]) marginLeft = float(d["marginLeft"]) marginTop = float(d["marginTop"]) hlr = HLRBRep_Algo() hlr.Add(shape.wrapped) projector = HLRAlgo_Projector(gp_Ax2(gp_Pnt(), DEFAULT_DIR)) hlr.Projector(projector) hlr.Update() hlr.Hide() hlr_shapes = HLRBRep_HLRToShape(hlr) visible = [] visible_sharp_edges = hlr_shapes.VCompound() if not visible_sharp_edges.IsNull(): visible.append(visible_sharp_edges) visible_smooth_edges = hlr_shapes.Rg1LineVCompound() if not visible_smooth_edges.IsNull(): visible.append(visible_smooth_edges) visible_contour_edges = hlr_shapes.OutLineVCompound() if not visible_contour_edges.IsNull(): visible.append(visible_contour_edges) hidden = [] hidden_sharp_edges = hlr_shapes.HCompound() if not hidden_sharp_edges.IsNull(): hidden.append(hidden_sharp_edges) hidden_contour_edges = hlr_shapes.OutLineHCompound() if not hidden_contour_edges.IsNull(): hidden.append(hidden_contour_edges) # Fix the underlying geometry - otherwise we will get segfaults for el in visible: BRepLib.BuildCurves3d_s(el, TOLERANCE) for el in hidden: BRepLib.BuildCurves3d_s(el, TOLERANCE) # convert to native CQ objects visible = list(map(Shape, visible)) hidden = list(map(Shape, hidden)) (hiddenPaths, visiblePaths) = getPaths(visible, hidden) # get bounding box -- these are all in 2-d space bb = Compound.makeCompound(hidden + visible).BoundingBox() # width pixels for x, height pixesl for y unitScale = min(width / bb.xlen * 0.75, height / bb.ylen * 0.75) # compute amount to translate-- move the top left into view (xTranslate, yTranslate) = ( (0 - bb.xmin) + marginLeft / unitScale, (0 - bb.ymax) - marginTop / unitScale, ) # compute paths ( again -- had to strip out freecad crap ) hiddenContent = "" for p in hiddenPaths: hiddenContent += PATHTEMPLATE % p visibleContent = "" for p in visiblePaths: visibleContent += PATHTEMPLATE % p svg = SVG_TEMPLATE % ({ "unitScale": str(unitScale), "strokeWidth": str(1.0 / unitScale), "hiddenContent": hiddenContent, "visibleContent": visibleContent, "xTranslate": str(xTranslate), "yTranslate": str(yTranslate), "width": str(width), "height": str(height), "textboxY": str(height - 30), "uom": str(uom), }) # svg = SVG_TEMPLATE % ( # {"content": projectedContent} # ) return svg
def _make_circle(self): circle = gp_Circ(gp_Ax2(gp_Pnt(1, 2, 3), gp.DZ_s()), 2.0) return Shape.cast(BRepBuilderAPI_MakeEdge(circle).Edge())
def getSVG(shape, opts=None): """ Export a shape to SVG text. :param shape: A CadQuery shape object to convert to an SVG string. :type Shape: Vertex, Edge, Wire, Face, Shell, Solid, or Compound. :param opts: An options dictionary that influences the SVG that is output. :type opts: Dictionary, keys are as follows: width: Document width of the resulting image. height: Document height of the resulting image. marginLeft: Inset margin from the left side of the document. marginTop: Inset margin from the top side of the document. projectionDir: Direction the camera will view the shape from. showAxes: Whether or not to show the axes indicator, which will only be visible when the projectionDir is also at the default. strokeWidth: Width of the line that visible edges are drawn with. strokeColor: Color of the line that visible edges are drawn with. hiddenColor: Color of the line that hidden edges are drawn with. showHidden: Whether or not to show hidden lines. """ # Available options and their defaults d = { "width": 800, "height": 240, "marginLeft": 200, "marginTop": 20, "projectionDir": (-1.75, 1.1, 5), "showAxes": True, "strokeWidth": -1.0, # -1 = calculated based on unitScale "strokeColor": (0, 0, 0), # RGB 0-255 "hiddenColor": (160, 160, 160), # RGB 0-255 "showHidden": True, } if opts: d.update(opts) # need to guess the scale and the coordinate center uom = guessUnitOfMeasure(shape) width = float(d["width"]) height = float(d["height"]) marginLeft = float(d["marginLeft"]) marginTop = float(d["marginTop"]) projectionDir = tuple(d["projectionDir"]) showAxes = bool(d["showAxes"]) strokeWidth = float(d["strokeWidth"]) strokeColor = tuple(d["strokeColor"]) hiddenColor = tuple(d["hiddenColor"]) showHidden = bool(d["showHidden"]) hlr = HLRBRep_Algo() hlr.Add(shape.wrapped) projector = HLRAlgo_Projector(gp_Ax2(gp_Pnt(), gp_Dir(*projectionDir))) hlr.Projector(projector) hlr.Update() hlr.Hide() hlr_shapes = HLRBRep_HLRToShape(hlr) visible = [] visible_sharp_edges = hlr_shapes.VCompound() if not visible_sharp_edges.IsNull(): visible.append(visible_sharp_edges) visible_smooth_edges = hlr_shapes.Rg1LineVCompound() if not visible_smooth_edges.IsNull(): visible.append(visible_smooth_edges) visible_contour_edges = hlr_shapes.OutLineVCompound() if not visible_contour_edges.IsNull(): visible.append(visible_contour_edges) hidden = [] hidden_sharp_edges = hlr_shapes.HCompound() if not hidden_sharp_edges.IsNull(): hidden.append(hidden_sharp_edges) hidden_contour_edges = hlr_shapes.OutLineHCompound() if not hidden_contour_edges.IsNull(): hidden.append(hidden_contour_edges) # Fix the underlying geometry - otherwise we will get segfaults for el in visible: BRepLib.BuildCurves3d_s(el, TOLERANCE) for el in hidden: BRepLib.BuildCurves3d_s(el, TOLERANCE) # convert to native CQ objects visible = list(map(Shape, visible)) hidden = list(map(Shape, hidden)) (hiddenPaths, visiblePaths) = getPaths(visible, hidden) # get bounding box -- these are all in 2D space bb = Compound.makeCompound(hidden + visible).BoundingBox() # width pixels for x, height pixels for y unitScale = min(width / bb.xlen * 0.75, height / bb.ylen * 0.75) # compute amount to translate-- move the top left into view (xTranslate, yTranslate) = ( (0 - bb.xmin) + marginLeft / unitScale, (0 - bb.ymax) - marginTop / unitScale, ) # If the user did not specify a stroke width, calculate it based on the unit scale if strokeWidth == -1.0: strokeWidth = 1.0 / unitScale # compute paths hiddenContent = "" # Prevent hidden paths from being added if the user disabled them if showHidden: for p in hiddenPaths: hiddenContent += PATHTEMPLATE % p visibleContent = "" for p in visiblePaths: visibleContent += PATHTEMPLATE % p # If the caller wants the axes indicator and is using the default direction, add in the indicator if showAxes and projectionDir == (-1.75, 1.1, 5): axesIndicator = AXES_TEMPLATE % ({ "unitScale": str(unitScale), "textboxY": str(height - 30), "uom": str(uom) }) else: axesIndicator = "" svg = SVG_TEMPLATE % ( { "unitScale": str(unitScale), "strokeWidth": str(strokeWidth), "strokeColor": ",".join([str(x) for x in strokeColor]), "hiddenColor": ",".join([str(x) for x in hiddenColor]), "hiddenContent": hiddenContent, "visibleContent": visibleContent, "xTranslate": str(xTranslate), "yTranslate": str(yTranslate), "width": str(width), "height": str(height), "textboxY": str(height - 30), "uom": str(uom), "axesIndicator": axesIndicator, }) return svg