我有一个用C++编写的应用程序,我必须将它迁移到C#。此应用程序是AutoCAD的扩展。
C++ AutoCAD API中的resbuf是一个链接列表,它处理所有AutoCAD基本数据类型。看上去像这样
struct resbuf {
struct resbuf * rbnext;
short restype;
union ads_u_val resval;
};因此,每个resbuf都包含由restype成员描述的特定数据。例如,代码410的restype是层名。所以在C#上,它看起来像这样
Entity entity; // Get object here
string layer = entity.Layer;在该应用程序中,resbuf结构被用作处理AutoCAD对象的一种方式,无论何时遇到resbuf,我都会直接使用对象(Line、Polyline、MText等)更改它。
但是现在我在代码10中找到了resbuf的用法,我打开了文档,发现了以下内容
10:要点。这是线条或文本实体、圆心等的起点。
我不知道怎么迁移它。因为对于每个对象,它是一个不同的属性。唯一的想法就是这样。
public void ChangePoint(Entity entity, Point3d value)
{
if (entity is Line)
{
// here code for Line
}
else if (entity is Circle)
{
// here code for Circle
}
// And so on
}但我不喜欢。也许有一种更好的方法。你有什么想法吗?
发布于 2016-04-11 08:57:54
首先,resbuf是AutoCAD API的ADS版本,它是一个C。ObjectARX是AutoCAD API的C++版本,它仍然对XData使用resbuf,但对于实体属性访问不再使用resbuf。在ObjectARX (C++)和AutoCAD .Net API (C#/VB.Net)中,您分别使用特定的方法和访问器访问实体属性(参见底部的示例)。
使用DXF表读取resbuf链接列表中的代码。
其次,代码DXF 410只是一个字符串。如果有人想要的话,可以使用它并存储一个层名,但是实体层被DXF代码8引用。
最后的DXF代码10,意味着实体的第一个有意义的点。这可以是一个圆的中心,也可以是一条线的第一点,等等.这就是为什么使用resbuf比使用访问器需要更多的关注和理解底层AutoCAD数据库结构的组织方式。
例如:
ADS (C)
ads_name en ;
ads_point pt ;
acedEntSel ("\nSelect an Entity: ", en, pt) ; // was ads_entsel() long time ago
struct resbuf *res =acdbEntGet (en) ;
// ... do something with res parsing the linked list and search for specific codes
// Entity Layer is code 8
// ... Eventually push changes to the entity using acdbEntMod()ObjectARX (C++)
ads_name en ;
ads_point pt ;
acedEntSel ("\nSelect an Entity: ", en, pt) ; // was ads_entsel() long time ago
AcDbObjectId id ;
acdbGetObjectId (id, en) ;
AcDbObjectPointer<AcDbEntity> pEnt (id, AcDb::kForWrite) ;
AcDbObjectId layerId =pEnt->layerId () ;
// ... do something with pEnt ...
// Eventually set a new layer
pEnt->setLayer (newLayerId, true) ;AutoCAD .Net (C#)
Document doc =Application.DocumentManager.MdiActiveDocument ;
Database db =doc.Database ;
Editor ed =doc.Editor ;
PromptSelectionResult psr =ed.GetSelection () ;
SelectionSet ss =psr.Value ;
SelectedObject so =ss [0] ;
Transaction tr =doc.TransactionManager.StartTransaction () ;
Entity ent =tr.GetObject (so.ObjectId, OpenMode.ForWrite) as Entity ;
ObjectId layerId =ent.Layer ;
// ... do something with ent ...
// Eventually set a new layer
ent.Layer =newLayer ;
tr.Commit () ;
// Regen clears highlighting and reflects the new layer
ed.Regen () ;发布于 2016-04-12 08:14:57
我不是C#的高手,但对ARX有一点了解。对我来说,似乎您在应用程序中使用了某种DXF迭代器。在C++中,您可以使用acdbEntGet,所以在C#中也可以使用它。见示例:
http://adndevblog.typepad.com/autocad/2012/05/accessing-visible-entities-in-a-dynamic-block.html
我想您可以使用相应的: acdbEntMake acdbEntMod创建、修改实体
https://stackoverflow.com/questions/36541852
复制相似问题