C# cass10 面积计算

news2024/11/19 17:33:50

运行环境Visual Studio 2022 c# cad2016 cass10

通过面积计算得到扩展数据,宗地面积 ,房屋占地面积,房屋使用面积

一、主要步骤

  1. 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象。
  2. 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界。
  3. 提示用户根据上述规则进行实体选择,并获取选择结果。
  4. 遍历所有被选中的外部多段线,确保所选多段线是闭合的且至少有一个顶点。
  5. 创建并填充一个表示外部多段线边界坐标的点集合。
  6. 使用多边形窗口选择方式让用户选择位于外部多段线内的实体。
  7. 遍历用户在内部区域所选的所有闭合多段线,计算房屋面积和附属面积。
  8. 计算宗地面积和输出结果。

二、完整代码

internal class zdfwmj
{
    public static List<string> filelist1 = new List<string>();
    public static List<string> filelist2 = new List<string>();
    public void fwzymj()
    {
        // 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        Editor ed = doc.Editor;
        string SelectedLayerName = CreatePalette.SelectedLayerName;
        NumberContainer numberContainer = new NumberContainer();


        //ed.WriteMessage("选择的图层:" + SelectedLayerName + "\n");


        // 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界
        SelectionFilter outerFilter = new SelectionFilter(new TypedValue[] {
            new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
            new TypedValue((int)DxfCode.LayerName, SelectedLayerName)
        });
        // 提示用户根据上述规则进行实体选择,并获取选择结果
        PromptSelectionResult outerSelRes = ed.GetSelection(outerFilter);
        // 检查用户是否成功选择了实体
        if (outerSelRes.Status == PromptStatus.OK)
        {
            using (Transaction tr = db.TransactionManager.StartTransaction())// 开始事务处理以确保数据一致性
            {
                foreach (ObjectId outerId in outerSelRes.Value.GetObjectIds())// 遍历所有被选中的外部多段线
                {
                    using (Polyline outerPolyline = (Polyline)tr.GetObject(outerId, OpenMode.ForRead))// 读取所选多段线
                    {
                        // 确保所选多段线是闭合的且至少有一个顶点
                        double totalArea = 0; // 总面积
                        double totalAreaZdmj = 0; // 总面积
                        double totalAreaSYmj = 0; // 总面积
                        if (outerPolyline.Closed && outerPolyline.NumberOfVertices > 0)
                        {

                            // 创建并填充一个表示外部多段线边界坐标的点集合
                            Point3dCollection outerPoints = new Point3dCollection();
                            for (int i = 0; i < outerPolyline.NumberOfVertices; i++)
                            {
                                Point3d point = outerPolyline.GetPoint3dAt(i);
                                // 获取多边形的中心点
                                Point3d center = GetCenterOfPolyline(outerPolyline);
                                // 定义你的扩展因子,比如 1.5 表示扩大1.5倍
                                double scaleFactor = 1.2;

                                // 将顶点向中心点平移,然后按比例缩放
                                Point3d scaledPoint = new Point3d(
                                    (point.X - center.X) * scaleFactor + center.X,
                                    (point.Y - center.Y) * scaleFactor + center.Y,
                                    (point.Z - center.Z) * scaleFactor + center.Z
                                );

                                // 创建并设置文本对象
                                DBText text = new DBText();
                                text.TextString = i.ToString();
                                //text.Height = 1; // 文字高度设为1个单位
                                text.Position = scaledPoint;

                                 将文本添加到模型空间
                                //using (Transaction transaction = db.TransactionManager.StartTransaction())
                                //{
                                //    BlockTable bt = transaction.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                                //    BlockTableRecord ms = transaction.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                                //    ms.AppendEntity(text);
                                //    transaction.AddNewlyCreatedDBObject(text, true);
                                //    transaction.Commit();
                                //}
                                outerPoints.Add(scaledPoint);
                            }

                            // 创建一个窗口选择过滤器,用于选择位于外部多段线内的所有实体
                            SelectionFilter innerFilter = new SelectionFilter(new TypedValue[] {
                    new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
                    new TypedValue((int)DxfCode.LayerName, "JMD")
                });
                            // 使用多边形窗口选择方式让用户选择位于外部多段线内的实体
                            PromptSelectionResult innerSelRes = ed.SelectWindowPolygon(outerPoints, innerFilter);

                            // 检查用户是否成功在内部区域进行了实体选择
                            if (innerSelRes.Status == PromptStatus.OK)
                            {
                                SelectionSet innerSelectionSet = innerSelRes.Value;
                                // 遍历用户在内部区域所选的所有闭合多段线

                               
                                foreach (ObjectId id2 in innerSelectionSet.GetObjectIds())
                                {
                                    using (Polyline polyline2 = (Polyline)tr.GetObject(id2, OpenMode.ForRead))
                                    {
                                        if (polyline2.Closed && polyline2.NumberOfVertices > 0)
                                        {
                                            Entity ent2 = (Entity)tr.GetObject(id2, OpenMode.ForWrite);
                                            //ent2.Color = Color.FromColorIndex(ColorMethod.ByAci, 3); // 示例:将颜色设为黄色
                                            //ed.UpdateScreen(); // 确保颜色更改即时生效
                                            filelist1.Clear();
                                            filelist2.Clear();
                                            int filelist1ii = 0;
                                            if (ent2 != null && ent2.XData != null)
                                            {
                                                List<int> numbers01 = new List<int> { 141161, 141121, 141151 };//房屋编码
                                                List<int> numbers02 = new List<int> { 141800, 140001, 143130, 143111, 143112 };//房屋附属编码

                                                ResultBuffer rb = ent2.GetXDataForApplication("SOUTH");
                                                string xdata = rb.ToString();

                                                foreach (TypedValue tv in rb)
                                                {
                                                    filelist1.Add(tv.TypeCode.ToString());//码
                                                    filelist2.Add(tv.Value.ToString());//值


                                                }
                                                filelist1ii = filelist1.Count();

                                                //房屋面积
                                                if (filelist1ii == 3)
                                                {
                                                    if (numbers01.Contains(Convert.ToInt32(filelist2[1])))
                                                    {
                                                        string fwjg = numberContainer.GetDescription(Convert.ToInt32(filelist2[1]));

                                                        int fileValue;
                                                        if (int.TryParse(filelist2[2], out fileValue))
                                                        {
                                                            double calculatedUsageArea = polyline2.Area * fileValue;
                                                            //ed.WriteMessage($"\n房屋面积信息:{fwjg}{fileValue} 占地面积:{polyline2.Area:N2} 使用面积:{calculatedUsageArea:N2}\n");
                                                            totalAreaZdmj += polyline2.Area;
                                                            totalAreaSYmj += calculatedUsageArea;
                                                            using (Transaction transaction = db.TransactionManager.StartTransaction())
                                                            {
                                                                RegAppTable table02 = (RegAppTable)transaction.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);
                                                                ResultBuffer rb02 = new ResultBuffer();
                                                                string appName02 = "扩展数据";
                                                                if (!table02.Has(appName02))
                                                                {
                                                                    RegAppTableRecord regAppRec = new RegAppTableRecord();
                                                                    regAppRec.Name = appName02;
                                                                    table02.Add(regAppRec);
                                                                    transaction.AddNewlyCreatedDBObject(regAppRec, true);
                                                                }
                                                                rb02.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName02));
                                                                rb02.Add(new TypedValue((int)DxfCode.ExtendedDataReal, polyline2.Area));
                                                                rb02.Add(new TypedValue((int)DxfCode.ExtendedDataReal, calculatedUsageArea));
                                                                ent2.XData = rb02;
                                                                transaction.Commit();
                                                            }
                                                        }
                                                        else
                                                        {
                                                            //ed.WriteMessage("\n无法将文件列表中的值转换为整数以计算使用面积!");
                                                        }
                                                    }


                                                }
                                                if (filelist1ii == 2)
                                                {
                                                   ed.WriteMessage("\n附属编码:" + filelist2[1]);
                                                    if (numbers02.Contains(Convert.ToInt32(filelist2[1])))
                                                    {
                                                        string fwjg = numberContainer.GetDescription(Convert.ToInt32(filelist2[1]));
                                                        //double fsmj = FwmjArea(polyline2, db, ed, tr);
                                                        TypedValue[] tvs = new TypedValue[]
                                                        {
                                                             new TypedValue((int)DxfCode.Operator, "<and"),
                                                             new TypedValue((int)DxfCode.Start, "TEXT"),
                                                             new TypedValue((int)DxfCode.LayerName, "房屋附属1"),
                                                             new TypedValue((int)DxfCode.Operator, "and>")
                                                        };

                                                        SelectionFilter sf = new SelectionFilter(tvs);
                                                        PromptSelectionResult psr = ed.SelectAll(sf);
                                                        SelectionSet ss = psr.Value;
                                                        foreach (SelectedObject so in ss)
                                                        {
                                                            DBText text = tr.GetObject(so.ObjectId, OpenMode.ForRead) as DBText;
                                                            if (IsPointInside(polyline2, text.Position))
                                                            {
                                                                string input = text.TextString;
                                                                //文字分解
                                                                string[] parts = input.Split(' ');

                                                                foreach (string part in parts)
                                                                {
                                                                    // 按中文逗号分割键值对
                                                                    string[] keyValue = part.Split(','); // 注意:这里的逗号是中文逗号,不是英文逗号

                                                                    if (keyValue.Length == 2)
                                                                    {
                                                                        string key = keyValue[0];
                                                                        string value = keyValue[1];

                                                                        //ed.WriteMessage("键: " + key + ", 值: " + value+ "\n");
                                                                        bool result = key.Contains("Q");
                                                                        if (result)
                                                                        {
                                                                            totalArea += polyline2.Area;
                                                                            //ed.WriteMessage($"全:{key}{value} 附属面积:{polyline2.Area:N2}\n");
                                                                        }
                                                                        result = key.Contains("B");
                                                                        if (result)
                                                                        {
                                                                            totalArea += polyline2.Area / 2;
                                                                            //ed.WriteMessage($"半:{key}{value} 附属面积:{polyline2.Area:N2}\n");
                                                                        }
                                                                    }
                                                                    else
                                                                    {
                                                                        //ed.WriteMessage("未能分割出键值对:" + part);
                                                                    }
                                                                }
                                                                using (Transaction transaction = db.TransactionManager.StartTransaction())
                                                                {
                                                                    RegAppTable table02 = (RegAppTable)transaction.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);
                                                                    ResultBuffer rb02 = new ResultBuffer();
                                                                    string appName02 = "扩展数据";
                                                                    if (!table02.Has(appName02))
                                                                    {
                                                                        RegAppTableRecord regAppRec = new RegAppTableRecord();
                                                                        regAppRec.Name = appName02;
                                                                        table02.Add(regAppRec);
                                                                        transaction.AddNewlyCreatedDBObject(regAppRec, true);
                                                                    }
                                                                    rb02.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName02));
                                                                    rb02.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, input));
                                                                    rb02.Add(new TypedValue((int)DxfCode.ExtendedDataReal, totalArea));
                                                                    ent2.XData = rb02;
                                                                    transaction.Commit();
                                                                }
                                                                //ed.WriteMessage($"房屋附属:{input} 附属面积:{totalArea:N2}\n");

                                                            }
                                                            
                                                        }   
                                                        
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            Entity ent01 = tr.GetObject(outerId, OpenMode.ForWrite) as Entity;
                            RegAppTable table = (RegAppTable)tr.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);
                            ResultBuffer rb01 = new ResultBuffer();
                            string appName = "扩展数据";
                            if (!table.Has(appName))
                            {
                                RegAppTableRecord regAppRec = new RegAppTableRecord();
                                regAppRec.Name = appName;
                                table.Add(regAppRec);
                                tr.AddNewlyCreatedDBObject(regAppRec, true);
                            }
                            rb01.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
                            rb01.Add(new TypedValue((int)DxfCode.ExtendedDataReal, outerPolyline.Area));
                            rb01.Add(new TypedValue((int)DxfCode.ExtendedDataReal, totalAreaZdmj));
                            rb01.Add(new TypedValue((int)DxfCode.ExtendedDataReal, (totalAreaSYmj + totalArea)));
                            ent01.XData = rb01;

                        }

                        //ed.WriteMessage($"\n宗地面积:{outerPolyline.Area:N2} \n\n房屋占地面积:{totalAreaZdmj:N2}\n房屋使用面积:{(totalAreaSYmj + totalArea):N2}\n");

                    }
                }
                tr.Commit();
            }
        }
    }

    /// <summary>FwmjArea
    public double FwmjArea(Polyline polyline, Database db, Editor ed, Transaction tr)
    {

        Point3dCollection outerPoints = new Point3dCollection(); // 创建并填充一个表示外部多段线边界坐标的点集合
        double areaFWFS = 0;//房屋附属面积
        for (int i = 0; i < polyline.NumberOfVertices; i++)
        {
            Point3d point = polyline.GetPoint3dAt(i);
            outerPoints.Add(point);
        }


        // 创建一个窗口选择过滤器,用于选择位于外部多段线内的所有实体
        SelectionFilter innerFilter = new SelectionFilter(new TypedValue[] {
                     new TypedValue((int)DxfCode.Operator, "<and"),
                     new TypedValue((int)DxfCode.Start, "TEXT"),
                     new TypedValue((int)DxfCode.LayerName, "房屋附属1"),
                     new TypedValue((int)DxfCode.Operator, "and>")
        });
        // 使用多边形窗口选择方式让用户选择位于外部多段线内的实体
        PromptSelectionResult innerSelRes = ed.SelectAll(innerFilter);
        if (innerSelRes.Status == PromptStatus.OK)
        {
            SelectionSet innerSelectionSet = innerSelRes.Value;
            foreach (SelectedObject so in innerSelectionSet)
            {
                DBText text = tr.GetObject(so.ObjectId, OpenMode.ForRead) as DBText;
                if (IsPointInside(polyline, text.Position))
                {
                    string input = text.TextString;
                    //ed.WriteMessage("\n房屋附属文字2:", input.ToString());
                    //ed.WriteMessage("\n房屋附属文字2:", polyline.Area);
                }

            }

        }



        return areaFWFS;
    }
    /// </summary>
    /// <param name="polyline"></param>
    /// <param name="point"></param>
    /// <returns></returns>
    // 定义一个方法,输入参数为一个多段线对象和一个三维点,返回值为布尔类型,表示该点是否在多段线内部
    public bool IsPointInside(Polyline polyline, Point3d point)
    {
        // 初始化交叉次数变量为0,用于记录点与多段线各线段相交的次数
        int crossings = 0;

        // 遍历多段线的所有顶点,从第一个顶点开始到最后一个顶点
        for (int i = 0; i < polyline.NumberOfVertices; i++)
        {
            // 获取当前线段的起点坐标
            Point3d start = polyline.GetPoint3dAt(i);

            // 计算下一个顶点的索引,并使用取模运算确保最后一个顶点后回到第一个顶点形成闭合循环
            int nextIndex = (i + 1) % polyline.NumberOfVertices;
            Point3d end = polyline.GetPoint3dAt(nextIndex);

            // 如果线段两端点都在检测点Y轴上方或下方,则此线段与过检测点的水平线不相交,跳过此次循环
            if (start.Y > point.Y && end.Y > point.Y)
                continue;
            if (start.Y <= point.Y && end.Y <= point.Y)
                continue;

            // 如果检测点X坐标小于线段起点和终点的X坐标最小值,则此线段位于检测点左侧,跳过此次循环
            if (point.X < Math.Min(start.X, end.X))
                continue;

            // 计算线段的斜率,并根据直线方程计算线段与过检测点Y坐标水平线的交点横坐标
            double slope = (end.Y - start.Y) / (end.X - start.X);
            double intersectX = start.X + (point.Y - start.Y) / slope;

            // 如果检测点X坐标大于等于交点横坐标,则表示检测点在线段的一侧,增加交叉次数
            if (point.X >= intersectX)
                crossings++;
        }

        // 根据奇偶性判断:若交叉次数为奇数,则认为点在多段线内;否则点在多段线外
        return (crossings % 2) == 1;
    }
    //包含字符 出现次数
    public static int CountCharacterOccurrences(string str, string substring)
    {
        if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(substring))
            return 0;

        int index = 0, count = 0;
        while ((index = str.IndexOf(substring, index)) != -1)
        {
            count++;
            index += substring.Length; // 移动到下一个可能的位置
        }
        return count;
    }
    // GetCenterOfPolyline 是一个假设存在的方法,用于计算多边形的中心点
    private Point3d GetCenterOfPolyline(Polyline polyline)
    {
        double xSum = 0, ySum = 0, zSum = 0;
        for (int i = 0; i < polyline.NumberOfVertices; i++)
        {
            Point3d vertex = polyline.GetPoint3dAt(i);
            xSum += vertex.X;
            ySum += vertex.Y;
            zSum += vertex.Z;
        }
        return new Point3d(xSum / polyline.NumberOfVertices, ySum / polyline.NumberOfVertices, zSum / polyline.NumberOfVertices);
    }
}

 //有需要cad二次开发可以私信进行联系
