C#操作有名字典
(vlax-ldata-get dict key)(vlax-ldata-put dict key data )
哪位大师能帮下忙。用C#实现LSp这两个函数。
研究了好久没搞明白 本帖最后由 ivde 于 2015-10-4 11:38 编辑
ldata是Autodesk为 alisp 专门做的一个数据,可以认为是一个“自定义实体”(0 . "VL_OBJ"),不管ARX还是 C# 都不能方便存取,只有那几个 alisp 使用才方便,当然用 dxf 可以获取,不过处理 resultburf 也不是一件轻松的事情(ldata 词典数据是自由的)
和 alisp 交互可以考虑下面方法
1 自己写词典存取函数,使用标准的 xrecord ,这个中 C# 中能处理,自己写 Lispfunction
2 使用 Alisp 变量过渡,在 C# 中使用 invoek 运行 (setq ldata (vlax-ldata-get "mydict" "first")) 语句,然后用 GetLispSymbol 获取,设置时 invoke 运行 (vlax-ldata-put "mydict" "first" '(1 2 2)) ,不需要返回值 ivde 发表于 2015-10-4 11:36 static/image/common/back.gif
ldata是Autodesk为 alisp 专门做的一个数据,可以认为是一个“自定义实体”(0 . "VL_OBJ"),不管ARX还是 C# ...
谢谢,原来C#不能这样存呀,
我只是想在图里存一个double,
然后可以用程序读取
不会搞,唉哟伤心 lionguns 发表于 2015-10-4 11:51 static/image/common/back.gif
谢谢,原来C#不能这样存呀,
我只是想在图里存一个double,
然后可以用程序读取
在 根词典建立子词典然后设置 Xrecord ivde 发表于 2015-10-4 12:22 static/image/common/back.gif
在 根词典建立子词典然后设置 Xrecord
就是不会设置和读取Xrecord
/// <summary>
/// 获取或创建根词典
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static DBDictionary GetOrCreateDictionary(string name)
{
var db = HostApplicationServices.WorkingDatabase;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
var dict = db.NamedObjectsDictionaryId.GetObject<DBDictionary>(OpenMode.ForWrite);
if (!dict.Contains(name))
{
var ndict = new DBDictionary();
dict.SetAt(name, ndict);
tr.AddNewlyCreatedDBObject(ndict, true);
tr.Commit();
return ndict;
}
return dict;
}
}
/// <summary>
/// 创建词典并设置 XRecord
/// 2015.03.24
/// </summary>
/// <param name="name">子词典名</param>
/// <param name="key">Xrecord 名</param>
/// <param name="rb">数据</param>
/// <returns></returns>
public static void CreateDictionary(string name, string key, ResultBuffer rb)
{
var db = HostApplicationServices.WorkingDatabase;
using (var tr = db.TransactionManager.StartTransaction())
{
DBDictionary subDictionary;
var nod = db.NamedObjectsDictionaryId.GetObject<DBDictionary>(OpenMode.ForWrite);
try
{
subDictionary = nod.GetAt(name).GetObject<DBDictionary>(OpenMode.ForWrite);
}
catch (Exception)
{
subDictionary = new DBDictionary();
nod.SetAt(name, subDictionary);
tr.AddNewlyCreatedDBObject(subDictionary, true);
subDictionary = nod.GetAt(name).GetObject<DBDictionary>(OpenMode.ForWrite);
}
Xrecord xrec;
try
{
xrec = (Xrecord) tr.GetObject(subDictionary.GetAt(key), OpenMode.ForWrite);
xrec.Data = rb;
xrec.Dispose();
}
catch (Exception)
{
subDictionary.UpgradeOpen();
xrec = new Xrecord {Data = rb};
subDictionary.SetAt(key, xrec);
tr.AddNewlyCreatedDBObject(xrec, true);
}
tr.Commit();
}
} ivde 发表于 2015-10-6 08:11 static/image/common/back.gif
GetObject<DBDictionary>
非泛型方法。。。不能与类型实参一起使用
这是什么情况呢?
昨天研究了一下,我都是每次删除主键,然后新建主键和子键来达到目的。不是很理想。
想研究一下发的通用方法,完善我的程序,也刚好学习提高一下。
同时对你的热心表示极大的感谢。 lionguns 发表于 2015-10-7 07:53 static/image/common/back.gif
GetObject
非泛型方法。。。不能与类型实参一起使用
这是什么情况呢?
public static T GetObject<T>(this ObjectId id) where T : DBObject
{
return (T) id.GetObject(OpenMode.ForRead);
}
public static T GetObject<T>(this ObjectId id, OpenMode mode) where T : DBObject
{
return (T) id.GetObject(mode);
}
ivde 发表于 2015-10-7 08:04 static/image/common/back.gif
谢谢,这个泛型,我拿去研究一下,由于C#水平比较差,意思是知道了,但理解的层次不够深。
再次感谢。 估计楼主也是想用lisp和C#混合编程。
那还是学习一下,如何将C#的变量搞成指针什么的全局变量,再用lisp调用。
就是这个贴子
http://bbs.mjtd.com/thread-80615-1-1.html
页:
[1]
2