示例#1
0
 def slice_plane(self, target, plane):
     
     ### Slice
     p = rs.coerceplane(plane)
     
     ### Geomrtry Type
     if rs.IsMesh(target):
         # print("Mesh!!")
         m = rs.coercemesh(target)
         # print(m)
         polylines = rg.Intersect.Intersection.MeshPlane(m, p)
     
     elif rs.IsBrep(target):
         # print("Brep!")
         b = rs.coercebrep(target)
         mp = rg.MeshingParameters.QualityRenderMesh
         m = rg.Mesh.CreateFromBrep(b, mp)
         # print(m[0])
         polylines = rg.Intersect.Intersection.MeshPlane(m[0], p)
     
     else:
         # print("N/A")
         polylines = None
     
     return polylines
示例#2
0
def rc_unroll_ortho():

    go = Rhino.Input.Custom.GetObject()
    go.GeometryFilter = Rhino.DocObjects.ObjectType.Brep

    default_thickness = sticky["thickness"] if sticky.has_key(
        "thickness") else 5.5
    default_lid = sticky["lid"] if sticky.has_key("lid") else False

    opt_thickness = Rhino.Input.Custom.OptionDouble(default_thickness, 0.2,
                                                    1000)
    opt_lid = Rhino.Input.Custom.OptionToggle(default_lid, "No", "Yes")

    go.SetCommandPrompt(
        "Select breps to unroll. Breps must be orthogonal (faces at 90 degree angles)"
    )
    go.AddOptionDouble("Thickness", opt_thickness)
    go.AddOptionToggle("Lids", opt_lid)

    go.GroupSelect = True
    go.SubObjectSelect = False
    go.AcceptEnterWhenDone(True)
    go.AcceptNothing(True)
    go.EnableClearObjectsOnEntry(False)
    go.EnableUnselectObjectsOnExit(False)
    go.GroupSelect = True
    go.SubObjectSelect = False
    go.DeselectAllBeforePostSelect = False

    res = None
    bHavePreselectedObjects = False

    while True:
        res = go.GetMultiple(1, 0)

        #If new option entered, redraw a possible result
        if res == Rhino.Input.GetResult.Option:
            #print res
            go.EnablePreSelect(False, True)
            continue

        #If not correct
        elif res != Rhino.Input.GetResult.Object:
            return Rhino.Commands.Result.Cancel

        if go.ObjectsWerePreselected:
            bHavePreselectedObjects = True
            go.EnablePreSelect(False, True)
            continue

        break

    rs.EnableRedraw(False)

    LID = opt_lid.CurrentValue
    THICKNESS = opt_thickness.CurrentValue
    global LCUT_INDICES
    LCUT_INDICES = wla.get_lcut_layers()

    #Get geometry and object lists
    brep_obj_list = []
    brep_geo_list = []
    brep_ids_list = []
    for i in xrange(go.ObjectCount):
        b_obj = go.Object(i).Object()
        brep_obj_list.append(b_obj)
        #For Debug and reference...
        #brep_geo_list.append(b_obj.Geometry)
        #brep_ids_list.append(b_obj.Id)

    #get information for each piece to be output.
    #future implementation should use bounding dims and curves rather than dimension-based system.
    unrolled_brep_info = []
    lid_info = []

    SELECT_GUIDS = []
    for i, obj in enumerate(brep_obj_list):
        #geometry prep: convert extrusions to breps
        if str(obj.ObjectType) != "Brep":
            new_brep = wru.extrusion_to_brep(obj.Geometry)
        else:
            new_brep = obj.Geometry

        #pull the brep sides info for this solid
        this_brep_side_info = get_brep_sides_info(new_brep, THICKNESS)
        unrolled_brep_info.append(this_brep_side_info)
        num_sides = len(this_brep_side_info.dims)

        #pull the lid info for this solid
        if LID == True:
            this_brep_lid_info = get_brep_lid_info(new_brep, num_sides,
                                                   THICKNESS)
            lid_info.append(this_brep_lid_info)

    #get dims needed to place this solid's outline curves
    brep_output_bounding_heights = []
    for i, brep_side_info in enumerate(unrolled_brep_info):
        if LID == True:
            brep_output_bounding_heights.append(
                max(brep_side_info.boundingDims.y, lid_info[i].dims.y)
            )  #lid info needs to become a named tuple as well.
        else:
            brep_output_bounding_heights.append(brep_side_info.boundingDims.y)

    ybase = 0
    #each solid
    for i, brep_side_info in enumerate(unrolled_brep_info):
        top_label_text = wut.number_to_letter(i)
        prefix = top_label_text + "-"
        xbase = 0
        #each piece
        for j, piecedims in enumerate(brep_side_info.dims):
            face_label = prefix + str(brep_side_info.labelNums[j])
            rect = rs.AddRectangle([xbase, ybase, 0], piecedims.x, piecedims.y)
            dot = rs.AddTextDot(face_label, rs.CurveAreaCentroid(rect)[0])

            rs.ObjectLayer(dot, "XXX_LCUT_00-GUIDES")
            rs.ObjectLayer(rect, "XXX_LCUT_01-CUT")
            SELECT_GUIDS.extend([rect, dot])
            xbase += piecedims[0] + GAP_SIZE

        #add the lids
        if LID == True:

            #transform the lid curve to the basepoint
            lid_curve = lid_info[i].outline
            p1 = rs.WorldXYPlane()
            p2 = rs.PlaneFromNormal([xbase, ybase, 0], [0, 0, 1], [1, 0, 0])
            orient = Rhino.Geometry.Transform.ChangeBasis(
                rs.coerceplane(p2), rs.coerceplane(p1))
            lid_curve.Transform(orient)

            #add the curve to the document
            crv_1 = wru.add_curve_to_layer(lid_curve, LCUT_INDICES[1])
            crv_2 = rs.CopyObject(
                crv_1, [lid_info[i].dims.x + GAP_SIZE, 0, 0
                        ])  #change this to use a transform; it's nasty.

            #add text dot
            face_label_1 = prefix + str(len(brep_side_info.dims))
            face_label_2 = prefix + str(len(brep_side_info.dims) + 1)
            dot_1 = rs.AddTextDot(face_label_1, rs.CurveAreaCentroid(crv_1)[0])
            dot_2 = rs.AddTextDot(face_label_2, rs.CurveAreaCentroid(crv_2)[0])
            rs.ObjectLayer([dot_1, dot_2], "XXX_LCUT_00-GUIDES")

            SELECT_GUIDS.extend([crv_1, crv_2, dot_1, dot_2])

        top_label = rs.AddTextDot(top_label_text, brep_side_info.topLabelPt)
        rs.ObjectLayer(top_label, "XXX_LCUT_00-GUIDES")
        ybase += brep_output_bounding_heights[i] + GAP_SIZE * 4

    sticky["thickness"] = THICKNESS
    sticky["lid"] = LID

    rs.UnselectAllObjects()
    rs.SelectObjects(SELECT_GUIDS)
    rs.Redraw()
    rs.EnableRedraw(True)
