def get_reference_shape(self, ref_object, target_srf_num):
     ref_points = ref_object.get_reference_points(target_srf_num)
     target_points = self.get_target_points(target_srf_num)
     new_shape = rs.OrientObject(rs.CopyObject(ref_object.shape),
                                 ref_points, target_points)
     if is_intersect(self.shape, rs.coercebrep(rs.CopyObject(new_shape))):
         new_shape = rs.OrientObject(
             rs.CopyObject(ref_object.shape),
             ref_object.get_target_points(self.target_face), target_points)
     return new_shape
Beispiel #2
0
    def copyAndMover(self, first, mid, last, points, text):
        plane = rs.PlaneFromPoints(points[0], points[1], points[2])
        uv1 = rs.PlaneClosestPoint(plane, points[1], False)
        uv2 = rs.PlaneClosestPoint(plane, points[2], False)
        distHor = abs(uv1[0] - uv2[0])
        distVert = abs(uv1[1] - uv2[1])
        key = 'len{0}{1}'.format(distHor, distVert)
        key = re.sub(r'\.', '', key)
        if key in self.partsHash:
            self.partsHash[key].append(text)
        else:
            self.partsHash[key] = []
            self.partsHash[key].append(text)
            ypos = len(self.partsHash.keys()) + len(self.partsHash.keys())
            rs.AddText(key, [0, ypos, 0], 0.3)
            newPoints = [
                rs.AddPoint(0, ypos, 0),
                rs.AddPoint(self.FLAT_LENGTH, ypos, 0),
                rs.AddPoint(self.FLAT_LENGTH + distHor, ypos + distVert, 0),
                rs.AddPoint((self.FLAT_LENGTH * 2) + distHor, ypos + distVert,
                            0)
            ]
            first = rs.OrientObject(first, points, newPoints, 1)
            mid = rs.OrientObject(mid, points, newPoints, 1)
            last = rs.OrientObject(last, points, newPoints, 1)
            first_fillet = rs.AddFilletCurve(first, mid, 0.09375)
            fillet_points = rs.CurveFilletPoints(first, mid, 0.09375)
            first_circle = rs.AddCircle(fillet_points[2], 0.09375)
            first_cp = rs.CurveClosestPoint(first, fillet_points[0])
            first_domain = rs.CurveDomain(first)
            first = rs.TrimCurve(first, (first_domain[0], first_cp), True)
            second_cp = rs.CurveClosestPoint(mid, fillet_points[1])
            second_domain = rs.CurveDomain(mid)
            mid = rs.TrimCurve(mid, (second_cp, second_domain[1]), True)

            second_fillet = rs.AddFilletCurve(mid, last, 0.09375)
            fillet_points = rs.CurveFilletPoints(mid, last, 0.09375)
            second_circle = rs.AddCircle(fillet_points[2], 0.09375)
            first_cp = rs.CurveClosestPoint(mid, fillet_points[0])
            first_domain = rs.CurveDomain(mid)
            mid = rs.TrimCurve(mid, (first_domain[0], first_cp), True)
            second_cp = rs.CurveClosestPoint(last, fillet_points[1])
            second_domain = rs.CurveDomain(last)
            last = rs.TrimCurve(last, (second_cp, second_domain[1]), True)
            curve = rs.JoinCurves(
                [first, first_fillet, mid, second_fillet, last])

            rs.AddCircle([0, ypos - 0.125 - 0.09375, 0], 0.09375)
            rs.AddCircle([(self.FLAT_LENGTH * 2) + distHor,
                          ypos + distVert + 0.125 + 0.09375, 0], 0.09375)
Beispiel #3
0
def orientObjAlongPolyPts(obj, pts, basePoint=(0, 0, 0), baseVect=(0, 1, 0)):
    print('orient obj along poly points')
    up = (0, 0, 1)
    generatedObjects = []
    for i in range(0, len(pts) - 1):

        if i < (len(pts) - 2):
            p0 = pts[i]
            p1 = pts[i + 1]
            p2 = pts[i + 2]

            v1 = rs.VectorUnitize(p1 - p0)
            v2 = rs.VectorUnitize(p2 - p1)
            n1 = rs.VectorCrossProduct(v1, up)
            n2 = rs.VectorCrossProduct(v2, up)
            mid = rs.VectorAdd(n1, n2)
            n = rs.VectorUnitize(mid)
        else:
            p0 = pts[i]
            p1 = pts[i + 1]
            v1 = rs.VectorUnitize(p1 - p0)
            n = rs.VectorCrossProduct(v1, up)

        rs.AddLine(p1, p1 + n)

        a = rs.VectorAngle((0, 1, 0), n)
        gen = rs.OrientObject(obj, [basePoint, basePoint + baseVect],
                              [p1, p1 + n], 1)
        generatedObjects.append(gen)
        #g=rs.AddGroup()
        #groupObjects=rs.AddObjectsToGroup(generatedObjects,g)
        return generatedObjects
 def orient_block(self):
     #orient 2pt with 3d scaling enabled
     r1 = rs.GetPoint("Pick reference corner 1")
     r2 = rs.GetPoint("Pick reference corner 2")
     t1 = rs.GetPoint("Pick target corner 1")
     t2 = rs.GetPoint("Pick target corner 2")
     ref_pts = [r1, r2]
     target_pts = [t1, t2]
     moved = rs.OrientObject(self.paper_dwg, ref_pts, target_pts, flags=2)
     self.paper_dwg = moved
Beispiel #5
0
def orient_to_srfs():
    objToOri = rs.GetObject("select object to orient")
    ref_srf = rs.GetObject("select a reference surface", 8)
    target_srfs = rs.GetObjects("select surfaces to orient objects to", 8)

    lstRefPts = getOrientationPts(ref_srf)

    for srf in target_srfs:
        lstTarPts = getOrientationPts(srf)
        objCopy = rs.CopyObject(objToOri)
        rs.OrientObject(objCopy, lstRefPts, lstTarPts)
Beispiel #6
0
def main():
  rs.AddLayer("laydown")

  while True:
    panel, face = getsubsurface.GetSubSurface("select down face")
    if panel is None or face is None:
      break

    # compute the plane
    normal = rs.VectorUnitize(rs.SurfaceNormal(face, (0.5,0.5)))
    plane = rs.PlaneFromNormal(rs.EvaluateSurface(face, 0.5, 0.5), normal)

    rs.ViewCPlane(plane=plane)
    box = rs.BoundingBox(face, rs.ViewCPlane(), in_world_coords=True)

    proj_coords = [rs.SurfaceClosestPoint(face, coord) + (0,) for coord in box]
    laydown = rs.OrientObject(panel, box[0:3], proj_coords[0:3], flags=1)
    rs.ObjectLayer(laydown, "laydown")

    rs.DeleteObject(face)
    rs.HideObject(panel)
def draw_model_paperspace():
    #go to paperspace, then go to view and enter its modelspace
    view = rs.CurrentView()  #rs.CurrentDetail()
    detail = rs.CurrentDetail(view)

    type = Rhino.RhinoDoc.ActiveDoc.Views.ActiveView.ActiveViewport.ViewportType
    if type != Rhino.Display.ViewportType.DetailViewport:
        print "Please enter detail modelspace"
        return
    print type

    #get model
    objs = rs.GetObjects("Select objects to draw", rs.filter.polysurface)
    rs.SelectObjects(objs)

    #make 2d, as current view
    rs.Command("!-_Make2D DrawingLayout=CurrentView _enter _enter")
    dwg_crvs = rs.LastCreatedObjects()

    #cut and paste into view window (paperspace)
    origin = [0, 0, 0]
    rs.AddBlock(dwg_crvs, origin, name=view, delete_input=True)

    #leave detail view and insert block
    rs.CurrentDetail(view, detail=view)
    insert_pt = [17, 11, 0]
    obj = rs.InsertBlock(view, insert_pt)

    #orient 2pt with 3d scaling enabled
    r1 = rs.GetPoint("Pick reference corner 1")
    r2 = rs.GetPoint("Pick reference corner 2")
    t1 = rs.GetPoint("Pick target corner 1")
    t2 = rs.GetPoint("Pick target corner 2")
    ref_pts = [r1, r2]
    target_pts = [t1, t2]
    rs.OrientObject(obj, ref_pts, target_pts, flags=2)

    print "Script Finished"
    return
