首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoCAD resbuf迁移

AutoCAD resbuf迁移
EN

Stack Overflow用户
提问于 2016-04-11 06:59:38
回答 2查看 681关注 0票数 0

我有一个用C++编写的应用程序,我必须将它迁移到C#。此应用程序是AutoCAD的扩展。

C++ AutoCAD API中的resbuf是一个链接列表,它处理所有AutoCAD基本数据类型。看上去像这样

代码语言:javascript
复制
struct resbuf {
  struct resbuf * rbnext;
  short restype;
  union ads_u_val resval;
};

因此,每个resbuf都包含由restype成员描述的特定数据。例如,代码410的restype是层名。所以在C#上,它看起来像这样

代码语言:javascript
复制
Entity entity; // Get object here
string layer = entity.Layer;

在该应用程序中,resbuf结构被用作处理AutoCAD对象的一种方式,无论何时遇到resbuf,我都会直接使用对象(Line、Polyline、MText等)更改它。

但是现在我在代码10中找到了resbuf的用法,我打开了文档,发现了以下内容

10:要点。这是线条或文本实体、圆心等的起点。

我不知道怎么迁移它。因为对于每个对象,它是一个不同的属性。唯一的想法就是这样。

代码语言:javascript
复制
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
}

但我不喜欢。也许有一种更好的方法。你有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 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)

代码语言:javascript
复制
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++)

代码语言:javascript
复制
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#)

代码语言:javascript
复制
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 () ;
票数 2
EN

Stack Overflow用户

发布于 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创建、修改实体

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36541852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档