//感谢大家的点赞,收藏,转发,关注

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1466505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#最优队列最小堆小顶堆大顶堆小根堆大根堆PriorityQueue的使用

最优队列有多种叫法&#xff0c;什么小根堆&#xff0c;大根堆&#xff0c;小顶堆&#xff0c;大顶堆。 队列分多种&#xff0c;线性队列&#xff08;简单队列&#xff09;&#xff0c;循环队列&#xff0c;最优队列等等。 最优队列&#xff0c;可以看作堆叠箱子&#xff0c;…

【深度学习】LoRA: Low-Rank Adaptation of Large Language Models,论文解读

文章&#xff1a; https://arxiv.org/abs/2106.09685 文章目录 摘要介绍LoRA的特点什么是低秩适应矩阵&#xff1f;什么是适应阶段&#xff1f;低秩适应矩阵被注入到预训练模型的每一层Transformer结构中&#xff0c;这一步是如何做到的&#xff1f; 摘要 自然语言处理的一个重…

vue video 多个视频切换后视频不显示的解决方法

先说一下我这边的需求是视频需要轮播&#xff0c;一个人员有多个视频&#xff0c;左右轮播是轮播某个人员下的视频&#xff0c;上下切换是切换人员。 vue 代码 <el-carouselindicator-position"none"ref"carousel"arrow"always":interval&qu…

