Mesh is Art(7)

  • 基于机器学习的幕墙嵌板优化
    • 前言
      • 问题提出
    • 聚类算法
      • 什么是聚类
      • K-Means聚类
        • 示例一
        • 示例二
        • 注意
        • 局限性
      • Gaussian Mixture Model (GMM)
        • 示例三
    • 幕墙优化
        • 示例四
      • 总结
      • 参考文献

基于机器学习的幕墙嵌板优化

Figure 1:使用聚类算法对异形曲面模型的多边形嵌板进行聚类分析 图片来源:作者自制

前言

上一节我们提到了网格对于幕墙优化有着重要意义,除了平板优化和四点共圆带来的无扭曲结构可以大幅度节省幕墙施工难度和造价以外,还可以通过结合机器学习使用聚类算法来将尺寸和形状近似的网格聚类并优化来节省造价。这一节我们就来讨论一下如何使用聚类算法来优化幕墙嵌板。这个问题具体分为两个大步骤,聚类和优化,需要先将已有的嵌板归为几个大类,每个类别的嵌板的特征相似,然后再对各个类别下的嵌板进行优化,使同一类别中的嵌板的差别尽可能地小。由于本人并没有过多研究机器学习相关内容,故对该部分内容仅作简单介绍。

问题提出

在幕墙设计与建造中,我们通常希望幕墙的嵌板规格能实现标准化,也就是所有幕墙嵌板的规格尺寸完全一样,这样方便批量加工,可以大规模生产。但是当遇到异形复杂的建筑时,规格尺寸完全相同的嵌板难以拟合,在计算机中设计时,无法保证嵌板的平板化,并且嵌板的尺寸难以实现统一,因此只能依赖对大量嵌板的订制来解决问题,这大大增加了施工难度和成本。

本文借助机器学习中的聚类算法,实现了对嵌板的归类,基于归类的基础上,将复杂曲面归为由几类尺寸完全相同的标准化平板嵌板拼接拟合而成,误差在可接受的范围内并且可控。

聚类算法

什么是聚类

首先来介绍下什么是聚类,在wiki中的解释如下:

Cluster analysis or clustering is the task of grouping a set of objects in such a way that objects in the same group (called a cluster) are more similar (in some sense) to each other than to those in other groups (clusters). It is a main task of exploratory data mining, and a common technique for statistical data analysis, used in many fields, including machine learning, pattern recognition, image analysis, information retrieval, bioinformatics, data compression, and computer graphics.

聚类分析或聚类的任务是对一组对象进行分组,使同一组中的对象(称为集群)对比其他组中的对象更相似。它是探索性数据挖掘的主要任务,是统计数据分析的常用技术,常用于机器学习、模式识别、图像分析、信息检索、生物信息学、数据压缩、计算机图形学等诸多领域。

简单来说就是给定一组对象,给定一些特征,把特征相似的对象汇聚在一起。这里需要注意一下分类和聚类的区别:
分类:分类是人为的对对象进行判断,在类别已知的前提下对对象进行归类,是一个有监督的过程。
聚类:聚类是在分类结束之前我们不知道数据如何分类,而是根据算法,自动地将相似的对象归在一起,是一个无监督的过程。、

常用的聚类算法有很多,比如K-Means、K-Modes、Gaussian Mixture Model、Binary Split等等,本文着重讨论K-Means和Gaussian Mixture,并以c#为例,来讨论它的算法和应用。

K-Means聚类

K-means聚类算法是一种通过迭代来求解的算法。使用者需要先指定K个对象作为聚类中心,然后计算每个对象到各个聚类中心之间的距离,直到将所有对象都分配给距离它们各自最近的聚类中心为止。

在.Net中有一个叫Accord.Net的类库(Grasshopper中的Lunchbox插件就是全部使用的这个类库),它提供了统计分析、机器学习、图像处理、计算机视觉相关的算法,该框架被分成了多个程序集,我们可以直接去官网下载或者使用NuGet得到。下面我们直接使用这个类库做几个案例来说明这个算法。

Figure 2:Accord机器学习类库的网站 图片来源:http://accord-framework.net/

示例一

Figure 3:示例一的gh实现 图片来源:作者自制

我们先举一个简单的例子,做一个关于x-y平面上点集的聚类。实现步骤如下:

