예제 #1
0
    def __init__(self, ID, masses, massSupports, trusses, trussLength, base,
                 frequency, modeShape):
        S3S_Structure.__init__(self, masses, massSupports, trusses,
                               trussLength, base)
        self.id = ID
        self.frequency = frequency
        self.modeShape = modeShape
        self.maxModeShape = np.array([0, 0, 0])  # 0 is a default value
        self.locationInERS = ColumnDataSource(data=dict(
            x=[0], y=[0]))  # with default values
        self.participationFactor = 0  # 0 is a default value

        self.multiplier_text = LatexDiv(
            text=" $\\displaystyle\\frac{\\beta S_a(T) }{ \\omega^2} =" +
            str(0) + "$",
            width=240,
            height=20)
        self.frequency_text = LatexDiv(text="""<b>Natural Frequency =</b> """,
                                       width=240,
                                       height=20)
       y='y',
       line_dash='dashed',
       source=V1parallel_line_source,
       color="black")
p.title.text_font_size = "20pt"

p.add_layout(Vector1_glyph)
p.add_layout(LO1_label_glyph)
p.add_layout(LO2_label_glyph)
p.add_layout(Vector2_glyph)
p.add_layout(VectorResultant_glyph)
p.add_layout(V_label_glyph)
p.add_layout(V1_label_glyph)
p.add_layout(V2_label_glyph)
p.add_layout(Resultant_values_glyph)
value_plot = LatexDiv(text="", render_as_text=False, width=300)

my_line = p.line(x='x',
                 y='y',
                 line_dash='dashed',
                 source=Line_source,
                 color='#0065BD',
                 line_width=3)
my_line = p.line(x='x',
                 y='y',
                 line_dash='dashed',
                 source=Line2_source,
                 color='#0065BD',
                 line_width=3)

p.toolbar.logo = None
mass = TA_CircularMass(8, 2, 2, 0.8, 0.5)
spring = TA_Spring((0, .3), (0, 1.5), 1, 1, 50, 0.25)
damper = TA_Dashpot((4, .3), (4, 1.5), 0.5, 1.5)
mass.plot(figure_name)
spring.plot(figure_name)
damper.plot(figure_name)

# for other real application classes browse through existing apps

###################################
#           Page Layout           #
###################################

description_filename = join(dirname(__file__), "description.html")
description = LatexDiv(text=open(description_filename).read(),
                       render_as_text=False,
                       width=1000)

# to keep track of the final page layout it is suggested to more or less use the same layout in your curdoc code
# add additional spacers to move your objects to the desired locations
curdoc().add_root(
    column(
        description,
        row(
            figure_name, Spacer(width=100),
            column(play_pause_button, example_slider, radio_group_01,
                   radio_group_02, radio_button_group)), surface))
curdoc().title = split(dirname(__file__))[-1].replace('_', ' ').replace(
    '-', ' '
)  # get path of parent directory and only use the name of the Parent Directory for the tab name. Replace underscores '_' and minuses '-' with blanks ' '
import sys, inspect
currentdir = dirname(abspath(inspect.getfile(inspect.currentframe())))
parentdir = join(dirname(currentdir), "shared/")
sys.path.insert(0, parentdir)
from latex_support import LatexDiv, LatexLabelSet, LatexSlider
# ----------------------------------------------------------------- #

###################################################
##           APP THEORETICAL DESCRIPTION         ##
###################################################

#Theoretical description of the app in Latex
description_filename1 = join(dirname(__file__),
                             "description1.html")  #Part I of the description
description1 = LatexDiv(text=open(description_filename1).read(),
                        render_as_text=False,
                        width=1000)

description_filename2 = join(dirname(__file__),
                             "description2.html")  #Part II of the description
description2 = LatexDiv(text=open(description_filename2).read(),
                        render_as_text=False,
                        width=1000)

description_filename3 = join(dirname(__file__),
                             "description3.html")  #Part III of the description
description3 = LatexDiv(text=open(description_filename3).read(),
                        render_as_text=False,
                        width=1000)

#Figures_static
heavy_comp_button = Button(
    label="start intensive computation",
    button_type="success",
    width=150,
    height=80
)  # also add a height to avoid resizing when the loading sign is displayed # in general buttons can stay with their default height
heavy_comp_button.on_click(
    start_work
)  # callback to apply the layout changes and start the computational work

# loading the html which provides the style definition of the loading symbol
# this can of course also be done where the other descriptions are loaded, however we keep important code together in each example section
description_filename_loading = join(dirname(__file__),
                                    "description_loading.html")
description_loading = LatexDiv(text=open(description_filename_loading).read(),
                               render_as_text=False,
                               width=div_width)

# create the div container which holds the loading sign
loading_sign = Div(
    text="<div class=\"lds-dual-ring\"></div>", width=650, visible=False
)  # initially visible is false since it only should be seen during calculations

