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
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)
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
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)
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
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)
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
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的单元顶点