插件实现:分别通过winform和WPF界面输入操作CAD——CAD c#二次开发

news2025/5/19 20:36:16

效果如下图所示:

主程序

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Windows.Forms;

// 必须添加对 System.Windows.Forms 的引用

namespace IfoxDemo
{
    public class Commands
    {
        [CommandMethod("xx")]
        public void DrawCircles()
        {
            // 获取当前文档和数据库
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            try
            {
                // 创建并显示输入圆信息的窗体
                CircleInputForm form = new CircleInputForm();
                if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    // 获取用户在窗体中输入的半径、数量、颜色、随机分布选项、坐标范围
                    double radius = form.Radius;
                    int count = form.Count;
                    bool isColorRandom = form.IsColorRandom;
                    bool isRandom = form.IsRandom;
                    double xMin = form.XMin;
                    double xMax = form.XMax;
                    double yMin = form.YMin;
                    double yMax = form.YMax;

                    // 开始事务
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        // 打开块表
                        BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                        // 打开模型空间块表记录
                        BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                        Random random = new Random();
                        for (int i = 0; i < count; i++)
                        {
                            Autodesk.AutoCAD.Geometry.Point3d center;
                            if (isRandom)
                            {
                                // 如果选择随机分布,生成随机位置
                                double x = random.NextDouble() * (xMax - xMin) + xMin;
                                double y = random.NextDouble() * (yMax - yMin) + yMin;
                                center = new Autodesk.AutoCAD.Geometry.Point3d(x, y, 0);
                            }
                            else
                            {
                                // 否则,使用原点作为圆心
                                center = Autodesk.AutoCAD.Geometry.Point3d.Origin;
                            }

                            // 创建一个圆对象
                            Circle circle = new Circle(center, Autodesk.AutoCAD.Geometry.Vector3d.ZAxis, radius);

                            if (isColorRandom)
                            {
                                // 如果颜色随机,生成随机颜色索引
                                circle.ColorIndex = (short)random.Next(1, 8);
                            }
                            else
                            {
                                // 否则,使用默认颜色索引
                                circle.ColorIndex = form.ColorIndex;
                            }

                            // 将圆添加到模型空间
                            btr.AppendEntity(circle);
                            tr.AddNewlyCreatedDBObject(circle, true);
                        }

                        // 提交事务
                        tr.Commit();
                    }
                    ed.ZoomExtents();
                }
            }
            catch (Exception ex)
            {
                // 输出异常信息到命令行
                ed.WriteMessage("\nError: " + ex.Message);
            }
        }
    }

    
}

窗体文件:

using Autodesk.AutoCAD.Windows;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace IfoxDemo
{
    public partial class CircleInputForm : Form
    {
        public double Radius { get; private set; }
        public int Count { get; private set; }
        public short ColorIndex { get; private set; }
        public bool IsRandom { get; private set; }
        public bool IsColorRandom { get; private set; }
        public double XMin { get; private set; }
        public double XMax { get; private set; }
        public double YMin { get; private set; }
        public double YMax { get; private set; }

        private Dictionary<string, short> colorMap = new Dictionary<string, short>
        {
            { "红色", 1 },
            { "黄色", 2 },
            { "绿色", 3 },
            { "青色", 4 },
            { "蓝色", 5 },
            { "洋红色", 6 },
            { "白色", 7 }
        };

        public CircleInputForm()
        {
            InitializeComponent();
            // 初始化颜色选择的 ComboBox
            foreach (var colorName in colorMap.Keys)
            {
                cmbColor.Items.Add(colorName);
            }
            cmbColor.SelectedIndex = 0; // 默认选择红色

            // 设置坐标范围的默认值
            txtXMin.Text = "0";
            txtXMax.Text = "10000";
            txtYMin.Text = "0";
            txtYMax.Text = "10000";
            chkRandom.Checked = true;
            chkColorRandom.Checked = true;
            txtRadius.Text = "100";
            txtCount.Text = "100";
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            double radius;
            int count;
            try
            {
                // 尝试将用户输入的半径和数量转换为相应的数据类型
                if (!double.TryParse(txtRadius.Text, out radius))
                {
                    MessageBox.Show("请输入有效的半径!", "输入错误");
                    txtRadius.Focus();
                    return;
                }

                if (!int.TryParse(txtCount.Text, out count))
                {
                    MessageBox.Show("请输入有效的数量!", "输入错误");
                    txtCount.Focus();
                    return;
                }

                // 若输入都有效,则继续后续处理
                Radius = radius;
                Count = count;
                // 获取用户选择的颜色索引
                ColorIndex = colorMap[cmbColor.SelectedItem.ToString()];
                // 获取是否随机分布的选项
                IsRandom = chkRandom.Checked;
                // 获取颜色是否随机的选项
                IsColorRandom = chkColorRandom.Checked;
                // 获取坐标范围
                XMin = double.Parse(txtXMin.Text);
                XMax = double.Parse(txtXMax.Text);
                YMin = double.Parse(txtYMin.Text);
                YMax = double.Parse(txtYMax.Text);

                // 检查坐标范围的合理性
                if (XMin > XMax || YMin > YMax)
                {
                    MessageBox.Show("坐标范围设置不合理,请确保最小值小于最大值。");
                    return;
                }

                // 关闭窗体并返回 DialogResult.OK
                DialogResult = DialogResult.OK;
                Close();
            }
            catch (Exception ex)
            {
                // 若转换失败,显示错误信息
                MessageBox.Show("输入无效: " + ex.Message);
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            // 关闭窗体并返回 DialogResult.Cancel
            DialogResult = DialogResult.Cancel;
            Close();
        }
    }
}

wpf界面如下:

 

 

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Windows;

namespace IfoxDemo
{
    public partial class MainWindow : Window
    {
        public double Radius { get; private set; }
        public int Count { get; private set; }
        public short ColorIndex { get; private set; }
        public bool IsRandom { get; private set; }
        public bool IsColorRandom { get; private set; }
        public double XMin { get; private set; }
        public double XMax { get; private set; }
        public double YMin { get; private set; }
        public double YMax { get; private set; }

        private Dictionary<string, short> colorMap = new Dictionary<string, short>
        {
            { "红色", 1 },
            { "黄色", 2 },
            { "绿色", 3 },
            { "青色", 4 },
            { "蓝色", 5 },
            { "洋红色", 6 },
            { "白色", 7 }
        };

        public MainWindow()
        {
            InitializeComponent();
            // 默认选择第一个颜色
            cmbColor.SelectedIndex = 0;
        }

        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            double radius;
            int count;

            // 验证半径输入
            if (!double.TryParse(txtRadius.Text, out radius))
            {
                MessageBox.Show("请输入有效的半径!", "输入错误");
                txtRadius.Focus();
                return;
            }

            // 验证数量输入
            if (!int.TryParse(txtCount.Text, out count))
            {
                MessageBox.Show("请输入有效的数量!", "输入错误");
                txtCount.Focus();
                return;
            }

            // 若输入都有效,则继续后续处理
            Radius = radius;
            Count = count;

            // 获取用户选择的颜色索引
            string selectedColor = ((ComboBoxItem)cmbColor.SelectedItem).Content.ToString();
            ColorIndex = colorMap[selectedColor];

            // 获取是否随机分布的选项
            IsRandom = chkRandom.IsChecked.Value;

            // 获取颜色是否随机的选项
            IsColorRandom = chkColorRandom.IsChecked.Value;

            // 定义临时变量用于存储解析结果
            double tempXMin, tempXMax, tempYMin, tempYMax;

            // 获取坐标范围
            if (!double.TryParse(txtXMin.Text, out tempXMin) || !double.TryParse(txtXMax.Text, out tempXMax) ||
                !double.TryParse(txtYMin.Text, out tempYMin) || !double.TryParse(txtYMax.Text, out tempYMax))
            {
                MessageBox.Show("请输入有效的坐标范围!", "输入错误");
                return;
            }

            // 将临时变量的值赋给属性
            XMin = tempXMin;
            XMax = tempXMax;
            YMin = tempYMin;
            YMax = tempYMax;

            // 检查坐标范围的合理性
            if (XMin > XMax || YMin > YMax)
            {
                MessageBox.Show("坐标范围设置不合理,请确保最小值小于最大值。");
                return;
            }

            // 关闭窗体并返回结果
            DialogResult = true;
            Close();
        }

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            // 关闭窗体并返回结果
            DialogResult = false;
            Close();
        }
    }

    public class Commands
    {
        [CommandMethod("xx")]
        public void DrawCircles()
        {
            // 获取当前文档和数据库
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            try
            {
                // 创建并显示输入圆信息的窗体
                MainWindow form = new MainWindow();
                if (form.ShowDialog() == true)
                {
                    // 获取用户在窗体中输入的半径、数量、颜色、随机分布选项、坐标范围
                    double radius = form.Radius;
                    int count = form.Count;
                    bool isColorRandom = form.IsColorRandom;
                    bool isRandom = form.IsRandom;
                    double xMin = form.XMin;
                    double xMax = form.XMax;
                    double yMin = form.YMin;
                    double yMax = form.YMax;

                    // 开始事务
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        // 打开块表
                        BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                        // 打开模型空间块表记录
                        BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                        Random random = new Random();
                        for (int i = 0; i < count; i++)
                        {
                            Point3d center;
                            if (isRandom)
                            {
                                // 如果选择随机分布,生成随机位置
                                double x = random.NextDouble() * (xMax - xMin) + xMin;
                                double y = random.NextDouble() * (yMax - yMin) + yMin;
                                center = new Point3d(x, y, 0);
                            }
                            else
                            {
                                // 否则,使用原点作为圆心
                                center = Point3d.Origin;
                            }

                            // 创建一个圆对象
                            Circle circle = new Circle(center, Vector3d.ZAxis, radius);

                            if (isColorRandom)
                            {
                                // 如果颜色随机,生成随机颜色索引
                                circle.ColorIndex = (short)random.Next(1, 8);
                            }
                            else
                            {
                                // 否则,使用默认颜色索引
                                circle.ColorIndex = form.ColorIndex;
                            }

                            // 将圆添加到模型空间
                            btr.AppendEntity(circle);
                            tr.AddNewlyCreatedDBObject(circle, true);
                        }

                        // 提交事务
                        tr.Commit();
                    }
                    ed.ZoomExtents();
                }
            }
            catch (Exception ex)
            {
                // 输出异常信息到命令行
                ed.WriteMessage("\nError: " + ex.Message);
            }
        }
    }
}

 