Beispiel #8
0
def orientObjAlongPolyPts(obj, pts, baseVect=(0, 1, 0)):
    up = (0, 0, 1)
    for i in range(0, len(pts) - 1):
        if i < (len(pts) - 2):
            p0 = pts[i]
            p1 = pts[i + 1]
            p2 = pts[i + 2]

            v1 = rs.VectorUnitize(p1 - p0)
            v2 = rs.VectorUnitize(p2 - p1)
            n1 = rs.VectorCrossProduct(v1, up)
            n2 = rs.VectorCrossProduct(v2, up)
            mid = rs.VectorAdd(n1, n2)
            n = rs.VectorUnitize(mid)
        else:
            p0 = pts[i]
            p1 = pts[i + 1]
            v1 = rs.VectorUnitize(p1 - p0)
            n = rs.VectorCrossProduct(v1, up)

        rs.AddLine(p1, p1 + n)

        a = rs.VectorAngle((0, 1, 0), n)
        rs.OrientObject(obj, [(0, 0, 0), baseVect], [p1, p1 + n], 1)
Beispiel #9
0
def sweepVolume(crv, tool_id, z_pos):

    tangent = rs.CurveTangent(crv, rs.CurveParameter(crv, 0))
    origin = rs.CurveStartPoint(crv)
    
    block = rs.InsertBlock( tool_id, (0,0,0), scale=(1,1,1) )
    

    # rs.DeleteObjects(objs)
       
    # pt2 = [origin.X, origin.Y + perp.XAxis[1], origin.Z]
    pt2 = [origin.X, origin.Y , origin.Z + 1]
    pt3 = [origin.X + tangent.X, origin.Y + tangent.Y , origin.Z + tangent.Z]

    ref     = [(0,0,0),(0,1,0),(0,0,1)] 
    target  = [origin, pt2 ,pt3]
    
    
    block = rs.OrientObject(block, ref, target)
    
    objs = rs.ExplodeBlockInstance(block)
    profile = None
    for item in objs:
        if rs.ObjectLayer(item) == 'HULP::C_Toolcontours' or rs.ObjectLayer(item) == 'Hulp::C_Toolcontours':
            profile = rs.CopyObject(item)
            
    
    rs.DeleteObjects(objs)


    
    if not profile:
        rs.MessageBox('there is no layer named "C_Toolcontours" in block %s' % rs.BlockInstanceName(block))
        return False
            
    profile = rs.OffsetCurve(profile, rs.CurveAreaCentroid(profile)[0], 0.001, style=1)
    
    # rs.MoveObject(profile, (0,0,z_pos))
            
    
    # rail = obj
    # rail_crv = rs.coercecurve(rail)
    # if not rail_crv: return
    # 
    # cross_sections = [profile]
    # if not cross_sections: return
    # cross_sections = [rs.coercecurve(crv) for crv in cross_sections]
    # 
    # sweep = Rhino.Geometry.SweepOneRail()
    # sweep.AngleToleranceRadians = scriptcontext.doc.ModelAngleToleranceRadians
    # sweep.ClosedSweep = True
    # # sweep.MiterType  = 2
    # sweep.SweepTolerance = scriptcontext.doc.ModelAbsoluteTolerance
    # sweep.SetToRoadlikeTop()
    # breps = sweep.PerformSweep(rail_crv, cross_sections)
    # for brep in breps: scriptcontext.doc.Objects.AddBrep(brep)
    # scriptcontext.doc.Views.Redraw()
    # 
    # # surface_id = rs.LastCreatedObjects()

    
    # METHOD1
    surface_id = rs.AddSweep1( crv, profile, True )    

    rs.CapPlanarHoles(surface_id)
    
    pt = rs.CurveAreaCentroid(profile)[0]
    pt2 = (pt.X, pt.Y, pt.Z+1)
    
    rev = rs.AddRevSrf( profile, (pt, pt2) )
    
    
    
    rs.MoveObject(surface_id, (0,0,z_pos))
    rs.MoveObject(rev, (0,0,z_pos))
    
    
    
    return [surface_id, rev]        

    
    
    rs.UnselectAllObjects()
    rs.SelectObjects([crv, profile])
    
    result = rs.Command("_-Sweep1 _Enter Style=RoadlikeTop _Enter", False)
            
    if result: 
        rs.DeleteObject(profile)
        surface_id = rs.LastCreatedObjects()

        rs.CapPlanarHoles(surface_id)
    
        rs.DeleteObjects(objs)
        rs.MoveObject(surface_id, (0,0,z_pos))

        return surface_id        