CSS 面试题汇总

CSS 面试题汇总 1. 介绍下 BFC 及其应 参考答案&#xff1a; 参考答案&#xff1a; 所谓 BFC&#xff0c;指的是一个独立的布局环境&#xff0c;BFC 内部的元素布局与外部互不影响。 触发 BFC 的方式有很多&#xff0c;常见的有&#xff1a; 设置浮动overflow 设置为 auto、scr…

uniapp 使用 z-paging组件

使用 z-paging 导入插件 获取插件进行导入 自定义上拉加载样式和下拉加载样式 页面结构 例子 搭建页面 <template><view class"content"><z-paging ref"paging" v-model"dataList" query"queryList"><templ…

笔记-电感充放电过程状态记录

描述&#xff1a;电感充放电过程状态记录 为加深对电感充放电的理解&#xff0c;特做一次记录。 目录 一、准备工作二、电感状态记录1、电感刚开始充电瞬间2、电感充电期间3、电感充电完毕4、电感开始放电瞬间5、电感放电完毕6、电感充放电完整记录 一、准备工作 1、在线平台…

C语言知识复习及拓展

复习内容&#xff1a; 指针、数组、关键字、内存布局、堆和栈的区别、队列、链表。 关键字 1、数据类型关键字 A基本数据类型&#xff08;5个&#xff09; void&#xff1a; 是用来修饰函数的参数或返回值的&#xff0c;代表函数没有参数或没有返回值。 char&#xff1a;用…

