CAD二次开发(5)-用户交互仿系统命令

news2024/11/16 1:49:53

在这里插入图片描述

在这里插入图片描述

1. 工具类:PromptTool.cs

using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _04用户交互
{
    public static partial class PromptTool
    {
        /// <summary>
        /// 获取点
        /// </summary>
        /// <param name="ed">命令和对象</param>
        /// <param name="promptStr">提示信息</param>
        /// <returns>PromptPointResult</returns>
        public static PromptPointResult GetPoint2(this Editor ed, string promptStr)
        {
            //声明一个获取点的提示类
            PromptPointOptions ppo = new PromptPointOptions(promptStr);
            //使回车和空格键有效
            ppo.AllowNone = true;
            return  ed.GetPoint(ppo);
        }
        /// <summary>
        /// 获取点或关键字
        /// </summary>
        /// <param name="ed">命令行</param>
        /// <param name="promptStr">提示显示</param>
        /// <param name="pointBase">基准点</param>
        /// <param name="keyWord">关键字</param>
        /// <returns>PromptPointResult</returns>
        public static PromptPointResult GetPoint(this Editor ed, string promptStr, Point3d pointBase, params string[] keyWord)
        {
            //声明一个获取点的提示类
            PromptPointOptions ppo = new PromptPointOptions(promptStr);
            //使回车和空格键有效
            ppo.AllowNone = true;
            //添加字符,使得相应的字符按键有效
            for (int i = 0; i < keyWord.Length; i++)
            {
                ppo.Keywords.Add(keyWord[i]);
            }
            //取消系统自动的关键字显示
            ppo.AppendKeywordsToMessage = false;
            //设置基准点
            ppo.BasePoint = pointBase;
            ppo.UseBasePoint = true;
            ppo.UseDashedLine = false;
            return ed.GetPoint(ppo);
        }
    }
}

2. Demo测试

 [CommandMethod("PromptDemo")]
 public void PromptDemo()
 {
     Database db = HostApplicationServices.WorkingDatabase;
     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
     //PromptPointResult ppr =  ed.GetPoint("\n请选择一个点:");
     //if (ppr.Status == PromptStatus.OK)
     //{
     //    Point3d p1 = ppr.Value;
     //    ppr = ed.GetPoint("\n请选择第二个个点:");
     //    if (ppr.Status == PromptStatus.OK)
     //    {
     //        Point3d p2 = ppr.Value;
     //        db.AddLineToModelSpace(p1, p2);
     //    }
     //}
     Point3d p1 = new Point3d(0, 0, 0);
     Point3d p2 = new Point3d();
     PromptPointOptions ppo = new PromptPointOptions("请指定第一个点:");
     ppo.AllowNone = true;
     PromptPointResult ppr = GetPoint(ppo);
     
     if (ppr.Status == PromptStatus.Cancel) return;
    
     if (ppr.Status == PromptStatus.OK) p1 = ppr.Value;
     ppo.Message = "请指定第二个点";
     ppo.BasePoint = p1;
     ppo.UseBasePoint = true;
     ppr = GetPoint(ppo);
     if (ppr.Status == PromptStatus.Cancel) return;
     if (ppr.Status == PromptStatus.None) return;
     if (ppr.Status == PromptStatus.OK) p2 = ppr.Value;
     db.AddLineToModelSpace(p1, p2);
 }

 private PromptPointResult GetPoint(PromptPointOptions ppo)
 {
     
     ppo.AllowNone = true;
     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
     return ed.GetPoint(ppo);

 }

3. 仿系统直线命令

3.1 拖曳类的引入

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _04用户交互
{
    public  class LineJig:EntityJig
    {
        private Point3d jStartPoint; //直线的起点
        private Point3d jEndPoint; //直线的终点
        private string jPromtStr; //提示信息
        private string[] jKeywords; //交互关键字
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="startPoint">起点</param>
        /// <param name="promtStr">提示信息</param>
        /// <param name="keywords">交互关键字</param>
        public LineJig(Point3d startPoint, string promtStr, string[] keywords)
            : base(new Line())
        {
            jStartPoint = startPoint;
            ((Line)Entity).StartPoint = jStartPoint;
            jPromtStr = promtStr;
            jKeywords = keywords;
        }
        protected override bool Update()
        {
            ((Line)Entity).EndPoint = jEndPoint;
            return true;
        }

        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            //声明提示信息类
            JigPromptPointOptions jppo = new JigPromptPointOptions(jPromtStr);
            //添加关键字
            for (int i = 0; i < jKeywords.Length; i++)
			{
                jppo.Keywords.Add(jKeywords[i]);

			}
            char space = (char)32;
            jppo.Keywords.Add(space.ToString());
            //设置获取的信息类型
            jppo.UserInputControls = UserInputControls.Accept3dCoordinates;
            //取消系统自动添加的关键字提示信息
            jppo.AppendKeywordsToMessage = false;
            PromptPointResult pr = prompts.AcquirePoint(jppo);
            jEndPoint = pr.Value;
            return SamplerStatus.NoChange;
        }
        /// <summary>
        /// 返回图形对象
        /// </summary>
        /// <returns>Entity</returns>
        public Entity GetEntity()
        {
            return Entity;
        }
    }
}

3.2 测试实现

[CommandMethod("FangLine")]
public void FangLine()
{
    Database db = HostApplicationServices.WorkingDatabase;
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    //声明一个直线的集合对象
    List<ObjectId> lineList = new List<ObjectId>();
    //声明一个预备的对象
    Point3d pointStart = new Point3d(100, 100, 0);
    Point3d pointPre = new Point3d(100, 100, 0);
    PromptPointResult ppr = ed.GetPoint2("\n 指定第一个点:");
    if (ppr.Status == PromptStatus.Cancel) return;
    if (ppr.Status == PromptStatus.None) pointPre = pointStart;
    if (ppr.Status == PromptStatus.OK) 
    {
        pointStart = ppr.Value;
        pointPre = pointStart;
    }
    //判断循环是否继续
    bool isC = true;
    while (isC)
    {
        if (lineList.Count > 1)
        {
             ppr = ed.GetPoint("\n 指定下一点或 [闭合(C)/放弃(U)]:", pointPre, new string[] { "C","U" });
        }
        else
        {
            ppr = ed.GetPoint("\n 指定下一点或 [放弃(U)]", pointPre, new string[] { "U" });
        }
        
        Point3d pointNext;
        if (ppr.Status == PromptStatus.Cancel) return;
        if (ppr.Status == PromptStatus.None) return;
        if (ppr.Status == PromptStatus.OK)
        {
            pointNext = ppr.Value;
            lineList.Add(db.AddLineToModelSpace(pointPre, pointNext));
            pointPre = pointNext;
        }
        if (ppr.Status == PromptStatus.Keyword)
        {
            switch (ppr.StringResult)
            {
                case "U":
                    if (lineList.Count == 0)
                    {
                         pointStart = new Point3d(100, 100, 0);
                         pointPre = new Point3d(100, 100, 0);
                         ppr = ed.GetPoint2("\n 指定第一个点:");
                         if (ppr.Status == PromptStatus.Cancel) return;
                         if (ppr.Status == PromptStatus.None) pointPre = pointStart;
                         if (ppr.Status == PromptStatus.OK)
                         {
                             pointStart = ppr.Value;
                             pointPre = pointStart;
                         }
                    }
                    else if (lineList.Count > 0)
                    {
                        int count = lineList.Count;
                        ObjectId lId = lineList.ElementAt(count-1);
                        pointPre = this.GetLineStartPoint(lId);
                        lineList.RemoveAt(count-1);
                        lId.EraseEntity();
                    }
                    break;
                case "C":
                   lineList.Add( db.AddLineToModelSpace(pointPre, pointStart));
                   isC = false;
                   break;
            }
        }
    }
    
}