示例#3
0
def get_brep_lid_info(brep, start_index, material_thickness):
    #get bounding box
    bb = rs.BoundingBox(brep)
    if bb:
        for i, point in enumerate(bb):
            pass
            #rs.AddTextDot(i,point)

    #set height
    height = wge.get_brep_height(brep)
    top_crv = rs.AddPolyline([bb[4], bb[5], bb[6], bb[7], bb[4]])
    bottom_crv = rs.AddPolyline([bb[0], bb[1], bb[2], bb[3], bb[0]])
    top_label_pt, _ = rs.CurveAreaCentroid(top_crv)
    bottom_label_pt, _ = rs.CurveAreaCentroid(bottom_crv)
    rs.DeleteObjects([top_crv, bottom_crv])

    #add text dots
    d1 = rs.AddTextDot(str(start_index), top_label_pt)
    d2 = rs.AddTextDot(str(start_index + 1), bottom_label_pt)
    rs.ObjectLayer([d1, d2], "XXX_LCUT_00-GUIDES")

    #get middle section and get polycurve

    g_polycurves = wge.get_brep_plan_cut(brep, height / 2,
                                         D_TOL)  #get plan cut at mid-height
    g_polycurve = g_polycurves[
        0]  #extract the first curve, we assume there will only be one curve.

    seg_count = 0

    if g_polycurve.GetType() == Rhino.Geometry.PolyCurve:
        wge.make_pcurve_ccw(g_polycurve)
    else:
        g_polycurve = wru.polylinecurve_to_polycurve(g_polycurve)
        wge.make_pcurve_ccw(g_polycurve)

    startpts, endpts, divpts = wge.get_polycurve_segment_points(g_polycurve)
    g_polyline = wru.polycurve_to_polyline(g_polycurve,
                                           doc.ModelAbsoluteTolerance,
                                           doc.ModelAngleToleranceDegrees)
    seg_count = g_polycurve.SegmentCount

    g_polycurve_lid = offset_pcurve(g_polycurve, material_thickness)

    #convert to polyline if needed.
    if g_polycurve.GetType() == Rhino.Geometry.PolylineCurve:
        g_polyline = wru.polycurve_to_polyline(g_polycurve_lid,
                                               doc.ModelAbsoluteTolerance,
                                               doc.ModelAngleToleranceDegrees)
    else:
        g_polyline = g_polycurve_lid

    crv_bbox = g_polyline.GetBoundingBox(False)
    if not crv_bbox.IsValid:
        return Rhino.Commands.Result.Failure

    #Print the min and max box coordinates in world coordinates
    Rhino.RhinoApp.WriteLine("World min: {0}", crv_bbox.Min)
    Rhino.RhinoApp.WriteLine("World max: {0}", crv_bbox.Max)

    pt_origin = crv_bbox.Corner(True, True, True)
    pt_x_axis = crv_bbox.Corner(False, True, True)
    pt_y_axis = crv_bbox.Corner(True, False, True)
    plane1 = rs.PlaneFromPoints(pt_origin, pt_x_axis, pt_y_axis)
    plane2 = rs.PlaneFromPoints([0, 0, 0], [1, 0, 0], [0, 1, 0])

    transformation = Rhino.Geometry.Transform.ChangeBasis(
        rs.coerceplane(plane2), rs.coerceplane(plane1))

    g_polyline.Transform(transformation)

    dims = [
        rs.Distance(pt_origin, pt_x_axis),
        rs.Distance(pt_origin, pt_y_axis)
    ]
    #print g_polyline.PointCount
    Dimensions = namedtuple('Dimensions', 'x y')
    dims = Dimensions(rs.Distance(pt_origin, pt_x_axis),
                      rs.Distance(pt_origin, pt_y_axis))

    SidesInfo = namedtuple(
        'SidesInfo', 'outline dims')  #dims are bounding dims for the curve
    out_sides_info = SidesInfo(g_polyline, dims)

    return out_sides_info
def PlanePointAt(plane_guid, point):
    plane_obj = rs.coerceplane(plane_guid)
    point = plane_obj.PointAt(point[0], point[1], point[2])
    return point
def PlaneRemapToPlaneSpace(plane_guid, point):
    plane_obj = rs.coerceplane(plane_guid)
    (status, point) = plane_obj.RemapToPlaneSpace(rs.coerce3dpoint(point))
    return point