Ejemplo n.º 1
0
def crackpolygon(pls, count):
    temppls = pls
    pls = []
    if count == 0:
        return 1
    else:
        for pl in temppls:
            if rs.CloseCurve(pl) == False:
                print
                "Not a closed curve"
            else:
                # print "Cool"
                centroid = rs.CurveAreaCentroid(pl)
                centpt = rs.AddPoint(centroid[0])
                curves = rs.ExplodeCurves(pl)
                for crv in curves:
                    # print crv
                    pt1 = rs.CurveStartPoint(crv)
                    pt2 = rs.CurveEndPoint(crv)
                    pts = []
                    pts.append(pt1)
                    pts.append(pt2)
                    pts.append(centpt)
                    pts.append(pt1)
                    newpl = rs.AddPolyline(pts)
                    pls.append(newpl)
                    rs.DeleteObject(crv)
                cleanup = []
                cleanup.append(centpt)
                # cleanup.append(curves)
                rs.DeleteObjects(cleanup)
        count = count - 1
        return crackpolygon(pls, count)
Ejemplo n.º 2
0
def addLevelMarks(func):
    rs.EnableRedraw(False)
    leftAlign = True
    geometry = []
    currentLevels = setLevels.getFloorLevels()
    for level in currentLevels:
        if level is None:
            print "Levels have not been set."
            return
    levelNames = rs.GetDocumentData("Levels")
    size = 10
    i = 0
    stPts = []
    for level in currentLevels:
        vec1 = [size*.2,size*.1,0]
        ptA = [0, level, 0]
        ptB = [size*.5, level, 0]
        stPts.append(ptA)
        geometry.append(rs.AddLine(ptA, ptB))
        geometry.append(rs.AddText(levelNames[i] + ": +" + str(level), rs.VectorAdd(ptA, vec1), size*.1))
                
        #Triangle Marking
        triPts = [[0,0,0], [size*.05, size*.07,0], [-size*.05, size*.07,0], [0,0,0]]
        newPts = []
        triPt = rs.VectorAdd(ptA, [size*.1, 0,0])
        for j in range(0, 4):
            newPts.append(rs.VectorAdd(triPt, triPts[j]))
        tri = rs.AddPolyline(newPts)
        geometry.append(rs.CloseCurve(tri))
        i=i+1
    
    #Dimensions
    for i in range(0, len(currentLevels)-1):
        pt1 = [0,currentLevels[i], 0]
        pt2 = [0,currentLevels[i+1], 0]
        pt3 = [size*-.15,currentLevels[i+1], 0]
        geometry.append(rs.AddAlignedDimension(pt1, pt2, pt3))
    firstPt = [0,currentLevels[0], 0]
    lastPt = [0,currentLevels[-1], 0]
    dimOffset = [size*-.3,currentLevels[-1], 0]
    geometry.append(rs.AddAlignedDimension(firstPt, lastPt, dimOffset))
    rs.AddLayer("80_LAYOUT", visible = True)
    annoLayer = rs.AddLayer("ANNO", parent = "80_LAYOUT")
    for geo in geometry:
        rs.ObjectLayer(geo, annoLayer)
    rs.AddBlock(geometry, [0,0,0], "Level Marks", True)
    if (func == 0):
        block = rs.InsertBlock("Level Marks", [0,0,0])
        rs.ObjectLayer(block, "ANNO")
    
    rs.EnableRedraw(True)
    return
Ejemplo n.º 3
0
def modify_input(filename):

    # Import object from file
    join_string = str(input_directory + filename)
    combined_string = '!_Import ' + '"' + join_string + '"'
    rs.Command(combined_string)

    # Get all objects imported
    objs = rs.LastCreatedObjects(select=False)[0]

    # Close curve
    closed_curve = rs.CloseCurve(objs, 0.5)
    rs.DeleteObject(objs)

    # Rebuild curve to create smoother shape
    rs.RebuildCurve(closed_curve, 3, 100)

    # Pipe figure with radius of 0.25
    piped = rs.AddPipe(closed_curve, 0, 0.4)[0]

    rs.MoveObject(piped, [0, 0, 0])

    bounding_pts = rs.BoundingBox([piped], view_or_plane=rs.WorldXYPlane())

    maxX = 0
    minX = 0
    minY = 0
    minZ = 0
    for pt in bounding_pts:
        if pt[0] < minX:
            minX = pt[0]
        if pt[0] > maxX:
            maxX = pt[0]
        if pt[1] < minY:
            minY = pt[1]
        if pt[2] < minZ:
            minZ = pt[2]

    rect = rs.AddRectangle(rs.WorldXYPlane(), abs(maxX - minX), 3.0)
    # Move rect up 1/2 of diameter of circle used to pipe
    # Potentially use solid but smaller in height rect
    # Select function in rhino module could allow us to select objects so that the export works.
    rs.MoveObject(rect, [minX, minY - 3.0, minZ + 0.4])
    piped_rect = rs.AddPipe(rect, 0, 0.4)
    rs.DeleteObject(closed_curve)
    rs.DeleteObject(rect)
    rs.SelectObjects([piped, piped_rect])

    rs.Command("_-Export " + output_directory + filename + '.stl' +
               " _Enter _Tolerance=.001  _Enter")