[CommandMethod("FangLine2")]
public void FangLine2()
{
    Database db = HostApplicationServices.WorkingDatabase;
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    //声明一个直线的集合对象
    List<ObjectId> lineList = new List<ObjectId>();
    //声明一个预备的对象
    Point3d pointStart = new Point3d(100, 100, 0);
    Point3d pointPre = new Point3d(100, 100, 0);
    PromptPointResult ppr = ed.GetPoint2("\n 指定第一个点:");
    if (ppr.Status == PromptStatus.Cancel) return;
    if (ppr.Status == PromptStatus.None) pointPre = pointStart;
    if (ppr.Status == PromptStatus.OK)
    {
        pointStart = ppr.Value;
        pointPre = pointStart;
    }
    LineJig lineJig;
    PromptResult pr;
    //判断循环是否继续
    bool isC = true;
    while (isC)
    {
        if (lineList.Count > 1)
        {
           
            lineJig = new LineJig(pointPre, "\n 指定下一点或 [闭合(C)/放弃(U)]:", new string[] { "C", "U" });
            pr = ed.Drag(lineJig);
        }
        else
        {
           
            lineJig = new LineJig(pointPre, "\n 指定下一点或 [放弃(U)]", new string[] { "U" });
            pr = ed.Drag(lineJig);

        }
        if (pr.Status == PromptStatus.Cancel) return;
        if (pr.Status == PromptStatus.None) return;
        if (pr.Status == PromptStatus.OK)
        {
            Line line = (Line)lineJig.GetEntity();
            pointPre = line.EndPoint;
            lineList.Add(db.AddEnityToModelSpace(line));
        }
        if (pr.Status == PromptStatus.Keyword)
        {
            switch (pr.StringResult)
            {
                case "U":
                    if (lineList.Count == 0)
                    {
                        pointStart = new Point3d(100, 100, 0);
                        pointPre = new Point3d(100, 100, 0);
                        ppr = ed.GetPoint2("\n 指定第一个点:");
                        if (ppr.Status == PromptStatus.Cancel) return;
                        if (ppr.Status == PromptStatus.None) pointPre = pointStart;
                        if (ppr.Status == PromptStatus.OK)
                        {
                            pointStart = ppr.Value;
                            pointPre = pointStart;
                        }
                    }
                    else if (lineList.Count > 0)
                    {
                        int count = lineList.Count;
                        ObjectId lId = lineList.ElementAt(count - 1);
                        pointPre = this.GetLineStartPoint(lId);
                        lineList.RemoveAt(count - 1);
                        lId.EraseEntity();
                    }
                    break;
                case "C":
                    lineList.Add(db.AddLineToModelSpace(pointPre, pointStart));
                    isC = false;
                    break;
                case  " ":
                    isC = false;
                    break;
            }
        }
    }

}

 /// <summary>
 /// 获得直线的起点坐标
 /// </summary>
 /// <param name="lineId">直线对象的ObjectId</param>
 /// <returns></returns>
 private Point3d GetLineStartPoint(ObjectId lineId)
 {
     Point3d startPoint;
     Database db = HostApplicationServices.WorkingDatabase;
     using (Transaction trans = db.TransactionManager.StartTransaction())
     {
         Line line = (Line)lineId.GetObject(OpenMode.ForRead);
         startPoint = line.StartPoint;
     }
     return startPoint;
 }

4. 仿系统圆命令

4.1 拖曳类的引入

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AcDotNetTool;
namespace _04用户交互
{
    public  class CircleJig:EntityJig
    {
        
        private double jRadius;
        public CircleJig(Point3d center)
            : base(new Circle())
        {
            ((Circle)Entity).Center = center;
        }
        //用于更新图形对象,这个更新属性是不需要使用事务处理
        protected override bool Update()
        {
            //动态更新园的半径
            if (jRadius > 0)
            {
                ((Circle)Entity).Radius = jRadius;
            }
            
            return true;
        }
        //这个函数的作用是当鼠标在屏幕上移动时,就会被调用,实现这个函数时,一般是用它改变的门图形的属性(我们在这个类里定义的属性)
        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            //声明jig提示信息
            JigPromptPointOptions jppo = new JigPromptPointOptions("\n 请指定园上的一个点");
            char space = (char)32; 
            jppo.Keywords.Add("U");
            jppo.Keywords.Add(space.ToString());
            jppo.UserInputControls = UserInputControls.Accept3dCoordinates;
            jppo.Cursor = CursorType.RubberBand;
            jppo.BasePoint = ((Circle)Entity).Center;
            jppo.UseBasePoint = true;
            
            //获取拖拽时鼠标的位置状态
            PromptPointResult ppr =  prompts.AcquirePoint(jppo);
            jRadius = ppr.Value.GetDistanceBetweenTwoPoint(((Circle)Entity).Center);
            return SamplerStatus.NoChange;
            
        }
        public Entity GetEntity()
        {
            return Entity;
        }
    }
}

4.2 测试实现