首先,为了方便,我们可以设置一个随机种子来从数据中随机取K个点作为聚类中心点(也可以手动设置),根据输入K值(分组的数量)来初始化K-Means类。然后我们就可以开始定义聚类特征,为了方便后面其他数据类型的理解,这里我们多做一步,先将点的x、y坐标放到一个树形数据(DataTree)的不同分支中,再将这个DataTree整理成二维数组的形式。最后将整理好的数据喂给K-Means类求解即可。

代码实现如下:

  private void RunScript(int k, List<Point3d> pt, ref object A){//设置随机种子Accord.Math.Random.Generator.Seed = 0;//初始化K-MeansAccord.MachineLearning.KMeans kmeans = new Accord.MachineLearning.KMeans(k);//定义聚类特征DataTree<double> TreeToCluster = new DataTree<double>();//将顶点的x和y值分别定义到一个树形数据的两个分支中for(int i = 0; i < pt.Count; ++i){TreeToCluster.Add(pt[i].X, new GH_Path(i));TreeToCluster.Add(pt[i].Y, new GH_Path(i));}//整理数据,将DataTree转换为二维数组int n_attr = 2;double[][] ToCluster = new double[pt.Count][];for(int i = 0; i < TreeToCluster.BranchCount; ++i){double[] ToCluster_temp = new double[n_attr];//将分支中的每个数据输入进二维数组for(int j = 0; j < TreeToCluster.Branch(i).Count; ++j){ToCluster_temp[j] = TreeToCluster.Branch(i)[j];}ToCluster[i] = ToCluster_temp;}//求解K-MeansAccord.MachineLearning.KMeansClusterCollection clusters = kmeans.Learn(ToCluster);int[] labels = clusters.Decide(ToCluster);//输出分类索引A = labels;}

最后得到的数据是分好类的顶点索引,我们只需要按照索引从原数据中依次取出即可实现分类,这里就不再赘述了。

此外,我们还可以加上这么一段来将我们随机生成的聚类中心输出出来。笔者写到这里发现,聚类中心和Voronoi的中心很像,毕竟算法的思路有一定的相像之处,都是距离判定,因此结果和聚类结果是一样的。注意Centroids属性可以set,因此我们也可以自己定义聚类中心,这里就不多做赘述了。

    List<Point3d> pts = new List<Point3d>();for (int i = 0; i < clusters.Centroids.Length; i++){double[] d = clusters.Centroids[i];pts.Add(new Point3d(d[0], d[1], 0));}B = pts;

Figure 4:输出聚类中心,再根据聚类中心生成Voronoi,发现聚类结果和Voronoi的结果一致 图片来源:作者自制

顺便一提,笔者还了解到,有篇论文就是通过Voronoi来对网格模型进行聚类,从而提取出模型特征的。

Figure 5:通过Voronoi来对网格模型进行聚类 图片来源:《Mesh Clustering by Approximating Centroidal Voronoi Tessellation》

小结:
通过示例一我们发现,K-Means聚类算法有以下关键点:

  • 定义K值
  • 设置聚类中心
  • 将对象的特征转译成数组形式

示例二

Figure 6:示例二 图片来源:作者自制

接下来来考虑一个简单的网格聚类问题,作为一个例子,我们可以使用K-Means算法将网格面面积相似的面片聚类在一起。已知一张曲面,对其进行三角剖分,为了能够更突出聚类算法的效果我们使用网格面面积差距较大的模型来测试(如图6)。那么对于网格聚类,我们需要关注的是需要用哪些特征作为聚类依据,这里我们使用的就是面积了。 对于三角形来说,面积的计算可以使用海伦公式来进行计算:

已知三角形三边a,b,c,则:
(海伦公式)(p=(a+b+c)/2)
S=sqrt[p(p-a)(p-b)(p-c)]
=sqrt[(1/16)(a+b+c)(a+b-c)(a+c-b)(b+c-a)]
=1/4sqrt[(a+b+c)(a+b-c)(a+c-b)(b+c-a)]

实现代码如下

 private void RunScript(int k, List<Curve> pt, ref object A){//设置随机种子Accord.Math.Random.Generator.Seed = 0;//初始化K-MeansAccord.MachineLearning.KMeans kmeans = new Accord.MachineLearning.KMeans(k);//定义聚类特征DataTree<double> TreeToCluster = new DataTree<double>();for(int i = 0; i < pt.Count; ++i){Curve[] tris = pt[i].DuplicateSegments();double a = tris[0].GetLength();double b = tris[1].GetLength();double c = tris[2].GetLength();//海伦公式double area = (1.0 / 4.0) * Math.Sqrt((a + b + c) * (a + b - c) * (a + c - b) * (b + c - a));TreeToCluster.Add(area, new GH_Path(i));}//整理数据,将DataTree转换为二维数组int n_attr = 4;double[][] ToCluster = new double[pt.Count][];for(int i = 0; i < TreeToCluster.BranchCount; ++i){double[] ToCluster_temp = new double[n_attr];//将分支中的每个数据输入进二维数组for(int j = 0; j < TreeToCluster.Branch(i).Count; ++j){ToCluster_temp[j] = TreeToCluster.Branch(i)[j];}ToCluster[i] = ToCluster_temp;}//求解K-MeansAccord.MachineLearning.KMeansClusterCollection clusters = kmeans.Learn(ToCluster);int[] labels = clusters.Decide(ToCluster);//输出分类索引A = labels;}

Figure 7:示例二的gh实现 图片来源:作者自制

最后再补充一点,关于K-Means聚类效果的评价我们可以使用Proportions来获取各个簇的比例,用Distortion方法来获取数据点到最近的聚类中心的平均距离的平方,平均距离可以用来衡量聚类的“优良性”。聚类中心周围的数据越多,平均距离越短,聚类效果越好。

    //获取各个类别的比例B = clusters.Proportions;//计算从数据点到最近的聚类中心的平均距离的平方。//平均距离可以用来衡量聚类的“优良性”。聚类中心周围的数据越多,平均距离越短,聚类效果越好。C = clusters.Distortion(ToCluster, labels);

注意

在使用K-Means处理数据时,示例二中我们只使用了一个面积特征来聚类,但是如果使用多种特征来聚类时,我们需要注意到数据标准化问题,就是将数据按比例缩放,落入一个区间,以便去除单位的限制。常用的标准化方法有两种:

Min-max 标准化(离差标准化)x’ = (x - min) / (max - min),该方法使数据全部落到 [0, 1] 区间内。
z-score标准化(标准差标准化)x’ = (x - xi) / si,xi为各变量(指标)的算数平均值,si为标准差。

关于K-Means聚类的更多细节问题,可以参考这篇简书文章:https://www.jianshu.com/p/fc91fed8c77b

局限性

在实际应用场景中,我们经常会遇到一些特征相近的情况,这也揭示了K-Means的局限性。一个很简单的例子如图8所示,我们在两个凹形曲线区域内生成若干随机点,我们肉眼看上去很容易就能对这些数据点进行归类,但是对于只能从距离出发的K-Means算法,就难以得到我们想要的结果了。然而高斯混合模型算法能够很好地解决这个问题(如图9所示)。

Figure 8:K-Means的局限性 图片来源:作者自制

Figure 9:GMM对两个凹形曲线区域内生成的随机点进行聚类 图片来源:作者自制

Gaussian Mixture Model (GMM)

高斯混合模型(Gaussian Mixture Model)是一种广泛常用的聚类算法,该算法使用了高斯分布作为参数模型,并且使用了期望最大(Expectation Maximization,简称EM)算法来进行训练。由于笔者对机器学习领域涉猎尚浅,关于高斯混合模型更清晰更易懂的解释以及K-Means与GMM的关系,可以去参考一下达观数据CEO-陈运文的《一文详解高斯混合模型原理》。
我们接下来直接使用示例来继续探讨GMM聚类算法。

示例三

我们尝试做一个示例,使用GMM算法来对随机三角形进行聚类。现在一个矩形区域内有若干个随机三角形,它们的面积、朝向、位置均是随机的,在grasshopper中的建模逻辑如图10所示。

Figure 10:在gh中生成若干随机三角形 图片来源:作者自制

我们可以定义三个特征因素来进行分类:面积、朝向(三角形中心到三个顶点的向量)和位置(所在xy平面的坐标)。实现代码如下:

  private void RunScript(int components, List<Curve> input, int seed, ref object A){//设置随机种子Accord.Math.Random.Generator.Seed = seed;//初始化GaussianMixtureModelAccord.MachineLearning.GaussianMixtureModel ggm = new Accord.MachineLearning.GaussianMixtureModel(components);//定义聚类特征DataTree<double> TreeToCluster = new DataTree<double>();List<double> areas = new List<double>();List<double> dirX = new List<double>();List<double> dirY = new List<double>();List<double> posX = new List<double>();List<double> posY = new List<double>();//将顶点的x和y值分别定义到一个树形数据的两个分支中for(int i = 0; i < input.Count; ++i){//获取三角形三边Curve[] tris = input[i].DuplicateSegments();//获取三角形三个顶点Point3d pa = tris[0].PointAtStart;Point3d pb = tris[1].PointAtStart;Point3d pc = tris[2].PointAtStart;Point3d center = (pa + pb + pc) / 3;//获取面积特征double a = tris[0].GetLength();double b = tris[1].GetLength();double c = tris[2].GetLength();//海伦公式double area = (1.0 / 4.0) * Math.Sqrt((a + b + c) * (a + b - c) * (a + c - b) * (b + c - a));areas.Add(area);//获取三角形的方向特征(中心到三点的向量的xy坐标)Vector3d v1 = pa - center;Vector3d v2 = pb - center;Vector3d v3 = pc - center;v1.Unitize();v2.Unitize();v3.Unitize();dirX.Add(v1.X);dirX.Add(v2.X);dirX.Add(v3.X);dirY.Add(v1.Y);dirY.Add(v2.Y);dirY.Add(v3.Y);//获取三角形的位置特征(中心点的坐标)posX.Add(center.X);posY.Add(center.Y);}for (int i = 0; i < input.Count; i++){//单位化数据double f1 = Min_Max_Normarlize(areas, areas[i]);double f2 = Min_Max_Normarlize(dirX, dirX[i]);double f3 = Min_Max_Normarlize(dirY, dirY[i]);double f4 = Min_Max_Normarlize(posX, posX[i]);double f5 = Min_Max_Normarlize(posY, posY[i]);TreeToCluster.Add(f1, new GH_Path(i));TreeToCluster.Add(f2, new GH_Path(i));TreeToCluster.Add(f3, new GH_Path(i));TreeToCluster.Add(f4, new GH_Path(i));TreeToCluster.Add(f5, new GH_Path(i));}//整理数据,将DataTree转换为二维数组int n_attr = 5;double[][] ToCluster = new double[input.Count][];for(int i = 0; i < TreeToCluster.BranchCount; ++i){double[] ToCluster_temp = new double[n_attr];//将分支中的每个数据输入进二维数组for(int j = 0; j < TreeToCluster.Branch(i).Count; ++j){ToCluster_temp[j] = TreeToCluster.Branch(i)[j];}ToCluster[i] = ToCluster_temp;}//求解GaussianMixtureModelAccord.MachineLearning.GaussianClusterCollection clusters = ggm.Learn(ToCluster);int[] labels = clusters.Decide(ToCluster);//输出分类索引A = labels;}public double Min_Max_Normarlize(List<double> all, double v){double t = (v - all.Min()) / (all.Max() - all.Min());return t;}

Figure 11:示例三的gh实现 图片来源:作者自制

为了验证聚类的效果,我们可以改动一下三个特征的权重来观察聚类效果。比如,我们像观察面积权重的效果,可以直接修改上述代码中的f1参数,比如在标准化后的数值上乘上一个系数5。根据改变不同特征的权重,我们得到如图12所示结果。

double f1 = 5 * Min_Max_Normarlize(areas, areas[i]);

Figure 12:不同权重的聚类结果 图片来源:作者自制

对于一个聚类任务,我们希望得到的簇中,簇内尽量紧密,簇间尽量远离,在Accord.Net中可以输出

    //输出方差(Variance)DataTree<double> variance = new DataTree<double>();for (int i = 0; i < clusters.Variance.Count(); i++){GH_Path ghp = new GH_Path(i);for (int j = 0; j < clusters.Variance[i].Count(); j++){variance.Add(clusters.Variance[i][j], ghp);}}B = variance;//输出数据点到最近的聚类中心的平均平方距离C = clusters.Distortion(ToCluster, labels);

在Lunchbox(一个将Accord.Net搬运进gh的插件)中,K-Means component和Gaussian Mixture component都提供了输出对数似然值(log-likelihood)的端口,该值用于度量一个对象落入不同簇之中的可能性。关于这个值的更多解释可见图13。

Figure 13:关于对数似然值的解释 图片来源:https://stats.stackexchange.com/questions/198078/interpretation-of-the-log-likelihood-in-clustering-techniques

幕墙优化

关于幕墙优化,我们还是以一个示例来解释如何实现。在这个示例中,需要读者对网格优化技术、聚类技术有一定了解。常用的幕墙嵌板有三角形、四边形和六边形(对偶图形),关于对偶算法和对偶网格优化的内容读者可以回顾之前的文章,示例中还使用了我自己编写的一些代码和插件,实现原理均可在文中查到,篇幅有限,在此不多做赘述。

示例四

1. 设计阶段

我们使用Kangaroo构建一个复杂曲面,构建方法如图14。设计思路是先在平面上绘制曲线、放样成面然后划分网格,没有什么技术难点。

Figure 14:使用Kangaroo构建复杂曲面 图片来源:作者自制

2. 网格优化阶段

我们的最终目标是得到六边形为主的三角形对偶网格结构,所以我们需要让所有的三角形尽可能地均匀、尽可能地接近等边三角形。此外,三角网格的奇异点的价决定了对偶后多边形网格的边数,为了减少异形嵌板的数量必须尽可能减少奇异点的数量。因此我们的优化目标如下:

  • 三角形尽可能接近正三角形
  • 奇异点尽可能少
  • 尽可能贴合原模型
  • 边缘保持不变

优化求解有多种方式,Kangaroo、Evolute Tools、笔者参与开发的Ameba等软件均可以实现。也可以通过直接重建曲面的方式来得到。在生成对偶网格时,推荐使用笔者开发的Mesh Dual功能(已内置在Ameba中),目前现有的对偶算法无法计算边缘处的对偶图形,Ameba的Mesh Dual可以直接生成网格边缘的对偶图形。关于Dual with Boundary功能的介绍可以查询笔者公众号的文章。

Figure 15:优化后的三角网格和对偶网格 图片来源:作者自制

我们可以直接将六边形的六个顶点加权组成一个平面,然后再将这六个顶点投影到该平面上来实现简单的平板化处理,尽管这样的处理方法会有一定的缝隙,但是对于大尺度的幕墙,嵌板厚度可以抵消一部分误差,施工上也有各种手段来解决这些问题,这些细小的缝隙暂时忽略不计。

Figure 16:平板化处理后会产生细小的缝隙 图片来源:作者自制

3. 聚类阶段

思路分为两步,因为我们在加工时对嵌板的面积比较敏感,所以需要先对面积进行聚类,然后再对面积聚类的簇进行第二次聚类,也就是在面积差别微小的嵌板中再根据它们的形状归类。

在面积聚类时需要注意两点,其一,对偶网格取决于三角形顶点价,优化过程中几乎不可避免地会产生奇异顶点,我们需要单独将奇异顶点产生的对偶网格(边数不为6的嵌板,下文称为奇异嵌板,其他嵌板称为正则嵌板)提取出来单独归为一类不参与聚类,这类嵌板数量不多,可以对其采用特殊加工的方法。其二,我们需要考虑边缘嵌板,边缘嵌板的形状与中心的正则嵌板差异很大,会对聚类结果造成影响,因此我们应单独拿出来考虑。此外,边缘嵌板既有凹形嵌板也有凸形面板,而内部嵌板均为凸形面板,如果是凸多边形,我们依然可以使用海伦公式求解面积,原理很简单,就是将凸多边形剖分成几个三角形,分别求三角形面积然后相加。但是对于凹多边形,会得到多余的面积。关于求凹多边形面积的方法和C++源码可以访问:https://www.cnblogs.com/TenosDoIt/p/4047211.html

Figure 17:使用Ameba的Mesh Dual区分边缘嵌板 图片来源:作者自制

经过以上处理后,所得嵌板均为正则六边形嵌板,得到每个六边形的面积后,我们可以仿照上文的示例以面积为依据进行聚类,聚类后得到如图18所示结果。

Figure 18:面积聚类结果:灰色嵌板为奇异嵌板和边缘嵌板,彩色嵌板为正则嵌板。 图片来源:作者自制

接下来进行第二次聚类,第二次聚类中我们需要考虑第一次聚类的簇中的嵌板的形状区别,我们将其中一个簇中的嵌板模型取出,我们需要找到可以区分这些嵌板的特征。笔者这里选择的是六边形的边长、六变形顶点到中心的距离以及六边形每个角的角度。
每条边的边长可以直接获取,六边形的六个顶点到中心的距离决定了六边形的形状,也可以直接求得,六边形的六个内角只需要让每条边和其相邻边的夹角求内积即可,使用半边网格数据结构可以很快求得结果。最后得到这以三个特征得到的聚类结果(如图19所示)。以此类推,我们可以对第一次聚类得到的所有的簇进行第二次聚类。

Figure 19:面积聚类后其中一个簇(图16中的橙色簇)的嵌板形状 图片来源:作者自制

4. 标准化单元

第二次聚类后得到的簇中的嵌板已经是面积相近、形状相近了,我们可以将没一个簇中的嵌板映射到xy平面上,观察它们的区别如图20所示。到这一步我们会发现各嵌板之间的差别微小,我们可以直接将这些嵌板做加权平均,求出它们的平均形状(六边形各点求加权平均点然后相连),为了尽可能适配每一个嵌板,我们需要先将这个六边形缩放,再重新映射回原来的位置。

Figure 20:第二次聚类后,同一簇中的不同嵌板的形状区别 图片来源:作者自制

Figure 21:将标准化的面板重新映射回曲面的结果 图片来源:作者自制

5. 嵌板间距优化、调参

仅仅把标准化的嵌板映射回曲面还不够,由于我们对标准化嵌板做过缩放处理,嵌板的间距有些参差不齐,甚至会有嵌板出现相交的情况,因此我们仍需要相邻嵌板的间距进行优化。在同一簇中,我们将每一个嵌板与其相邻嵌板的最近距离构造一个函数,我们可以人为定义一个距离值作为标准,以之前的每一个簇中的缩放值作为输入参数,使用模拟退火算法来优化嵌板间的间距,调参后,得到如图22的结果。最后我们依然可以对边界嵌板执行上述同样的步骤来实现聚类,道理相同,篇幅关系不在为大家解释了。

Figure 22:将标准化的面板重新映射回曲面的结果 图片来源:作者自制

总结

  • 聚类的种类十分重要,取决于网格的复杂度和实际工程需要。
  • 在实际加工中,平板加工设备不受种类数量影响,能大幅度为工程节省造价。
  • 聚类的种类越多对形体拟合地越好。
  • 聚类的效果受网格优化影响非常大,高质量的网格可以直接得到高质量的聚类结果。
  • 最终将1377块六边形面板分类成了27种,分类种数较少导致缝隙依然很大,实际工程中可以视情况增加聚类数。

最后,是一个使用了本文相关技术的实际项目 —— MUSEO SOUMAYA

Figure 23:MUSEO SOUMAYA 图片来源:Google

Figure 24:MUSEO SOUMAYA的聚类结果比对 图片来源:Google

Figure 25:MUSEO SOUMAYA的嵌板安装过程 图片来源:Google

参考文献

Fan, F., Cheng, F. F., Huang, C., Li, Y., Wang, J., & Lai, S. (2009, October). Mesh clustering by approximating centroidal Voronoi tessellation. In 2009 SIAM/ACM Joint Conference on Geometric and Physical Modeling (pp. 301-306). ACM.

《一文详解高斯混合模型原理》 陈运文 达观数据CEO(https://www.ituring.com.cn/article/497545)

Mesh is Art(7)基于机器学习的幕墙嵌板优化相关推荐

  1. 如何构造充填图元_每日一练36:关于如何在Revit中使用自适应族创建矩形无缝曲面幕墙嵌板的方法...

    如何用自适应族创建矩形无缝曲面幕墙嵌板 1.用公制概念体量,绘制曲面幕墙 生成实体后点击分格表面调整V网格为15(可根据自己需求调整) 2.新建一个基于公制幕墙嵌板填充图案,创建实体形状 载入到项目中 ...

  2. bim建模工具丨Revit中弧形幕墙嵌板的快速创建法?

    bim建模工具丨Revit中弧形幕墙嵌板的快速创建法?如图-1,圆形幕墙嵌板在幕墙中无法自动生成. 如何才能快速生成弧形幕墙嵌板? 步骤(1)选中转角幕墙,将其嵌板类型替换成墙.如图-2 编辑替换的墙 ...

  3. Revit幕墙:这些命令在幕墙嵌板中的妙用及快速幕墙

    一.Revit中这些命令在幕墙嵌板中的妙用 在我们做幕墙时,通常会有不同种类的幕墙,比如材质不同,颜色不同.这时我们就需要去选中嵌板进行替换新样式的嵌板. 1.通常我们在替换嵌板时都是通过Tab切换, ...

  4. Revit如何利用公制栏杆嵌板绘制幕墙嵌板?

    [添加官方微信,一起聊聊BIM呀] 1.        单击"应用菜单"--"新建"--"族". 2.        在"新建&q ...

  5. bim综合免费工具:Revit中公制门窗改为幕墙嵌门窗

    bim综合免费工具:Revit中公制门窗改为幕墙嵌门窗?有时候需要在幕墙上增加门或窗,但是用幕墙窗或幕墙门来代替幕嵌板,但是,公制门窗的种类较多,如何将现有的公制门窗改为可替换嵌板的幕墙门窗? 下面讲 ...

  6. Mesh is Art(6):PQ Mesh与幕墙优化(上)

    Mesh is Art(6) 网格与幕墙优化 前言 离散自由结构 三角形网格 平面四边形网格(Planar Quad Meshes) 简单几何体的四边形网格 旋转PQ Mesh案例 共轭曲线网(Con ...

  7. Mesh is Art(5):Circle Packing Mesh优化及其应用

    Mesh is Art(5) Circle Packing Mesh优化及其应用 Circle Packing在各个领域中的应用 CP Mesh优化原理 和CP Mesh相关的几何性质 优化算法 CP ...

  8. 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否...

    基于机器学习的web异常检测 from: https://jaq.alibaba.com/community/art/show?articleid=746 Web防火墙是信息安全的第一道防线.随着网络 ...

  9. 基于机器学习的UEBA在账号异常检测中的应用

    UEBA UEBA是一种采用高级数据分析方法.面向用户和实体网络行为,进行异常检测和调查的技术,也是安全智能分析切入点. U:表示用户(User),UEBA不是一般的安全分析,而是以分析用户活动为首要 ...

最新文章

  1. python多线程爬虫实例-Python多线程爬虫简单示例
  2. 常用js代码整理、收集
  3. 《产品之光》作者Kevin:对于小程序我有话要说
  4. Pycharm超使用快捷键
  5. 设备翻转时viewController调用的方法
  6. 如何自己养卡,快速提升信用卡额度?
  7. 存储型xss漏洞怎么解决_FinDOMXSS:一款针对DOM型XSS漏洞的快速扫描工具
  8. 固定速率与固定延迟– RxJava常见问题解答
  9. 循环序列模型 —— 1.9 GRU单元(门控循环单元)
  10. 【收藏】请不要做浮躁的人
  11. 【瑞芯微RK3188 VS 全志A31】性能向多项目对比评测
  12. 绕过图片打印成PDF时出现锯齿的问题
  13. Python 实现电信天翼网关光猫自动重启
  14. 比例尺和分辨率的相关概念
  15. Oracle 11g RAC OEM配置
  16. Mybatis中Mapper标签总结大全
  17. html浏览器安全调色板,网页安全色调色盘
  18. 爬虫(三):爬取西刺高匿代理
  19. JS 简繁体互转代码
  20. 减法公式运算法则_加减乘除运算法则

热门文章

  1. 设计师搭建免费好用的个人作品网站
  2. 录屏截图工具-超级录屏
  3. 12自由度六足机器人实现蓝牙遥控
  4. Ubuntu OS: Ubuntu for phone
  5. excle 方向键滚动
  6. shell 使用字符串拼接变量名
  7. 计算机视觉(CV)概述
  8. VS 关于 .sln 文件和 .suo 文件
  9. 挑选出两个日期中间的指定礼拜几的时间
  10. ISC互联网安全大会