#---------------------------------------------------------------------#

# add app description text
description_filename = join(dirname(__file__), "description.html")
description = LatexDiv(text=open(description_filename).read(),
                       render_as_text=False,
                       width=div_width)
################################################################################

#Create Reset Button:
button = Button(label="Reset", button_type="success", width=50)

#Let program know what functions button calls when clicked:
weight_slide.on_change('value', fun_check1)
button.on_click(init)

#Initialization at the beginning:
init()

# add app description
description_filename = join(dirname(__file__), "description.html")
description = LatexDiv(text=open(description_filename).read(),
                       render_as_text=False,
                       width=app_width)

description1_filename = join(dirname(__file__), "description1.html")
description1 = LatexDiv(text=open(description1_filename).read(),
                        render_as_text=False,
                        width=app_width)

################################################################################
####Output section
################################################################################
#Output to the browser:
curdoc().add_root(
    column(
        row(Spacer(width=600), lang_button), description1,
        column(
    def __init__(self, Vis, Plotter):
        # setup random by selecting a seed (so that numbers are truly random)
        seed()
        # save car viewer
        self.Vis = Vis
        # save graph plotter
        self.Plotter = Plotter
        # choose a random velocity, e.g. between 0.5 and 10 (steps of 0.5)
        self.v = self._init_random_velocity()
        # tell the car viewer about this choice
        self.Vis.setV(self.v)

        ## set up interactions
        # input for v0 or v(s)
        self.Vs = TextInput(value=str(self.v),
                            title="Initial Velocity",
                            width=300)
        self.Vs.on_change('value', self.set_v)
        # choice of v0 or v(s) method
        self.VMethod = Select(
            title="",
            value="Initial Velocity",
            options=["Initial Velocity", "Distance-dependent Velocity"],
            width=300)
        self.VMethod.on_change('value', self.switch_model)
        # get user value for acceleration
        self.UserAcceleration = TextInput(value="",
                                          title="Acceleration :",
                                          width=300)
        self.UserAcceleration.on_change('value', self.check_acceleration)
        # button which runs the simulation
        self.startSim = Button(label="Start",
                               button_type="success",
                               width=100,
                               disabled=True)
        self.startSim.on_click(self.Start)
        # reset button
        self.reset_button = Button(label="Reset",
                                   button_type="success",
                                   width=100)
        self.reset_button.on_click(self.Reset)
        # selection for exact time and distance dependent formulas
        self.eq_selection = Select(title="",
                                   value="Select an equation",
                                   width=300,
                                   options=[
                                       "Select an equation",
                                       "s(t) - time dependent distance",
                                       "v(t) - time dependent velocity",
                                       "t(s) - distance dependent time",
                                       "v(s) - distance dependent velocity"
                                   ])
        self.eq_selection.on_change('value', self.show_equation)
        # write equations into a invisible div
        self.eq_st = LatexDiv(text="$$ s(t) = \\frac{1}{2} a_0 t^2 + v_0 t $$",
                              visible=False)
        self.eq_vt = LatexDiv(text="$$ v(t) = \\frac{1}{2} a_0 t + v_0 $$",
                              visible=False)
        self.eq_ts = LatexDiv(
            text=
            "$$ t(s) = \\frac{2s}{v(s)+v_0} = \\frac{2s}{\\sqrt{2as + v_0^2}+v_0} $$",
            visible=False)
        self.eq_vs = LatexDiv(text="$$ v(s) = \\sqrt{2as + v_0^2} $$",
                              visible=False)
        self.equations = {
            "st": self.eq_st,
            "vt": self.eq_vt,
            "ts": self.eq_ts,
            "vs": self.eq_vs
        }
        # user input for t(s) to be tested against simulation
        self.UserTs = TextInput(value="", title="t(s) = ", width=200)
        self.UserTs.on_change('value', self.check_function_inputs)
        # user input for v(s) (or a(s)) to be tested against simulation
        self.UserVs = TextInput(value="", title="v(s) = ", width=200)
        self.UserVs.on_change('value', self.check_function_inputs)
        # button to plot t(s) and v(s)/a(s) over simulation data
        self.TestEqs = Button(label="Check equations",
                              button_type="success",
                              width=150)
        self.TestEqs.on_click(self.plot_attempt)
        # warning widget
        self.warning_widget = Div(text="",
                                  render_as_text=False,
                                  style={
                                      'color': 'red',
                                      'font_size': '200%'
                                  },
                                  width=300)
        self.warning_widget_equ = Div(text="",
                                      render_as_text=False,
                                      style={
                                          'color': 'red',
                                          'font_size': '200%'
                                      },
                                      width=300)

        # mathematical operation buttons for user input
        self.math_group_map = {0: self.Vs, 1: self.UserTs, 2: self.UserVs}
        num_math_usr_button_groups = len(self.math_group_map)
        self.math_usr_buttons = dict(sqrts=[], quads=[])
        for i in range(0, num_math_usr_button_groups):
            tmp_tag = "math_group_" + str(i)
            self.math_usr_buttons["sqrts"].append(
                Button(label=bl_sqrt,
                       button_type="success",
                       width=math_button_width,
                       tags=[tmp_tag]))
            self.math_usr_buttons["quads"].append(
                Button(label=bl_quad,
                       button_type="success",
                       width=math_button_width,
                       tags=[tmp_tag]))
            self.math_usr_buttons["sqrts"][i].on_click(self.add_math_op)
            self.math_usr_buttons["quads"][i].on_click(self.add_math_op)

        # define a callback map for easy removal and reset of callbacks to widgets
        self.callback_map = {
            self.Vs: self.set_v,
            self.UserTs: self.check_function_inputs,
            self.UserVs: self.check_function_inputs
        }

        # initialise initial time, displacement and acceleration
        self.t = 0
        self.s = 0
        self.a = 0
        # remember which model is being used
        self.model_type = "init_v"  # "init_v" and "distance_v"

        # save the callback id to run the simulations
        self.callback_id = None

        # save layout
        self.Layout = column(
            self.VMethod,
            row(self.math_usr_buttons["sqrts"][0],
                self.math_usr_buttons["quads"][0]),
            self.Vs, self.UserAcceleration,
            row(self.startSim, self.warning_widget), self.reset_button,
            self.eq_selection, self.eq_st, self.eq_vt, self.eq_ts, self.eq_vs,
            row(self.math_usr_buttons["sqrts"][1],
                self.math_usr_buttons["quads"][1]), self.UserTs,
            row(self.math_usr_buttons["sqrts"][2],
                self.math_usr_buttons["quads"][2]), self.UserVs,
            row(self.TestEqs, self.warning_widget_equ))
예제 #8
0
        y_t = [0.1]
        layout.children[1] = row(column(Spacer(height=10), material_select, rubber_description, row(Spacer(width=75), play_pause_button), 
                             row(Spacer(width=75), reset_button)), column(p), column(Spacer(height=89), column(plot)))
    if new == "CFRP" or new == "Steel":
        A_source.data = dict(x=x_A, y=y_A)
        A3_label_source.data = dict(x=x_A3, y=y_A3, A=["A"])
    R_m_source.data = dict(x=x_R_m, y=y_R_m)
    R3_label_source.data = dict(x=x_R3, y=y_R3, R=["R"])
    m_label_source.data = dict(x=x_m, y=y_m, m=["m"])
    A_t_source.data = dict(x=x_A_t, y=y_A_t)
    A4_label_source.data = dict(x=x_A4, y=y_A4, A=["A"])
    t_label_source.data = dict(x=x_t, y=y_t, t=["t"])

## add app description
description_filename = join(dirname(__file__), "description.html")
description = LatexDiv(text=open(description_filename).read(), render_as_text=False, width=1200)

## add coefficient description
steel_filename = join(dirname(__file__), "steel_description.html")
steel_description = LatexDiv(text=open(steel_filename).read(), render_as_text=False, width=250)
cfrp_filename = join(dirname(__file__), "cfrp_description.html")
cfrp_description = LatexDiv(text=open(cfrp_filename).read(), render_as_text=False, width=250)
rubber_filename = join(dirname(__file__), "rubber_description.html")
rubber_description = LatexDiv(text=open(rubber_filename).read(), render_as_text=False, width=250)

## initial values
def init():
    i = [1]
    dx = [0]
    dL = [0]
    x_mounting = [1, 4, 4, 3, 2, 1]
                               text='name',
                               text_font_size="15pt",
                               level='glyph',
                               source=F2_source)

plot.add_layout(F1_arrow_glyph)
plot.add_layout(F2_arrow_glyph)
plot.add_layout(F1_label_glyph)
plot.add_layout(F2_label_glyph)
plot.add_layout(dist)
plot.add_layout(dist_label)
plot.add_layout(length)
plot.add_layout(length_label)

# Div to show force and distance values
value_plot = LatexDiv(text="", render_as_text=False, width=300)


def setValueText(F1, F2):
    value_plot.text = "$$\\begin{aligned} F_1&=" + "{:4.1f}".format(
        F1) + "\\,\\mathrm{N}\\\\ F_2&=" + "{:4.1f}".format(
            F2) + "\\,\\mathrm{N} \\end{aligned}$$"


def changeLength(attr, old, new):
    tmp = (l_beam - new) / new
    F1_new = (F_total * tmp) / (1 + tmp)
    F2_new = F_total - F1_new
    F1_source.patch({"yS": [(0, F1_new)]})
    F2_source.patch({"yS": [(0, F2_new)]})
    dist_source.patch({'xE': [(0, new)], 'xL': [(0, new / 2.0 - 0.3)]})