<Window x:Class="IfoxDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="输入圆信息" Height="350" Width="300">
    <Grid>
        <!-- 半径输入 -->
        <Label Content="半径:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="txtRadius" HorizontalAlignment="Left" Height="23" Margin="60,10,0,0" TextWrapping="Wrap" Text="100" VerticalAlignment="Top" Width="120"/>

        <!-- 数量输入 -->
        <Label Content="数量:" HorizontalAlignment="Left" Margin="10,40,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="txtCount" HorizontalAlignment="Left" Height="23" Margin="60,40,0,0" TextWrapping="Wrap" Text="100" VerticalAlignment="Top" Width="120"/>

        <!-- 颜色选择 -->
        <Label Content="颜色:" HorizontalAlignment="Left" Margin="10,70,0,0" VerticalAlignment="Top"/>
        <ComboBox x:Name="cmbColor" HorizontalAlignment="Left" Margin="60,70,0,0" VerticalAlignment="Top" Width="120">
            <ComboBoxItem Content="红色"/>
            <ComboBoxItem Content="黄色"/>
            <ComboBoxItem Content="绿色"/>
            <ComboBoxItem Content="青色"/>
            <ComboBoxItem Content="蓝色"/>
            <ComboBoxItem Content="洋红色"/>
            <ComboBoxItem Content="白色"/>
        </ComboBox>

        <!-- 随机分布圆位置复选框 -->
        <CheckBox x:Name="chkRandom" Content="随机分布圆位置" HorizontalAlignment="Left" Margin="10,100,0,0" VerticalAlignment="Top" IsChecked="True"/>

        <!-- 颜色随机分布复选框 -->
        <CheckBox x:Name="chkColorRandom" Content="颜色随机分布" HorizontalAlignment="Left" Margin="10,130,0,0" VerticalAlignment="Top" IsChecked="True"/>

        <!-- X 坐标范围 -->
        <Label Content="X 坐标范围:" HorizontalAlignment="Left" Margin="10,160,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="txtXMin" HorizontalAlignment="Left" Height="23" Margin="100,160,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="50"/>
        <Label Content="-" HorizontalAlignment="Left" Margin="147,158,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="txtXMax" HorizontalAlignment="Left" Height="23" Margin="160,160,0,0" TextWrapping="Wrap" Text="10000" VerticalAlignment="Top" Width="50"/>

        <!-- Y 坐标范围 -->
        <Label Content="Y 坐标范围:" HorizontalAlignment="Left" Margin="10,190,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="txtYMin" HorizontalAlignment="Left" Height="23" Margin="100,190,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="50"/>
        <Label Content="-" HorizontalAlignment="Left" Margin="147,188,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="txtYMax" HorizontalAlignment="Left" Height="23" Margin="160,190,0,0" TextWrapping="Wrap" Text="10000" VerticalAlignment="Top" Width="50"/>

        <!-- 确定按钮 -->
        <Button Content="确定" HorizontalAlignment="Left" Margin="50,230,0,0" VerticalAlignment="Top" Width="75" Click="btnOK_Click"/>

        <!-- 取消按钮 -->
        <Button Content="取消" HorizontalAlignment="Left" Margin="150,230,0,0" VerticalAlignment="Top" Width="75" Click="btnCancel_Click"/>
        <!-- 版权信息 -->
        <TextBlock Text="版权#山水(qq443440204)" 
                   HorizontalAlignment="Center" 
                   VerticalAlignment="Bottom" 
                   Margin="0,0,0,10" 
                   Foreground="Red" 
                   FontWeight="Bold"/>
    </Grid>
