Тема: Создание PolyFacesMesh из дотнета - не пойму смысл экзепшена

Пытаюсь из C# создать полигональную сетку, не выходит. Вылетает исключение Autodesk.AutoCAD.Runtime.Exception: eNoDatabse.

PolyFaceMesh mesh = new PolyFaceMesh();
mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(width / 2, depth / 2, depth)));
mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(width / 2, -depth / 2, depth)));
mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(-width / 2, depth / 2, depth)));
mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(-width / 2, -depth / 2, depth)));
mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(width / 2, depth / 2, 0)));
mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(width / 2, -depth / 2, 0)));
mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(-width / 2, depth / 2, 0)));
mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(-width / 2, -depth / 2, 0)));
mesh.AppendFaceRecord(new FaceRecord(1, 3, 7, 5));
BlockTable bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false);
BlockTableRecord btr = (BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
btr.AppendEntity(mesh);
tm.AddNewlyCreatedDBObject(mesh, true);

А если этот кусок меняю на взытый из примера, то все работает :(

Point3d center = new Point3d(9.0, 3.0, 0.0);
Vector3d normal = new Vector3d(0.0, 0.0, 1.0);
BlockTable bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false);
BlockTableRecord btr = (BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
using (Circle pcirc = new Circle(center, normal, 10.0))
{
  btr.AppendEntity(pcirc);
  tm.AddNewlyCreatedDBObject(pcirc, true);
}

Справка в ObjectARX дурацкая - справочник функций и все... Занимаюсь с автокадом только третий день, не бейте сильно за глупость вопроса:)

Re: Создание PolyFacesMesh из дотнета - не пойму смысл экзепшена

Ага. Методом исключения определил, что в коде экзепшн вызывается строчками типа

mesh.AppendVertex(new PolyFaceMeshVertex(new Point3d(width / 2, depth / 2, depth)));

Буду дальше копать. Но может быть просто у кого-то уже есть опыт? Погуглил, примеров работы с полигонами не нашел...

Re: Создание PolyFacesMesh из дотнета - не пойму смысл экзепшена

Так. С исключением понятно - надо просто команду AppentEntity ставить сразу второй строчкой. Это оттого, что объект состваной, и нельзя писать в БД точки и фэйсы полигональной поверхности, пока сам объект не будет туда записан. Теперь исключений нет, но примитив все равно не появляется на экране. А при закрытии автокада валится неотловленное исключение:) Копаю дальше.

Re: Создание PolyFacesMesh из дотнета - не пойму смысл экзепшена

Спасение утопающих - дело рук самих утопающих. Полигоны не появлялись из-за того, что все дочерние объекты тоже надо регистрировать в БД.

PolyFaceMesh mesh = new PolyFaceMesh();
btr.AppendEntity(mesh);
tm.AddNewlyCreatedDBObject(mesh, true);
PolyFaceMeshVertex v;
v = new PolyFaceMeshVertex(new Point3d(width / 2, depth / 2, height));
mesh.AppendVertex(v);
tm.AddNewlyCreatedDBObject(v, true);
v = new PolyFaceMeshVertex(new Point3d(width / 2, -depth / 2, height));
mesh.AppendVertex(v);
tm.AddNewlyCreatedDBObject(v, true);
v = new PolyFaceMeshVertex(new Point3d(-width / 2, depth / 2, height));
mesh.AppendVertex(v);
tm.AddNewlyCreatedDBObject(v, true);
v = new PolyFaceMeshVertex(new Point3d(-width / 2, -depth / 2, height));
mesh.AppendVertex(v);
tm.AddNewlyCreatedDBObject(v, true);
FaceRecord fr = new FaceRecord(1, 2, 4, 3);
mesh.AppendFaceRecord(fr);
tm.AddNewlyCreatedDBObject(fr, true);

Всем спасибо за внимание.

Re: Создание PolyFacesMesh из дотнета - не пойму смысл экзепшена

> BaCR
Я не стал вмешиваться, т.к. если один раз сам сделаешь - запомнишь на долго! smile

Re: Создание PolyFacesMesh из дотнета - не пойму смысл экзепшена

И на том спасибо. Но вопросы еще будут:)