Skip to content

Instantly share code, notes, and snippets.

@Cyril-Pop
Last active April 30, 2024 10:02
Show Gist options
  • Save Cyril-Pop/0fa9c7465632fd78395ad203f6668ffc to your computer and use it in GitHub Desktop.
Save Cyril-Pop/0fa9c7465632fd78395ad203f6668ffc to your computer and use it in GitHub Desktop.
import clr
import sys
import System
clr.AddReference("System.Numerics")
#
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import Autodesk.DesignScript.Geometry as DS
#import Revit API
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB
#import specify namespace
from Autodesk.Revit.DB.Electrical import *
from Autodesk.Revit.DB.Structure import *
#import net library
from System import Array
from System.Collections.Generic import List, IList, Dictionary
#import transactionManager and DocumentManager (RevitServices is specific to Dynamo)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
my_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments)
pf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)
clr.AddReference('Python.Included')
import Python.Included as pyInc
path_py3_lib = pyInc.Installer.EmbeddedPythonHome
sys.path.append(path_py3_lib + r'\Lib\site-packages')
import numpy as np
import pandas as pd
import webbrowser
import matplotlib.pyplot as plt
import io
import base64
import re
clr.AddReference('System.Drawing')
clr.AddReference('System.Windows.Forms')
import System.Drawing
import System.Windows.Forms
from System.Drawing import *
from System.Windows.Forms import *
class MyForm(Form):
#
# __namespace__ = f"MyForm_{int(time.time())}"
def __init__(self):
super().__init__()
self.init_htmlDf = """\
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9">
<style>
table, th, td {font-size:10pt; border:1px solid black; border-collapse:collapse; text-align:left;}
th, td {padding: 5px;}
tr:nth-child(even) {background: #E0E0E0;}
tr:hover {background: silver; cursor: pointer;}
</style>
</head>
<body>
</body>
</html>
"""
self.htmlDf = self.init_htmlDf
self.InitializeComponent()
def InitializeComponent(self):
self._webBrowser1 = System.Windows.Forms.WebBrowser()
self.SuspendLayout()
#
# webBrowser1
#
self._webBrowser1.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right
self._webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill
self._webBrowser1.Location = System.Drawing.Point(0, 0)
self._webBrowser1.ScriptErrorsSuppressed = True
self._webBrowser1.Name = "webBrowser1"
self._webBrowser1.Size = System.Drawing.Size(594, 528)
self._webBrowser1.TabIndex = 0
self._webBrowser1.DocumentText = self.htmlDf
self._webBrowser1.DocumentCompleted += self.WebBrowser1DocumentCompleted
#
# Form27
#
self.ClientSize = System.Drawing.Size(600, 540)
self.Controls.Add(self._webBrowser1)
self.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show
self.SizeChanged += self.FormSizeChanged
self.Name = "Form27"
self.Text = "PandasViewer"
def WebBrowser1DocumentCompleted(self, sender, e):
#self._webBrowser1.Size = self._webBrowser1.Document.Body.ScrollRectangle.Size
self._webBrowser1.Document.Body.ScrollIntoView(False)
def FormSizeChanged(self, sender, e):
self._webBrowser1.Size = System.Drawing.Size.Subtract(self.ClientSize, System.Drawing.Size(10, 10))
self._webBrowser1.Document.Body.Width = self.ClientSize.Width - 10
#@property
def get_HtmlText(self):
#print(self.htmlDf)
return self.htmlDf
#@HtmlText.setter
def set_HtmlText(self, value):
self.htmlDf = value
self._webBrowser1.Document.OpenNew(True)
self._webBrowser1.Document.Write(self.htmlDf)
self._webBrowser1.Refresh()
#self.Activate()
HtmlText = clr.clrproperty(str, get_HtmlText, set_HtmlText)
def ResetHtml(self):
self.htmlDf = self.init_htmlDf
@pd.api.extensions.register_dataframe_accessor("viewer")
class HtmlAccessor:
def __init__(self, df_obj):
self._obj = df_obj
#
def Show(self, n=0):
"""
convert DataFrame to Html and show it
"""
# get current html
htmlDf = viewerForm.htmlDf
# convert current dataFrame to html
if n == 0:
html_toAdd = self._obj.to_html()
else:
html_toAdd = self._obj.head(n).to_html()
# add to the current html
htmlDf = re.sub(r"<\/body>", html_toAdd + r"<br><hr><br></body>", htmlDf)
# update the html in form
viewerForm.HtmlText = htmlDf
def Plot(self, method="plot()"):
"""
plot a DataFrame
type = 'bar', 'area', 'box',
"""
plt.figure()
s = io.BytesIO()
if method.startswith("."):
method = method[1:]
if not method.startswith("plot"):
method = "plot." + method
#
ax = eval("self._obj."+ method)
#
plt.savefig(s, format='png', bbox_inches="tight")
plt.close()
s = base64.b64encode(s.getvalue()).decode("utf-8").replace("\n", "")
#
htmlDf = viewerForm.htmlDf
html_toAdd = """<img align="left" src="data:image/png;base64,{0}">""".format(s)
#
# add to the current
htmlDf = re.sub(r"<\/body>", html_toAdd + r"<br clear=left><hr><br></body>", htmlDf)
#
# update the html in form
viewerForm.HtmlText = htmlDf
import gc
objects =gc.get_objects()
viewerForm = next((obj for obj in objects if isinstance(obj, MyForm) and obj.Controls.Count > 0 and all(not x.IsDisposed for x in obj.Controls)), None)
if viewerForm is None:
viewerForm = MyForm()
else:
viewerForm.ResetHtml()
viewerForm.Show()
all_cable_tray = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_CableTray).WhereElementIsNotElementType().ToElements()
df = pd.DataFrame({'DB_Element': all_cable_tray})
#
df['Name'] = df.apply(lambda x: x['DB_Element'].get_Name(), axis=1)
#
df['Service'] = df.apply(lambda x: x['DB_Element'].get_Parameter(BuiltInParameter.RBS_CTC_SERVICE_TYPE).AsValueString(), axis=1).astype(str)
#
df['Hauteur'] = df.apply(lambda x: x['DB_Element'].get_Parameter(BuiltInParameter.RBS_CABLETRAY_HEIGHT_PARAM).AsValueString(), axis=1).astype(str)
#
df['Largeur'] = df.apply(lambda x: x['DB_Element'].get_Parameter(BuiltInParameter.RBS_CABLETRAY_WIDTH_PARAM).AsValueString(), axis=1).astype(str)
#
df['Longueur'] = df.apply(lambda x: x['DB_Element'].get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsValueString(), axis=1).apply(pd.to_numeric)
#
df.viewer.Show()
# show only 5 first rows
df.viewer.Show(5)
df.dtypes.to_frame().viewer.Show()
# describe
dfdes = df.describe()
# show describe
dfdes.viewer.Show()
# show transpose dscribe
dfdes.T.viewer.Show()
##
# grouby and sum by 'Service'
dfg = df.drop(['DB_Element'], axis=1)
dfg = dfg.groupby('Service')['Longueur'].sum()
dfg.to_frame().viewer.Show()
# grouby and sum by 'Service' and 'Largeur'
dfg2 = df.drop(['DB_Element'], axis=1)
dfg2 = dfg2.groupby(['Service', 'Largeur']).sum()
dfg2.viewer.Show()
###
dfg.to_frame().viewer.Plot()
dfg.to_frame().viewer.Plot("plot.bar(rot=0)")
#dfg.to_frame().viewer.Plot("plot.pie()")
dfg.to_frame().viewer.Plot("plot.pie(subplots=True, figsize=(11, 6))")
df.viewer.Plot("box()")
OUT = df.__repr__ , df.dtypes
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment