zoukankan      html  css  js  c++  java
  • 两种方法在.Net中调用AutoCAD中的命令

    1.using wrapper RunCommand:

    using System;
    using System.Linq.Expressions;
    using System.Reflection;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Geometry;
    using Autodesk.AutoCAD.Runtime;
    using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
    
    namespace RevisionCloud
    {
        public class UsingRunCommand
        {
            [CommandMethod("CLOUD1")]
            public void Cloud()
            {
                Document doc = AcAp.DocumentManager.MdiActiveDocument;
                Database db = doc.Database;
                Editor ed = doc.Editor;
    
                PromptPointResult ppr = ed.GetPoint("
    Specify the first corner: ");
                if (ppr.Status != PromptStatus.OK) return;
                Point3d pt1 = ppr.Value;
    
                ppr = ed.GetCorner("
    Specify the opposite corner: ", pt1);
                if (ppr.Status != PromptStatus.OK) return;
                Point3d pt2 = ppr.Value;
    
                ObjectId id = DrawRectangle(db, pt1, pt2);
                ed.Command("_revcloud", "_arc", 2.0, 6.0, "_object", id, "_no");
            }
    
            private static ObjectId DrawRectangle(Database db, Point3d pt1, Point3d pt2)
            {
                ObjectId id;
                using (Transaction tr = db.TransactionManager.StartTransaction())
                using (Polyline pline = new Polyline(4))
                {
                    pline.AddVertexAt(0, new Point2d(pt1.X, pt1.Y), 0.0, 0.0, 0.0);
                    pline.AddVertexAt(1, new Point2d(pt2.X, pt1.Y), 0.0, 0.0, 0.0);
                    pline.AddVertexAt(2, new Point2d(pt2.X, pt2.Y), 0.0, 0.0, 0.0);
                    pline.AddVertexAt(3, new Point2d(pt1.X, pt2.Y), 0.0, 0.0, 0.0);
                    pline.Closed = true;
                    BlockTableRecord space =
                        (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                    id = space.AppendEntity(pline);
                    tr.AddNewlyCreatedDBObject(pline, true);
                    tr.Commit();
                }
                return id;
            }
        }
    
        public static class Extension
        {
            public static PromptStatus Command(this Editor ed, params object[] args)
            {
                if (ed == null)
                    throw new ArgumentNullException("ed");
                return runCommand(ed, args);
            }
    
            static Func<Editor, object[], PromptStatus> runCommand = GenerateRunCommand();
    
            static Func<Editor, object[], PromptStatus> GenerateRunCommand()
            {
                MethodInfo method = typeof(Editor).GetMethod(
                    "RunCommand", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                ParameterExpression instance = Expression.Parameter(typeof(Editor), "ed");
                ParameterExpression args = Expression.Parameter(typeof(object[]), "args");
                return Expression.Lambda<Func<Editor, object[], PromptStatus>>(
                   Expression.Call(instance, method, args), instance, args)
                      .Compile();
            }
        }
    }

    2.using acedcommand:

    using System;
    using System.Runtime.InteropServices;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Geometry;
    using Autodesk.AutoCAD.Runtime;
    using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
    
    namespace RevisionCloud
    {
        public class UsingAcedCommand
        {
            [CommandMethod("CLOUD2")]
            public static void Cloud2()
            {
                Document doc = AcAp.DocumentManager.MdiActiveDocument;
                Database db = doc.Database;
                Editor ed = doc.Editor;
    
                PromptPointResult ppr = ed.GetPoint("
    Specify the first corner: ");
                if (ppr.Status != PromptStatus.OK) return;
                Point3d pt1 = ppr.Value;
    
                ppr = ed.GetCorner("
    Specify the opposite corner: ", pt1);
                if (ppr.Status != PromptStatus.OK) return;
                Point3d pt2 = ppr.Value;
    
                ObjectId id = DrawRectangle(db, pt1, pt2);
                DrawRevCloud(id, 1.0);
            }
    
            [System.Security.SuppressUnmanagedCodeSecurity]
            [DllImport("accore.dll", EntryPoint = "acedCmd", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
            extern static private int acedCmd(IntPtr resbuf);
    
            private static ObjectId DrawRectangle(Database db, Point3d pt1, Point3d pt2)
            {
                ObjectId id;
                using (Transaction tr = db.TransactionManager.StartTransaction())
                using (Polyline pline = new Polyline(4))
                {
                    pline.AddVertexAt(0, new Point2d(pt1.X, pt1.Y), 0.0, 0.0, 0.0);
                    pline.AddVertexAt(1, new Point2d(pt2.X, pt1.Y), 0.0, 0.0, 0.0);
                    pline.AddVertexAt(2, new Point2d(pt2.X, pt2.Y), 0.0, 0.0, 0.0);
                    pline.AddVertexAt(3, new Point2d(pt1.X, pt2.Y), 0.0, 0.0, 0.0);
                    pline.Closed = true;
                    BlockTableRecord space =
                        (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                    id = space.AppendEntity(pline);
                    tr.AddNewlyCreatedDBObject(pline, true);
                    tr.Commit();
                }
                return id;
            }
    
            private static void DrawRevCloud(ObjectId id, double scale)
            {
                ResultBuffer args = new ResultBuffer(
                    new TypedValue((int)LispDataType.Text, "_revcloud"),
                    new TypedValue((int)LispDataType.Text, "_arc"),
                    new TypedValue((int)LispDataType.Double, 2.0 / scale),
                    new TypedValue((int)LispDataType.Double, 6.0 / scale),
                    new TypedValue((int)LispDataType.Text, "_object"),
                    new TypedValue((int)LispDataType.ObjectId, id),
                    new TypedValue((int)LispDataType.Text, "_no"));
                acedCmd(args.UnmanagedObject);
            }
        }
    }
    

      

  • 相关阅读:
    4.Windows下安装ZooKeeper
    3. ZAB与Paxos算法的联系与区别。
    2. ZooKeeper的ZAB协议。
    1. 初识ZooKeeper。
    27. Spring Boot 部署与服务配置
    26.SpringBoot事务注解详解
    25.Spring @Transactional工作原理
    24. Spring Boot 事务的使用
    罗辑思维CEO李天田:我们是这样玩儿公司的
    mysql中char,varchar与text类型的区别和选用
  • 原文地址:https://www.cnblogs.com/swtool/p/SWTOOL_00012.html
Copyright © 2011-2022 走看看