Beispiel #10
0
def RunCommand(is_interactive):
    # get input objects
    objs = rs.GetObjects("Select object(s) to connect")
    if (objs is None):
        return 1
    # select source handle
    source = rs.GetObject("Select sender handle (L polyline)", rs.filter.curve)
    if (source is None):
        return 1
    sPoly = rs.coercecurve(source)

    # select destination handle
    receiver = rs.GetObject("Select receiver handle (L polyline)",
                            rs.filter.curve)
    if (receiver is None):
        return 1
    rPoly = rs.coercecurve(receiver)

    if not (rs.IsPolyline(sPoly) & rs.IsPolyline(rPoly)): return 1

    preview = []
    while True:
        # input rotation angle
        rotation = rs.GetReal("Rotation angle (degrees)", 0, -360, 360)
        if rotation is None: break
        rs.EnableRedraw(False)

        # precalculate points, planes and transformation
        sPts = ptsFromPolyline(sPoly)
        rPts = ptsFromPolyline(rPoly)
        sPlane = planeFromPts(sPts)
        rPlane = planeFromPts(rPts)
        origin = rPts[0]
        rPts = rs.RotateObjects(rPts, origin, 180, rPlane.YAxis)
        rPts1 = rs.RotateObjects(rPts, origin, -rotation, rPlane.ZAxis)
        for obj in objs:
            preview.append(rs.OrientObject(obj, sPts, rPts1, 1))

        rs.DeleteObjects(rPts1)
        rs.EnableRedraw(True)
        result = rs.GetString("Looks good?", "Yes", ("Yes", "No"))
        if result is None:
            rs.EnableRedraw(False)
            for obj in preview:
                rs.DeleteObject(obj)
            rs.EnableRedraw(True)
            break
        result = result.upper()
        if result == "YES":
            group_map = []
            for obj in preview:
                obj = rs.coercerhinoobject(obj)
                RhinoUpdateObjectGroups(obj, group_map)
            break
        elif result == "NO":
            rs.EnableRedraw(False)
            for obj in preview:
                rs.DeleteObject(obj)
            rs.EnableRedraw(True)

    # you can optionally return a value from this function
    # to signify command result. Return values that make
    # sense are
    #   0 == success
    #   1 == cancel
    # If this function does not return a value, success is assumed
    return 0