Ejemplo n.º 4
0
def output_frame (filename):

    join_string = str(input_directory + filename)
    combined_string = '!_Import ' + '"' + join_string + '"'
    rs.Command(combined_string)

    # Get all objects imported 
    objs = rs.LastCreatedObjects(select=False)[0]
    
    # Close curve
    closed_curve = rs.CloseCurve(objs, 0.5)
    rs.DeleteObject(objs)
    
    # Rebuild curve to create smoother shape
    rs.RebuildCurve(closed_curve, 3, 100)

    # Pipe figure with radius of 0.25
    piped = rs.AddPipe(closed_curve,0,pipe_diameter)[0]

    rs.MoveObject(piped, [0,0,0])

    bounding_pts = rs.BoundingBox([piped], view_or_plane=rs.WorldXYPlane())

    maxX = 0
    minX = 0
    minY = 0
    minZ = 0
    for pt in bounding_pts:
        if pt[0] < minX:
            minX = pt[0]
        if pt[0] > maxX:
            maxX = pt[0]
        if pt[1] < minY:
            minY = pt[1]
        if pt[2] < minZ:
            minZ = pt[2]
    
    epsilon = 0.5
    center = 0
    one = [center - (box_width / 2),minY-epsilon,-1 * pipe_diameter]
    two = [center - (box_width / 2),minY-epsilon,pipe_diameter]
    three = [center + (box_width / 2),minY-epsilon,pipe_diameter]
    four = [center + (box_width / 2),minY-epsilon,-1 * pipe_diameter]
    five = [center - (box_width / 2),minY+epsilon,-1 * pipe_diameter]
    six = [center - (box_width / 2),minY+epsilon,pipe_diameter]
    seven = [center + (box_width / 2),minY+epsilon,pipe_diameter]
    eight = [center + (box_width / 2),minY+epsilon,-1 * pipe_diameter]
    
    bowx = rs.AddBox([two, three, four, one, six, seven, eight, five])
Ejemplo n.º 5
0
def modify_input(filename):

    # Import object from file
    join_string = str(input_directory + filename)
    combined_string = '!_Import ' + '"' + join_string + '"'
    rs.Command(combined_string)

    # Get all objects imported
    objs = rs.LastCreatedObjects(select=False)[0]

    # Close curve
    closed_curve = rs.CloseCurve(objs, 0.5)
    rs.DeleteObject(objs)

    # Rebuild curve to create smoother shape
    rs.RebuildCurve(closed_curve, 3, 100)

    # Pipe figure with radius of 0.25
    piped = rs.AddPipe(closed_curve, 0, 0.4)[0]

    rs.MoveObject(piped, [0, 0, 0])

    bounding_pts = rs.BoundingBox([piped], view_or_plane=rs.WorldXYPlane())

    maxX = 0
    minX = 0
    minY = 0
    minZ = 0
    for pt in bounding_pts:
        if pt[0] < minX:
            minX = pt[0]
        if pt[0] > maxX:
            maxX = pt[0]
        if pt[1] < minY:
            minY = pt[1]
        if pt[2] < minZ:
            minZ = pt[2]

    rect = rs.AddRectangle(rs.WorldXYPlane(), abs(maxX - minX), 3.0)
    rs.MoveObject(rect, [minX, minY - 3.0, minZ])
    rs.AddPipe(rect, 0, 0.4)
    rs.DeleteObject(closed_curve)
    rs.DeleteObject(rect)

    export_string = '!_Export ' + '"' + str(output_directory + filename) + '"'
    rs.Command(export_string)
Ejemplo n.º 6
0
def generate_frame(pt_array):

    crv_frame = []
    for i in xrange(len(pt_array)):

        pt_list = []
        tmp_list = pt_array[i]

        ### closed, add -1
        for j in xrange(len(tmp_list)):
            pt_list.append(tmp_list[j])

        pt_list.append(tmp_list[0])

        crv = rs.AddInterpCurve(pt_list)
        rs.CloseCurve(crv)
        crv_frame.append(crv)

    return crv_frame
