乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 82|回复: 4

在AcDbDicpedia(namedobjcript)中创建xRecord并添加ResultBuffer数据

[复制链接]

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2018-11-23 11:07:04 | 显示全部楼层 |阅读模式
嘿,网络大师!
为了通过字典中的xRecord将一些.NET数据传递给LISP,我提出了一些(重要的)请求(因此它将依赖于.dwg)
我发现将LISP数据存储到字典中最简单的方法是这样的(通过LISP(抱歉,它是普通的,不是可视化的)):
  1. ; (IncludeDataIntoMainDic "MyXrec" '("Custom" 2 "data"))
  2. ; (IncludeDataIntoMainDic "MyXrec" nil)
  3. ; xRecName - xrecord name
  4. ; dataL - basically any type of data (usually its a list) if nil, then the xrecord will be deleted.
  5. ; http://www.theswamp.org/index.php?topic=5003.0
  6. (defun IncludeDataIntoMainDic ( xRecName dataL / maindic xrec )
  7.   (cond
  8.     ( (not (eq 'STR (type xRecName))) (prompt "\nxRecName is not STR type.") )
  9.     ( (vl-some (function (lambda (x) (wcmatch (strcase xRecName) x))) '("ACAD*" "AEC*" "Ac*")) ; Being paranoid
  10.       (prompt "\nInvalid xRecord name.")
  11.     )
  12.     (t
  13.       (setq maindic (namedobjdict))
  14.       (if (setq xrec (dictsearch maindic xRecName)) (entdel (cdr (assoc -1 xrec))))
  15.       (if dataL (dictadd maindic xRecName (entmakex (append '((0 . "XRECORD") (100 . "AcDbXrecord")) (list (cons 1 (vl-prin1-to-string dataL)))))))
  16.     ); t
  17.   ); cond
  18. ); defun IncludeDataIntoMainDic
  1. ; (GetDataFromMainDic "MyXrec")
  2. ; http://www.theswamp.org/index.php?topic=5003.0
  3. (defun GetDataFromMainDic ( xRecName / tmp r )
  4.   (and
  5.     (setq tmp (dictsearch (namedobjdict) xRecName))
  6.     (setq tmp (cdr (assoc 1 tmp)))
  7.     (setq r (read tmp))
  8.   ); and
  9.   r
  10. ); defun GetDataFromMainDic

但我不知道如何将上述算法转换为C#as方法(用注释描述):
[LispFunction(“IncludeDataIntoMainDic”)]
公共静态void包含在数据maindic中(字符串xRecordName,restbuffer ResBuf)
{
//如果存在xRecordName的xRecord(从主词典中),则删除它。
如果(ResBuf)
{
//然后使用xRecordName创建新的xRecord
//并以某种方式将结果缓存到它中。
}
}
[LispFunction(“GetDataFromMainDic”)]
公共静态结果缓存GetDataFromMainDic(字符串xRecordName)
{
//获取xrecord并以某种方式返回第一个带有键1的DXF代码,作为新的结果缓冲区。
//返回ResBuf;
}
//注意:如果不可能将'ResultBuffer'作为数据附加到Xrecord,则任何类型的返回数据都会这样做:
//包含在主数据中(“X记录”

//GetDataFromMainDic(“TheXrecord”);>>应该返回<any></div><ol>><br>注意:<br>-这是关于创建/删除一个Xrecord对象/类吗?来自AcDbDictionary类(我猜)
\-将自定义数据包括到Xrecord中(在我的情况下,它是一个字符串,我将对其进行解算和重新计算)
  1. _$ (vl-prin1-to-string '("Custom" 2 "data")) >> "("Custom" 2 "data")"
  2. _$ (read "("Custom" 2 "data")") >> ("Custom" 2 "data")

很抱歉,我事先提出了请求,而不是简单地提出请求(我仍然被.NET的数量所淹没)-我将尝试研究您的解决方案/// //。
//。
//。
公共静态空AddXrecdToNamedDicpedia(字符串字典名称、字符串键、ResultBuffer数据)。
{。
if(Active.Document==null)返回;。
尝试。
{。
使用(Document.LockDocument())。
{。
使用(事务tr=Active.Document.TransactionManager.StartTransaction())。
{。
tr.GetObjectActive.Database.NamedObjectsDictionaryId。
OpenMode.ForWrite)作为DBDicpedia;。
if(nod==null)返回;。
>>>>>>>>>>>>如果(nod.Contains(字典名称))。
{。
//设置字典。
tr.GetObjectnod.GetAt字典名称OpenMode.ForWrite。
}。
其他。
{。
//完成创建字典。
nod.SetAt字典名称;。
tr.AddNewlyCreatedDBObject(myDbDicpedia, true);。
}。

如果(myDbDictionary.Contains(键))。
{。
//编辑现有的xRecords。
var myXRec=tr.GetObject(myDbDictionary.GetAt(key),OpenMode.ForWrite);。
myXRec.Data=数据;。
}。
其他。
{。
//添加x记录。
XRecords newXRec=new XRecords(){Data=data};。
myDbDictionary.SetAt(键,newXRec);。
tr.AddNewlyCreatedDBObject(newXRec,true);。
}。
tr.Commit();。
}。
}。
}。
捕获(异常e)。
{。
AID_Application.HandleError(e);。
}。
}。



回复

使用道具 举报

16

主题

506

帖子

6

银币

中流砥柱

Rank: 25

铜币
570
发表于 2018-11-23 14:53:30 | 显示全部楼层
谢谢您,Atook!但是您在ResultBuffer中包含什么类型的值,以便xRecord将它们用作数据呢?我尝试了许多方法/以及1个string类型的键和40个int类型的键..即'((1。“你好”)(1,《世界》)(40。888))/:    addxrecordtonamedictionary 。
(" csharpcdictionary "," xRecordKey ",new ResultBuffer。
(。
新类型值((int)LispDataType),ListBegin),。
新类型值((int)LispDataType),ListBegin),。
新类型值((int)LispDataType),Int32,8),。
新类型值((int)LispDataType),文本,“你好”),。
新类型值((int)LispDataType),ListEnd),。
新类型值((int)LispDataType),ListBegin),。
新类型值((int)LispDataType),Int32,8),。
新类型值((int)LispDataType),Text,“世界”),。
新类型值((int)LispDataType),ListEnd),。
新类型值((int)LispDataType),ListEnd)。
)。
);。

