Надлежащий контейнер для отображения/модификации данных

Я создаю форму окна, в которой пользователь будет запускать команду в Autocad, она предложит им выбрать объект (в частности, трехмерные полилинии). Трехмерная полилиния может иметь очень широкий диапазон вершин. Я хочу, чтобы каждая вершина была включена/создала свою собственную строку. Каждая строка имеет 5 столбцов (свойства каждой вершины).

Какую подходящую емкость для этого использовать? Я ожидаю, что пользователь сможет изменять (например, изменять высоту) каждое свойство в каждой вершине. Наряду с фактическим удалением любых вершин, которые они хотят.

Панель макета таблицы? Обычная панель? Вот код, как я "получаю" вершины:

        using (AcDb.Transaction oTr = db.TransactionManager.StartTransaction())
        {
            AcDb.ObjectIdCollection ids = new AcDb.ObjectIdCollection();

            AcEd.PromptEntityOptions options = new AcEd.PromptEntityOptions("\nSelect a 3DPolyline:");
            options.SetRejectMessage("That is not select a 3DPolyline" + "\n");
            options.AddAllowedClass(typeof(AcDb.Polyline3d), true);
            AcEd.PromptEntityResult result = ed.GetEntity(options);

            if (result.Status != AcEd.PromptStatus.OK) return;

            AcDb.Polyline3d oEnt = oTr.GetObject(result.ObjectId, AcDb.OpenMode.ForRead) as AcDb.Polyline3d;


            foreach (AcDb.ObjectId oVtId in oEnt)
            {
                AcDb.PolylineVertex3d oVt = oTr.GetObject(oVtId, AcDb.OpenMode.ForRead) as AcDb.PolylineVertex3d;
                //now to populate...something

person smakfactor1    schedule 03.04.2014    source источник
comment
возможно датасет? должен позволить вам просматривать набор объектов вершин и изменять их напрямую (с включенными событиями редактирования до/после)... удаление не так очевидно (выберите строку, нажмите «Удалить» на клавиатуре), поэтому, возможно, добавьте панель инструментов.   -  person bdimag    schedule 04.04.2014


Ответы (1)


DataTable будет иметь смысл при сборе данных.

using (var trans = db.TransactionManager.StartTransaction())
{
    var options = new PromptEntityOptions("\nSelect a 3DPolyline:");
    options.SetRejectMessage("That is not select a 3DPolyline" + "\n");
    options.AddAllowedClass(typeof(Polyline3d), true);
    var result = ed.GetEntity(options);

    if (result.Status != PromptStatus.OK)
        return;

    var poly = (Polyline3d)trans.GetObject(result.ObjectId, OpenMode.ForRead);
    var vertexClass = RXClass.GetClass(typeof(PolylineVertex3d));

    var vertexTable = new System.Data.DataTable("Vertices");
    vertexTable.Columns.Add("HandleId", typeof(long));
    vertexTable.Columns.Add("PositionX", typeof(double));
    vertexTable.Columns.Add("PositionY", typeof(double));
    vertexTable.Columns.Add("PositionZ", typeof(double));

    foreach (ObjectId vertexId in poly)
    {
        if (!vertexId.ObjectClass.IsDerivedFrom(vertexClass))
            continue;

        var vertex = (PolylineVertex3d)trans.GetObject(vertexId, OpenMode.ForRead);
        vertexTable.Rows.Add(vertex.Handle.Value, vertex.Position.X, vertex.Position.Y, vertex.Position.Z);
    }

    trans.Commit();
}

После того, как у вас есть данные о вершинах в таблице, вы можете очень легко привязать их к визуальным элементам управления.

person Parrish Husband    schedule 04.04.2014
comment
Я ошибаюсь, предполагая, что это было бы редактирование данных в реальном времени? У меня он заполняет форму, но изменение чего-либо (например, значения z) ничего не делает после закрытия формы. Нужно ли мне делать что-то конкретное при закрытии формы? - person smakfactor1; 10.04.2014
comment
В зависимости от ваших требований к приложению вам необходимо решить, что происходит при изменении данных. Если вы просто хотите, чтобы изменения в форме были применены к объектам, используя текущую логику, вам придется повторно получить их (вы можете получить ObjectID из Handle), чтобы отредактировать их, а затем зафиксировать новую транзакцию. - person Parrish Husband; 10.04.2014
comment
В качестве альтернативы (и, вероятно, лучше в вашем случае) было бы оставить DBObjects и транзакцию открытыми, пока отображается форма, а затем обновить данные после ее закрытия. Вам нужно будет создать метод, который устанавливает обновленные значения таблицы для открытых вами объектов. - person Parrish Husband; 10.04.2014
comment
Думаю, я даже не вижу, где закрывается транзакция, я пытался переместить trans.Commit(); вокруг, прямо сейчас он полностью удален, и ничего другого не происходит. В любом случае... в основном я должен создать новый метод, который читает сетку данных и переводит ее обратно в запись в БД. - person smakfactor1; 10.04.2014
comment
Транзакция реализует IDisposable, поэтому при выходе из оператора using транзакция закрывается. Фиксация транзакции потребуется, если вы хотите, чтобы изменения в объектах DBObject сохранялись. Да, вам понадобится метод для записи изменений в сетке обратно в DbObjects AutoCAD. - person Parrish Husband; 10.04.2014
comment
Я пойду оттуда, спасибо за вашу помощь, сэр. Очень признателен. - person smakfactor1; 10.04.2014