def AddVector(vecdir, base_point): if base_point == None: base_point = [0, 0, 0] tip_point = rs.PointAdd(base_point, vecdir) line = rs.AddLine(base_point, tip_point) if line: return rs.CurveArrows(line, 2)
def AddVectorArrow(base, vector): vec_normal = rs.VectorUnitize(vector) vec_scale = rs.VectorScale(vec_normal, 200) p = rs.PointAdd(base, vec_scale) line = rs.AddLine(base, p) rs.CurveArrows(line, 2) return p
def plot_reaction_forces(structure, step, layer=None, scale=1.0): """ Plots reaction forces for the Structure analysis results. Parameters ---------- structure : obj Structure object. step : str Name of the Step. layer : str Layer name for plotting. scale : float Scale of the arrows. Returns ------- None """ if not layer: layer = '{0}-{1}'.format(step, 'reactions') rs.CurrentLayer(rs.AddLayer(layer)) rs.DeleteObjects(rs.ObjectsByLayer(layer)) rs.EnableRedraw(False) rfx = structure.results[step]['nodal']['rfx'] rfy = structure.results[step]['nodal']['rfy'] rfz = structure.results[step]['nodal']['rfz'] nkeys = rfx.keys() v = [scale_vector([rfx[i], rfy[i], rfz[i]], -scale * 0.001) for i in nkeys] rm = [length_vector(i) for i in v] rmax = max(rm) nodes = structure.nodes_xyz(nkeys) for i in nkeys: if rm[i] > 0.001: l = rs.AddLine(nodes[i], add_vectors(nodes[i], v[i])) rs.CurveArrows(l, 1) col = [ int(j) for j in colorbar(rm[i] / rmax, input='float', type=255) ] rs.ObjectColor(l, col) vector = [rfx[i], rfy[i], rfz[i]] name = json.dumps({ 'rfx': rfx[i], 'rfy': rfy[i], 'rfz': rfz[i], 'rfm': length_vector(vector) }) rs.ObjectName(l, '_' + name) rs.CurrentLayer(rs.AddLayer('Default')) rs.LayerVisible(layer, False) rs.EnableRedraw(True)
def select_quad_mesh_strip(mesh, text='key'): """Select quad mesh strip. Parameters ---------- mesh : QuadMesh, CoarseQuadMesh The quad mesh or coarse quad mesh. text : str Optional argument to show the strip key or density. The key by default. Returns ------- hashable The strip key. """ n = mesh.number_of_strips() # different colors per strip strip_to_color = {skey: scale_vector([float(i), 0, n - 1 - float(i)], 255 / (n - 1)) for i, skey in enumerate(mesh.strips())} rs.EnableRedraw(False) # add strip polylines with colors and arrows guids_to_strip = {rs.AddPolyline(mesh.strip_edge_midpoint_polyline(skey)): skey for skey in mesh.strips()} for guid, skey in guids_to_strip.items(): rs.ObjectColor(guid, strip_to_color[skey]) rs.CurveArrows(guid, arrow_style = 3) # show strip key or density if text == 'key' or text == 'density': if text == 'key': guids_to_dot = {guid: rs.AddTextDot(skey, Polyline(mesh.strip_edge_midpoint_polyline(skey)).point(t = .5)) for guid, skey in guids_to_strip.items()} elif text == 'density': guids_to_dot = {guid: rs.AddTextDot(mesh.get_strip_density(skey), Polyline(mesh.strip_edge_midpoint_polyline(skey)).point(t = .5)) for guid, skey in guids_to_strip.items()} for guid, dot in guids_to_dot.items(): rs.ObjectColor(dot, rs.ObjectColor(guid)) # return polyline strip rs.EnableRedraw(True) skey = guids_to_strip.get(rs.GetObject('Get strip.', filter = 4), None) rs.EnableRedraw(False) # delete objects rs.DeleteObjects(guids_to_strip.keys()) if text == 'key' or text == 'density': rs.DeleteObjects(guids_to_dot.values()) return skey
def AddVector(base, vec): rs.AddPoint(base) tip = rs.PointAdd(base, vec) line = rs.AddLine(base, tip) rs.CurveArrows(line, 2)
def AddVector(base, vec): tip = rs.PointAdd(base, vec) line = rs.AddLine(base, tip) rs.CurveArrows(line, 2) return line
def makeFireStair(rect, landingLevels): #HARD VARIABLES minGapSize = .2 minTread = .260 maxRiser = .180 thickness = .15 #(1)Determine Run Direction rs.SimplifyCurve(rect) rectSegments = rs.ExplodeCurves(rect) edge1 = rectSegments[0] edge3 = rectSegments[1] rs.DeleteObject(rectSegments[2]) rs.DeleteObject(rectSegments[3]) if rs.CurveLength(edge1) > rs.CurveLength(edge3): longEdge = edge1 shortEdge = edge3 else: longEdge = edge3 shortEdge = edge1 longVec = rs.VectorCreate(rs.CurveStartPoint(longEdge), rs.CurveEndPoint(longEdge)) longVecRev = rs.VectorReverse(longVec) shortVec = rs.VectorCreate(rs.CurveStartPoint(shortEdge), rs.CurveEndPoint(shortEdge)) shortVecRev = rs.VectorReverse(shortVec) rs.CurveArrows(longEdge, 2) rs.CurveArrows(shortEdge, 2) #(2)Stair Width stairWidth = (rs.CurveLength(shortEdge) - minGapSize) / 2 #LandingRect landing1Plane = rs.PlaneFromFrame(rs.CurveStartPoint(shortEdge), shortVecRev, longVecRev) landing1 = rs.AddRectangle(landing1Plane, rs.CurveLength(shortEdge), stairWidth) landing2Plane = rs.PlaneFromFrame(rs.CurveEndPoint(longEdge), shortVec, longVec) landing2 = rs.AddRectangle(landing2Plane, rs.CurveLength(shortEdge), stairWidth) #(3)Run Length runLength = rs.CurveLength(longEdge) - (stairWidth * 2) #RunRects run1Plane = rs.PlaneFromFrame( rs.CurveEditPoints(landing1)[3], shortVecRev, longVecRev) run1Rect = rs.AddRectangle(run1Plane, stairWidth, runLength) run2Plane = rs.PlaneFromFrame( rs.CurveEditPoints(landing2)[3], shortVec, longVec) run2Rect = rs.AddRectangle(run2Plane, stairWidth, runLength) #(4)Num Flights between Landings numLevels = len(landingLevels) deltaLevels = [] runsPerLevel = [] maxRisersPerRun = math.floor(runLength / minTread) numRuns = 0 for i in range(0, numLevels - 1): deltaLevels.append(landingLevels[i + 1] - landingLevels[i]) minNumRisers = math.ceil(deltaLevels[i] / maxRiser) runsPerLevel.append(math.ceil(minNumRisers / maxRisersPerRun)) numRuns = numRuns + int(runsPerLevel[i]) #(5) Which flights listOfRuns = [] for i in range(0, numRuns): if i % 2: #if even listOfRuns.append(rs.CopyObject(run1Rect)) else: listOfRuns.append(rs.CopyObject(run2Rect)) #(6) Num Treads per run runsDeltaHeight = [] for i in range(0, numLevels - 1): for j in range(0, int(runsPerLevel[i])): runsDeltaHeight.append(deltaLevels[i] / runsPerLevel[i]) numRisersPerRun = [] for i in range(0, numRuns): numRisersPerRun.append(math.ceil(runsDeltaHeight[i] / maxRiser)) #(7) Move Runs elevation = 0 landings = [] for i in range(0, numRuns): elevation = elevation + runsDeltaHeight[i] translation = rs.VectorCreate([0, 0, elevation], [0, 0, 0]) rs.MoveObject(listOfRuns[i], translation) if i % 2: landings.append( rs.MoveObject(rs.CopyObject(landing2), translation)) else: landings.append( rs.MoveObject(rs.CopyObject(landing1), translation)) #(8) Make Landings stairGeo = [] for i in range(0, numRuns): dir = rs.VectorCreate([0, 0, 0], [0, 0, runsDeltaHeight[i]]) #rs.MoveObject(landings[i], dir) path = rs.AddLine([0, 0, 0], [0, 0, -thickness]) geo = rs.ExtrudeCurve(landings[i], path) rs.CapPlanarHoles(geo) stairGeo.append(geo) rs.DeleteObject(path) rs.DeleteObjects(landings) #(9) Draw Stairs runs = [] for i in range(0, numRuns): runs.append( Run(listOfRuns[i], runsDeltaHeight[i], numRisersPerRun[i])) stairGeo.append(runs[i].make()) finalGeo = rs.BooleanUnion(stairGeo, delete_input=True) #Cleanup rs.DeleteObjects(listOfRuns) rs.DeleteObjects(rectSegments) rs.DeleteObject(landing1) rs.DeleteObject(landing2) rs.DeleteObject(run1Rect) rs.DeleteObject(run2Rect) print "done" return finalGeo
def AddVector(vecdir, base_point=None): # Draws a vector (for visualization purposes) base_point = base_point or [0, 0, 0] tip_point = rs.PointAdd(base_point, vecdir) line = rs.AddLine(base_point, tip_point) if line: return rs.CurveArrows(line, 2) # adds an arrow tip
def VectorDraw(vecdir, base_point=[0, 0, 0]): """Draws a vector starting at the given base point.""" tip_point = rs.PointAdd(base_point, vecdir) line = rs.AddLine(base_point, tip_point) if line: return rs.CurveArrows(line, 2) # adds an arrow tip
#coding=utf-8 import rhinoscriptsyntax as rs lines = rs.GetObjects("选中直线", rs.filter.curve) #lines = rs.ObjectsByGroup() #lines = rs.ObjectsByName(line,True) if lines: for i in lines: rs.CurveArrows(i, 2)
def drilling(curve_list, surface1, used_line2, unused_line, closest_p): split_num = 4 point_list = [] if not curve_list: # print("tan2: There is not curve") return if len(curve_list) != 1: cur_length = [] length = 0 # Message: unable to convert 0530c598-26e0-4ff5-a15a-389bd334aeff into Curve geometry for i in range(0, len(curve_list)): if rs.IsCurve(curve_list[i]): length = rs.CurveLength(curve_list[i]) cur_length.append(length) curve_index = cur_length.index(max(cur_length)) curve = curve_list[curve_index] else: curve = curve_list domain = rs.CurveDomain(curve) t = (domain[1] - domain[0]) / split_num for i in range(0, 4): dt = t * i point = rs.EvaluateCurve(curve, dt) point_list.append(point) # 直線の交点を求める line1 = rs.AddLine(point_list[0], point_list[2]) line2 = rs.AddLine(point_list[1], point_list[3]) vec1 = rs.VectorCreate(point_list[2], point_list[0]) vec2 = rs.VectorCreate(point_list[3], point_list[1]) cross = rs.VectorCrossProduct(vec1, vec2) normal = rs.VectorUnitize(cross) curveOnsurface1 = rs.ProjectCurveToSurface(line1, surface1, normal) curveOnsurface2 = rs.ProjectCurveToSurface(line2, surface1, normal) if len(curveOnsurface1) == 0: # ttm add プロジェクションされていない可能性があるため new_vec1 = rs.VectorReverse(normal) curveOnsurface1 = rs.ProjectCurveToSurface(line1, surface1, new_vec1) if len(curveOnsurface2) == 0: # ttm add プロジェクションされていない可能性があるため new_vec2 = rs.VectorReverse(normal) curveOnsurface2 = rs.ProjectCurveToSurface(line2, surface1, new_vec2) if len(curveOnsurface1) == 2 and len(curveOnsurface2) == 2: intersection1 = rs.CurveCurveIntersection(curveOnsurface1[0], curveOnsurface2[0]) intersection2 = rs.CurveCurveIntersection(curveOnsurface1[1], curveOnsurface2[1]) # 条件分岐 if intersection1 is None: intersection1 = rs.CurveCurveIntersection(curveOnsurface1[0], line2) if intersection1 is None: intersection1 = rs.CurveCurveIntersection( curveOnsurface2[0], line1) if intersection1 is None: intersection1 = rs.CurveCurveIntersection( curveOnsurface1[1], line2) if intersection1 is None: intersection1 = rs.CurveCurveIntersection( curveOnsurface2[1], line1) if intersection1 is None: intersection1 = rs.CurveCurveIntersection( curveOnsurface1[0], curveOnsurface2[1]) intersection2 = rs.CurveCurveIntersection( curveOnsurface1[1], curveOnsurface2[0]) else: # normal_reverce = rs.VectorReverse(normal) # curveOnsurface1 = rs.ProjectCurveToSurface(line1, surface1, normal) # curveOnsurface2 = rs.ProjectCurveToSurface(line2, surface1, normal) intersection1 = rs.CurveCurveIntersection( curveOnsurface1[0], curveOnsurface2[0]) #index out of range: 0 intersection2 = None # console # print("intersection1: %s" % (intersection1)) # print("intersection2: %s" % (intersection2)) if intersection1 is None and intersection2 is None: center_point = rs.CurveMidPoint(curveOnsurface1[0]) elif intersection2 is None: center_point = intersection1[0][1] else: center_point1 = intersection1[0][1] center_point2 = intersection2[0][1] dis1 = rs.Distance(center_point1, closest_p) dis2 = rs.Distance(center_point2, closest_p) if dis1 > dis2: center_point = center_point2 else: center_point = center_point1 parameter1 = rs.CurveClosestPoint(unused_line, center_point) parameter2 = rs.CurveClosestPoint(used_line2, center_point) point1 = rs.EvaluateCurve(unused_line, parameter1) # base point point2 = rs.EvaluateCurve(used_line2, parameter2) # base point # ドリル穴のベクトルを生成 drill_line = rs.AddLine(point1, point2) rs.CurveArrows(drill_line, 2) rs.ExtendCurveLength(drill_line, 0, 2, 100) drill_vec = rs.VectorCreate(point2, point1) # 外積計算より回転軸を生成 start_point = rs.CurveStartPoint(unused_line) end_point = rs.CurveEndPoint(unused_line) distance1 = rs.Distance(start_point, center_point) distance2 = rs.Distance(end_point, center_point) if distance1 > distance2: select_point = end_point else: select_point = start_point # 回転平面を定義する origin_point = center_point x_point = point1 y_point = select_point new_plane = rs.PlaneFromPoints(origin_point, x_point, y_point) rs.ViewCPlane(None, new_plane) rotate_p = origin_point vec1 = rs.VectorCreate(x_point, rotate_p) vec2 = rs.VectorCreate(y_point, rotate_p) cross = rs.VectorCrossProduct(vec1, vec2) cross_unit = rs.VectorUnitize(cross) rotate_vec = rs.VectorScale( cross_unit, 100) # Message: Could not convert None to a Vector3d # 描画 # new_rotate_axis = AddVector(center_point, rotate_vector) # rotate_axis = AddVector(rotate_p, rotate_vec) # rs.AddPoint(point1) # rs.AddPoint(point2) # rs.AddPoint(center_point) # object削除 rs.DeleteObject(line1) rs.DeleteObject(line2) for i in range(0, len(curveOnsurface1)): rs.DeleteObject(curveOnsurface1[i]) for i in range(0, len(curveOnsurface2)): rs.DeleteObject(curveOnsurface2[i]) # 平面をもとのxy平面に戻す origin_point = (0, 0, 0) x_point = (100, 0, 0) y_point = (0, 100, 0) new_plane = rs.PlaneFromPoints(origin_point, x_point, y_point) rs.ViewCPlane(None, new_plane) # 戻り値(ドリルライン、ドリルベクトル、回転軸、回転軸点) return drill_line, drill_vec, rotate_vec, center_point
import rhinoscriptsyntax as rs base_point = ( 20, 10, 5) vector_A = ( 10, 10, 10) rs.AddPoint(base_point) tip_point = rs.PointAdd(base_point, vector_A) line = rs.AddLine(base_point, tip_point) rs.CurveArrows(line, 2)
def AddVector(vecdir, base_point=[0, 0, 0]): tip_point = rs.PointAdd(base_point, vecdir) line = rs.AddLine(base_point, tip_point) if line: return rs.CurveArrows(line, 2) # adds an arrow tip
import rhinoscriptsyntax as rs from compas_rhino.geometry import RhinoMesh from compas_pattern.datastructures.mesh_quad.mesh_quad import QuadMesh guids = rs.GetObjects('get quad meshes', filter = 32) rs.EnableRedraw(False) for guid in guids: mesh = QuadMesh.from_vertices_and_faces(*RhinoMesh.from_guid(guid).get_vertices_and_faces()) mesh.collect_strips() polylines = [rs.AddPolyline(mesh.strip_edge_polyline(skey)) for skey in mesh.strips()] for polyline in polylines: rs.CurveArrows(polyline, 3)
def AddVector(vecdir, base_point): tip_point = rs.PointAdd(base_point, vecdir) line = rs.AddLine(base_point, tip_point) if line: rs.CurveArrows(line, 2)