def DrawDoubleLines(cls, layer, offsetType): # startPoint gp = Rhino.Input.Custom.GetPoint() gp.SetCommandPrompt("Pick first point") gp.Get() if gp.CommandResult() != Rhino.Commands.Result.Success: return gp.CommandResult() point1 = gp.Point() gp.Dispose() # secondPoint line00 = None line01 = None oldLayer = rs.CurrentLayer(layer) while True: gp = Rhino.Input.Custom.GetPoint() gp.SetCommandPrompt("Pick second point") gp.DrawLineFromPoint(point1, True) gp.EnableDrawLineFromPoint(True) gp.Get() if gp.CommandResult() != Rhino.Commands.Result.Success: rs.CurrentLayer(oldLayer) return gp.CommandResult() point2 = gp.Point() if point2: doubleLine = cls.MakeDoubleLine(config.DOUBLELINEWIDTH, point1, point2, offsetType) if (line00 != None) and (line01 != None): line10, line11 = doubleLine.draw() p0 = rs.LineLineIntersection(line00, line10) p1 = rs.LineLineIntersection(line01, line11) rs.AddLine(rs.CurveStartPoint(line00), p0[0]) rs.AddLine(rs.CurveStartPoint(line01), p1[0]) rs.DeleteObject(line00) rs.DeleteObject(line01) line00 = rs.AddLine(p0[1], rs.CurveEndPoint(line10)) line01 = rs.AddLine(p1[1], rs.CurveEndPoint(line11)) rs.DeleteObject(line10) rs.DeleteObject(line11) else: line00, line01 = doubleLine.draw() point1 = point2 else: sc.errorhandler() break gp.Dispose() rs.CurrentLayer(oldLayer)
def rampIntersection(route1, route2, width): edges = [] offSeg1 = offsetLine(route1, width / 2) offSeg2 = offsetLine(route2, width / 2) test1 = rs.CurveCurveIntersection(offSeg1, offSeg2) if (test1 == None): side1 = False else: side1 = True offSeg3 = offsetLine(route1, -width / 2) offSeg4 = offsetLine(route2, -width / 2) rs.ObjectColor(offSeg3, [255, 0, 0]) rs.ObjectColor(offSeg4, [255, 0, 0]) test2 = rs.CurveCurveIntersection(offSeg3, offSeg4) if (test2 == None): side2 = False else: side2 = True if (side1): pivotPt = rs.LineLineIntersection(offSeg1, offSeg2)[0] perpPt1 = rs.EvaluateCurve(offSeg3, rs.CurveClosestPoint(offSeg3, pivotPt)) perpPt2 = rs.EvaluateCurve(offSeg4, rs.CurveClosestPoint(offSeg4, pivotPt)) edges.append(rs.AddLine(pivotPt, perpPt1)) edges.append(rs.AddLine(pivotPt, perpPt2)) elbowPt = rs.LineLineIntersection(offSeg3, offSeg4)[0] else: pivotPt = rs.LineLineIntersection(offSeg3, offSeg4)[0] perpPt1 = rs.EvaluateCurve(offSeg1, rs.CurveClosestPoint(offSeg1, pivotPt)) perpPt2 = rs.EvaluateCurve(offSeg2, rs.CurveClosestPoint(offSeg2, pivotPt)) edges.append(rs.AddLine(pivotPt, perpPt1)) edges.append(rs.AddLine(pivotPt, perpPt2)) elbowPt = rs.LineLineIntersection(offSeg1, offSeg2)[0] rs.DeleteObject(offSeg1) rs.DeleteObject(offSeg2) rs.DeleteObject(offSeg3) rs.DeleteObject(offSeg4) landing = rs.AddPolyline([pivotPt, perpPt1, elbowPt, perpPt2, pivotPt]) return edges, landing
def setIntersectParallelLines(self, parallelLines, nodes): for parallelLine in parallelLines: if (self.no == parallelLine.no): continue for myLine in self.lines: for yourLine in parallelLine.lines: pts = rs.LineLineIntersection([myLine.sPt, myLine.ePt], [yourLine.sPt, yourLine.ePt]) if pts is not None: node = Node(pts[0], [myLine, yourLine]) node = self.checkNodes(node, nodes) myLine.nodes.append(node)
def addExtlHandrail(self): hdrlPtList = [] hdrlEndPt = rs.AddPoint(rs.CurveEndPoint(self.guideCrv)) hdrlStPt = rs.AddPoint(rs.CurveStartPoint(self.guideCrv)) hdrlVec = rs.VectorCreate(hdrlStPt, hdrlEndPt) projHdrlVec = rs.VectorUnitize([hdrlVec.X, hdrlVec.Y, 0]) #Top Extension topExtEndPt = rs.CopyObject(hdrlEndPt) rs.MoveObject(topExtEndPt, rs.VectorScale(projHdrlVec, -.305)) hdrlPtList.append(topExtEndPt) #Btm Extension (tread length method) btmExtEndPt = rs.CopyObject(hdrlStPt) btmPtExtTemp = rs.CopyObject(hdrlStPt) btmVertPtExtTemp = rs.CopyObject(hdrlStPt) rs.MoveObject(btmPtExtTemp, hdrlVec) angledLineTemp = rs.AddLine(hdrlStPt, btmPtExtTemp) rs.MoveObject(btmVertPtExtTemp, [0, 0, -1]) vertLineTemp = rs.AddLine(btmVertPtExtTemp, hdrlStPt) rs.MoveObject(vertLineTemp, rs.VectorScale(projHdrlVec, self.treadLength)) btmExtPt = rs.LineLineIntersection(angledLineTemp, vertLineTemp)[0] hdrlPtList.append(hdrlEndPt) hdrlPtList.append(btmExtPt) #Make and move hdrlCrv = rs.AddPolyline(hdrlPtList) rs.MoveObject(hdrlCrv, [0, 0, self.hdrlHeight]) #move away from wall widthVec = rs.VectorUnitize( rs.VectorCreate(rs.CurveEndPoint(self.stairWidthEdge), rs.CurveStartPoint(self.stairWidthEdge))) rs.MoveObject(hdrlCrv, rs.VectorScale(widthVec, self.hdrlDistFromWall)) #cleanup rs.DeleteObject(topExtEndPt) rs.DeleteObject(hdrlEndPt) rs.DeleteObject(hdrlStPt) rs.DeleteObject(btmPtExtTemp) rs.DeleteObject(btmVertPtExtTemp) rs.DeleteObject(angledLineTemp) rs.DeleteObject(vertLineTemp) rs.DeleteObject(btmExtEndPt) return hdrlCrv
def addIntlHandrail(self, minGapSize, riserHeight, extensionLength): innerGuideCrv = rs.CopyObject(self.guideCrv) ptList = [] stairWidth = rs.CurveLength(self.stairWidthEdge) stairEdgeEnd = rs.CurveEndPoint(self.stairWidthEdge) stairEdgeStart = rs.CurveStartPoint(self.stairWidthEdge) widthVec = rs.VectorUnitize( rs.VectorCreate(stairEdgeEnd, stairEdgeStart)) rs.MoveObject( innerGuideCrv, rs.VectorScale(widthVec, stairWidth - self.hdrlDistFromWall)) guideCrvVec = rs.VectorUnitize( rs.VectorCreate(rs.CurveEndPoint(self.guideCrv), rs.CurveStartPoint(self.guideCrv))) projGuideVec = rs.VectorUnitize([guideCrvVec.X, guideCrvVec.Y, 0]) guideCrvStPt = rs.AddPoint(rs.CurveStartPoint(innerGuideCrv)) ######1 guideCrvEndPt = rs.AddPoint(rs.CurveEndPoint(innerGuideCrv)) #(1) Angled Extension angledEndPt = rs.MoveObject(rs.CopyObject(guideCrvStPt), rs.VectorScale(guideCrvVec, -1)) angledLine = rs.AddLine(guideCrvStPt, angledEndPt) #(2) vertLine vertLineBtmPt = rs.MoveObject(rs.CopyObject(guideCrvStPt), [0, 0, -riserHeight]) vertLine = rs.AddLine(vertLineBtmPt, guideCrvStPt) #intersection rs.MoveObject(vertLine, rs.VectorScale(projGuideVec, -self.hdrlDistFromWall)) rs.MoveObject(vertLineBtmPt, rs.VectorScale(projGuideVec, -self.hdrlDistFromWall)) ######3 extIntPt = rs.AddPoint( rs.LineLineIntersection(angledLine, vertLine)[0]) ######2 #(3) Crosspiece crossPieceEnd = rs.MoveObject( rs.CopyObject(vertLineBtmPt), rs.VectorScale(widthVec, (self.hdrlDistFromWall * 2) + minGapSize)) #####4 #(4) topExtension topExtEndPt = rs.MoveObject( rs.CopyObject(guideCrvEndPt), rs.VectorScale( projGuideVec, extensionLength + self.hdrlDistFromWall + self.treadLength)) ####1 #Create final line ptList.append(topExtEndPt) ptList.append(guideCrvEndPt) ptList.append(extIntPt) ptList.append(vertLineBtmPt) ptList.append(crossPieceEnd) finalLine = rs.AddPolyline(ptList) rs.MoveObject(finalLine, [0, 0, self.hdrlHeight]) #cleanup rs.DeleteObjects([ topExtEndPt, guideCrvEndPt, extIntPt, vertLineBtmPt, crossPieceEnd ]) rs.DeleteObject(angledLine) rs.DeleteObject(vertLine) rs.DeleteObject(angledEndPt) rs.DeleteObject(guideCrvStPt) rs.DeleteObject(innerGuideCrv) return finalLine
def make(self): runVector = rs.VectorCreate(rs.CurveEndPoint(self.runLongEdge), rs.CurveStartPoint(self.runLongEdge)) unitRunVec = rs.VectorUnitize(runVector) treadVec = rs.VectorScale(unitRunVec, self.treadLength) riseVec = rs.VectorCreate([0, 0, self.riserHeight], [0, 0, 0]) newPt = [ rs.CurveStartPoint(self.firstRiserEdge).X, rs.CurveStartPoint(self.firstRiserEdge).Y, rs.CurveStartPoint(self.firstRiserEdge).Z - self.deltaHeight ] ptList = [] ptList.append(rs.AddPoint(newPt)) for i in range(self.numRisers): tempPt = rs.CopyObject(ptList[-1]) rs.MoveObject(tempPt, riseVec) ptList.append(tempPt) tempPt = rs.CopyObject(ptList[-1]) rs.MoveObject(tempPt, treadVec) ptList.append(tempPt) #stringer construct offset line undersideLine = rs.AddLine(ptList[0], ptList[-1]) closestPtParam = rs.CurveClosestPoint(undersideLine, ptList[1]) closestPt = rs.EvaluateCurve(undersideLine, closestPtParam) perpVec = rs.VectorUnitize(rs.VectorCreate(ptList[1], closestPt)) stringerBtm = rs.MoveObject(undersideLine, rs.VectorScale(perpVec, -self.thickness)) cnstrLine = rs.ScaleObject(stringerBtm, rs.CurveMidPoint(stringerBtm), [2, 2, 2]) #line going down btmPt = rs.MoveObject(ptList[0], [0, 0, -self.thickness]) moveDir = rs.VectorCreate(ptList[2], ptList[1]) btmPtMoved = rs.MoveObject(rs.CopyObject(btmPt), rs.VectorScale(moveDir, 3)) btmLineCnstr = rs.AddLine(btmPt, btmPtMoved) ptIntersectBtm = rs.AddPoint( rs.LineLineIntersection(btmLineCnstr, cnstrLine)[0]) #yes #top lines topVec = rs.VectorScale( rs.VectorUnitize(rs.VectorCreate(ptList[-1], ptList[-2])), self.extenionLength) topPt1 = rs.MoveObject(ptList[-1], topVec) topPtDown = rs.MoveObject(rs.CopyObject(topPt1), [0, 0, -self.thickness]) extLengthTemp = self.extenionLength if extLengthTemp < .1: extLengthTemp = .1 topVec = rs.VectorScale( rs.VectorUnitize(rs.VectorCreate(ptList[-1], ptList[-2])), extLengthTemp) topPtTemp = rs.MoveObject(rs.CopyObject(topPtDown), topVec) topLine = rs.AddLine(topPtDown, topPtTemp) ptIntersectTop = rs.AddPoint( rs.LineLineIntersection(topLine, cnstrLine)[0]) #yes ptList.append(topPtDown) ptList.append(ptIntersectTop) ptList.append(ptIntersectBtm) stringer = rs.AddPolyline(ptList) closeCrv = rs.AddLine(rs.CurveStartPoint(stringer), rs.CurveEndPoint(stringer)) newStringer = rs.JoinCurves([stringer, closeCrv], True) stair = rs.ExtrudeCurve(newStringer, self.firstRiserEdge) rs.CapPlanarHoles(stair) #make handrail guide curve topOfNosing = rs.AddLine(ptList[1], ptList[-5]) self.guideCrv = topOfNosing rs.DeleteObject(btmLineCnstr) rs.DeleteObject(btmPtMoved) rs.DeleteObject(btmLineCnstr) rs.DeleteObject(ptIntersectTop) rs.DeleteObject(undersideLine) rs.DeleteObject(topPtTemp) rs.DeleteObject(topLine) rs.DeleteObject(stringer) rs.DeleteObject(newStringer) rs.DeleteObjects(ptList) return stair
def drawRhombusOnRegularOffsetLine(emblem): tmpObjs = [] for rhomboid in emblem.rhomboids: objs = [] # 中点長方形の対角四角形 for i in range(len(rhomboid.midPts)): p0 = rhomboid.midPts[i] if (i == 0): nextMidPt = rhomboid.midPts[i + 1] prevtMidPt = rhomboid.midPts[len(rhomboid.midPts) - 1] elif (i == len(rhomboid.midPts) - 1): nextMidPt = rhomboid.midPts[0] prevtMidPt = rhomboid.midPts[i - 1] else: nextMidPt = rhomboid.midPts[i + 1] prevtMidPt = rhomboid.midPts[i - 1] p1 = rs.VectorAdd(p0, nextMidPt) p1 = rs.VectorDivide(p1, 2.0) p2 = rhomboid.ellipsePts[0] p3 = rs.VectorAdd(p0, prevtMidPt) p3 = rs.VectorDivide(p3, 2.0) pts = [p0, p1, p2, p3, p0] obj = rs.AddPolyline(pts) if (i % 2 == 0): rs.ObjectLayer(obj, "srf%s" % rhomboid.lines[1].no) else: rs.ObjectLayer(obj, "srf%s" % rhomboid.lines[0].no) objs.append(obj) # 外周面 pts = [] for pt in rhomboid.pts: pts.append(pt) pts.append(pts[0]) obj = rs.AddPolyline(pts) rs.ObjectLayer(obj, "srfRhomboid") objs.append(obj) # 外周線 for i in range(len(rhomboid.pts)): if (i == len(rhomboid.pts) - 1): obj = rs.AddLine(rhomboid.pts[i], rhomboid.pts[0]) else: obj = rs.AddLine(rhomboid.pts[i], rhomboid.pts[i + 1]) rs.ObjectLayer(obj, "lineBlack") objs.append(obj) # move to center objs = rs.MoveObjects(objs, [ -rhomboid.ellipsePts[0][0], -rhomboid.ellipsePts[0][1], -rhomboid.ellipsePts[0][2] ]) # rotate xform = rs.XformRotation2(rhomboid.rotateAng, [0, 0, 1], [0, 0, 0]) rs.TransformObjects(objs, xform) # move pts = rs.LineLineIntersection( [rhomboid.lines[0].sPt, rhomboid.lines[0].ePt], [rhomboid.lines[1].sPt, rhomboid.lines[1].ePt]) rs.MoveObjects(objs, pts[0]) # tmpObjs for obj in objs: tmpObjs.append(obj) return tmpObjs
rs.RotateObject(outterCircle, point, 90) rs.RotateObject(innerCircle, point, 90) dividedPoints = rs.DivideCurve(outterCircle, division, True) dividedPointsInner = rs.DivideCurve(innerCircle, division, True) lines1 = [] lines2 = [] lines3 = [] lines4 = [] for i in range(len(dividedPoints)): lines1.append(rs.AddLine(dividedPoints[i],dividedPoints[(i+3)%division])) lines2.append(rs.AddLine(dividedPoints[i],dividedPoints[(i+4)%division])) lines3.append(rs.AddLine(point, dividedPoints[i])) for j in range(len(lines1)): intersection = rs.LineLineIntersection(lines1[j], lines1[(j+2)%division]) rs.AddLine(point,intersection[0]) lines4.append(dividedPoints[0]) x = rs.LineLineIntersection(lines1[0],lines2[7]) lines4.append(rs.AddPoint(x[0])) z = rs.LineLineIntersection(lines3[0],lines2[7]) lines4.append(rs.AddPoint(z[0])) y = rs.LineLineIntersection(lines1[7], lines2[9]) lines4.append(rs.AddPoint(y[0])) lines4.append(dividedPoints[0]) polylines = [] polyline = rs.AddCurve(lines4, 1) polylines.append(polyline)
def MakeRampLandings(allLines, hdrlCtrOffset): landingGeo = [] hdrls = [] rs.DeleteObject(allLines[0]) rs.DeleteObject(allLines[-1]) del allLines[0] del allLines[-1] for i in range(0, len(allLines), 2): #TOP LINE stPt = rs.CurveStartPoint(allLines[i]) endPt = rs.CurveEndPoint(allLines[i]) tanVec = rs.CurveTangent(allLines[i], 0) perpVec = rs.VectorRotate(tanVec, 90, (0, 0, 1)) stPtOffset = rs.CopyObject(stPt, perpVec) endPtOffset = rs.CopyObject(endPt, perpVec) stLine = rs.AddLine(stPt, stPtOffset) endLine = rs.AddLine(endPt, endPtOffset) #Bottom line allLines[i] stPtBtm = rs.CurveStartPoint(allLines[i + 1]) endPtBtm = rs.CurveEndPoint(allLines[i + 1]) tanVecBtm = rs.CurveTangent(allLines[i + 1], 0) perpVecBtm = rs.VectorRotate(tanVecBtm, -90, (0, 0, 1)) stPtOffsetBtm = rs.CopyObject(stPtBtm, perpVecBtm) endPtOffsetBtm = rs.CopyObject(endPtBtm, perpVecBtm) stLineBtm = rs.AddLine(stPtBtm, stPtOffsetBtm) endLineBtm = rs.AddLine(endPtBtm, endPtOffsetBtm) #Intersection try: stInter = rs.AddPoint( rs.LineLineIntersection(stLineBtm, stLine)[0]) except: stInter = stPt try: endInter = rs.AddPoint( rs.LineLineIntersection(endLineBtm, endLine)[0]) except: endInter = endPt landingPts = [stPt, endPt, endInter, endPtBtm, stPtBtm, stInter, stPt] landingCrv = rs.AddPolyline(landingPts) landingGeo.append(rs.AddPlanarSrf(landingCrv)) #Handrails hdrl1 = rs.AddPolyline([stPt, stInter, stPtBtm]) hdrl1b = rs.OffsetCurve(hdrl1, endPt, hdrlCtrOffset, (0, 0, 1)) hdrls.append(hdrl1b) hdrl2 = rs.AddPolyline([endPt, endInter, endPtBtm]) hdrl2b = rs.OffsetCurve(hdrl2, stPt, hdrlCtrOffset, (0, 0, 1)) hdrls.append(hdrl2b) rs.DeleteObject(hdrl1) rs.DeleteObject(hdrl2) rs.DeleteObject(landingCrv) rs.DeleteObject(stLine) rs.DeleteObject(endLine) rs.DeleteObject(stLineBtm) rs.DeleteObject(endLineBtm) try: rs.DeleteObjects([ stPtOffset, endPtOffset, stPtOffsetBtm, endPtOffsetBtm, stInter, endInter ]) except: rs.DeleteObjects( [stPtOffset, endPtOffset, stPtOffsetBtm, endPtOffsetBtm]) rs.DeleteObjects(allLines) return landingGeo, hdrls
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #Practice 5 #################################################################### import rhinoscriptsyntax as rs startPoint = [1.0, 2.0, 0.0] endPoint = [4.0, 5.0, 0.0] line1 = [startPoint, endPoint] line1ID = rs.AddLine( line1[0], line1[1]) # Adds a line to the Rhino Document and returns an ObjectID startPoint2 = [1.0, 4.0, 0.0] endPoint2 = [4.0, 2.0, 0.0] line2 = [startPoint2, endPoint2] line2ID = rs.AddLine(line2[0], line2[1]) # Returns another ObjectID int1 = rs.LineLineIntersection( line1ID, line2ID) # passing the ObjectIDs to the function. #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #Practice 6 #################################################################### import rhinoscriptsyntax as rs ptOrigin = rs.GetPoint("Plane origin") ptX = rs.GetPoint("Plane X-axis", ptOrigin) ptY = rs.GetPoint("Plane Y-axis", ptOrigin) dX = rs.Distance(ptOrigin, ptX) dY = rs.Distance(ptOrigin, ptY) arrPlane = rs.PlaneFromPoints(ptOrigin, ptX, ptY) rs.AddPlaneSurface(arrPlane, 1.0, 1.0) rs.AddPlaneSurface(arrPlane, dX, dY) #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
__author__ = "billpower" __version__ = "2020.01.28" import rhinoscriptsyntax as rs li = Lines lst = [] #直线首尾点和交点 pls = [] #根据交点构建的直线 plsp = [] #用于临时放置循环每一步的交点 pl = [] #用于临时放置循环每一步的交点和首尾点 #嵌套循环得出所有直线交点 for i in range(len(li)): for p in li: point = rs.LineLineIntersection(li[i],p) if point and rs.IsPointOnCurve(li[i],point[0]) and rs.IsPointOnCurve(p,point[0]): #有交点且同时在两直线上 lst.append(point[0]) plsp.append(point[0]) #取首尾点 sta = rs.CurveStartPoint(li[i]) end = rs.CurveEndPoint(li[i]) #加入临时点列表 pl = [sta]+plsp+[end] #单个数据加[]改为列表 #排序点并且连为折线 pls.append(rs.AddPolyline(rs.SortPointList(pl))) plsp = [] pl = [] print(lst) print(PLS) IntersectionPoints = lst