def clean_curve(b):
    """Clean curve geometry
        1. Checks if guid or object
        2. Simplifiebs
        3. Reverse curve dirn
        4. Closes curve if not already closed
    """
    if type(b) == type(rs.AddPoint(0, 0, 0)):  # already guid
        pass
    else:
        b = sc.doc.Objects.AddCurve(b)
    rs.SimplifyCurve(b)
    # reverse curve direction
    boundarybrep = rs.coercecurve(b)
    Rhino.Geometry.Curve.Reverse(boundarybrep)
    sc.doc.Objects.Replace(b, boundarybrep)
    if rs.IsCurveClosed(b):
        return b
    else:
        return rs.CloseCurve(b)
Ejemplo n.º 8
0
def dogbone(curves, diam, diam_barrenos, tol):
    for curve in curves:
        if rs.CloseCurve(curve):
            centroid = rs.CurveAreaCentroid(curve)[0]
        else:
            centroid = rs.CurveMidPoint(curve)
        if diam_barrenos == -1:
            rs.AddPoint(centroid)
        elif diam_barrenos == 0:
            pass
        else:
            rs.AddCircle(centroid, diam_barrenos * .5)

        curve = rs.ConvertCurveToPolyline(curve, delete_input=True)
        tol_curve = rs.OffsetCurve(curve, centroid, -tol) if tol else curve
        ocurve = rs.OffsetCurve(tol_curve,
                                rs.CurveAreaCentroid(curve)[0], diam * .3)
        circles = [rs.AddCircle(i, diam / 2) for i in rs.CurvePoints(ocurve)]
        rs.CurveBooleanUnion(circles + [tol_curve])
        rs.DeleteObjects([ocurve, tol_curve] + circles)
        if curve: rs.DeleteObject(curve)
Ejemplo n.º 9
0
def output_frame(filename):

    global box_height
    global box_width
    global pipe_diameter

    # Import object from file
    join_string = str(input_directory + filename)
    combined_string = '!_Import ' + '"' + join_string + '"'
    rs.Command(combined_string)

    # Get all objects imported
    objs = rs.LastCreatedObjects(select=False)[0]

    # Close curve
    closed_curve = rs.CloseCurve(objs, 0.5)
    rs.DeleteObject(objs)

    # Rebuild curve to create smoother shape
    rs.RebuildCurve(closed_curve, 3, 100)

    # Pipe figure with radius of 0.25
    piped = rs.AddPipe(closed_curve, 0, pipe_diameter)[0]

    rs.MoveObject(piped, [0, 0, 0])

    bounding_pts = rs.BoundingBox([piped], view_or_plane=rs.WorldXYPlane())

    maxX = 0
    minX = 0
    minY = 0
    minZ = 0
    for pt in bounding_pts:
        if pt[0] < minX:
            minX = pt[0]
        if pt[0] > maxX:
            maxX = pt[0]
        if pt[1] < minY:
            minY = pt[1]
        if pt[2] < minZ:
            minZ = pt[2]

    epsilon = 0.5
    center = 0
    one = [
        center - (box_width / 2) - box_height, minY - epsilon,
        -1 * pipe_diameter
    ]
    two = [
        center - (box_width / 2) - box_height, minY - epsilon, pipe_diameter
    ]
    three = [
        center + (box_width / 2) + box_height, minY - epsilon, pipe_diameter
    ]
    four = [
        center + (box_width / 2) + box_height, minY - epsilon,
        -1 * pipe_diameter
    ]
    five = [
        center - (box_width / 2) - box_height, minY + epsilon,
        -1 * pipe_diameter
    ]
    six = [
        center - (box_width / 2) - box_height, minY + epsilon, pipe_diameter
    ]
    seven = [
        center + (box_width / 2) + box_height, minY + epsilon, pipe_diameter
    ]
    eight = [
        center + (box_width / 2) + box_height, minY + epsilon,
        -1 * pipe_diameter
    ]

    bowx = rs.AddBox([two, three, four, one, six, seven, eight, five])

    # rect = rs.AddRectangle(rs.WorldXYPlane(), box_width, box_height)
    #rect = rs.AddRectangle(rs.WorldXYPlane(), box_width, box_height)
    # Potentially use solid but smaller in height rect
    # rs.MoveObject(rect, [minX, minY - 3.0, minZ + pipe_diameter])
    # piped_rect = rs.AddPipe(rect,0,pipe_diameter)
    rs.DeleteObject(closed_curve)
    # rs.DeleteObject(rect)
    rs.SelectObjects([piped, bowx])

    rs.Command("_-Export " + output_directory + filename + '.stl' +
               " _Enter _Tolerance=.001  _Enter")