[CommandMethod("CircleDemo")]
public void CircleDemo()
{
    Database db = HostApplicationServices.WorkingDatabase;
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    Point3d center = new Point3d();
    //double radius = 0;
    PromptPointResult ppr = ed.GetPoint("\n 请制定圆心:");
    if (ppr.Status == PromptStatus.OK)
    {
        center = ppr.Value;
    }
    #region
    //PromptDistanceOptions pdo = new PromptDistanceOptions("\n 请指定圆上的一点:");
    //pdo.BasePoint = center;
    //pdo.UseBasePoint = true;

    //PromptDoubleResult pdr = ed.GetDistance(pdo);
    //if (pdr.Status == PromptStatus.OK)
    //{
    //    radius = pdr.Value;
    //}
    //db.AddCircleModelSpace(center, radius);
    #endregion

    CircleJig jCircle = new CircleJig(center);
    //PromptPointResult pr = (PromptPointResult)ed.Drag(jCircle);
    //if (pr.Status == PromptStatus.OK)
    //{
    //    Point3d pt = pr.Value;
    //    db.AddCircleModelSpace(center, pt.GetDistanceBetweenTwoPoint(center));
    //}
    PromptResult pr = ed.Drag(jCircle);
    if (pr.Status == PromptStatus.OK)
    {
        db.AddEnityToModelSpace( jCircle.GetEntity());
    }
}

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

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

相关文章

总是等不是办法,向媒体投稿你得学会用新方法

初入信息宣传领域,我怀揣着对文字的热爱与传播价值的热情,肩负起了单位活动的宣传报道重任。那时的我,满脑子都是传统的投稿思维:精心撰写每一篇稿件,然后逐一搜寻各大媒体的投稿邮箱,一封封邮件满怀期待地发出,像播撒希望的种子,渴望在广袤的媒体土壤中生根发芽。然而,理想很丰…

返回枚举类给前端

1. 前言 在实际开发过程中&#xff0c;前端的下拉框或者单选按钮的内容通常的需要和后端匹配的&#xff0c;故一般会由后端将下拉框的内容或单选框的内容传给前端&#xff0c;而这些内容在后端一般是由枚举类存储的&#xff0c;如果后端直接返回枚举类&#xff0c;返回结果将会…

基于门控的循环神经网络:GRU

门控循环单元&#xff08;GatedRecurrentUnit&#xff0c;GRU&#xff09;网络&#xff0c;也是一种基于门控的循环神经网络&#xff0c;但是名气不如LSTM大&#xff0c;GRU是对LSTM的一种改版&#xff0c;可以理解为是LSTM的简化版。LSTM有三个门&#xff0c;输入门&#xff0…

大模型应用:基于Golang实现GPT模型API调用

1.背景 当前OpenAI提供了开放接口&#xff0c;支持通过api的方式调用LLM进行文本推理、图片生成等能力&#xff0c;但目前官方只提供了Python SDK。为了后续更方便集成和应用&#xff0c;可以采用Golang对核心推理调用接口进行封装&#xff0c;提供模型调用能力。 2.相关准备…

Python基于PyQt6制作GUI界面——按钮

示例对应的制作的 ui文件 界面如下所示。 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Form</class><widget class"QWidget" name"Form"><property name"geom…

探索python字典:遍历与访问的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、获取字典的键与值 1. 获取字典的键 2. 获取字典的值 二、遍历字典的键值对 1. 使用 …

I2C SPI UART TCP/UDP AD/DA PWM大总结

I2C SPI UART TCP/UDP AD/DA PWM大总结 1. I2C总线描述1.1 基础协议内容1.1.1 通信时序1.1.2 一般通讯时序1.1.3 Burst模式 2. SPI总线2.1 基础协议内容 3. UART4. TCP/UDP5. AD/DA5.1 AD的原理5.2 DA的原理 6. PWM 1. I2C总线描述 I2C的特点&#xff1a;半双工&#xff0c;同步…

X2Doris使用指南:界面化数据迁移工具 - 轻松实现整库迁移至Doris

什么是X2Doris X2Doris 是 SelectDB 团队开发的&#xff0c;专门用于将各种离线数据迁移到 Apache Doris 中的核心工具&#xff0c;该工具集 自动建 Doris 表 和 数据迁移 为一体&#xff0c;目前支持了 Apache Doris/Hive/Kudu/StarRocks 数据库往 Doris 或 SelectDB Cloud 迁…

如何查看热门GPT应用?

1、登陆chatgpt 2、访问 https://chatgpt.com/gpts 3、在该界面&#xff0c;可以搜索并使用image generator, Write For Me&#xff0c;Language Teature等热门应用。

【实战JVM】-基础篇-03-Java内存结构