飞书被破了,文档可复制可下载

使用过飞书的用户都知道&#xff0c;许多文档、表格被设置权限&#xff0c;只能阅读&#xff0c;不能复制&#xff0c;更别说下载&#xff0c;不方便资料保存。 一、破解 今天无意中发现一个软件&#xff0c;居然可以复制、下载飞书文档&#xff0c;直接看效果&#xff0c;CTR…

开源大语言模型作为 LangChain 智能体

概要 开源大型语言模型 (LLMs) 现已达到一种性能水平&#xff0c;使它们适合作为推动智能体工作流的推理引擎: Mixtral 甚至在我们的基准测试中 超过了 GPT-3.5&#xff0c;并且通过微调&#xff0c;其性能可以轻易的得到进一步增强。 引言 针对 因果语言建模 训练的大型语言模…

Canal + Kafka 同步 MySQL 数据到 Redis

解决缓存和数据库一致性问题 一般来说&#xff0c;缓存中的数据没什么问题&#xff0c;但是数据库更新后&#xff0c;就容易出现缓存&#xff08;Redis&#xff09;和数据库&#xff08;MySQL&#xff09;间的数据一致性问题。由于写和读是并发的&#xff0c;没法保证顺序&…

java_URL中的URL编码转换成中文

问题描述 上传文件后&#xff0c;获得的URL中包含了URL编码&#xff0c;导致在前端展示文件名时出现乱码 最终效果 解决思路&#xff1a; 1、先按照英文逗号切割URL 2、截取字符串中URL编码部分(含后缀名) 3、使用正则匹配截取到的字符串中的URL编码 4、转换URL编码为中文&a…

