zoukankan      html  css  js  c++  java
  • Navisworks Api Quantification

    Quantification  国外有的叫定量  我们国内一些施工方叫工程量。

    通过TakeOff API的开发者有机会获得更多的数据和数据可通过图形用户界面。

    1 添加Navisworks的Api

    Autodesk.Navisworks.Takeoff.dll

    2获取量一般是由随模型一起有个Access数据库.所有数据存在该数据库里面。当然也可以是基本数据库..
    3使用C#和使用Autodesk.Navisworks.Api.Takeoff命名空间则扩展方法:

    DocumentExtensions.GetTakeoff 

    例如 C# 代码:

    DocumentTakeoff docTakeoff =
       Autodesk.Navisworks.Api.Application.MainDocument.Takeoff as DocumentTakeoff;
    
    DocumentTakeoff docTakeoff2 =
       Autodesk.Navisworks.Api.Application.MainDocument.GetTakeoff();
    注:下面有关键字 table 都是数据库里的表。
    DocumentExtensions类的地方扩展到文档类的DocumentTakeoff文档部件类。
     
    DocumentTakeoff提供对与起飞相关的各种文档部分。
     
    ItemGroupTable配置信息ItemGorupTable。
     
    ItemTable配置信息ItemTable。
     
    ObjectResourceTable配置信息ObjectResourceTable。
     
    ObjectStepTable配置信息ObjectStepTable。
     
    ObjectTable配置信息ObjectTable。
     
    ResourceGroupTable配置信息ResourceGroupTable。
     
    ResourceTable配置信息ResourceTable。
     
    StepResourceTable配置信息StepResourceTable。
     
    StepTable配置信息StepTable。
     
    TakeoffTable为所有表共有的特征共同的基类。
     
    TakeoffTableSelection表示在一个表中选择。
     
    TakeoffColumnDefinition起飞表中的固定列的定义。
     
    TakeoffProjectSettings Access项目设置。
     
    TakeoffSelection切入点每个表的选择。
     
    TakeoffSelectionChangeEventArgs用于TakeoffSelection Changed事件通过哪些表被修改。
     
    TakeoffSheetIds访问表编号。
     
    TakeoffVariable代表一个变量。
     
    TakeoffVariableCollection代表配置列的行数据。
     
    TakeoffVariableDefinition起飞表变量列的定义。
     
    的配置列定义TakeoffVariableDefinitionCollection集合

    4使用标准的SQL查询数据

    Int64 GetLastInsertRowId()
    {
       DocumentTakeoff docTakeoff = Autodesk.Navisworks.Api.Application.MainDocument.GetTakeoff();
       using (NavisworksCommand cmd = docTakeoff.Database.Value.CreateCommand())
       {
          //use SELECT ... FROM ... WHERE ... sql for query.
          //last_insert_rowid() is a stored function used to retrieve the rowid of the last insert row
          cmd.CommandText = "select last_insert_rowid()";
          using (NavisWorksDataReader dataReader = cmd.ExecuteReader())
          {
             Int64 lastId = -1;
             if (dataReader.Read())
             {
                Int64.TryParse(dataReader[0].ToString(), out lastId);
             }
             return lastId;
          }
       }
    }

    5使用标准的SQL创建目录

    Int64 InsertItem(Int64? parent, String name, String description, String wbs, Int32 color, Double transparency)
    {
       Debug.Assert(name != null);
       DocumentTakeoff docTakeoff = Autodesk.Navisworks.Api.Application.MainDocument.GetTakeoff();
       ItemTable table = docTakeoff.Items;
       Debug.Assert(table != null);
    
       //Directly operate on database
       //Database schema entry: TakeoffTable
       //INSERT INTO TABLE(COL1,COL2,COL3...) VALUES(V1,V2,V3...);
       String sql = "INSERT INTO TK_ITEM(parent, name, description, wbs, color, transparency) VALUES(@parent, @name, @description,@wbs, @color,@transparency)";
       //Modification must be surrounded by NavisworksTransaction
       using (NavisworksTransaction trans = docTakeoff.Database.BeginTransaction(DatabaseChangedAction.Edited))
       {
          using (NavisworksCommand cmd = docTakeoff.Database.Value.CreateCommand())
          {
             NavisworksParameter p = cmd.CreateParameter();
             p.ParameterName = "@parent";
             if (parent.HasValue)
                p.Value = parent.Value;
             else
                p.Value = null;
             cmd.Parameters.Add(p);
    
             p = cmd.CreateParameter();
             p.ParameterName = "@name";
             p.Value = name;
             cmd.Parameters.Add(p);
    
             p = cmd.CreateParameter();
             p.ParameterName = "@description";
             p.Value = description;
             cmd.Parameters.Add(p);
    
             p = cmd.CreateParameter();
             p.ParameterName = "@wbs";
             p.Value = wbs;
             cmd.Parameters.Add(p);
    
             p = cmd.CreateParameter();
             p.ParameterName = "@color";
             p.Value = color;
             cmd.Parameters.Add(p);
    
             p = cmd.CreateParameter();
             p.ParameterName = "@transparency";
             p.Value = transparency;
             cmd.Parameters.Add(p);
    
             cmd.CommandText = sql;
             cmd.ExecuteNonQuery();
          }
          trans.Commit();
       }
       return GetLastInsertRowId();
    }

    6复制使用类来创建一个takeOff

    Int64 DoTakeoff(Int64 itemId, Guid modelItemGuid)
    {
       DocumentTakeoff docTakeoff = Autodesk.Navisworks.Api.Application.MainDocument.GetTakeoff();
       List<Autodesk.Navisworks.Api.ModelItem> items = Autodesk.Navisworks.Api.Application.MainDocument.Models.RootItemDescendantsAndSelf.WhereInstanceGuid(modelItemGuid).ToList();
       Int64 lastId = -1;
       if (items.Count != 0)
       {
          using (NavisworksTransaction trans = docTakeoff.Database.BeginTransaction(DatabaseChangedAction.Edited))
          {
             docTakeoff.Objects.InsertModelItemTakeoff(itemId, items[0]);
             //Quantification UI actually expect the takeoff to have a non-empty wbs, so better to set the wbs for it using the sql way
             lastId = GetLastInsertRowId();
             Debug.Assert(lastId > 0);
             using (NavisworksCommand cmd = docTakeoff.Database.Value.CreateCommand())
             {
                //UPDATE Object set WBS = value WHERE id = lastId;
                cmd.CommandText = "UPDATE TK_OBJECT SET wbs = @wbs WHERE id = @id";
                NavisworksParameter p = cmd.CreateParameter();
                p.ParameterName = "@wbs";
                p.Value = 1;
                cmd.Parameters.Add(p);
    
                p = cmd.CreateParameter();
                p.ParameterName = "@id";
                p.Value = lastId;
                cmd.Parameters.Add(p);
    
                cmd.ExecuteNonQuery();
             }
             trans.Commit();
          }
    
       }
       return lastId;
    }

    7使用类查询和修改数据

    void UpdateTakeoffValue(Int64 objectId)
    {
       DocumentTakeoff docTakeoff = Autodesk.Navisworks.Api.Application.MainDocument.GetTakeoff();
       //TakeoffVariableCollection TakeoffVariable are the entrance for read/update of the variables
       TakeoffVariableCollection variableCollection = docTakeoff.Objects.SelectInputVariables(objectId);
       Int32 lengthIndex = variableCollection.Find("ModelLength");
       if (lengthIndex != -1)
       {
          TakeoffVariable lengthVariable = variableCollection.GetItem(lengthIndex);
          if (lengthVariable.IsAbleToSetValue)
          {
             lengthVariable.Value = Autodesk.Navisworks.Api.VariantData.FromDouble(5.6);
             using (NavisworksTransaction trans = docTakeoff.Database.BeginTransaction(DatabaseChangedAction.Edited))
             {
                docTakeoff.Objects.UpdateInputVariables(objectId, variableCollection);
                trans.Commit();
             }
          }
       }
    }

    8选择在不同层次的元素在层次结构中

    void SelectUIItem(Int64 itemId)
    {
       TakeoffSelection takeoffSelection = Autodesk.Navisworks.Api.Application.MainDocument.GetTakeoff().CurrentSelection;
       takeoffSelection.BeginEdit();
       takeoffSelection.Items.Clear();
       takeoffSelection.ItemGroups.Clear();
       takeoffSelection.StepResources.Clear();
       takeoffSelection.Steps.Clear();
       takeoffSelection.Items.Add(itemId);
       takeoffSelection.EndEdit();
    }
    粘贴的老外的
  • 相关阅读:
    el-table背景色透明
    判断数组对象里的属性值是否重复
    :Duplicate keys detected: 'xxx'. This may cause an update error.
    钉钉微应用附件下载方案
    探索JS引擎工作原理
    js深度优先遍历和广度优先遍历实现
    微前端qiankun从搭建到部署的实践
    浏览器与Node的事件循环(Event Loop)有何区别?
    JS
    微信小程序预览Word文档
  • 原文地址:https://www.cnblogs.com/w2011/p/4152559.html
Copyright © 2011-2022 走看看