找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 772|回复: 2

[求助] 环境搭建问题:请教不通过NETLOAD加载,而是通过WINFORM界面直接操作CAD的方法

[复制链接]
发表于 2017-5-26 16:35:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 yeah188 于 2017-5-26 16:55 编辑

大家好,小弟初来乍到。
最近接触.net二次开发,但在环境搭建上碰到了难题。
碰到的问题:我想通过WINFORM窗口程序,对AutoCAD进行操作。
但是运行期间碰到了如下错误:

出错提示

出错提示

说一下运行环境,本人WIN10 64位系统,AUTOCAD2016,已经添加了对accoremgd.dll、acdbmgd.dll、acmgd.dll和AutoCAD 2016 Type Library的引用。
这些代码我通过传统的创建类库的方式,通过调试acad.exe的方式启动,执行相应命令是能够顺利运行的。但不知为何直接外部调用不可以。
代码如下:
Form1.cs:
  1. namespace AcadConnectionTest
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         public Form1()
  6.         {
  7.             InitializeComponent();
  8.         }

  9.         private void button1_Click(object sender, EventArgs e)
  10.         {
  11.             Class1.ConnectToAcad();
  12.             Class1.DrawingTest();
  13.             Class1.AddNewCircleTransaction();
  14.         }
  15.     }
  16. }



前两个函数都能够正常运行,第三个调用到相关.dll文件之后就不行了,很是费解

Class1.cs://这些都是书上的例子,简单修改的
  1. using AutoCAD;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;


  6. namespace AcadConnectionTest
  7. {
  8.     class Class1
  9.     {
  10.         public static AcadApplication acAppComObj = null;
  11.         public static AcadDocument acDocComObj;
  12.         [CommandMethod("ConnectToAcad")]
  13.         public static void ConnectToAcad()
  14.         {

  15.             const string strProgId = "AutoCAD.Application.20";

  16.             // Get a running instance of AutoCAD
  17.             try
  18.             {
  19.                 acAppComObj = (AcadApplication)Marshal.GetActiveObject(strProgId);
  20.             }
  21.             catch // An error occurs if no instance is running
  22.             {
  23.                 try
  24.                 {
  25.                     // Create a new instance of AutoCAD
  26.                     acAppComObj = (AcadApplication)Activator.CreateInstance(Type.GetTypeFromProgID(strProgId), true);
  27.                 }
  28.                 catch
  29.                 {
  30.                     // If an instance of AutoCAD is not created then message and exit
  31.                     System.Windows.Forms.MessageBox.Show("Instance of 'AutoCAD.Application'" +
  32.                                                          " could not be created.");

  33.                     return;
  34.                 }
  35.             }

  36.             // Display the application and return the name and version
  37.             acAppComObj.Visible = true;
  38.             System.Windows.Forms.MessageBox.Show("Now running " + acAppComObj.Name + " version " + acAppComObj.Version);



  39.         }

  40.         public static void DrawingTest()
  41.         {
  42.             // Get the active document
  43.             acDocComObj = acAppComObj.ActiveDocument;
  44.             double[] startPoint = new double[3] { 0, 0, 0 };                //声明直线起点坐标
  45.             double[] endPoint = new double[3] { 300, 200, 0 };              //声明直线终点坐标
  46.             acDocComObj.ModelSpace.AddLine(startPoint, endPoint);
  47.         }

  48.         public static void AddNewCircleTransaction()
  49.         {
  50.             // 获得当前文档和数据库   Get the current document and database
  51.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  52.             Database acCurDb = acDoc.Database;

  53.             // 启动一个事务  Start a transaction
  54.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  55.             {
  56.                 // 以只读方式打开块表   Open the Block table for read
  57.                 BlockTable acBlkTbl;
  58.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  59.                                              OpenMode.ForRead) as BlockTable;

  60.                 // 以写方式打开模型空间块表记录   Open the Block table record Model space for write
  61.                 BlockTableRecord acBlkTblRec;
  62.                 acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  63.                                                 OpenMode.ForWrite) as BlockTableRecord;

  64.                 // 创建一个半径为3圆心在5,5的圆    Create a circle with a radius of 3 at 5,5
  65.                 Circle acCirc = new Circle();
  66.                 acCirc.SetDatabaseDefaults();
  67.                 acCirc.Center = new Point3d(5, 5, 0);
  68.                 acCirc.Radius = 3;

  69.                 // 添加新对象到模型空间和事务中   Add the new object to Model space and the transaction
  70.                 acBlkTblRec.AppendEntity(acCirc);
  71.                 acTrans.AddNewlyCreatedDBObject(acCirc, true);

  72.                 // 提交修改并销毁事务  Commit the changes and dispose of the transaction
  73.                 acTrans.Commit();
  74.             }
  75.         }

  76.     }
  77. }



求好心人解答,谢谢了!

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-5-26 19:54:14 | 显示全部楼层
操作ACAD不是这样用的,如果你在外部用Form,就是通过 ActiveX 操作,
你这里用的那些是在Acad内部用的方法,CommandMethod 是定义Acad内部命令
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-27 09:33:20 | 显示全部楼层

原来如此,那我赶紧查查ActiveX方面的资料,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 21:24 , Processed in 0.405862 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表