我正在尝试以编程方式将预先存在的绘图中的块插入到运行插件的当前绘图中.为此,我在C#.NET表单上有一个按钮,调用以下方法
public void MakeAndInsertObject() //Method to add all windows and doors templates to drawing database for use later
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; //Stores the active document
Editor ed = doc.Editor; //Stores the document's editor
Database dtb = ed.Document.Database; //Stores the database from the editor
Transaction tr = dtb.TransactionManager.StartTransaction(); //Start a transaction with the document's database
DocumentLock docLock = doc.LockDocument();
using (tr)
using (docLock)
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(dtb.CurrentSpaceId, OpenMode.ForWrite); //Opens the block table record so you can write to …Run Code Online (Sandbox Code Playgroud) 编辑器类有一个名为GetString的方法,它通过AutoCAD的命令提示符提示用户输入字符串值.我在这个包装器方法中调用它:
public static string PromptUserForString(string message = "Enter a string: ", string defaultAnswer = "")
{
return _editor.GetString("\n" + message).StringResult;
}
Run Code Online (Sandbox Code Playgroud)
参数消息成为用户在提示输入字符串时看到的消息.如何设置它以使默认答案的值自动设置为答案,以便如果用户立即进入,则会变为如下面的屏幕截图中的值

因此,1会自动输入为答案,这意味着用户可以按Enter键输入值1或将1更改为他们想要的任何非默认答案
我正在尝试编写两种调用AutoCAD的UNDO命令并传入不同参数的方法.第一种方法调用UNDO并传递M,这意味着标记绘图的位置.第二种方法调用UNDO并传递B,这意味着一直撤回到标记位置(如果没有,则返回结束).到目前为止,它们非常简单
/// <summary>
/// Method to mark the current position of the AutoCAD program
/// </summary>
public static void MarkPosition()
{
doc.SendStringToExecute("._UNDO M", true, false, true);
}
/// <summary>
/// Method to step AutoCAD back int steps
/// </summary>
public static void BigUndo()
{
doc.SendStringToExecute("._UNDO B", true, false, true);
}
Run Code Online (Sandbox Code Playgroud)
看起来他们应该工作,但由于某种原因,他们没有.当我调用MarkPosition()然后调用BigUndo()时,我得到一个错误,说遇到了Start of Group; 进入撤消结束以进一步返回.测试我的语法.我将MarkPosition改为
public static void MarkPosition()
{
doc.SendStringToExecute("circle 2,2,0 4 ", true, false, true);
}
Run Code Online (Sandbox Code Playgroud)
成功画了一个圆圈.这意味着我的语法是正确的,但撤消会发生一些奇怪的事情.
我正在尝试找到一种方法,可以将C#类作为XRecord存储到AutoCAD实体中.例如,我有以下类:
public class ExampleClass
{
private int x;
private int y;
public ExampleClass(int x, int y)
{
this.x = x;
this.y = y;
}
#region Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个它的实例:
ExampleClass objToStoreInXRecord = new ExampleClass(3, 5);
Run Code Online (Sandbox Code Playgroud)
将它存储到AutoCAD实体(例如图中的一行)XRecord的最佳方法是什么,这样我就可以这样做:
ExampleClass objRecoveredFromXRecord = GetXRecordFromEntity(Entity e)
Run Code Online (Sandbox Code Playgroud)
其中GetXRecordFromEntity(Entity e)是一个帮助器方法,我可以编写一个实体e,获取我之前存储的对象的XRecord,然后返回它.
我对XRecord的工作原理以及XRecord与AutoCAD的命名对象字典(NOD)的关系并没有很好的处理.我已经看到了实现,其中要存储在XRecord中的对象使用二进制格式化程序进行序列化,并且序列化数据存储在实体的XRecord中,但我正在寻找更好的方法.
在我的 Autocad.NET 应用程序中,我想使用 log4net 记录所有未处理的异常。AutoCAD 本身会显示一个错误对话框,其中包含详细消息 -> 因此必须有一种方法来注册特定事件。
我尝试AppDomain.CurrentDomain.UnhandledException在应用程序初始化时注册事件:
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
System.Exception exception = (System.Exception)e.ExceptionObject;
log.Error(String.Format("Unhandled Exception: {0}\n{1}", exception.Message, exception.StackTrace));
};
Run Code Online (Sandbox Code Playgroud)
但此事件从未被触发。
我正在制作一个Autocad Plugin运行良好的使用Windows Forms
而且我创建了一个user control (winforms)以我喜欢的任何形式复制.
问题是
从控件的代码中,我如何获得运行该控件的应用程序实例?
(可能是纯粹的winforms问题)
Coditions:
在插件中,我可以毫无问题地获得Autocad Application实例.
此用户控件意味着要在separate assembly (dll)插件应用程序中引用,因此它无法直接访问应用程序实例.
关于场景的一点解释:
有一个Main Assembly由Autocad作为插件运行.该程序集实例化了Autocad应用程序.
现在我有一些有用的表单控件来使用Autocad,它们在一个separate assembly.(那是因为我想在我喜欢的许多不同的插件中使用它们).
因此,Autocad运行main assembly并main assembly运行控件separate assembly.
为了正常工作,这些控件需要访问正在运行的Autocad应用程序main assembly.
今天我使用应用程序作为控件中的属性,我必须在使用它们之前设置它.(如果我忘记设置,则会引发异常).因为我无法控制创建者参加参赛者.
我希望控件检测其正在运行的应用程序,以便我避免这种解决方法.
我正在尝试创建一些代码,可以将类库序列化和反序列化为AutoCAD绘图.这个问题与AutoCAD没什么关系,除了它是我无法通过正常方式调试它的原因.我从这篇文章开始这个项目并成功运行了他的代码.然而,他的代码的结构方式,需要我让我的所有类继承自他的基础对象.因为这显然是代码味道,我知道我需要创建一个界面.下面是我最终得到的代码.
第一部分是负责序列化到AutoCAD绘图中的代码.
第二部分是实现我的自定义序列化接口的类的示例
public class Commands
{
public class MyUtil
{
const int kMaxChunkSize = 127;
public ResultBuffer StreamToResBuf(MemoryStream ms, string appName)
{
ResultBuffer resBuf = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
for (int i = 0; i < ms.Length; i += kMaxChunkSize)
{
int length = (int)Math.Min(ms.Length - i, kMaxChunkSize);
byte[] datachunk = new byte[length];
ms.Read(datachunk, 0, length);
resBuf.Add(new TypedValue((int)DxfCode.ExtendedDataBinaryChunk, datachunk));
}
return resBuf;
}
public MemoryStream ResBufToStream(ResultBuffer resBuf)
{
MemoryStream ms = new MemoryStream();
TypedValue[] values = resBuf.AsArray(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过实体框架使用类似于此的连接字符串连接到 Azure SQL 数据库:
Data Source=<server>.database.windows.net;Authentication=Active Directory Integrated;Initial Catalog=<database>
连接尝试是在 AutoCAD 2018 中运行的托管 WPF 表单的上下文中进行的。该项目是使用 .NET Framework 4.6 和 EF 6.1.3 构建的。
我遇到以下错误:
Unable to load adalsql.dll (Authentication=ActiveDirectoryIntegrated). Error code: 0x2. For more information, see http://go.microsoft.com/fwlink/?LinkID=513072
不幸的是,帮助链接没有指向提供此问题技术细节的页面。到目前为止,我还没有在网络上发现任何阐明根本原因的内容。
我也试过这个连接字符串:
Server=tcp:<server>.database.windows.net,1433;Initial Catalog=<database>;Persist Security Info=False;User ID=<username>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication="Active Directory Integrated"
它是从 Azure 门户的ADO.NET (Active Directory integrated authentication)部分复制而来的。但是,使用此连接字符串,我收到以下错误Cannot use 'Authentication=Active Directory Integrated' with 'User ID', 'UID', 'Password' or 'PWD' connection string keywords
但它不包含密码段。删除该User ID段后,我仍然收到Unable to load adalsql.dll ...错误消息。
我正在开发一个 Autocad .NET 插件(.dll通过加载NETLOAD),我使用了很多Document.Editor对象来获取用户输入,比如字符串、数字、点和实体。
我希望我的一些提示显示几个选项供用户选择(与本机-DWGUNITS命令完全一样)。
显示提示和选项非常好(我使用的是Editor.GetInteger,传递带有选项的多行消息,有时还有一两个关键字)。
但我无法弄清楚如何展开命令栏以使其显示所有选项(否则用户必须手动展开它才能查看列表)
所以,这是我目前的命令(蓝色的私人内容):
选项仅限于这三行(更改CLIPROMPTLINES似乎不是最好的选择,但如果您知道如何使用.NET,这是一个好的开始)。

.
这就是我想要的:
我的任务是将AutoCAD插件从VBA翻译成VB.NET,我现在有点卡住了.
我正在处理的命令创建一个新层(或者如果它已经存在则选择它作为活动层),然后执行2"-INSERT"命令给出用户选择的点和dwg文件.然后,将先前的活动层重置为活动层.
insert-command看起来像这样:
-INSERT
C:\path\to\file.dwg
<point.x>,<point.y>,<point.z>
<documentScale>
Run Code Online (Sandbox Code Playgroud)
注意:命令中的所有换行符都添加为vbCR(不vbCrLf).
我的问题是,如何在.NET中针对ObjectARX实现相同的结果?我无法使用,SendStringToExecute因为它是异步的(没有回调),所以换句话说,一旦完成执行,我就无法重置当前层.必须有一些方法在纯.NET代码中复制此功能,可能使用BlockTable,但我不知道如何.
我已经尝试过按照此处找到的文章:http://through-the-interface.typepad.com/through_the_interface/2006/08/import_blocks_f.html,但这根本没有对文档产生明显影响.我也尝试使用myDatabase.Insert(transform, otherDatabase, False)和命令提示符说已经存在的块,因此跳过,但我仍然没有看到任何变化.我不知道"-INSERT"命令在幕后实际上有多么神奇,但在.NET中复制它是否可行?或者它是否可以被称为普通方法(而不是发送给AutoCAD处理的文本命令)?