Ejemplo n.º 10
0
def rc_terraincut2(b_obj, building_guids, etching_guids):

    join_dist = 0
    if str(b_obj.ObjectType) != "Brep":
        b_geo = extrusion_to_brep(b_obj.Geometry)
    else:
        b_geo = b_obj.Geometry

    outline_crv = get_surface_outline(b_geo)
    #wrh.add_curves_to_layer(outline_crv,1)

    #extrude down the topography surface in order to take sections
    bool_merged = Rhino.Geometry.Brep.MergeCoplanarFaces(b_geo, D_TOL)
    extruded_srf_id = extrude_down_srf(wrh.docobj_to_guid(b_obj))
    extruded_srf = rs.coercebrep(extruded_srf_id)

    #get planes for sectioning.
    planes = get_section_planes(b_geo, THICKNESS)

    #get the section curves and the section srfs
    #rs.Redraw()
    section_srfs = []
    for i, plane in enumerate(planes):
        #print i
        #if first level, get brep outline
        if i > 0:
            plane_sections = get_section(extruded_srf, plane)
        else:
            plane_sections = outline_crv
        ###DEBUG STARTS####
        current_level_srfs = []
        for crv in plane_sections:
            closed = crv.IsClosed
            if not closed:
                dist = rs.Distance(crv.PointAtStart, crv.PointAtEnd)
                res = crv.MakeClosed(dist * 2)
                join_dist = dist if dist > join_dist else join_dist
                if res == False: return 0
            new_brep = Rhino.Geometry.Brep.CreatePlanarBreps(crv)[0]
            current_level_srfs.append(new_brep)
            #new_brep_added = doc.Objects.AddBrep(new_brep)
            #rs.ObjectLayer(new_brep_added,"s15")
        ###DEBUG ENDS###
        section_srfs.append(current_level_srfs)
    rs.DeleteObject(extruded_srf_id)

    #get extrusions of section srfs
    extruded_section_breps = []
    boolean_section_breps = []
    frame_base_surface = None
    for i, brep_level in enumerate(section_srfs):
        extruded_breps = []
        for brep in brep_level:
            srf_added = wrh.add_brep_to_layer(brep, LCUT_IND[2])
            if i == 0: frame_base_surface = rs.CopyObject(srf_added)
            extruded_breps.append(rs.ExtrudeSurface(srf_added, SHORT_GUIDE))
            rs.DeleteObject(srf_added)
        extruded_section_breps.append(extruded_breps)

    #rs.Redraw()
    #make voids for existing buildings
    building_breps = building_guids
    bldg_subtraction_breps = get_building_booleans(building_breps, planes)
    if bldg_subtraction_breps:
        extruded_section_breps = cut_building_volumes(extruded_section_breps,
                                                      bldg_subtraction_breps)
        [rs.DeleteObjects(x)
         for x in bldg_subtraction_breps]  #purge the building breps

    num_divisions = len(section_srfs)
    frame_brep = get_frame_brep(frame_base_surface, BORDER_THICKNESS,
                                THICKNESS * num_divisions)
    rs.DeleteObject(frame_base_surface)
    #boolean out the features
    final_breps = []
    for i, brep_level in enumerate(extruded_section_breps):
        boolean_level_ind = i + 2
        final_level_breps = []
        if boolean_level_ind < len(extruded_section_breps):
            for A_brep in brep_level:
                final_brep = None
                B_breps = []
                for B_srf in section_srfs[boolean_level_ind]:
                    B_breps.append(rs.ExtrudeSurface(B_srf, LONG_GUIDE))
                #truncate the B_breps
                if BORDER_BOOL:
                    B_breps = [
                        cut_frame_from_brep(b, frame_brep) for b in B_breps
                    ]
                #rs.AddLayer("debug6",[50,200,50]) #debug
                #rs.ObjectLayer(B_breps,"debug6")
                #handle a bug creating lists of lists sometimes.
                if isinstance(B_breps[0], (list, )): B_breps = B_breps[0]
                boolean_result = rs.BooleanDifference([A_brep], B_breps, False)
                rs.DeleteObjects(B_breps)
                if boolean_result:
                    final_brep = boolean_result
                else:
                    final_brep = rs.CopyObjects([A_brep])
                rs.DeleteObjects([A_brep])
                #rs.ObjectLayer(B_breps,"debug6")
                #rs.AddLayer("s11",[200,200,50]) #debug
                #rs.ObjectLayer(final_brep,"s11") #debug
                final_level_breps.extend(final_brep)
        else:
            #rs.ObjectLayer(A_brep,"s11")
            final_level_breps.extend(brep_level)
        final_breps.append(final_level_breps)

    #get the final surfaces by iterating through the final section breps and extracting the top faces.
    final_srfs = []
    for i, breplevel in enumerate(final_breps):
        final_srfs_level = []
        for brep in breplevel:
            xsrf = wge.get_extreme_srf(rs.coercebrep(brep), 5)
            final_srfs_level.append(
                doc.Objects.Add(xsrf[0].DuplicateFace(
                    False)))  #must properly type the faces
        #rs.ObjectLayer(final_srfs_level,"s4")
        final_srfs.append(final_srfs_level)

    [rs.DeleteObjects(x) for x in final_breps]  #DEBUG
    #project etching layers to final srfs
    final_srfs.reverse()

    #get the boundary curves
    main_curves = []
    guide_curves = []
    etch_curves = []
    for i, srflevel in enumerate(final_srfs):
        main_curves_level = []
        guide_curves_level = []
        etch_curves_level = []

        for srf in srflevel:
            sb = rs.DuplicateSurfaceBorder(srf)
            sb_outer = rs.DuplicateSurfaceBorder(srf, 1)
            if sb:
                main_curves_level.extend(sb)
            if i < len(final_srfs) - 1 and sb_outer:
                p = rs.ProjectCurveToSurface(sb_outer, final_srfs[i + 1],
                                             [0, 0, -1])
                if p: guide_curves_level.extend(p)
                rs.DeleteObject(sb_outer)
            if sb_outer: rs.DeleteObject(sb_outer)  #refactor...
        etch_curves_level = project_etching(etching_guids, srflevel)

        etch_curves.append(etch_curves_level)
        main_curves.append(main_curves_level)
        guide_curves.append(guide_curves_level)

    flat_srf_list = [item for sublist in final_srfs for item in sublist]

    etch_curves.reverse()
    main_curves.reverse()
    guide_curves.reverse()

    bb = rs.BoundingBox(b_geo)
    layout_dist = rs.Distance(bb[0], bb[3]) + LASER_GAP
    preview_dist = rs.Distance(bb[0], bb[1]) + LASER_GAP
    movement_range = [(i + 1) * layout_dist for i in xrange(len(main_curves))]
    for i, level_list in enumerate(main_curves):
        cp_main = rs.CurvePlane(level_list[0])
        rs.MoveObjects(level_list, [0, movement_range[i], -cp_main.OriginZ])

        if etch_curves[i]:
            rs.MoveObjects(etch_curves[i],
                           [0, movement_range[i], -cp_main.OriginZ])

        if i > 0:
            cp_guide = rs.CurvePlane(guide_curves[i][0])
            rs.MoveObjects(guide_curves[i],
                           [0, movement_range[i - 1], -cp_guide.OriginZ])

    main_curves = [item for sublist in main_curves for item in sublist]
    guide_curves = [item for sublist in guide_curves for item in sublist]
    etch_curves = [item for sublist in etch_curves for item in sublist]

    preview_geo = [item for sublist in final_srfs for item in sublist]
    rs.MoveObjects(preview_geo, [preview_dist, 0, 0])

    #close the boundary curves
    cb_crvs = []
    for c in guide_curves:
        if not rs.IsCurveClosed(c):
            if rs.IsCurveClosable(c, D_TOL):
                cb_curves.append(rs.CloseCurve(rs.CopyObject(c)))
        else:
            cb_crvs.append(rs.CopyObject(c))

    etch_curves = wge.trim_boundary(etch_curves, cb_crvs, D_TOL)
    rs.DeleteObjects(cb_crvs)
    rs.DeleteObject(frame_brep)

    rs.ObjectLayer(main_curves, "XXX_LCUT_01-CUT")
    rs.ObjectLayer(guide_curves, "XXX_LCUT_03-LSCORE")
    rs.ObjectLayer(etch_curves, "XXX_LCUT_04-ENGRAVE")
    rs.ObjectLayer(preview_geo, "XXX_LCUT_00-GUIDES")
    if join_dist > 0:
        s = "Had to force-close gaps up to a distance of " + str(join_dist)
        Rhino.RhinoApp.WriteLine(s)
    return 1