</Window>

 当前结构问题:随着功能的增加,代码可能会变得臃肿,难以管理。
优化建议:可以将相关的功能进行模块化拆分,例如将与圆的绘制逻辑相关的代码提取到一个独立的类中,将与坐标范围处理相关的代码提取到另一个类中。这样可以提高代码的可读性和可维护性。
MVVM 模式的应用
优势:
分离关注点:MVVM 模式将应用程序分为三个主要部分,即模型(Model)、视图(View)和视图模型(ViewModel)。模型负责处理数据和业务逻辑,视图负责展示用户界面,视图模型作为中间桥梁,连接模型和视图,负责处理视图的交互和数据绑定。这样可以使代码的各个部分职责更加明确,便于开发、测试和维护。
提高可测试性:由于视图模型不依赖于具体的视图,因此可以更容易地对其进行单元测试。可以通过模拟视图模型的依赖项来测试其业务逻辑,而无需依赖于 UI 界面。
数据绑定和交互:MVVM 模式利用数据绑定技术,使得视图和视图模型之间的数据交互更加便捷和直观。当视图模型中的数据发生变化时,视图会自动更新;反之,当用户在视图中进行操作时,也会自动更新视图模型中的数据。

 通用功能使用wpf实现:

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

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

相关文章

白酒迈入3.0时代,珍酒李渡如何穿越周期高质增长?