addxrecordtonamedictionary 。
(“cshardictionary 2”,“xRecordKey2”,新结果缓冲区。
(。
新类型值((int)LispDataType),ListBegin),。
新类型值((int)LispDataType),ListBegin),。
新类型值((int)LispDataType),Int32,8),。
新类型值((int)LispDataType),文本,“你好”),。
新类型值((int)LispDataType),ListEnd),。
新类型值((int)LispDataType),ListBegin),。
新类型值((int)LispDataType),Int32,8),。
新类型值((int)LispDataType),Text,“世界”),。
新类型值((int)LispDataType),ListEnd),。
新类型值((int)LispDataType),ListBegin),。
新类型值((int)LispDataType),Int32,2),。
新类型值((int)LispDataType),Int32,888),。
新类型值((int)LispDataType),ListEnd),。
新类型值((int)LispDataType),ListEnd)。
)。
);。

addxrecordtonamedictionary 。
(“cshardictionary 3”,“xRecordKey3”,新结果缓冲区。
(。
新类型值((int)LispDataType),文本,“你好”),。
新类型值((int)LispDataType),Text," World")。
)。
);但是我总是得到 eInvalidDxfCode :
  1. Source: Acdbmgd
  2. Message: eInvalidDxfCode
  3. Data: System.Collections.ListDictionaryInternal
用于捕捉:   捕捉(Autodesk,AutoCAD.Runtime.Exception e)。
{。
应用,document manager . mdiactivedocument . editor . write message 。
(。
"Source: " + e.Source +。
" \消息:"+ e.Message +。
"\nData: " + e.Data。
);。
}。
回复

