【问题标题】:Proper "container" for data display/modification用于数据显示/修改的适当“容器”
【发布时间】:2014-04-04 20:40:19
【问题描述】:

我正在创建一个 Windows 窗体,用户将在其中运行 Autocad 中的命令,它会提示他们选择一个对象(特别是 3d 多段线)。 3d 多段线可以有非常广泛的顶点。我希望每个顶点都打开/创建它自己的行。每行有 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

【问题讨论】:

  • 可能是一个数据网格?应该允许您查看顶点对象的集合并直接修改(包含之前/之后的编辑事件)......删除并不那么明显(选择行,按键盘上的删除),所以可能会扔进工具栏。跨度>

标签: c# .net autocad


【解决方案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();
}

在表格中获取顶点数据后,您可以非常轻松地将其绑定到可视控件。

【讨论】:

  • 我认为这会“实时”编辑数据是不是错了?我让它填充表单,但是一旦我关闭表单,更改任何内容(例如 z 值)都不会做任何事情。我需要在表单关闭时做一些具体的事情吗?
  • 根据您的应用程序要求,您需要解决数据更改时发生的情况。如果您只是希望将表单上的更改应用于对象,则使用当前逻辑您必须重新获取它们(您可以从 Handle 获取 ObjectID)来编辑它们,然后提交一个新事务。跨度>
  • 或者(在您的情况下可能更好)是在显示表单时让 DBObjects 和事务处于打开状态,然后在关闭时更新数据。您必须创建一个方法,将更新后的表值设置为您打开的对象。
  • 我想我什至看不到交易在哪里关闭,我已经尝试移动“trans.Commit();”,现在它已完全删除,没有任何不同发生。无论如何.. .基本上我应该创建一个读取数据网格并将其转换回“写入”到数据库的新方法。
  • Transaction 实现了 IDisposable,所以当 using 语句退出时,Transaction 关闭。如果您希望对 DBObjects 的更改持续存在,则需要提交事务。是的,您需要一种方法将网格上的更改写回 AutoCAD DbObjects
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多