editor.command(),用户命令能使用选择集么
我在autocad2015的环境下,join命令可以合并多条直线成多段线。用autocad.net发送命令发现不能识别选择集。思路如下:
先建一个含两条直线的选择集,如 testset
然后用editor.command("_join",testset)
发现选择集不能被join命令所识别.
请问这个editor.command发送命令函数怎样才能使用选择集?
另外问下这个函数是同步执行命令的么?我不需要sendstringToExecute那样延时运行的发送命令函数。
直接传ObjectId试试 用 Editor.CommandAsync 有暂停等用户输入 都2015了,真是超前的厉害,致敬 试着转objectid,如下代码,不行啊。
Dim testid() As ObjectId
If acSSPrompt.Status = PromptStatus.OK Then
Dim acSSet As SelectionSet = acSSPrompt.Value
testid = acSSet.GetObjectIds()
ed.Command("_JOIN", testid)
End If
另外,用2015版纯粹巧合,工作用10的,小本用15的。 fiyone 发表于 2014-7-10 23:41
试着转objectid,如下代码,不行啊。
Dim testid() As ObjectId
If acSSPrompt.Status =...
command需要SelectionSet 本帖最后由 雪山飞狐_lzh 于 2014-7-11 17:57 编辑
ed.Command("_JOIN", id1, id2)
建议尽量不要用这个 Jion可以直接用代码实现的 不是很复杂 另外你没有搞清楚Join的步骤 他是先选择源对象 再选其他对象,所以调用格式:
editor.command("_join", id, ss) 本帖最后由 雪山飞狐_lzh 于 2014-7-11 18:35 编辑
下面是我的测试(用自己的封装,没有2015)
#region Command
private static void AddValueToResultBuffer(ref ResultBuffer rb, object obj)
{
if (obj == null)
{
rb.Add(new TypedValue((int)LispDataType.Text, ""));
}
else
{
if (obj is string)
{
rb.Add(new TypedValue((int)LispDataType.Text, obj));
}
else if (obj is Point2d)
{
rb.Add(new TypedValue((int)LispDataType.Text, "_non"));
rb.Add(new TypedValue((int)LispDataType.Point2d, obj));
}
else if (obj is Point3d)
{
rb.Add(new TypedValue((int)LispDataType.Text, "_non"));
rb.Add(new TypedValue((int)LispDataType.Point3d, obj));
}
else if (obj is ObjectId)
{
rb.Add(new TypedValue((int)LispDataType.ObjectId, obj));
}
else if (obj is SelectionSet)
{
rb.Add(new TypedValue((int)LispDataType.SelectionSet, obj));
}
else if (obj is double)
{
rb.Add(new TypedValue((int)LispDataType.Double, obj));
}
else if (obj is short)
{
rb.Add(new TypedValue((int)LispDataType.Int16, obj));
}
else if (obj is int)
{
rb.Add(new TypedValue((int)LispDataType.Int32, obj));
}
else if (obj is TypedValue)
{
rb.Add(obj);
}
}
}
private static extern int acedCmd(IntPtr vlist);
/// <summary>
/// 调用AutoCad命令
/// </summary>
/// <param name="endCommandByUser">命令结束方式</param>
/// <param name="rb">参数</param>
public static void Command(bool endCommandByUser, ResultBuffer rb)
{
ResultBuffer rbend = new ResultBuffer();
try
{
Document doc = Application.DocumentManager.MdiActiveDocument;
string currCmdName = doc.CommandInProgress;
acedCmd(rb.UnmanagedObject);
if (endCommandByUser)
{
rbend.Add(new TypedValue((int)LispDataType.Text, "\\"));
}
while (doc.CommandInProgress != currCmdName)
{
acedCmd(rbend.UnmanagedObject);
}
}
catch { }
finally
{
rb.Dispose();
rbend.Dispose();
}
}
/// <summary>
/// 调用AutoCad命令
/// </summary>
/// <param name="endCommandByUser">命令结束方式</param>
/// <param name="args">参数</param>
public static void Command(bool endCommandByUser, params object[] args)
{
ResultBuffer rb = new ResultBuffer();
foreach (object val in args)
{
AddValueToResultBuffer(ref rb, val);
}
Command(endCommandByUser, rb);
}
#endregion
测试代码
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
ObjectId id1,id2;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt, OpenMode.ForWrite);
Line l1 = new Line(new Point3d(1, 1, 0), Point3d.Origin);
Line l2 = new Line(Point3d.Origin,new Point3d(-1,-1,0));
id1 =btr.AppendEntity(l1);
tr.AddNewlyCreatedDBObject(l1,true);
id2 =btr.AppendEntity(l2);
tr.AddNewlyCreatedDBObject(l2,true);
tr.Commit();
}
EdEx.Command(
false,
"._join",
id1,
SelectionSet.FromObjectIds(new ObjectId[] { id2 }),
null);
我用的是vb,楼上的代码有点高大上了。我看看能不能转成vb试试。谢谢
页:
[1]
2