def rectify(pline, decPlaces):
    """
    --Uses your current cplane as guides
    pline: one pline to rectify
    decPlace: number of decimals to round to (1 = 100mm, 2 = 10mm, 3 = 1mm)
    """
    rs.EnableRedraw(False)

    #Remove colinear points
    rs.SimplifyCurve(pline)

    #orient to world
    xPt = rs.VectorAdd(rs.ViewCPlane().Origin, rs.ViewCPlane().XAxis)
    yPt = rs.VectorAdd(rs.ViewCPlane().Origin, rs.ViewCPlane().YAxis)
    origCplane = [rs.ViewCPlane().Origin, xPt, yPt]
    world = [[0, 0, 0], [1, 0, 0], [0, 1, 0]]
    rs.OrientObject(pline, origCplane, world)

    #get ctrl Pts
    ctrlPts = rs.CurvePoints(pline)

    #test if closed
    closedBool = rs.IsCurveClosed(pline)
    if closedBool:
        del ctrlPts[-1]

    #initial direction
    stPt = ctrlPts[0]
    nxtPt = ctrlPts[1]
    dX = abs(stPt[0] - nxtPt[0])
    dY = abs(stPt[1] - nxtPt[1])
    if dX > dY:
        xDir = True
    else:
        xDir = False

    #split into x and y vals
    xVals = []
    yVals = []
    xVals.append(ctrlPts[0][0])
    yVals.append(ctrlPts[0][1])
    if xDir:
        for i in range(1, len(ctrlPts)):
            if i % 2 == 1:
                xVals.append(ctrlPts[i][0])
            else:
                yVals.append(ctrlPts[i][1])
    else:
        for i in range(1, len(ctrlPts)):
            if i % 2 == 0:
                xVals.append(ctrlPts[i][0])
            else:
                yVals.append(ctrlPts[i][1])
    xVals = roundedDist(xVals, decPlaces)
    yVals = roundedDist(yVals, decPlaces)

    #Make points
    newPts = []
    for i in range(0, len(ctrlPts)):
        if xDir:
            if i % 2 == 0:
                newPts.append(
                    rs.coerce3dpoint([xVals[int(i / 2)], yVals[int(i / 2)],
                                      0]))
            else:
                newPts.append(
                    rs.coerce3dpoint(
                        [xVals[int(i / 2 + .5)], yVals[int(i / 2 - .5)], 0]))
        else:
            if i % 2 == 0:
                newPts.append(
                    rs.coerce3dpoint([xVals[int(i / 2)], yVals[int(i / 2)],
                                      0]))
            else:
                newPts.append(
                    rs.coerce3dpoint(
                        [xVals[int(i / 2 - .5)], yVals[int(i / 2 + .5)], 0]))

    #Close it
    if closedBool:
        if xDir:
            newPts[-1].X = newPts[0].X
        else:
            newPts[-1].Y = newPts[0].Y
        newPts.append(newPts[0])

    #make new Line
    newLine = rs.AddPolyline(newPts)

    #Cleanup
    objectsLay = rs.MatchObjectAttributes(newLine, pline)
    rs.ObjectColor(pline, (255, 0, 0))
    #rs.DeleteObject(pline)

    #Move back to original cplane
    rs.OrientObject(newLine, world, origCplane)

    rs.EnableRedraw(True)
    return newLine
#分解mesh,获取点坐标列表,用于生成面
meshes = meshes
#meshes = rs.ExplodeMeshes(mesh)  #该函数在新版本中无效
lp = []
#print(Locationpoint)
for i in Locationpoint: #循环遍历点,获取点坐标列表
    lp.append(rs.PointCoordinates(i))
#print(lp)

#核心展平程序
xymeshes = []
for i in range(len(meshes)):
    if i == 0:
        mesh0point = rs.MeshVertices(meshes[i]) #获取第一个单元面的所有顶点
        xymesh0 = rs.OrientObject(meshes[i],mesh0point,lp,1)    
        #将第一个单元面放置在二维平面上,初始参考点为第一个单元面的顶点,目标参考点为输入的点对象(至少三个点,并转化为点坐标列表
        xymeshes.append(xymesh0)    #将第一个展平面加入列表
        #print(xymeshes)
    else:
        vertices2 = rs.MeshVertices(meshes[i])  #获取索引值为i时,单元面所有顶点
        vertices1 = rs.MeshVertices(meshes[i-1])    #i-1时,单元面的所有顶点
        ver = [m for m in vertices1 for n in vertices2 if m==n] #遍历两mesh中的点,提取重合点ab
        #print(vertices2)
        a = ver[0]
        b = ver[1]
        indexa = vertices1.index(a) #提取ab点在i-1单元中的索引值
        indexb = vertices1.index(b)
        d = [m for m in vertices2 if m not in ver][0]
        #使用列表推导式循环遍历索引值为i时单元面的顶点,并且要求提取的条件为不重合的点,如果为四边,因此增加[0]
        refvertice = rs.MeshVertices(xymeshes[i-1]) #获取已经转化为二维单元面i-1的单元顶点