创建一个基于Node.js的实时聊天应用

在当今数字化社会&#xff0c;实时通讯已成为人们生活中不可或缺的一部分。无论是在社交媒体平台上与朋友交流&#xff0c;还是在工作场合中与同事协作&#xff0c;实时聊天应用都扮演着重要角色。与此同时&#xff0c;Node.js作为一种流行的后端技术&#xff0c;为开发者提供了…

1TB! 台湾最新倾斜摄影3DTiles数据分享

之前的文章分享了546GB香港倾斜摄影3DTiles数据&#xff0c;主要是验证倾斜模型3DTiles转换工具的生产效率和数据显示效率&#xff0c;结果对比可以看出无论是数据生产速度以及成果数据显示效率上&#xff0c;都优于其他两种技术路线。最近使用倾斜模型3DTiles工具生产了台湾地…

Spring 手动实现Spring底层机制

目录 一、前言 二、Spring底层整体架构 1.准备工作 : 2.架构分析 : &#xff08;重要&#xff09; 3.环境搭建 &#xff1a; 三、手动实现Spring容器结构 1.自定义注解 : 1.1 Component注解 1.2 Scope注解 2.自定义组件 : 3.自定义用于封装Bean信息的BeanDefinition类&a…

STM32 SPI(基础概念)