【实战JVM】-基础篇-03-Java内存结构 1 运行时数据区1.1 总览1.2 程序计数器1.2.1 是否会内存溢出 1.3 java虚拟机栈1.3.1 栈帧的组成1.3.1.1 局部变量表1.3.1.2 操作数栈1.3.1.3 帧数据1.3.1.3.1 动态链接1.3.1.3.2 方法出口1.3.1.3.3 异常表 1.3.2 是否会内存溢出1.3.3 设置虚…

代码随想录算法训练营第三十六天 | 1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

目录 1005.K次取反后最大化的数组和 思路 代码 代码 134.加油站 思路 代码 135.分发糖果 思路 代码 1005.K次取反后最大化的数组和 本题简单一些&#xff0c;估计大家不用想着贪心 &#xff0c;用自己直觉也会有思路。 代码随想录 思路 直觉&#xff0c;直接写&…

基于YOLOv8的车牌检测与识别(CCPD2020数据集)

前言 本篇博客主要记录在autodl服务器中基于yolov8实现车牌检测与识别&#xff0c;以下记录实现全过程~ yolov8源码&#xff1a;GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > OpenVINO > CoreML > TFLite 一、环境配置 …

粤嵌—2024/5/20—三角形最小路径和(✔)

代码实现&#xff1a; int minimumTotal(int **triangle, int triangleSize, int *triangleColSize) {if (triangleSize 1) {return triangle[0][0];}for (int i 1; i < triangleSize; i) {for (int j 0; j < triangleColSize[i]; j) {int x i - 1;int y1 j - 1, y2…

[JDK工具-5] jinfo jvm配置信息工具

文章目录 1. 介绍2. 打印所有的jvm标志信息 jinfo -flags pid3. 打印指定的jvm参数信息 jinfo -flag InitialHeapSize pid4. 启用或者禁用指定的jvm参数 jinfo -flags [|-]HeapDumpOnOutOfMemoryError pid5. 打印系统参数信息 jinfo -sysprops pid6. 打印以上所有配置信息 jinf…

LDAP: error code 32 - No Such Object

目前我的项目版本&#xff1a; Spring版本:5.3.15SpringBoot版本:2.6.3 完整错误 org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - No Such Object]; nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Objec…

多环境和前后多环境实战

文章目录 一.多环境1.1 什么是多环境1.2 多环境分类1.2.1 本地环境&#xff08;自己的电脑&#xff09;1.2.2 开发环境&#xff08;远程开发&#xff09;1.2.3 测试环境1.2.4 预发布环境1.2.5 正式环境1.2.6 沙箱环境&#xff08;实验环境&#xff09; 1.3 如何实现1.3.1 抽象配…

Git--本地仓库

文章目录 工作区和暂存区工作区&#xff08;Working Directory&#xff09;版本库&#xff08;Repository&#xff09; 初始化git仓库添加文件到版本库步骤 查看修改内容查看工作区和暂存区状态已add文件已修改/新增 的未add文件git跟踪修改原理 查看提交历史版本回退撤销修改撤…

C++/ cuda kernel中的模版元编程识别 kernel 模版的数据类型

1&#xff0c;模版元编程 模板元编程是一种利用 C 模板系统在编译时进行计算和生成代码的技术。其原理基于模板特化、递归、模板参数推导等特性&#xff0c;通过模板实例化和展开&#xff0c;在编译时生成代码&#xff0c;以实现在编译期间进行复杂计算和代码生成的目的。 2&am…

化学中的不确定性。

化学中的不确定性TOC 基于元素分析的无机化学的理论大厦应该说早已落成了&#xff0c;但是却仍然存在着一些列的难解甚至是无解问题&#xff0c;这些大多是在使用理论解释现象时遇到的困难&#xff0c;有些则是在生产实践中生产工艺和生产工序设计和优化中发现的问题。于是&…

音视频开发8 音视频中SDL的使用,SDL 在windows上环境搭建,SDL 使用 以及 常用 API说明,show YUV and play PCM

1.SDL简介 SDL&#xff08;Simple DirectMedia Layer&#xff09;&#xff0c;是一个跨平台的C语言多媒体开发库。 支持Windows、Mac OS X、Linux、iOS、Android 提供对音频、键盘、鼠标、游戏操纵杆、图形硬件的底层访问 很多的视频播放软件、模拟器、受欢迎的游戏都在使用…