当下&#xff0c;白酒行业仍处深度调整期&#xff0c;过往通过渠道拓展、硬广宣传等推动规模扩张、提升市场份额的模式&#xff0c;愈发难以为继。 行业迫切需要构建高质增长新模式&#xff0c;完成增长动能转换。中国酒业协会理事长宋书玉提出&#xff0c;白酒消费亟需进入品…

人工智能-LangGraph+ChatUI+DeepSeek API搭建本地智能助手

人工智能-LangGraphChatUIDeepSeek API搭建本地智能助手 0 环境说明1 LangGraph2 Agent Chat UI 0 环境说明 环境项环境说明操作系统Windows11 专业版硬件信息联想拯救者Y9000PcondaAnancondaPython版本3.12NodeJs18.20.0 # 使用conda创建python环境 conda create -n langgra…

虚幻5入门

常用操作 运行时&#xff0c;调试相机&#xff0c;按~键&#xff0c;输入ToggleDebugCamera 。进入自由视角 常用节点 gate节点&#xff1a;用于控制该流程通不通&#xff0c;执不执行。Flip Flop节点&#xff1a;反转执行&#xff0c;一次A&#xff0c;一次B。Set Timer by…

慧通测控:汽车RGB氛围灯功能测试介绍

在汽车内饰不断进化的当下&#xff0c;汽车 RGB 氛围灯已从曾经的小众配置&#xff0c;逐渐成为众多车主提升驾乘体验的热门选择。它宛如车内的 “魔法精灵”&#xff0c;凭借丰富的功能&#xff0c;为单调的车厢披上一层梦幻而温馨的色彩。今天&#xff0c;让我们深入探究汽车…

QML Book 学习基础6(定位/布局元素)

目录 定位元素 Column Row Grid Flow 布局元素 1.元素填充它的⽗元素。 2.对齐 定位元素 Column Column &#xff08;列&#xff09;元素将它的⼦对象通过顶部对⻬的列⽅式进⾏排列。 spacing 属性⽤来设置每个元素之间的间隔⼤⼩ Row Row &#xff08;⾏&#xff09;元…

【SpringCloud】LoadBalance-负载均衡

4. 负载均衡-LoadBalance 4.1 为什么需要负载均衡&#xff1f; 不知道各位心中有没有女神&#xff0c;通常来说一个女神就会有多个舔狗&#xff0c;那这些舔狗呢&#xff0c;就会心甘情愿的帮女神干活&#xff0c;假设女神小美现在有三个舔狗&#xff0c;小美喜欢让这三个舔狗…

自然语言处理(26:(终章Attention 2.)带Attention的seq2seq的实现)

系列文章目录 终章 1&#xff1a;Attention的结构 终章 2&#xff1a;带Attention的seq2seq的实现 终章 3&#xff1a;Attention的评价 终章 4&#xff1a;关于Attention的其他话题 终章 5&#xff1a;Attention的应用 目录 系列文章目录 前言 一、编码器的实现 二、解…

Sentinel实战(二)、流控规则之流控阈值类型、流控模式

spring cloud Alibaba-sentinel-流控 流控规则前置环境一、基于阈值类型(QPS/线程数)维度,设置流控规则demo1、流控规则:设置QPS流控规则设置含义测试,观察流控规则设定后的效果demo2、流控规则-设置线程数流控规则设置含义测试,观察流控规则设定后的效果二、基于流控模…

AI与.NET技术实操系列(四):使用 Semantic Kernel 和 DeepSeek 构建AI应用

1. 引言 在人工智能技术飞速发展的今天&#xff0c;大型语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为智能应用开发的核心驱动力。从智能客服到自动化内容生成&#xff0c;LLMs的应用正在深刻改变我们的工作和生活方式。 对于.NET开发者而言&#xff0c;…

HarmonyOS:ComposeTitleBar 组件自学指南

在日常的鸿蒙应用开发工作中&#xff0c;我们常常会面临构建美观且功能实用的用户界面的挑战。而标题栏作为应用界面的重要组成部分&#xff0c;它不仅承载着展示页面关键信息的重任&#xff0c;还能为用户提供便捷的操作入口。最近在参与的一个项目里&#xff0c;我就深深体会…