文章目录 前言一、SPI通信协议概述二、SPI硬件框图和软件层次三、SPI通信时序四、SPI控制器总结 前言 本篇文章来给大家讲解一个非常重要的通信协议SPI&#xff0c;SPI在MCU和外设之间的通信用的是非常多的&#xff0c;这篇文章将带大家先来学习SPI的一些概念。 一、SPI通信协…

alist修改密码(docker版)

rootarmbian:~# docker exec -it [docker名称] ./alist admin set abcd123456 INFO[2024-02-20 11:06:29] reading config file: data/config.json INFO[2024-02-20 11:06:29] load config from env with prefix: ALIST_ INFO[2024-02-20 11:06:29] init logrus..…

《TCP/IP详解 卷一》第3章 链路层

目录 3.1 引言 3.2 以太网 3.3 全双工 省点 自动协商 流量控制 3.4 网桥和交换机 3.5 WiFi 3.6 PPP协议 3.6.1 PPP协议流程 3.7 环回 3.8 MTU和路径MTU 3.9 隧道基础 3.9.1 GRE 3.9.2 PPTP 3.9.3 L2TP 3.10 与链路层相关的攻击 3.11 总结 3.1 引言 城域网&…

2024年1月京东洗衣机行业数据分析:TOP10品牌销量销额排行榜

鲸参谋监测的京东平台1月份洗衣机市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台显示&#xff0c;今年1月份&#xff0c;京东平台上洗衣机的销量约160万件&#xff0c;环比上个月增长约42%&#xff0c;同比去年下滑7%&#xff1b;销售额约28亿元&#xff0c;环比…

Java零基础 - 三元运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

Golin 弱口令/漏洞/扫描/等保/基线核查的快速安全检查小工具

下载地址&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/db6afba6de1f 主要功能 主机存活探测、漏洞扫描、子域名扫描、端口扫描、各类服务数据库爆破、poc扫描、xss扫描、webtitle探测、web指纹识别、web敏感信息泄露、web目录浏览、web文件下载、等保安全风险问题风险…