使用道具 举报

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2018-11-23 16:03:56 | 显示全部楼层
看看DxfCode枚举的数据类型,而不是lisp的数据类型。另外,你不需要创建列表,这是来自文档的一个例子:
https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2017/ENU/AutoCAD-NET/files/GUID-A43BA3F1-513E-42E5-A21F-633FAF97B5C9-htm.html
我刚刚意识到你可能需要将数据存储在列表或“树”般的结构中。如果你愿意,你可以将此信息存储为 xml 字符串,我为我的应用/对象外部数据执行此操作,我只需要存储一个 TypedValue。如果你的xml数据变得很大,你可以使用Daniel的StringToResultBuffer代码,你可以通过快速搜索在板上找到它。这将压缩信息以节省空间并运行良好。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2018-11-23 16:56:11 | 显示全部楼层
哦...如果XML存储是您正在寻找的,我喜欢MickD存储单个ResultBuffer的想法...如果我需要,我可能会为自己使用那个!我在NOD中存储数据库对象。这是我对之前发布的存储spinlker对象的函数的调用:Active.AddXrecordToNamedDictionary(AID_Strings.SprinkDictionary,spk.ID,spk.XRecordData ());这是洒水器对象的XRecordData:///。
///返回一个TypeValueList,该列表旨在作为xdata存储在字典中的XRecord上。
///不作为Xdata写入块,[0]处没有APPNAME。
>/// 公共TypeValueList XRecordData()。
{。
TypeValueList结果=新的TypeValueList(。
新的TypeValue((int)DxfCode.Text, ID),。
新的TypeValue((int)DxfCode.Text,BlockName),。
新类型值((int)DxfCode.Real,压力),。
新类型值((int)DxfCode.Real,半径),。
新的TypeValue((int)DxfCode.Real,Flow),。
新的TypeValue((int)DxfCode.Real, PlotSize));。

返回结果;。
}。
这是Tony的TypeValueList类,也强烈推荐。公共类TypeValueList:List。
{。
//感谢Tony Tanzillo。
//http://www.theswamp.org/index.php?topic=14495.msg186823#msg186823。
//。
公共类型值列表(参数类型值[]参数)。
{。
AddRange(args);。
}。

//让添加项目变得更容易:。

public ull添加(int typeode,对象值)。
{。
base.Add(新的TypeValue(typeode, value));。
}。
public ull添加(LispDataType类型,对象值)。
{。
添加(新的TypeValue((int)类型,值));。
}。
公共空添加(DxfCode代码,对象值)。
{。
添加(新的TypeValue((int)代码,值));。
}。

//隐式转换为SelectionFilter。
公共静态隐式运算符SelectionFilter(TypeValueList src)。
{。
返回src!=null? new SelectionFilter(src): null;。
}。

//隐式转换为ResultBuffer。
公共静态隐式运算符ResultBuffer(TypeValueList src)。
{。
返回src!=null? new ResultBuffer(src): null;。
}。

//隐式转换为TypeValue[]。
公共静态隐式运算符TypeValue[](TypeValueList src)。
{。
返回src!=null?src.ToArray(): null;。
}。

//从TypeValue[]隐式转换。
公共静态隐式运算符TypeValueList(TypeValue[]src)。
{。
返回src!=null? new TypeValueList(src): null;。
}。

//从SelectionFilter隐式转换。
公共静态隐式运算符TypeValueList(SelectionFilter src)。
{。
返回src!=null? new TypeValueList(src.GetFilter()): null;。
}。

//从ResultBuffer隐式转换。
公共静态隐式运算符TypeValueList(ResultBuffer src)。
{。
返回src!=null? new TypeValueList(src.AsArray()): null;。
}。
}。
希望这有帮助!。
回复

使用道具 举报

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2018-11-23 18:55:16 | 显示全部楼层

谢谢Mick!
所以我不得不使用DxfCode枚举,位于Database aseServices命名空间中。
有点困惑,为什么他们没有将这些枚举放在同一个命名空间中,但我会习惯的
  1. Autodesk.AutoCAD.DatabaseServices.DxfCode
  2. Autodesk.AutoCAD.Runtime.LispDataType

不需要,我只是想从一些简单的东西开始探索,虽然它看起来很有用。顺便说一句。
谢谢Agot,你帮了大忙!
周末愉快,伙计们!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 07:59 , Processed in 0.411476 second(s), 62 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表