AutoCAD Resbuf миграции

У меня есть приложение, написанное на C ++, и я должен перенести его на C #. Это приложение является расширением для AutoCAD.

resbuf в C ++ AutoCAD API — это связанный список, который обрабатывает все основные типы данных AutoCAD. Это выглядит так

struct resbuf {
struct resbuf * rbnext;
short restype;
union ads_u_val resval;
};

Таким образом, каждый resbuf содержит конкретные данные, описанные участником restype. Например, restype с кодом 410 является именем слоя. Так на C # это выглядит так

Entity entity; // Get object here
string layer = entity.Layer;

В этом приложении структура resbuf используется как способ работы с объектами AutoCAD, и везде, где я встречаю resbuf, я изменяю ее, используя объект (Line, Polyline, MText и т. Д.) Напрямую.

Но теперь я нашел использование resbuf с кодом 10, открыл документацию и нашел следующее

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
}

Но мне это не нравится. Может быть, есть лучший способ сделать это. Есть ли у вас какие-либо идеи?

0

Решение

Первым обновлением была ADS-версия AutoCAD API, которая была C API. ObjectARX, которая является версией AutoCAD API для C ++, по-прежнему использует resbuf для XData, но больше не для доступа к свойствам Entity. В ObjectARX (C ++) и AutoCAD .Net API (C # / VB.Net) вы получаете доступ к свойству сущности, используя определенные методы и средства доступа соответственно (см. Примеры внизу).

Использовать Стол DXF читать код в связанном списке resbuf.

Во-вторых, код DXF 410 — это просто строка. Кто-то может использовать его и сохранить имя слоя, если он хочет, но на уровень сущности ссылается код DXF 8.

Последний код 10 DXF означает первую значимую точку для объекта. Это может быть либо центр круга, либо 1-я точка линии и т. Д. Вот почему использование resbuf требует гораздо большего внимания и понимания того, как организована базовая структура базы данных AutoCAD, чем использование средств доступа.

Например:

ОБЪЯВЛЕНИЯ (С)

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 () ;
2

Другие решения

Я не мастер C #, но немного знаю об ARX.
Мне кажется, что вы используете какой-то итератор DXF в своем приложении.
В C ++ вы можете использовать acdbEntGet
так что в C # вы также можете использовать его. Смотрите пример:

http://adndevblog.typepad.com/autocad/2012/05/accessing-visible-entities-in-a-dynamic-block.html

Полагаю, таким же образом вы можете использовать соответствующие:
acdbEntMake
acdbEntMod
создавать, изменять сущности

0

По вопросам рекламы [email protected]