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 + " ")
Exemple #2
0
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)
Exemple #3
0
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)
Exemple #4
0
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)
Exemple #6
0
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)