精华内容
下载资源
问答
  • 从大、小偏心受压构件截面的界限破坏条件出发,着重考虑中和轴角变化的影响,采用简化的平行线法计算中和轴的位置并采用数值分析对钢筋混凝土 T形柱构件界限轴压比进行分析,得出各种中和轴角情况下的 T形柱构件的界限...
  • PRUFTECHNIK-中和振动工程师手册
  • 根据枟混凝土结构设计规范枠关于正截面承载力计算原理,对 L形、T形和十字形截面柱的轴压比限值进行了数值计算分析,得出了不同截面形状、不同纵向配筋率和不同中和轴角度时的轴压比限值随含箍特征值的变化规律。...
  • 中和transform属性

    2019-04-28 18:56:06
    定义沿着 X 和 Y 的 2D 倾斜转换。 perspective(n) 为 3D 转换元素定义透视视图。 部分实例演示 translate(x,y) .a{ background-color: red; } .b{ background-color: yellow; transform...

    行级元素居中

    • 水平居中:text-align:center;
    • 垂直居中:line-height:(xx)px;
      line-height的值要和height的值相同才能实现垂直居中

    块级元素居中

    • 水平居中:
      1. 设置边距margin:0px auto;
      2. 将块级元素设为行级元素都进行居中 display:inline;
    ul{
    	text-align:center;
    }
    li{
    	display:inline;
    }
    
    • 将父元素设置为position:relative;left:50%;子元素:position:relative;left:-50%;
    .q{                                    /*父元素*/
        font-size: 50px;
        height: 200px;
        width: 200px;
        background-color:red;
        position: relative;
        left: 50%;
    }
    .w{
        text-align: center;                /*行内元素水平居中*/
        background-color: yellow;
        position: relative;
        left: -50%;
    }
    

    效果显示
    在这里插入图片描述

    • transform:平移旋转,transform:translateX(50%);
    .a{
       height: 400px;
       width: 400px;
       background-color: red;
    }
    .b{
       width: 200px;
       background-color: yellow;
       position: relative;
       left: 50%;
       transform: translateX(-50%);
    }
    

    效果显示:
    在这里插入图片描述

    • 垂直居中
      1. 设置边距,没有确定高度的可以使用table包裹再使用margin:auto 0px;
      2. 设置父元素position:relative;top:50%;
        子元素:position:relative;top:-50%;
      3. 设置transform:translateY();
      4. 将元素设置为表格表单元素:display:table-cell;vertical-align:middle;注意:vertical只能用来行内元素和表格单元格生效;
      .a{
      height: 400px;
      width: 400px;
      display: table;
      background-color: red;
      }
      .b{
      background-color: yellow;
      display:table-cell;
      vertical-align:middle;
      }
      
      效果显示:
      在这里插入图片描述

    使用flex来进行居中

    设为Flex布局以后,子元素的float clear和vertical-align属性将失效。

    • 水平居中:
      display:flex; justify-content:center;
    • 垂直居中:
      flex-direction默认row属性主轴为水平方向,起始端为左端,flex-direction是原则主轴方向,水平方向或者竖直方向。
    display:flex;
    flex-direction:column;
    justify-content:center;
    
    display:flex;
    align-items:center;
    

    Transform

    Transform属性应用于元素的2D或3D转换。这个属性允许你将元素旋转,缩放,移动,倾斜等。

    translate(x,y) 定义 2D 转换。
    translate3d(x,y,z) 定义 3D 转换。
    scale(x,y) 定义 2D 缩放转换。
    scale3d(x,y,z) 定义 3D 缩放转换。
    rotate(angle) 定义 2D 旋转,在参数中规定角度。
    rotate3d(x,y,z,angle) 定义 3D 旋转。
    skew(x-angle,y-angle) 定义沿着 X 和 Y 轴的 2D 倾斜转换。
    perspective(n) 为 3D 转换元素定义透视视图。

    部分实例演示

    • translate(x,y)
    .a{
        background-color: red;
    }
    .b{
        background-color: yellow;
        transform: translate(20px,20px);
    }
    

    在这里插入图片描述

    • rotate
    .a{
        background-color: red;
        transition: 0.3S;
    }
    .b:hover{
        background-color: yellow;
        transform: rotateX(45deg);
    }
    

    在这里插入图片描述

    • skew
    .a{
       background-color: red;
       transition: 0.3S;
       position: relative;
       left: 100PX;
    }
    .b:hover{
       background-color: yellow;
       transform: skewX(45deg);
    }
    

    在这里插入图片描述

    • scale
    .c{
       background-color: red;
       position: relative;
       left: 100PX;
    }
    .a{
       transition: 0.3S;
       position: relative;
       left: 100PX;
    }
    .b:hover{
       background-color: yellow;
       transform: scaleX(2);
    }
    

    在这里插入图片描述

    展开全文
  • 讨论了单晶体中和负折射率介质中的负折射现象的区别:负折射率介质中的负折射是由负的折射率引起的,单晶体中是由于各向异性决定的。同时还发现单晶体中的能流负折射现象不能实现Pendry在理论上所预言的完美透镜...
  • axisPointer: { // 坐标指示器,坐标触发有效 type: 'shadow' // 默认为直线,可选为:'line' | 'shadow' } }, title: { text: '', subtext: '', }, legend: { data: ['data'], right: '5%' }, ...

      需求描述: 在FineUIMVC中加载图形控件echarts 其官网中只有静态的json语句的数据源,没有关于取数据库的资料,几天下午百度了一些方法。坑太多了, 但是 只要方向没错, 总有成功的方法:

     1.起初从简单的Webform 中处理开始(思路:从数据库中取数据保留在datatable 中, 再把datatable 转成json 格式的数据 ; ajax 怎样和后台交互:(通过一般处理程序.ashx 向js中异步传所需的数据)

     2.先贴些代码:

    一下是.ashx 代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.SqlClient;
    using System.Data;
    using System.Web.Script.Serialization;

    namespace WebApplication1
    {
    /// <summary>
    /// Test01 的摘要说明
    /// </summary>
    public class Test01 : IHttpHandler
    {
    /// <summary>
    /// 您将需要在网站的 Web.config 文件中配置此处理程序
    /// 并向 IIS 注册它,然后才能使用它。有关详细信息,
    /// 请参见下面的链接: http://go.microsoft.com/?linkid=8101007
    /// </summary>
    #region IHttpHandler Members
    SqlConnection con = new SqlConnection("Server=.;User Id=sa;Pwd=123456;DataBase=AppBoxMvc");
    DataSet ds = new DataSet();
    SqlDataAdapter adapter = new SqlDataAdapter();
    JavaScriptSerializer jsS = new JavaScriptSerializer();
    List<object> lists = new List<object>();
    //Series seriesObj = new Series();
    string result = "";

    public void ProcessRequest(HttpContext context)
    {
    //获取一同发送过来的参数
    //string command = context.Request["cmd"];
    context.Response.ContentType = "text/plain";
    //用来传回去的内容
    //context.Response.Write("Hello World");
    Get_Data01(context);
    }

    public void Get_Data01(HttpContext context)
    {
    string sql = @"SELECT Name, ParentID FROM dbo.Menus WHERE ParentID IS NOT null and ParentID <> 1";
    ds = GetDataFromDatabase(sql);
    lists = new List<object>();
    foreach (DataRow dr in ds.Tables[0].Rows)
    {
    var obj = new { Name = dr["Name"], ParentID = dr["ParentID"] };
    lists.Add(obj);
    }
    jsS = new JavaScriptSerializer();
    result = jsS.Serialize(lists);
    context.Response.Write(result);
    }

    public DataSet GetDataFromDatabase(string sql)
    {
    ds = new DataSet();
    adapter = new SqlDataAdapter(sql, con);
    adapter.Fill(ds);
    return ds;
    }

    public bool IsReusable
    {
    // 如果无法为其他请求重用托管处理程序,则返回 false。
    // 如果按请求保留某些状态信息,则通常这将为 false。
    get { return false; }
    }


    #endregion
    }
    }

    以上代码返回web调用的数据源。

    前端代码:

    一,添加 js引用

    <!-- 引入 echarts.js -->
    <script src="echarts.js"></script>

    --- jquery 库
    <script src="jquery-1.11.1.js"></script>

    二,拼接动态字符串

    var name = '[';

    name += 'transresult[' + item + '].Name' + ', ';

    name += ']';

    三,取动态字符串的值

    --eval 函数

    eval(name);

    四, 完整代码

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>

    <!DOCTYPE html>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>


    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="echarts.js"></script>
    <script src="jquery-1.11.1.js"></script>
    </head>
    <body>

    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main1" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
    // 基于准备好的dom,初始化echarts实例

    var myChart1 = echarts.init(document.getElementById('main1'));

    // 指定图表的配置项和数据
    var option1 = {
    tooltip: {
    trigger: 'axis',
    axisPointer: { // 坐标轴指示器,坐标轴触发有效
    type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
    }
    },
    title: {
    text: '',
    subtext: '',
    },
    legend: {
    data: ['data'],
    right: '5%'
    },
    grid: {
    left: '5%',
    right: '0%',
    bottom: '3%',
    containLabel: true
    },
    xAxis: [
    {
    type: 'category',
    data: []
    }
    ],

    yAxis: [
    {
    type: 'value'
    }
    ],
    series: [
    {
    name: 'New',
    type: 'bar',
    data: [100],
    markPoint: {
    data: [
    { type: 'max', name: 'Max Value' },
    { type: 'min', name: 'Min Value' }
    ]
    },
    },
    ]
    };


    $.ajax({
    type: "post",
    async: false,
    url: "Test01.ashx",

    datatype: "json",
    success: function (result) {
    if (result) {

    eval("var transresult=" + result);

    var name = '[';
    var parentId = '[';
    for (var item in transresult)
    {
    if (item < transresult.length - 1) {
    name += 'transresult[' + item + '].Name' + ', ';
    parentId += 'transresult['+item+'].ParentID' + ', ';
    }
    else {
    name += 'transresult[' + item + '].Name' ;
    parentId += 'transresult[' + item + '].ParentID' ;
    }
    }
    //}
    name += ']';
    parentId += ']';
    option1.xAxis[0].data = eval(name);
    option1.series[0].data = eval(parentId);
    alert(name);
    alert(option1.series[0].data);
    myChart1.setOption(option1);
    }
    },
    error: function (errorMsg) {
    alert(errorMsg);
    }
    });
    // 使用刚指定的配置项和数据显示图表。

    </script>

    </body>
    </html>

    --------------------------------------------------------------------------------------------------------------------------

    --------------------------------------------------------------------------------------------------------------------------

    FINEUIMVC 中的测试。

    是否可以使用一般窗体:(可以,但需要修改Web.config 中添加以下内容)

    <pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral,
    PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral,
    PublicKeyToken=31BF3856AD364E35">
    <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    </namespaces>
    </pages>

    然后按正常的控制器视图模式就可以生成类型webform的程序

    如果是正常的.cshtml 文件如果能在JS 代码里处理一般处理过程,则其加载数据的方式 和 webform无异。

    在测试环境中是成功的!

     

    转载于:https://www.cnblogs.com/hzf08/p/7475034.html

    展开全文
  • 故宫景点功课5:中和殿和保和殿

    千次阅读 2010-06-08 19:45:00
    中和殿 中和殿位处太和殿与保和殿之间,是一座四四方方、象亭子一样的建筑。中和殿四面门窗的形制取自古代的“明堂”,有点像古代尊贵的“工”字形殿中间的穿廊的意思。 中和殿是皇帝在大典之前的休息室。每次大典...

    本文标签慢慢走走

    说明:本文是这篇文章第5节的一部分。


    中和殿
    中和殿位处太和殿与保和殿之间,是一座四四方方、象亭子一样的建筑。中和殿四面门窗的形制取自古代的“明堂”,有点像古代尊贵的“工”字形殿中间的穿廊的意思。

    中和殿是皇帝在大典之前的休息室。每次大典前,皇帝从后宫出来,在中和殿稍作停留。当太和殿所有的仪式都准备好后,有专门的人来导引着皇帝,沿中间的御道,从太和殿的后门走进去。当皇帝一落座,就要焚香、奏乐、响鞭,整个大典便开始了。

    中和殿初建于明永乐年(15世纪初),初名华盖殿,后几经灾毁和修建。明嘉靖年重建后改名中极殿,清顺治帝入主紫禁城后改名中和殿,意为秉中庸之道,求天下和顺。现殿内为清代原状陈列。

    中和殿高29米,黄琉璃瓦四角攒尖顶,正中有鎏金宝顶。屋顶正中有一条正脊,前后各有2条垂脊,在各条垂脊下部再斜出一条岔脊,连同正脊、垂脊、岔脊共9条,建筑术语上叫歇山式

    由于这里是皇帝大典之前做准备工作的地方,所以它在后来逐渐成为举行各种祭祀、典礼时的准备场所。在各种祭祀活动中,有一项很特殊,那就是每年春天的祭农。每年春分,皇帝要到先农坛,那里有一块皇帝的“自留地”,就是咱们俗称的“一亩三分地”。平常有专门的官员管理,但到了春分那天,皇帝要亲自到这块田地上,扶扶犁,锄锄地,这叫行“亲耕礼”,祈求五谷丰登。皇帝在去先农坛之前,要在中和殿举行一个仪式,看一看他要用的农具,这也反映皇帝对农业的重视。当然了,中和殿还有其他用途。比如皇帝要在这里阅视家谱。皇族和老百姓一样,也有自己的家谱,皇帝的家谱叫“玉牒”。玉牒每隔十年重修一次。皇帝的家谱虽名为玉牒,但并不是用玉制成的,也是用纸张书写,只是为了强调皇帝家谱的高贵,才称为玉牒。中和殿的另一个用途,是皇帝在这里为皇太后上徽号。皇帝为了表示孝道,要在寿庆和节日给皇太后上一些吉祥的称号,叫做徽号。像我们熟悉的“慈禧”“慈安”就是徽号。

    保和殿
    保和殿是三台上的第三座大殿,初建于明永乐年(15世纪初),后来几经灾毁和重建。原名为谨身殿,后改建极殿,清代最终定名为保和殿,意为保持心志纯一,共享天下和谐。

    在明清两朝,这里是皇家的高级宴会厅。每逢重大节日和帝后生日,皇帝都要在这里宴请文武百官,以示庆贺。一些少数民族的领袖,像西藏的高僧,蒙古王公来皇宫,皇帝也要在这里设宴款待,以示笼络。公主出嫁,皇帝也要在这里宴请亲家,表示对他们的尊重。

    从清朝乾隆年间开始,保和殿拥有了一项更加重要的职能,成为中国科举考试的最高一级殿试的考场。老百姓所熟知的状元,就是从这座大殿里考出来的。

    朝为放牛郎,暮登天子堂。将相本无种,男儿当自强!您听过这首童谣吗?它的前两句是说一个青年早上还在为地主放牛,晚上就到天子堂来考试了。而“天子堂”,指的就是这保和殿。这里形容读书人的一步登天,其实当年可不是这样的。

    在当年,能够到这座大殿内参加考试,就应该是非常非常不容易了。因为来到这里的考生,都是从全国众多学子中,经过从地方到京城层层考试选出来的。一个读书人,熟读“四书五经”之后,首先要中秀才。中了秀才就是读书人,到县衙大堂,见县官就不用跪了。秀才要去省会城市参加“乡试”,考中为举人,举人就可以做县令之类的小官了,社会地位也会得到很大的提升。您还记得吗,在电视剧《铁齿铜牙纪晓岚》里就有秀才参加乡试,考官们徇私舞弊的情节。其实,中举对于科举之路来说,只是万里长征走完了第一步。举人们还要到京城的国子监去考“会试”。然后才有资格到这座宫殿参加“殿试”。“殿”就是指保和殿。

    殿试每三年举行一次,由皇帝亲自主考。从早上考到晚上,整整一天。阅卷工作全部结束,皇帝要在太和殿进行一个隆重的发榜仪式,称之为“金殿传胪”。所有参加殿试的贡生们都云集在太和广场,皇帝亲自在大殿上宣读前三名的名字。考中第一名的称为状元,第二,第三名称为榜眼和探花,其他被录取者称“进士”。前三名可以从午门正中的门洞走出紫禁城,表示皇帝对他们的恩宠。

    云龙石雕
    故宫中,在许多宫殿的前台都有石雕,用浮雕的手法刻出游龙、翔凤等图案。这些石雕主要为了装饰,显示皇家的威严和气派。在这些大大小小的石雕中,保和殿后台阶中间的云龙石雕是最大的一块。石雕的图案,从上到下,刻着九条形态各异、栩栩如生的游龙,嬉戏于云海之中,非常生动、精美。这块石雕是用一块完整的大青石雕成的,现在长16.57米,宽3.07米,平均厚度1.70米,重量达200多吨。这块石料是采自北京房山区的大石窝村,距离紫禁城有100多华里。

    在500多年前,没有任何现代化运输工具的情况下,是如何从百里之外将这么巨大的石头完整的运来的呢?简单地说,就是借助冰,是用拉旱船的办法拖过来的。工匠们从紫禁城到大石窝村,每隔一里地打一口井。到了严冬季节,从井里把水提上来,泼在路面上,就这样泼出一条100多华里的冰道,冰面上的摩擦力小的多。但即使这样,仍然动用了两万多名民工、几千匹骡马,用了近一个月时间,耗银11万两,才把这块大石头拉进紫禁城里,其艰难程度可想而知。

    天府永藏展
    保和殿西庑及西北崇楼开设《天府永藏展》。展览由序厅和七个专题厅组成,分别介绍不同来源文物承载的不同文化内涵,使观众宏观地了解故宫文物收藏情况。

    宫阙述往展
    保和殿东庑开设《宫阙述往展》(现闭馆施工),介绍故宫不同区域的建筑群所蕴涵的皇家文化与典章制度,讲述建筑背后的历史典故。

    展览共展示文物与档案200余件,图片200多幅,分为9个专题,分别为:紫禁城建筑规划、紫禁城建筑技术、太和殿与国朝大典、乾清宫与皇帝日常理政、文华殿与经筵大典、坤宁宫东西六宫与后妃生活、奉先殿与皇家祭祖、中正殿与皇室信仰、宫门及其守卫等。在序幕厅中,观众朋友们既可以观赏到紫禁城全景建筑模型,也可以欣赏专题片“宫阙巍峨帝王家”,从而对紫禁城宫殿建筑留下宏观的印象。

    链接
    故宫景点功课2:前三殿区
    故宫景点功课3:太和殿院落上
    故宫景点功课4:太和殿院落下
    走走北京中轴(全集)
    走走北京中轴(七):午门至神武门的功课
    故宫博物院官方网站
    王刚带您游故宫导游词(上)
    北京五日自助游情报大汇编 (转载)
    冬日雪后之图游故宫(二)

    展开全文
  • unity 自定义时间Starting with Unity 2019.1, Timeline supports markers! In this blog post, I will show you how to create custom markers. 从 Unity 2019.1 开始 ,时间支持标记! 在此博客文章中,我将...

    unity 自定义时间轴

    Starting with Unity 2019.1, Timeline supports markers! In this blog post, I will show you how to create custom markers.

    Unity 2019.1 开始 ,时间轴支持标记! 在此博客文章中,我将向您展示如何创建自定义标记。

    Previously, I explained how to use Timeline Signals to trigger events. When we originally designed that feature, we quickly saw that in order to make it work, we couldn’t use clips. Since one of the main characteristics of a signal is that it has no “duration”, we would need a new type of item, hence the addition of markers to Timeline. Internally, signals are implemented using markers. Let’s see how to add a custom marker to Timeline.

    之前 ,我解释了如何使用时间轴信号触发事件。 当我们最初设计该功能时,我们很快看到为了使其起作用,我们无法使用剪辑。 由于信号的主要特征之一是它没有“持续时间”,因此我们需要一种新型的物品,因此需要在时间轴上添加标记。 在内部,信号是使用标记实现的。 让我们看看如何向时间轴添加自定义标记。

    The code and assets used for this blog post are available here.

    此处提供了 用于此博客文章的代码和资产

    一个简单的标记 (A Simple Marker)

    A marker is a new item that can be added to a Timeline Asset and is used to represent a point in time. Markers also have a specialization, just like clips do (Activation clip, Audio clip, Animation clip, etc). This lets you create your own type of marker to build something that covers your specific workflows.

    标记是可以添加到时间轴资产的新项目,用于表示时间点。 标记也具有特殊性,就像剪辑一样( 激活 剪辑, 音频 剪辑, 动画 剪辑等)。 这使您可以创建自己的标记类型来构建涵盖您特定工作流程的标记。

    In order to add a new type of marker, all you need to do is to create a class that inherits the Marker class:

    为了添加新型标记,您需要做的就是创建一个继承 Marker 类的类:

    1

    public class SimpleMarker : UnityEngine.Timeline.Marker {}

    1

    public class SimpleMarker : UnityEngine . Timeline . Marker { }

    That’s it! This custom marker can now be added to any track on the timeline marker area:

    而已! 现在可以将此自定义标记添加到时间线标记区域上的任何轨道:

    At this point, this simple marker is only a visual item. This means that this marker cannot run code when triggered. That doesn’t mean it is isn’t useful; a marker can be a snap point or an annotation (see Part V). It’s also accessible through the Timeline API in editor and at runtime.

    在这一点上,这个简单的标记只是一个 视觉项目 。 这意味着该标记 在触发时 无法运行代码 。 这并不意味着它没有用。 标记可以是捕捉点或注释(请参见第V部分)。 也可以 通过 编辑器中和运行时 的Timeline API对其 进行 访问 。

    We will need to combine a marker with another system to make it able to execute code. If you’re interested in knowing how the system works, read the next two parts, otherwise, you can skip to Part IV (I won’t be offended!). 

    我们将需要将标记与另一个系统结合起来以使其能够执行代码。 如果您想了解系统的工作原理,请阅读下面的两部分,否则,您可以跳至第四部分(我不会感到冒犯!)。

    第二部分–可播放的通知 (Part II – Playable Notifications)

    The Playable API allows notifications to be sent to an object while a PlayableGraph is processed. Playable Notifications can be used to inform a target object that an event occurred. I will build a simple graph and manually send a notification.

    Playable API允许在处理PlayableGraph时将通知发送到对象。 可播放的通知可用于通知目标对象已发生事件。 我将构建一个简单的图形并手动发送通知。

    First, I need to create a notification: a class that implements the INotification interface.

    首先,我需要创建一个 Notification :一个实现 INotification 接口的类。

    1

    2
    3
    4
    public class MyNotification : INotification
    {
        public PropertyName id { get; }
    }

    1

    2
    3
    4
    public class MyNotification : INotification
    {
         public PropertyName id { get ; }
    }

    We can use the id property to uniquely identify the notification. For these examples, I don’t really need it, so I will use the default implementation.

    我们可以使用 id 属性来唯一标识通知。 对于这些示例,我并不是真的需要它,因此我将使用默认实现。

    Then, I need a receiver: a class that implements the INotificationReceiver interface. For this example, I have a receiver that will print the time at which a notification was received. 

    然后,我需要一个 接收器 :一个实现 INotificationReceiver 接口的类。 对于此示例,我有一个接收器,它将打印接收通知的时间。

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ReceiverExample : INotificationReceiver
    {
       public void OnNotify(Playable origin, INotification notification, object context)
       {
           if (notification != null)
           {
               double time = origin.IsValid() ? origin.GetTime() : 0.0;
               Debug.LogFormat("Received notification of type {0} at time {1}", notification.GetType(), time);
           }
       }
    }

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ReceiverExample : INotificationReceiver
    {
       public void OnNotify ( Playable origin , INotification notification , object context )
       {
           if ( notification != null )
           {
               double time = origin . IsValid ( ) ? origin . GetTime ( ) : 0.0 ;
               Debug . LogFormat ( "Received notification of type {0} at time {1}" , notification . GetType ( ) , time ) ;
           }
       }
    }

    In the following example, I created a new playable graph and a new playable output. I added a ReceiverExample to the playable output (using the AddNotificationReceiver method). The m_Receiver instance will now be able to receive notification sent to this output. 

    在以下示例中,我创建了一个新的可播放图形和一个新的可播放输出。 我 在可播放的输出中 添加了 ReceiverExample (使用 AddNotificationReceiver 方法)。 现在, m_Receiver 实例将能够接收发送到此输出的通知。

    Everything is now in place to send a notification. I can push a new notification using the PushNotification method from the playable output. 

    现在一切就绪,可以发送通知。 我可以 从可播放的输出中 使用 PushNotification 方法 推送新的通知 。

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class ManualNotification : MonoBehaviour
    {
        PlayableGraph m_Graph;
        ReceiverExample m_Receiver;
        void Start()
        {
            m_Graph = PlayableGraph.Create("NotificationGraph");
            var output = ScriptPlayableOutput.Create(m_Graph, "NotificationOutput");
            //Create and register a receiver
            m_Receiver = new ReceiverExample();
            output.AddNotificationReceiver(m_Receiver);
            //Push a notification on the output
            output.PushNotification(Playable.Null, new MyNotification());
            m_Graph.Play();
        }
    }

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class ManualNotification : MonoBehaviour
    {
         PlayableGraph m_Graph ;
         ReceiverExample m_Receiver ;
         void Start ( )
         {
             m_Graph = PlayableGraph . Create ( "NotificationGraph" ) ;
             var output = ScriptPlayableOutput . Create ( m_Graph , "NotificationOutput" ) ;
             //Create and register a receiver
             m_Receiver = new ReceiverExample ( ) ;
             output . AddNotificationReceiver ( m_Receiver ) ;
             //Push a notification on the output
             output . PushNotification ( Playable . Null , new MyNotification ( ) ) ;
             m_Graph . Play ( ) ;
         }
    }

    Beware! Notifications are not sent as soon as you call PushNotification; they are only queued. This means that they will be accumulated until the graph has been processed completely. Immediately before the LateUpdate stage, all queued notifications will be sent to the graph’s outputs. Once all the notifications are sent, the queue is cleared before a new frame begins.

    谨防! 调用 PushNotification 不会立即发送通知 他们只是 排队 这意味着它们将被累积,直到图形被完全处理为止。 LateUpdate阶段 之前 ,所有排队的通知都将发送到图的输出。 发送所有通知后,将在新帧开始之前清除队列。

    When the graph is played, the OnNotify method will be called on the m_Receiver instance with the notification that was sent as an argument.  When transitioning in playmode, this message appears in the console:

    播放图形时, 将使用 作为参数发送的通知 在 m_Receiver 实例上 调用 OnNotify 方法 。   在播放模式下过渡时,此消息会出现在控制台中:

    Received notification of type MyNotification at time 0

    在时间0收到类型为MyNotification的通知

    Hmm… The receiver correctly received a notification, but how can I control the time at which the notification is sent? We’ll need more help to achieve that. 

    嗯……接收者正确地收到了通知,但是如何控制通知的发送时间呢? 我们需要更多帮助来实现这一目标。

    第三部分– TimeNotificationBehaviour (Part III – TimeNotificationBehaviour)

    Now that we know how to send a notification through a playable graph, let’s schedule a notification so that it is sent at a time of our choosing. I can use the built-in class TimeNotificationBehaviour for that. This class is a standard PlayableBehaviour, so it can be added to any graph, only with some more logic to send a notification at a precise time. Let’s take the previous example and tweak it a little bit.

    现在我们知道了如何通过可播放的图表发送通知,让我们安排一个通知,以便在我们选择的时间发送该通知。 我可以使用内置的 TimeNotificationBehaviour 类 。 此类是标准的PlayableBehaviour,因此可以将其添加到任何图形中,仅需使用一些其他逻辑即可在准确的时间发送通知。 让我们以前面的示例为例进行一些调整。

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class ScheduledNotification : MonoBehaviour
    {
       PlayableGraph m_Graph;
       ReceiverExample m_Receiver;
       void Start()
       {
           m_Graph = PlayableGraph.Create("NotificationGraph");
           var output = ScriptPlayableOutput.Create(m_Graph, "NotificationOutput");
           //Create and register a receiver
           m_Receiver = new ReceiverExample();
           output.AddNotificationReceiver(m_Receiver);
           //Create a TimeNotificationBehaviour
           var timeNotificationPlayable = ScriptPlayable<TimeNotificationBehaviour>.Create(m_Graph);
           output.SetSourcePlayable(timeNotificationPlayable);
           //Add a notification on the time notification behaviour
           var notificationBehaviour = timeNotificationPlayable.GetBehaviour();
           notificationBehaviour.AddNotification(2.0, new MyNotification());
           m_Graph.Play();
       }
    }

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class ScheduledNotification : MonoBehaviour
    {
       PlayableGraph m_Graph ;
       ReceiverExample m_Receiver ;
       void Start ( )
       {
           m_Graph = PlayableGraph . Create ( "NotificationGraph" ) ;
           var output = ScriptPlayableOutput . Create ( m_Graph , "NotificationOutput" ) ;
           //Create and register a receiver
           m_Receiver = new ReceiverExample ( ) ;
           output . AddNotificationReceiver ( m_Receiver ) ;
           //Create a TimeNotificationBehaviour
           var timeNotificationPlayable = ScriptPlayable < TimeNotificationBehaviour > . Create ( m_Graph ) ;
           output . SetSourcePlayable ( timeNotificationPlayable ) ;
           //Add a notification on the time notification behaviour
           var notificationBehaviour = timeNotificationPlayable . GetBehaviour ( ) ;
           notificationBehaviour . AddNotification ( 2.0 , new MyNotification ( ) ) ;
           m_Graph . Play ( ) ;
       }
    }

    Here’s the playable graph that was generated:

    这是生成的可播放图表:

    As you can see, instead of calling PushNotification directly on the playable output, I attached a TimeNotificationBehaviour to the output and added a notification to it. This behaviour will automatically push the notification to the output at the correct time. The console now displays:

    如您所见,我没有 在可播放的输出上直接 调用 PushNotification ,而是 在输出上附加了 TimeNotificationBehaviour 并向其中 添加了一条通知 。 此行为将在正确的时间自动将通知推送到输出。 控制台现在显示:

    Received notification of type MyNotification at time 2.00363647006452

    在时间2.00363647006452收到类型为MyNotification的通知

    All right! Now we can control when a notification is sent!

    行! 现在我们可以控制 何时 发送通知!

    Hmm… But why was it not sent at exactly two seconds?  When I added the notification to the TimeNotificationBehaviour, didn’t I specify exactly two seconds?

    嗯......但为什么却没有 正好有 两个秒 发送 ? 当我将通知添加到 TimeNotificationBehaviour时 ,是否未指定 确切的 两秒钟?

    1

    notificationBehaviour.AddNotification(2.0, new MyNotification());

    1

    notificationBehaviour . AddNotification ( 2.0 , new MyNotification ( ) ) ;

    The AddNotification method does not guarantee an exact time. The Playable Graph’s time is updated when Unity begins rendering a new frame. Depending on the game’s frame rate, the evaluation time of a PlayableGraph may not exactly match the time specified when the notification was added to the TimeNotificationBehaviour. What the AddNotification method guarantees is that the notification will be sent as soon as the PlayableGraph’s time is greater than the notification trigger time. 

    AddNotification 方法并不能保证一个确切的时间。 Unity开始渲染新帧时,可播放图表的时间会更新。 根据游戏的帧速率,PlayableGraph的评估时间可能与通知添加到TimeNotificationBehaviour时指定的时间不完全匹配。 什么 AddNotification 方法保证的是,该通知将尽快PlayableGraph的时间比通知触发时间时发送。

    第四部分– MarkerNotification (Part IV – MarkerNotification)

    All these new APIs are nice if you want to manually send notifications in a Playable Graph, but it can be a lot of work. Fortunately, Timeline can automatically generate the proper PlayableGraph to handle notifications!

    如果您想在“可播放图形”中手动发送通知,那么所有这些新API都很不错,但这可能需要很多工作。 幸运的是,时间轴可以自动生成适当的PlayableGraph来处理通知!

    Remember the marker from Part I? Let’s create a new marker that implements the INotification interface.

    还记得第一部分中的标记吗? 让我们创建一个实现 INotification 接口 的新标记 。

    1

    2
    3
    4
    public class NotificationMarker : Marker, INotification
    {
       public PropertyName id { get; }
    }

    1

    2
    3
    4
    public class NotificationMarker : Marker , INotification
    {
       public PropertyName id { get ; }
    }

    A class that inherits from Marker and implements INotification tells Timeline that it needs to generate a playable graph to supports this notification. If I add this marker to an empty timeline, the following playable graph is created:

    Marker 继承 并实现 INotification的类 告诉Timeline它需要生成一个可播放的图形来支持此通知。 如果我将此标记添加到空白时间轴,则会创建以下可播放图形:

    This is nearly identical to the playable graph I created in Part III, except that Timeline added its own PlayableBehaviour. This was much easier than creating my own Playable Graph though!

    这与我在第三部分中创建的可玩图表几乎相同,除了时间轴添加了自己的PlayableBehaviour。 不过,这比创建自己的可玩图表要容易得多!

    The only thing left is to identify who is going to receive the notifications. The rules are the same as signals:

    剩下的唯一一件事就是确定 谁将 接收通知。 规则与信号相同:

    • If the marker is on the timeline header area: the object which owns the PlayableDirector that plays the current timeline will receive notifications.

      如果标记在时间轴标题区域上: 拥有播放当前时间轴的PlayableDirector的对象将收到通知。

    • If the marker is on a track: the object bound to the track will receive notifications.

      如果标记在轨道上: 绑定到轨道的对象将收到通知。

    Any component that implements the INotificationReceiver interface and is located on the target object will receive notifications.

    任何实现 INotificationReceiver 接口并位于目标对象上的组件都将接收通知。

    In my example, I added two NotificationMarkers to the timeline header area. I also added a NotificationReceiver to the object that plays the timeline. 

    在我的示例中,我向 时间线标题区域 添加了两个 NotificationMarker 。 我还向 播放时间线的对象 添加了 NotificationReceiver

    Here’s the output from the console:

    这是控制台的输出:

    Received notification of type NotificationMarker at time 1.00330553948879

    在时间1.00330553948879收到类型为NotificationMarker的通知

    Received notification of type NotificationMarker at time 2.016666666666

    在时间2.016666666666收到类型为NotificationMarker的通知

    Which is exactly the same as Part III.

    与第三部分完全相同。

    Only the markers that implement the INotification interface will generate the proper Playable Graph to support notifications. To make things clear, here’s a table of the particularities of the different ways to create custom markers:

    只有实现 INotification 接口 的标记 才会生成正确的Playable Graph以支持通知。 为了明确起见,下面是创建自定义标记的不同方法的特殊性的表格:

    第五部分-自定义样式 (Part V – Custom Style)

    Our custom marker is represented visually by a generic “pin” icon, but it is also possible to change this icon to the image of your choice. To demonstrate how to do this, I will create an Annotation marker.

    我们的自定义标记在视觉上由通用的“图钉”图标表示,但是也可以将该图标更改为您选择的图像。 为了演示如何执行此操作,我将创建一个注释标记。

    The first step is to create a stylesheet. Stylesheets can be used to extend the Editor’s visual appearance. This can be done by adding a file named common.uss in an Editor folder in a StyleSheets/Extensions folder hierarchy. In my example, I added a new file at the following location: 

    第一步是创建样式表。 样式表可用于扩展编辑器的视觉外观。 这可以通过 在StyleSheets / Extensions文件夹层次结构的Editor文件夹中 添加一个名为 common.uss 的文件来完成 。 在我的示例中,我在以下位置添加了一个新文件:

    “5-Annotation/Editor/Stylesheets/Extensions/common.uss”

    “ 5-注释/编辑器/样式表/扩展名/common.uss”

    USS files (for Unity Style Sheet) use a CSS-like syntax to describe new styles. Here is an example:

    USS文件(用于Unity样式表)使用类似于CSS的语法来描述新样式。 这是一个例子:

    1

    2
    3
    4
    5
    6
    Annotation
    {
       width:18px;
       height:18px;
       background-image: resource("Assets/5-Annotation/Editor/pencil.png");
    }

    1

    2
    3
    4
    5
    6
    Annotation
    {
       width : 18px ;
       height : 18px ;
       background - image : resource ( "Assets/5-Annotation/Editor/pencil.png" ) ;
    }

    In this style, I specified that I wish to use a pencil icon along with size properties. Next, I can tell Timeline that this style should be used when drawing a marker on-screen.

    在这种样式中,我指定希望与尺寸属性一起使用铅笔图标。 接下来,我可以告诉时间轴在屏幕上绘制标记时应使用此样式。

    1

    2
    3
    4
    5
    [CustomStyle("Annotation")]
    public class Annotation : Marker
    {
       [TextArea] public string annotation;
    }

    1

    2
    3
    4
    5
    [ CustomStyle ( "Annotation" ) ]
    public class Annotation : Marker
    {
       [ TextArea ] public string annotation ;
    }

    The CustomStyle attribute can be used to specify which style to use. In my example, I want to use the Annotation style that I added to the common.uss file.

    CustomStyle 属性可以用来指定要使用的样式。 在我的示例中,我想使用 添加到 common.uss 文件中 的 注释 样式 。

    When adding this Annotation marker to a timeline, it will use the custom style I created:

    当将此注释标记添加到时间线时,它将使用我创建的自定义样式:

    第六部分–全部放在一起 (Part VI – Putting it all together)

    To demonstrate what can be done with markers and notifications, I added a Jump marker to the Github repo. This marker, combined with a JumpReceiver, will ‘’jump’’ from one point to another in a timeline. The destination point is specified with a Destination marker. This example combines everything that was done in this blog post, including a custom style:

    为了演示如何使用标记和通知,我 在Github存储库中 添加了一个 跳转 标记。 此标记与 JumpReceiver 结合 ,将在时间轴上从一个点“跳”到另一点。 用目标标记指定目标点。 此示例结合了此博客文章中完成的所有操作,包括自定义样式:

    The orange arrow is the jump point and the purple arrow is the destination point. See how I did it here.

    橙色箭头是跳转点,紫色箭头是目的地。 看 我是如何做到的在这里

    Notifications and markers are really powerful additions to the Playable Graph and Timeline APIs. My examples should cover enough to get you started creating cool stuff! Head to the Timeline forums if you need help.

    通知和标记是Playable Graph和Timeline API的真正强大补充。 我的示例应足以使您开始创建很棒的东西! 如果需要帮助 ,请前往 时间轴论坛

    第七部分奖金–片段通知 (Bonus Part VII – Notifications from clips)

    We saw that a PlayableGraph can send notifications and that Timeline can use those to enhance the capabilities of markers. But what about clips? Can clips also send notifications?

    我们看到PlayableGraph可以发送通知,而Timeline可以使用这些通知来增强标记的功能。 但是剪辑呢? 片段还可以发送通知吗?

    Yes!

    是!

    Notifications can be sent from a Playable Behaviour: 

    可以通过可玩行为发送通知:

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class ClipNotificationBehaviour : PlayableBehaviour
    {
       double m_PreviousTime;
       public override void OnGraphStart(Playable playable)
       {
           m_PreviousTime = 0;
       }
       public override void ProcessFrame(Playable playable, FrameData info, object playerData)
       {
           if ((int)m_PreviousTime < (int)playable.GetTime())
           {
               info.output.PushNotification(playable, new MyNotification());
           }
           m_PreviousTime = playable.GetTime();
       }
    }

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class ClipNotificationBehaviour : PlayableBehaviour
    {
       double m_PreviousTime ;
       public override void OnGraphStart ( Playable playable )
       {
           m_PreviousTime = 0 ;
       }
       public override void ProcessFrame ( Playable playable , FrameData info , object playerData )
       {
           if ( ( int ) m_PreviousTime < ( int ) playable . GetTime ( ) )
           {
               info . output . PushNotification ( playable , new MyNotification ( ) ) ;
           }
           m_PreviousTime = playable . GetTime ( ) ;
       }
    }

    In this example, I push a notification at each second during the clip’s processing. If I add this clip to a timeline and a NotificationReceiver to the object that drives the timeline, here’s the generated output:

    在此示例中,我在剪辑的处理过程中每秒发送一次通知。 如果我将此剪辑添加到时间轴,并将 NotificationReceiver添加 到驱动时间轴的对象,则生成的输出如下:

    Received notification of type MyNotification at time 1.01593019999564

    在时间1.01593019999564收到类型为MyNotification的通知

    Received notification of type MyNotification at time 2.00227000191808

    在时间2.00227000191808收到类型为MyNotification的通知

    Received notification of type MyNotification at time 3.01137680560353

    在时间3.01137680560353收到类型为MyNotification的通知

    It works! If you already have your own Playable Behaviour classes and want to send notifications, you don’t absolutely need a marker; clips already support much of the functionality.

    有用! 如果您已经拥有自己的Playable Behavior类,并且想要发送通知,则不需要绝对的标记。 剪辑已经支持许多功能。

    翻译自: https://blogs.unity3d.com/2019/06/25/how-to-create-custom-timeline-markers/

    unity 自定义时间轴

    展开全文
  • 那么相对的,aware datetime就是计算机能准确知道其时区的时间对象,他是一个准确的时间点,就落在时间上的某个地方,不管从哪个时区看,这个点都是绝对固定的。所以,我们可以将一个aware datetime转换成unix...
  • CSS篇 -- 居中和Grid布局

    千次阅读 2019-08-08 15:16:35
    translate(-50%,-50%) 作用是,往上(x),左(y)移动自身长宽的 50%,以使其居于中心位置 网格布局介绍 (1)网格布局 display:grid;或display:inline-grid指定一个容器采用网格布局 注意:设置为网格...
  • CSS3 中和动画有关的属性有三个 transform 、transition 和 animation 下面一一说明 transform 从字面来看transform 的释义为改变,使...改变,转换,这里我们可以理解为变形,那都能怎么变呢, node 表示不进行...
  • 滚动轴承诊断分析

    千次阅读 2019-08-29 19:31:45
    如果机器都进行了精确对中和精确平衡,不在共振频率附近运转,并且轴承润滑良好,那么机器运行就会非常可靠。机器的实际寿命也会接近其设计寿命。然而遗憾的是,大多数工业现场都没有做到这些。因此有很多轴承都因为...
  • 每个图像上的两个表示输入样本的BERT tokens,颜色表示绝对注意力权重(深色表示更大的权重)。 前三种类型最可能与预训练的语言模型相关,而后两种类型可能编码语义和语法信息。 有趣的发现: BERT 模型明显参数化...
  • 如果Peccei-Quinn(PQ)对称性在充气过程中和充气之后仍保持破裂,则如此高的充气比例会与QCD暗物质产生张力,因为会产生太大的等曲率扰动。 如果在充气过程中获得足够重的质量,则可以抑制等曲率摄动。 ...
  • 2020-11-03Paderborn大学轴承数据集

    千次阅读 2020-11-03 11:08:13
    个人学习记录 德国Paderborn大学轴承数据集解释 数据集下载:Paderborns轴承数据集 简单描述:提供了基于振动和电动机电流信号的状态监测(CM)实验... 轴承和齿轮的不对中和倾斜结构性地集成到测试台的模块中,引起
  • 垂直居中 垂直居中内容 原理 transform: translateY(-50%); 让div 沿Y平移自身高度的一半
  • PS中和FW一样的精灵图缩小功能(像素栏输入数字就能缩小)PS中的精灵图缩小方法 PS中的精灵图缩小方法 本人为CSDN小白,第一次写博客,肯定存在很多问题,请大家见谅。 正文: 很多人习惯使用FW了,身边很多朋友的PS...
  • CSS3中和动画有关的属性有三个 transform、 transition 和 animation。下面来一一说明:    transform    从字面来看transform的释义为改变,使…变形;转换 。这里我们就可以理解为变形。那都能怎么变...
  • #center-hor1{background-color: red;color: #F8CBAD;top: 50%;left :50%;width: 100px;position: absolute;/*transform: translateY(-50%); !*防止多行出现的对齐问题*!*/transform: translate(-50%, -50%);...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,757
精华内容 1,502
关键字:

中和轴