骑着骆驼撩妹 2024-09-03 16:02 采纳率: 0%
浏览 5

c# AutoCAD开发问题

想通过另外一个 winform程序发送udp实时新增&修改cad图形位置 最后保存dwg文件 。目前遇到问题:不放线程里,可以在cad上绘制,需要一直等待命令绘制,放在线程里面就报错(试过异步、委托到主线程等方式)。或者可以直接通过修改dwg文件,网上复制了些例子,没成功

[CommandMethod("OpenUI")]
        public void OpenUI()
        {
            Process.Start(User.getInstance.GetProgramPath());
            m_udpMgr = new UdpMgr();
            m_udpMgr.RecvMsg();
            //Thread thr = new Thread(() =>
            //{
            //    Thread.Sleep(1000);
                Database db = HostApplicationServices.WorkingDatabase;
                db.AddRectToModelSpace(new Point2d(0, 0), new Point2d(100, 100));
                db.AddRectToModelSpace(new Point2d(200, 200), new Point2d(100, 100));
                db.AddRectToModelSpace(new Point2d(500, 500), new Point2d(1000, 1000));
            //});
            //thr.IsBackground = true;
            //thr.Start();
        }
        public static ObjectId AddEntityToModelSpace(this Database db, Entity ent)
        {
            ObjectId entId = ObjectId.Null;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                //打开块表
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,OpenMode.ForRead);
                //打开块表记录
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                //添加图形到块表记录
                entId = btr.AppendEntity(ent);
                //更新数据信息
                trans.AddNewlyCreatedDBObject(ent, true);
                //提交事务
                trans.Commit();
            }
            return entId;
        }
        /// <summary>
        /// 绘制矩形
        /// </summary>
        /// <param name="db">图形数据库</param>
        /// <param name="point1">第一个点</param>
        /// <param name="point2">对角点</param>
        /// <returns>ObjectId</returns>
        public static ObjectId AddRectToModelSpace(this Database db,Point2d point1,Point2d point2)
        {
            //申明多段线
            Polyline pLine = new Polyline();
            //计算矩形4个顶点坐标
            Point2d p1 = new Point2d(Math.Min(point1.X, point2.X),Math.Min(point1.Y,point2.Y));
            Point2d p2 = new Point2d(Math.Max(point1.X, point2.X),Math.Min(point1.Y,point2.Y));
            Point2d p3 = new Point2d(Math.Max(point1.X, point2.X),Math.Max(point1.Y,point2.Y));
            Point2d p4 = new Point2d(Math.Min(point1.X, point2.X),Math.Max(point1.Y,point2.Y));
            //添加多段线的顶点
            pLine.AddVertexAt(0,p1,0,0,0);
            pLine.AddVertexAt(0,p2,0,0,0);
            pLine.AddVertexAt(0,p3,0,0,0);
            pLine.AddVertexAt(0,p4,0,0,0);
            //闭合多段线
            pLine.Closed = true;
            return db.AddEntityToModelSpace(pLine);
        }

  • 写回答

1条回答 默认 最新

  • 吃不了席 2024-09-03 17:29
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    要解决这个问题,我们可以将任务分解为几个步骤:

    1. 使用System.Diagnostics.Process启动AutoCAD应用程序。
    2. 创建一个线程来处理UDP消息接收,并在其中执行绘图操作。
    3. 在主窗体中实现一个按钮点击事件,当用户单击按钮时,触发发送UDP消息并开始线程。

    首先,我们创建一个自定义类来封装UDP接收功能:

    using System;
    using System.Net.Sockets;
    using System.Threading;
    
    public class UdpMgr
    {
        private Socket socket;
        private NetworkStream networkStream;
        private byte[] buffer = new byte[1024];
    
        public UdpMgr()
        {
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp);
                socket.Bind(new IPEndPoint(IPAddress.Any, 6789)); // UDP端口
                networkStream = socket.CreateStream();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    
        public void RecvMsg()
        {
            while (true)
            {
                int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
                if (bytesRead > 0)
                {
                    string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                    Console.WriteLine($"Received: {message}");
                    Send(message);
                }
            }
        }
    
        private void Send(string message)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(message);
            networkStream.Write(bytes, 0, bytes.Length);
        }
    }
    

    接下来,在主窗体中添加一个按钮,以及一个方法来调用UDP接收线程:

    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
    
            buttonSend.Click += ButtonSend_Click;
        }
    
        private void ButtonSend_Click(object sender, EventArgs e)
        {
            // 发送UDP消息
            UdpMgr udpMgr = new UdpMgr();
            udpMgr.Send("Hello, World!");
        }
    }
    

    现在,让我们将这些组件组合在一起,形成完整的解决方案:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Xml.Serialization;
    using System.Xml;
    using System.Diagnostics;
    
    namespace AutoCAD_CadDrawing
    {
        public partial class MainForm : Form
        {
            private const int PORT_NUMBER = 6789; // 假设这个值是你AutoCAD应用程序的端口号
    
            private UdpMgr _udpMgr;
    
            public MainForm()
            {
                InitializeComponent();
    
                buttonSend.Click += ButtonSend_Click;
            }
    
            private void ButtonSend_Click(object sender, EventArgs e)
            {
                // 发送UDP消息
                UdpMgr udpMgr = new UdpMgr();
                udpMgr.Send("Hello, World!");
    
                // 添加新实体到模型空间
                AddEntityToModelSpace();
            }
    
            private void AddEntityToModelSpace()
            {
                // ...
    
                // 模型空间中的实体对象ID
                ObjectId entId = AddEntityToModelSpace();
                // ...
            }
        }
    }
    

    在这个示例中,我们将AutoCAD应用程序的端口号设置为6789。然后在ButtonSend_Click方法中,我们创建一个新的UdpMgr实例,设置其监听端口,并将其与一个线程绑定。当用户点击按钮时,线程就会运行,发送UDP消息并将实体添加到模型空间。

    注意:这个示例没有包含实际的AutoCAD图形库代码,因为这取决于AutoCAD的具体版本和API。你需要根据实际情况调整相关部分。此外,确保在尝试从AutoCAD获取图形之前正确关闭所有窗口和资源。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月3日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。