def PictureframeOnScale(): filter = "PNG (*.png)|*.png|JPG (*.jpg)|*.jpg|BMP (*.bmp)|*.bmp|All (*.*)|*.*||" #filter = "PNG (*.png)|*.png" filename = rs.OpenFileName("Select existing image file", filter) if not filename: return # use the System.Drawing.Bitmap class described at # [url]http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx[/url] img = SD.Bitmap(filename) img.Dispose # define scale from inch to file unitsystem dblScale = rs.UnitScale(rs.UnitSystem(), 8) #calculate width based on image pixel dimension and image HorizontalResolution w = str((img.Width / img.HorizontalResolution) * dblScale) #release the image (not sure if this is correct but seems to work) # scripted rhino command pictureframe with width and height as calculated above rs.Command("!_-PictureFrame \"" + filename + "\" _Pause " + w + " ")
def VolumeLiters(): """Report the volume in Litres of closed surfaces, polysurfaces, or meshes.""" input_obj = rs.SelectedObjects() if not input_obj: input_obj = rs.GetObjects("Select objects") if not input_obj: return volume = 0.0 for o in input_obj: if rs.IsMesh(o): a, b, c = rs.MeshVolume(o) volume += b elif rs.IsObjectSolid(o): a, b = rs.SurfaceVolume(o) volume += a if volume == 0.0: return volume = round(volume / (rs.UnitScale(rs.UnitSystem(), 3) * 10)**3, 3) print "Volume = {} liters".format(volume)
def FilamentCalculator(): """3D Printing filament length, weight, volume calculator.""" input_obj = rs.SelectedObjects() if not input_obj: input_obj = rs.GetObjects("Select objects") if not input_obj: return volume = 0.0 for o in input_obj: if rs.IsMesh(o): a, b, c = rs.MeshVolume(o) volume += b elif rs.IsObjectSolid(o): a, b = rs.SurfaceVolume(o) volume += a if volume == 0.0: return filaments = { "PLA": 1.24, "ABS": 1.05, "ASA": 1.07, "PETG": 1.27, "PETT": 1.45, "HIPS": 1.07, "TPU": 1.30, "PMMA": 1.18, "Nylon": 1.08, "Polycarbonate": 1.20, "Copperfill": 3.90 } filament = rs.GetString("Material:", "PLA", [a for a in filaments]) density = filaments[filament] volume = volume / rs.UnitScale(rs.UnitSystem(), 3)**3 weight = volume * filaments[filament] l1 = volume / (math.pi * (0.175 / 2)**2) / 100 l2 = volume / (math.pi * (0.285 / 2)**2) / 100 l3 = volume / (math.pi * (0.3 / 2)**2) / 100 volume = round(volume, 3) weight = round(weight, 3) l1 = round(l1, 2) l2 = round(l2, 2) l3 = round(l3, 2) message = """{f}: Density = {d} grams / cubic centimeter Volume = {v} cubic centimeters Weight ~ {w} grams 1.75 mm filament length ~ {l1} meters 2.85 mm filament length ~ {l2} meters 3.00 mm filament length ~ {l3} meters""" message = message.format(f=filament, d=density, v=volume, w=weight, l1=l1, l2=l2, l3=l3) rs.MessageBox(message, buttons=0, title="FilamentCalculator:") print(message)
def createSinglePDF(_view, _saveFolder, _fileName): # Takes in a RhinoView and Exports it to PDF subFolder = '' #'\Exports\\' outputFolderPath = '{}{}'.format(_saveFolder, subFolder) if outputFolderPath[-1] == '\\': pass else: outputFolderPath = outputFolderPath + '\\' # If the folder doesn't already exist, create it if os.path.exists(os.path.dirname(outputFolderPath)) == False: print 'Creating the folder: {}'.format(outputFolderPath) os.makedirs(os.path.dirname(outputFolderPath)) else: pass # Layout Page Size in Layout's Units pageHeight = sc.doc.Views.ActiveView.PageHeight pageWidth = sc.doc.Views.ActiveView.PageWidth # Layout Page Size in Inches # Ref: https://developer.rhino3d.com/api/RhinoScriptSyntax/#document-UnitScale # Ref: https://developer.rhino3d.com/api/RhinoCommon/html/P_Rhino_RhinoDoc_PageUnitSystem.htm pageUnitSysemNumber = rs.UnitSystem(in_model_units=False) pageHeight = pageHeight * rs.UnitScale( 8, pageUnitSysemNumber) # Type 8 = Inches pageWidth = pageWidth * rs.UnitScale(8, pageUnitSysemNumber) pageHeight = round(pageHeight, 2) pageWidth = round(pageWidth, 2) pdf = Rhino.FileIO.FilePdf.Create() dpi = 300 size = System.Drawing.Size(pageWidth * dpi, pageHeight * dpi) # Should get this from the view? settings = Rhino.Display.ViewCaptureSettings(_view, size, dpi) settings.OutputColor = Rhino.Display.ViewCaptureSettings.ColorMode.DisplayColor pdf.AddPage(settings) filePath = outputFolderPath + _fileName + '.pdf' pdf.Write(filePath)
def RunCommand(is_interactive): #rs.EnableRedraw(False) cplane = rs.ViewCPlane() area = 0 defaultName = '' areaObjs = rs.GetObjects("Select Objects", filter=65536, preselect=True) if not areaObjs: rs.EnableRedraw(True) print("No object selected. Exiting command.") return areaName = rs.GetString( "Enter name of area to be displayed", object_names(areaObjs), ["RETAIL", "RESIDENTIAL", "AMENITY", "BOH", "LOBBY"]) if not areaName: rs.EnableRedraw(True) return # GRAPHIC SCALE OPTIONS nameOffset = .4 nameTextSize = 1 areaTextSize = .8 scale = rs.GetReal("Text height (in Rhino Units)", defaultScale) if not scale: print("Text height not entered, exiting command") rs.EnableRedraw(True) return nameOffset = nameOffset * scale nameTextSize = nameTextSize * scale areaTextSize = areaTextSize * scale # GET AREA and Format it to Integer with commas area = get_area(areaObjs) area = area * (rs.UnitScale(9))**2 area = int(area) area = "{:,} SF".format(area) bbox = rs.BoundingBox(areaObjs, cplane) pt_sum = bbox[0] for i in xrange(1, len(bbox)): pt_sum += bbox[i] area_avg = rs.AddPoint(pt_sum / len(bbox)) areaCenter = rs.PointCoordinates( rs.MoveObject(area_avg, cplane.YAxis * (nameOffset + areaTextSize) / -2)) nameCenter = rs.PointCoordinates( rs.MoveObject(area_avg, cplane.YAxis * (nameOffset + nameTextSize))) # print(nameCenter, areaCenter) # CREATE THE TEXT areaText = rs.AddText(area, areaCenter, areaTextSize, justification=2) nameText = rs.AddText(areaName, nameCenter, nameTextSize, justification=2) # CREATE BOX AROUND TEXT textBounds = rs.BoundingBox(areaText, cplane) textBoundary = rs.AddPolyline(textBounds[0:5]) nameTextHeight = rs.Distance( rs.BoundingBox(nameText, cplane)[2], rs.BoundingBox(nameText, cplane)[1]) textBorder = rs.OffsetCurve(textBoundary, (0, 0, 0), .25 * scale, style=1) rs.DeleteObject(textBoundary) rs.ObjectName(nameText, "Name Text") rs.ObjectName(areaText, "Area Text") rs.ObjectName(textBorder, "Text Border") parent = rs.ParentLayer( rs.ObjectLayer(areaObjs[0])) + '::' if rs.ParentLayer( rs.ObjectLayer(areaObjs[0])) else '' # print("LAYER NAME", rs.LayerName(parent+"A-ANNO-NOTE")) if not rs.IsLayer(parent + "A-ANNO-NOTE"): rs.AddLayer(parent + "A-ANNO-NOTE") rs.ObjectLayer(nameText, parent + "A-ANNO-NOTE") rs.ObjectLayer(areaText, parent + "A-ANNO-NOTE") rs.ObjectLayer(textBorder, parent + "A-ANNO-NOTE") areasGroup = rs.AddGroup() rs.AddObjectsToGroup([areaText, nameText, textBorder], areasGroup) rs.SelectObjects(rs.ObjectsByGroup(areasGroup)) rs.DeleteObject(area_avg) rs.EnableRedraw(True)
def RunCommand(is_interactive): rs.EnableRedraw(False) defaultName = '' areaObj = rs.GetObject("Select Object:", filter=65536, preselect=True) areaName = rs.ObjectName(areaObj) if not areaName: defaultName = rs.ObjectLayer(areaObj).split("-")[-1].replace("_", " ") print("default", defaultName) areaName = rs.GetString( "Enter name of area to be displayed", defaultName, ["RETAIL", "RESIDENTIAL", "AMENITY", "BOH", "LOBBY"]) else: areaName = areaName.upper() #areaName = areaName.replace(" ", "\n") nameOffset = 20 nameTextSize = 50 areaTextSize = 40 scale = rs.GetReal("Scale for text (.5 for towers)", 1) nameOffset = nameOffset * scale nameTextSize = nameTextSize * scale areaTextSize = areaTextSize * scale areaObjExp = rs.ExplodeHatch(areaObj) try: area = rs.Area(areaObjExp) except: print("Object not a solid hatch") rs.DeleteObject(areaObjExp) area = area * (rs.UnitScale(9))**2 area = int(area) area = "{:,} SF".format(area) areaCenter = rs.SurfaceAreaCentroid(areaObjExp)[0] rs.DeleteObject(areaObjExp) areaCenter = rs.PointAdd(areaCenter, (0, ((nameOffset + areaTextSize) / -2), 0)) nameCenter = rs.PointAdd(areaCenter, (0, nameOffset + nameTextSize, 0)) print(nameCenter, areaCenter) areaText = rs.AddText(area, areaCenter, areaTextSize, justification=2) nameText = rs.AddText(areaName, nameCenter, nameTextSize, justification=2) textBounds = rs.BoundingBox(areaText) textBoundary = rs.AddPolyline(textBounds[0:5]) nameTextHeight = rs.Distance( rs.BoundingBox(nameText)[2], rs.BoundingBox(nameText)[1]) print("AreaNameHeight", nameTextHeight) textBorder = rs.OffsetCurve(textBoundary, (0, 0, 0), 5 * scale, style=1) rs.DeleteObject(textBoundary) rs.ObjectName(nameText, "Name Text") rs.ObjectName(areaText, "Area Text") rs.ObjectName(textBorder, "Text Border") parent = rs.ParentLayer(rs.ObjectLayer(areaObj)) rs.ObjectLayer(nameText, parent + "::A-ANNO-NOTE") rs.ObjectLayer(areaText, parent + "::A-ANNO-NOTE") rs.ObjectLayer(textBorder, parent + "::A-ANNO-NOTE") areasGroup = rs.AddGroup() rs.AddObjectsToGroup([areaText, nameText, textBorder], areasGroup) rs.SelectObjects(rs.ObjectsByGroup(areasGroup)) rs.EnableRedraw(True)