25-智慧旅游系统(协同算法)三端

介绍 技术&#xff1a; 基于 B/S 架构 SpringBootMySQLLayuivue 环境&#xff1a; Idea mysql maven jdk1.8 node 管理端功能 首页展示图表&#xff1a;以数据可视化方式展示关键业务数据。 用户管理&#xff1a;管理系统用户&#xff0c;包括查看、编辑等操作。 供应商管…

数据结构实验1.2: 顺序表的基本运算

文章目录 一&#xff0c;问题描述二&#xff0c;基本要求三&#xff0c;算法分析&#xff08;1&#xff09;插入算法&#xff08;2&#xff09;删除算法 四&#xff0c;参考程序五&#xff0c;运行效果 一&#xff0c;问题描述 创建一个顺序表&#xff0c;编程实现顺序表的下列…

【QT】QT中的信号与槽

QT中的信号与槽 一、信号与槽函数的作用二、如何关联信号与槽函数1、借助集成开发环境&#xff0c;右键转到槽函数示例代码&#xff1a; 2、调用connect函数手动关联信号与槽函数 三、扩展四、总结信号与槽的特点1、一个类如果要使用信号以及槽函数&#xff0c;那么该类的定义中…

使用Python爬虫获取1688商品(按图搜索)接口

一、引言 随着电商行业的不断发展&#xff0c;消费者对商品搜索的效率和准确性要求越来越高。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品搜索功能&#xff0c;其中按图搜索功能&#xff08;类似于淘宝的拍立淘&#xff09;极大地提升了用户的购物体验。本文将…

AI Agent拐点已至,2B+2C星辰大海——行业深度报告

大家好&#xff0c;我是吾鳴。 今天吾鳴要给大家分享一份由开源证券出品的关于AI Agent的报告&#xff0c;报告从AI Agent商业化应用、C端B端应用与布局&#xff0c;投资建议等方向介绍2025AI Agent新元年。报告一共28页PDF&#xff0c;文末有完整版下载地址。 内容摘要 2025年…

【CSS】- 表单控件的 placeholder 如何控制换行显示?

表单控件的 placeholder 如何换行展示&#xff1f; HTML 中&#xff0c;<textarea> 元素的 placeholder 属性默认情况下不支持换行。不过&#xff0c;可以通过以下几种方法来实现换行效果&#xff1a; 模版字符串 模板字符串可以轻松地创建多行字符串&#xff0c;而不…

node.js、npm相关知识

Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境&#xff0c;主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务&#xff0c;突破了 JavaScript 仅在浏览器中运行的限制。 npm&#xff08;Node Package Man…

基于HTML5和CSS3实现3D旋转相册效果

基于HTML5和CSS3实现3D旋转相册效果 这里写目录标题 基于HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现原理1. HTML结构2. CSS样式设计2.1 基础样式设置2.2 容器样式2.3 图片样式 3. JavaScript实现4. 交互功能实现4.1 触摸和鼠标拖拽4.2 播放控制 项目亮点技术难点…

上市电子制造企业如何实现合规的质量文件管理?

浙江洁美电子科技股份有限公司成立于2001年&#xff0c;是一家专业为片式电子元器件(被动元件、分立器件、集成电路及LED)配套生产电子薄型载带、上下胶带、离型膜、流延膜等产品的国家高新技术企业&#xff0c;主要产品有分切纸带、打孔经带、压孔纸带、上下胶带、塑料载带及其…

vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启

1、粘滞滚动的基本概念和作用 ‌VSCode中的“粘滞”功能主要是指编辑器在滚动时的一种特殊效果&#xff0c;使得编辑器在滚动到某个位置时会“粘”在那里&#xff0c;而不是平滑滚动到底部或顶部。‌ 粘滞滚动的基本概念和作用 粘滞滚动功能可以让用户在滚动时更直观地看到当前…