Tekla二次开发课程 基础篇 外部调用内部插件   Component component = new Component();   component.Name = teklaPLuginList.Name;   component.Number = teklaPLuginList.Number;   ComponentInput componentInput = new ComponentInput();   switch (teklaPLuginList.Name)   {       case "DKQGGQCoQ螺栓连接Q螺栓公共节点":           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           componentInput.AddOneInputPosition(new Picker().PickPoint());           componentInput.AddOneInputPosition(new Picker().PickPoint());           break;       case "DKQGGQDoQ边柱与梁Q端板竖放一":           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           break;       case "DKQGGQDoQ边柱与梁Q端板竖放二":           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           break;       case "DKQGGQDoQ边柱与梁Q端板平方":           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           break;       default:           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           componentInput.AddInputObject(new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART));           break;  ​   }   component.SetComponentInput(componentInput);   component.Insert();   _model.CommitChanges(); 获取Tekla文件夹目录    if (_model.GetConnectionStatus())   {        marcofile = "";        TeklaBMP = "";        Teklaexe = "";        string xsbin = "";        TeklaStructuresSettings.GetAdvancedOption("XSBIN", ref xsbin);        DirectoryInfo path = new DirectoryInfo(xsbin);        string tt = path.Parent.Parent.FullName;//上 2层目录        TeklaBMP = tt + "\\Bitmaps\\";        Teklaexe = tt + "\\nt\\bin";        tt += "\\nt\\bin\\plugins\\Tekla\\Model\\ModelTemplates\\KDplugin\\";        marcofile = tt;        List vs = new List();        vs.Add(TeklaBMP);        vs.Add(tt);        vs.Add(Teklaexe);        RememberKey.remeberKeyMethod(vs);        return true;   } 获取插件列表   CatalogHandler catalogHandler = new CatalogHandler();   //组件管理器                                                                       //ComponentItemEnumerator componentItemEnumerator1 = catalogHandler.GetComponentItems();//获取管理器下的组件项  ​   if (catalogHandler.GetConnectionStatus())//有没有链接   {       ComponentItemEnumerator componentItemEnumerator = catalogHandler.GetComponentItems();  ​       int t = catalogHandler.GetComponentItems().GetSize();  ​       while (componentItemEnumerator.MoveNext())//遍历当前组件管理器下的每个插件项       {           string pluginName = componentItemEnumerator.Current.Name;           int pluginNumber = componentItemEnumerator.Current.Number;           string[] type = pluginName.Split(new string[] { "Q" }, StringSplitOptions.RemoveEmptyEntries);           if (type.Length > 0 && type[0] == "DK")           {               switch (type[1])               {                   case "GG":                       switch (type[2]) //简单的switch(){case :beak;....default :break;}//获取到的组件的类型                       {                           case "Do":                               addpluin(pluginName, pluginNumber, teklaPLuginListDo);                               break;                           case "Fr":                               addpluin(pluginName, pluginNumber, teklaPLuginListFr);                               break;                           case "Tr":                               addpluin(pluginName, pluginNumber, teklaPLuginListTr);                               break;                           case "Gr":                               addpluin(pluginName, pluginNumber, teklaPLuginListGr);                               break;                           case "Co":                               addpluin(pluginName, pluginNumber, teklaPLuginListCo);                               break;                           default:                               break;                       }                       break;                   case "GJ":                         //简单的switch(){case :beak;....default :break;}                         //获取到的组件的类型                       switch (type[2])                       {                           case "Pu":                               addpluin(pluginName, pluginNumber, teklaPLuginListPu);                               break;                           case "Pi":                               addpluin(pluginName, pluginNumber, teklaPLuginListPi);                               break;                           case "St":                               addpluin(pluginName, pluginNumber, teklaPLuginListSt);                               break;                           case "Wa":                               addpluin(pluginName, pluginNumber, teklaPLuginListWa);                               break;                           case "Pl":                               addpluin(pluginName, pluginNumber, teklaPLuginListPl);                               break;                           case "Ba":                               addpluin(pluginName, pluginNumber, teklaPLuginListBa);                               break;                           case "Go":                               addpluin(pluginName, pluginNumber, teklaPLuginListGo);                               break;                           default:                               break;                       }                       break;                   case "TZ":                       switch (type[2]) //简单的switch(){case :beak;....default :break;}//获取到的组件的类型                       {                           case "Re":                               addpluin(pluginName, pluginNumber, teklaPLuginListRe);                               break;                           case "As":                               addpluin(pluginName, pluginNumber, teklaPLuginListAs);                               break;                           case "Pa":                               addpluin(pluginName, pluginNumber, teklaPLuginListPa);                               break;                           case "Ga":                               addpluin(pluginName, pluginNumber, teklaPLuginListGa);                               break;                           case "To":                               addpluin(pluginName, pluginNumber, teklaPLuginListTo);                               break;                           default:                               break;                       }                       break;                   case "BB":                       switch (type[2]) //简单的switch(){case :beak;....default :break;}//获取到的组件的类型                       {                           case "Sl":                               addpluin(pluginName, pluginNumber, teklaPLuginListSl);                               break;                           case "Rb":                               addpluin(pluginName, pluginNumber, teklaPLuginListRb);                               break;                           case "Bo":                               addpluin(pluginName, pluginNumber, teklaPLuginListBo);                               break;                           default:                               break;                       }                       break;               }  ​           }  ​       }  ​   } 碰撞检查初始化             ClashCheckOptions clashCheckOptions = new ClashCheckOptions();//碰撞检查初始化:d,t             TeklaStructuresSettings.GetOptions(ref clashCheckOptions);//tekla设置或者得到碰撞将车的值             MessageBox.Show("d=" + clashCheckOptions.BoltHeadDiameter.ToString()                 + "\r\n" + "t=" + clashCheckOptions.NutThickness.ToString(), "Tekla碰撞检查获取");             clashCheckOptions.BoltHeadDiameter = 10.0;//d             clashCheckOptions.NutThickness = 5.0;//t             TeklaStructuresSettings.SetOptions(clashCheckOptions);//设置碰撞检查初始化值的             MessageBox.Show("d=" + clashCheckOptions.BoltHeadDiameter.ToString()                 + "\r\n" + "t=" + clashCheckOptions.NutThickness.ToString(), "碰撞检查修改"); 组件初始化   ComponentOptions componentOptions = new ComponentOptions();//组件   TeklaStructuresSettings.GetOptions(ref componentOptions);//获取   MessageBox.Show(       "板名称" + componentOptions.PlateProfileName + "\r\n" +       "折叠板名称" + componentOptions.FoldedPlateProfileName + "\r\n" +       "螺栓边距系数" + componentOptions.BoltEdgeDistanceFactor + "\r\n" +       "比较距离" + componentOptions.BoltEdgeDistanceReference + "\r\n" +         "螺栓标准" + componentOptions.BoltStandard + "\r\n" +         "螺栓尺寸" + componentOptions.BoltSize + "\r\n" +         "零件材料" + componentOptions.PartMaterial + "\r\n" +         "焊接主构件的零件前缀" + componentOptions.PartWeldedToPrimaryPositionPrefix + "\r\n" +       "焊接主构件的零件起始编号" + componentOptions.PartWeldedToPrimaryStartNumber + "\r\n" +       "焊接次构件的零件前缀" + componentOptions.PartWeldedToSecondaryPositionPrefix + "\r\n" +       "焊接次构件的零件起始编号" + componentOptions.PartWeldedToSecondaryStartNumber + "\r\n" +       "松散零件前缀" + componentOptions.LoosePartPositionPrefix + "\r\n" +       "松散零件其实编号" + componentOptions.LoosePartStartNumber + "\r\n" +       "构件松散零件编号前缀" + componentOptions.AssemblyLoosePartPositionPrefix + "\r\n" +       "构件松散零件编号" + componentOptions.AssemblyLoosePartStartNumber + "\r\n"     , "Tekla组件默认值设置修改");   componentOptions.PlateProfileName = "测试呀名";   componentOptions.FoldedPlateProfileName = "折叠版名称";   componentOptions.BoltEdgeDistanceReference = ComponentOptions.BoltEdgeDistanceReferenceEnum.HOLE_DIAMETER;   TeklaStructuresSettings.SetOptions(componentOptions);//修改 模块配置     MessageBox.Show(         "分析和设计管理=" + ModuleManager.AnalysisAndDesign.ToString() + "\r\n" +         "混凝土=" + ModuleManager.ConcreteDetailing.ToString() + "\r\n" +         "负载建模=" + ModuleManager.LoadModeling.ToString() + "\r\n" +         "多材质建模=" + ModuleManager.MultimaterialModeling.ToString() + "\r\n" +         "钢筋建模=" + ModuleManager.RebarModeling.ToString() + "\r\n" +         "钢结构详图=" + ModuleManager.SteelDetailing.ToString() + "\r\n" +         "任务管理=" + ModuleManager.TaskManagement.ToString() + "\r\n" +         "司晨提醒" + "\r\n" +         "当前程序运行的配置=" + ModuleManager.Configuration, "Tekl软件配置信息"  ​         ); Tekla路径文件相关   TeklaStructuresFiles teklaStructuresFiles = new TeklaStructuresFiles();//寻找Tekla相关文件   List filesList = new List();   int i = 0;   string files = "";   while (i < teklaStructuresFiles.PropertyFileDirectories.Count)   {       files += teklaStructuresFiles.PropertyFileDirectories[i] + "\r\n";       i++;   }//遍历的Tekla相关文件夹   MessageBox.Show(files, "查询路径列表");   string file = teklaStructuresFiles.GetAttributeFile("rebar_with_couplers.tpl").ToString();   //寻找相应文件的文件路径   MessageBox.Show(file);   bool vs = false;   filesList = teklaStructuresFiles.GetMultiDirectoryFileList("rpt", vs);   files = "";   foreach (string tt in filesList)   {       files += tt + "\r\n";   }   MessageBox.Show(files, "查询文件后缀名的列表");   filesList.Clear();   FileInfo tttt = teklaStructuresFiles.GetAttributeFile(teklaStructuresFiles.PropertyFileDirectories, "rebar_with_couplers.tpl");   MessageBox.Show(tttt.ToString(), "查询文件路径"); 版本相关   string infoS = "";   infoS +=   "内部版本=" + TeklaStructuresInfo.GetBuildNumber() + "\r\n" +   "环境安装文件夹=" + TeklaStructuresInfo.GetCommonAppDataFolder() + "\r\n" +   "Tekla结构版权=" + TeklaStructuresInfo.GetCopyRightText() + "\r\n" +   "Tekla结构版本=" + TeklaStructuresInfo.GetCurrentProgramVersion() + "\r\n" +   "Tekla结构用户=" + TeklaStructuresInfo.GetCurrentUser() + "\r\n" +   "Tekla结构的完整注册表项=" + TeklaStructuresInfo.GetFullTSRegistryKeyText() + "\r\n" +   "用户本地appdata文件夹=" + TeklaStructuresInfo.GetLocalAppDataFolder() + "\r\n" +     "Tekla结构的修订日期=" + TeklaStructuresInfo.GetRevisionDate();   MessageBox.Show(infoS, "Tekla结构版本信息"); 浇筑体相关 bool ispourendabled = TeklaStructuresSettings.IsPourEnabled(); MessageBox.Show(ispourendabled.ToString(), "是否启动浇筑体管理"); string istoolOR = ""; istoolOR += "全部工具选项=" + TeklaStructuresSettings.IsToolOptionOn("sel_all") + "\r\n"; istoolOR += "分析节点链接工具选项=" + TeklaStructuresSettings.IsToolOptionOn("sel_analysisnodelinks") + "\r\n"; istoolOR += "分析节点工具选项=" + TeklaStructuresSettings.IsToolOptionOn("sel_analysisnodes") + "\r\n"; istoolOR += "分析部分工具选项=" + TeklaStructuresSettings.IsToolOptionOn("sel_analysisparts") + "\r\n"; istoolOR += "单根钢筋工具选项=" + TeklaStructuresSettings.IsToolOptionOn("sel_single_rebars") + "\r\n\r\n"; istoolOR += "施工线工具选项=" + TeklaStructuresSettings.ToolOptionNames.ConstructionLines + "\r\n"; istoolOR += "自定义对象工具选项=" + TeklaStructuresSettings.ToolOptionNames.CustomObjects + "\r\n"; istoolOR += "切割工具选项=" + TeklaStructuresSettings.ToolOptionNames.Cuts + "\r\n"; istoolOR += "直接操作工具选项=" + TeklaStructuresSettings.ToolOptionNames.DirectManipulation + "\r\n"; istoolOR += "过滤器对话框工具选项=" + TeklaStructuresSettings.ToolOptionNames.DisplaySelectionFilterDialog + "\r\n"; istoolOR += "距离工具选项=" + TeklaStructuresSettings.ToolOptionNames.Distances + "\r\n"; istoolOR += "轴网工具选项=" + TeklaStructuresSettings.ToolOptionNames.Grid + "\r\n"; istoolOR += "轴网线工具选项=" + TeklaStructuresSettings.ToolOptionNames.GridLine + "\r\n"; istoolOR += "节点工具选项=" + TeklaStructuresSettings.ToolOptionNames.Joints + "\r\n"; istoolOR += "负载工具选项=" + TeklaStructuresSettings.ToolOptionNames.Loads + "\r\n"; istoolOR += "节点中对象工具选项=" + TeklaStructuresSettings.ToolOptionNames.ObjectsInJoints + "\r\n"; istoolOR += "零件工具选项=" + TeklaStructuresSettings.ToolOptionNames.Parts + "\r\n"; istoolOR += "平面工具选项=" + TeklaStructuresSettings.ToolOptionNames.Planes + "\r\n"; istoolOR += "点工具选项=" + TeklaStructuresSettings.ToolOptionNames.Points + "\r\n"; istoolOR += "终止工具选项=" + TeklaStructuresSettings.ToolOptionNames.PourBreaks + "\r\n"; istoolOR += "钢筋组工具选项=" + TeklaStructuresSettings.ToolOptionNames.RebarGroup + "\r\n"; istoolOR += "钢筋工具选项=" + TeklaStructuresSettings.ToolOptionNames.Rebars + "\r\n"; istoolOR += "参考模型工具选项=" + TeklaStructuresSettings.ToolOptionNames.ReferenceModels + "\r\n"; istoolOR += "螺丝钉工具选项=" + TeklaStructuresSettings.ToolOptionNames.Screws + "\r\n"; istoolOR += "选择构件工具选项=" + TeklaStructuresSettings.ToolOptionNames.SelectAssemblies + "\r\n"; istoolOR += "选择构建中的对象工具选项=" + TeklaStructuresSettings.ToolOptionNames.SelectObjectsInAssemblies + "\r\n"; istoolOR += "选择任务工具选项=" + TeklaStructuresSettings.ToolOptionNames.SelectTasks + "\r\n"; istoolOR += "单根栓钉工具选项=" + TeklaStructuresSettings.ToolOptionNames.SingleScrews + "\r\n"; istoolOR += "表面工具选项=" + TeklaStructuresSettings.ToolOptionNames.Surfaces + "\r\n"; istoolOR += "视图工具选项=" + TeklaStructuresSettings.ToolOptionNames.Views + "\r\n"; istoolOR += "焊缝工具选项=" + TeklaStructuresSettings.ToolOptionNames.Weldings + "\r\n"; MessageBox.Show(istoolOR, "工具选项"); //TeklaStructuresSettings.GetAdvancedOption("XS_ENABLE_POUR_MANAGEMENT",ref istoolOR); TeklaStructuresSettings.GetAdvancedOption("XS_POUR_BREAK_COLOR", ref istoolOR); MessageBox.Show(istoolOR, "高级选项的名称"); 轮廓点相关 Beam beam = (Beam)new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART);//获取对象 Solid solid = beam.GetSolid(); FaceEnumerator faceEnumerator = solid.GetFaceEnumerator();//获取到的面 集合 int i = 0; while (faceEnumerator.MoveNext()) //每个面 { LoopEnumerator loopEnumerator = faceEnumerator.Current.GetLoopEnumerator();//获取当前面上的边 集合 while (loopEnumerator.MoveNext()) //每条当前面上的边 { VertexEnumerator vertexEnumerator = loopEnumerator.Current.GetVertexEnumerator();//壳体上的 点的 集合 while (vertexEnumerator.MoveNext())// 壳体上的点(单独点) { dataGridView1.Rows.Add();//添加表中一行 dataGridView1.Rows[i].Cells[0].Value = string.Format("坐标点{0}", i); dataGridView1.Rows[i].Cells[1].Value = vertexEnumerator.Current as Point;//当前面上的当前闭合线上形成壳体上的一点 i++; } } } 菜单栏修改 string sourceFile = @"albl_up_Developer--main_menu.xml"; string destinationFile = @"C:\Users\Administrator\AppData\Local\Trimble\Tekla Structures\2020.0\UI\Ribbons\albl_up_Developer--main_menu.xml"; bool isrewrite = true; // true=覆盖已存在的同名文件,false则反之 System.IO.File.Copy(sourceFile, destinationFile, isrewrite); 图纸管理器 string str = "基础属性\r\n\r\n"; DrawingHandler drawingHandler = new DrawingHandler();//图纸列表管理器 var drawings= drawingHandler.GetDrawings();//获取图纸列表 while (drawings.MoveNext()) { str += "图纸名称:" + drawings.Current.Name + "\r\n\r\n"; str += "图纸类型:" + drawings.Current.GetType() + "\r\n\r\n"; str += "图纸编号:" + drawings.Current.Mark + "\r\n\r\n"; str += "冻结状态:" + ((drawings.Current as Drawing).IsFrozen == true ? "冻结" : "没冻结") + "\r\n\r\n"; str += "锁定状态:" + ((drawings.Current as Drawing).IsLocked == true ? "锁定" : "没锁定") + "\r\n\r\n"; str += "标题 1:" + drawings.Current.Title1 + "\r\n\r\n"; } return str; Tekla外部窗体继承 Tekla.Structures.Dialog.ApplicationFormBase 初始化当中进行 public partial class Form1 : ApplicationFormBase { public Form1() { InitializeComponent(); InitializeForm(); if (GetConnectionStatus()) { string messageFolder = null; TeklaStructuresSettings.GetAdvancedOption("XS_MESSAGES", ref messageFolder); messageFolder = Path.Combine(messageFolder, @"DotAppsStrings"); Dialogs.SetSettings(string.Empty); Localization.Language = (string)Settings.GetValue("language"); Localization.LoadFile(Path.Combine(messageFolder, Application.ProductName + ".xml")); Localization.Localize(this); } else { MessageBox.Show("Tekla Structures is NOT running..."); } } //与Tekla主窗体同进退 class Program : WindowsFormsApplicationBase { public Program() { IsSingleInstance = true; EnableVisualStyles = true; } protected override void OnCreateMainForm() { MainForm = new Form1(); MainForm.Show(TeklaStructures.MainWindow); } protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) { eventArgs.BringToForeground = true; base.OnStartupNextInstance(eventArgs); } /// /// 应用程序的主入口点。 /// [STAThread] static void Main(string[] args) { if (TeklaStructures.Connect()) { TeklaStructures.Closed += delegate { Application.Exit(); }; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); try { Program program = new Program(); program.Run(args); } finally { TeklaStructures.Disconnect(); } } } } 属性大全 梁柱 Part beam = new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART) as Part;//选择一根梁 string property = "基础属性\r\n\r\n"; //基础属性 property += "类型: " + beam.GetType().Name + "\r\n\r\n";//名称 property += "名称: " + beam.Name + "\r\n\r\n";//名称 property += "截面: " + beam.Profile.ProfileString + "\r\n\r\n";//截面 property += "材料: " + beam.Material.MaterialString + "\r\n\r\n";//材料 property += "完成: " + beam.Finish + "\r\n\r\n";//完成 property += "等级: " + beam.Class + "\r\n\r\n";//等级 property += "零件前缀: " + beam.PartNumber.Prefix + "\r\n\r\n";//零件前缀 property += "零件编号: " + beam.PartNumber.StartNumber + "\r\n\r\n";//零件编号 property += "构件前缀: " + beam.AssemblyNumber.Prefix + "\r\n\r\n";//构件前缀 property += "构件编号: " + beam.AssemblyNumber.StartNumber + "\r\n\r\n";//构件编号 property += "构件垂直方向位置: " + beam.Position.Depth + "\r\n\r\n";//构件垂直方向位置 property += "位置偏移: " + beam.Position.DepthOffset + "\r\n\r\n";//位置偏移 if (beam.GetType() == typeof(Beam)) { property += "旋转位置: " + beam.Position.Rotation + "\r\n\r\n";//旋转位置 property += "位置偏移: " + beam.Position.RotationOffset + "\r\n\r\n";//位置偏移 property += "水平方向位置: " + beam.Position.Plane + "\r\n\r\n";//水平方向位置 property += "位置偏移: " + beam.Position.PlaneOffset + "\r\n\r\n";//位置偏移 property += "起点x偏移: " + ((Beam)beam).StartPointOffset.Dx + "\r\n\r\n";// property += "起点y偏移: " + ((Beam)beam).StartPointOffset.Dy + "\r\n\r\n";// property += "起点z偏移: " + ((Beam)beam).StartPointOffset.Dz + "\r\n\r\n";// property += "终点x偏移: " + ((Beam)beam).EndPointOffset.Dx + "\r\n\r\n";// property += "终点y偏移: " + ((Beam)beam).EndPointOffset.Dy + "\r\n\r\n";// property += "终点z偏移: " + ((Beam)beam).EndPointOffset.Dz + "\r\n\r\n";// property += "扭曲起点: " + beam.DeformingData.Angle + "\r\n\r\n";//扭曲起点 property += "扭曲终点: " + beam.DeformingData.Angle2 + "\r\n\r\n";//扭曲终点 property += "起拱: " + beam.DeformingData.Cambering + "\r\n\r\n";//起拱 property += "减短: " + beam.DeformingData.Shortening + "\r\n\r\n";//减短 } textBox1.Text = property; //进阶属性 property = ""; string pos = ""; int pos2 = 0; double pos1 = 0.0; Phase phase; property += "进阶属性" + "\r\n\r\n"; property += "零件编号:" + beam.GetReportProperty("PART_POS", ref pos) + ":" + pos + "\r\n\r\n"; property += "状态:" + beam.GetPhase(out phase) + ":" + phase.PhaseName + "\r\n\r\n"; property += "重量:" + beam.GetReportProperty("WEIGHT", ref pos1) + ":" + pos1 + "\r\n\r\n"; property += "体积:" + beam.GetReportProperty("VOLUME", ref pos1) + ":" + pos1 + "\r\n\r\n"; property += "长度:" + beam.GetReportProperty("LENGTH", ref pos1) + ":" + pos1 + "\r\n\r\n"; property += "数量:" + beam.GetAssembly().GetReportProperty("NUMBER", ref pos2) + ":" + pos2 + "\r\n\r\n"; property += "顶面标高:" + beam.GetReportProperty("TOP_LEVEL", ref pos) + ":" + pos + "\r\n\r\n"; property += "底面标高:" + beam.GetReportProperty("BOTTOM_LEVEL", ref pos) + ":" + pos + "\r\n\r\n"; property += "平面位置:" + beam.GetAssembly().GetReportProperty("POSITION_CODE", ref pos) + ":" + pos + "\r\n\r\n"; textBox2.Text = property; 焊缝 Weld weld = new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_WELD) as Weld;//选择一根梁 string basicproperty = "基础属性\r\n\r\n"; basicproperty += "类型:" + weld.GetType().Name + "\r\n\r\n"; basicproperty += "边缘-四周:" + (weld.AroundWeld == true ? "四周" : "边缘") + "\r\n\r\n"; basicproperty += "工厂-车间:" + (weld.ShopWeld == true ? "工地" : "车间") + "\r\n\r\n"; basicproperty += "位置:" + weld.Position + "\r\n\r\n"; basicproperty += "形状:" + weld.IntermittentType + "\r\n\r\n"; basicproperty += "连接为:" + (weld.ConnectAssemblies == true ? "次零件" : "次构件") + "\r\n\r\n";// basicproperty += "布置:" + weld.Placement + "\r\n\r\n"; //basicproperty += "预加工:" + weld.Preparation + "\r\n\r\n";//预加工为主零件 basicproperty += "上部的线前缀:" + weld.PrefixAboveLine + "\r\n\r\n";//上部的线前缀 basicproperty += "上部焊缝的类型:" + weld.TypeAbove + "\r\n\r\n";//上部焊缝的类型 basicproperty += "上部的尺寸:" + weld.SizeAbove + "\r\n\r\n";//上部的尺寸 basicproperty += "上部的角度:" + weld.AngleAbove + "\r\n\r\n";//上部的角度 basicproperty += "上部轮廓类型:" + weld.ContourAbove + "\r\n\r\n";//上部轮廓类型 basicproperty += "上部完成的类型:" + weld.FinishAbove + "\r\n\r\n";//完成的类型 basicproperty += "上部焊角面:" + weld.RootFaceAbove + "\r\n\r\n"; basicproperty += "上部有效喉高:" + weld.EffectiveThroatAbove + "\r\n\r\n"; basicproperty += "上部根部开孔:" + weld.RootOpeningAbove + "\r\n\r\n"; basicproperty += "上部增量编号:" + weld.IncrementAmountAbove + "\r\n\r\n"; basicproperty += "上部长度:" + weld.LengthAbove + "\r\n\r\n"; basicproperty += "上部斜度:" + weld.PitchAbove + "\r\n\r\n"; basicproperty += "下部的线前缀:" + weld.PrefixBelowLine + "\r\n\r\n";//下部的线前缀 basicproperty += "下部焊缝的类型:" + weld.TypeBelow + "\r\n\r\n";//下部焊缝的类型 basicproperty += "下部的尺寸:" + weld.SizeBelow + "\r\n\r\n";//下部的尺寸 basicproperty += "下部的角度:" + weld.AngleBelow + "\r\n\r\n";//下部的角度 basicproperty += "下部轮廓类型:" + weld.ContourBelow + "\r\n\r\n";//下部轮廓类型 basicproperty += "下部完成的类型:" + weld.FinishBelow + "\r\n\r\n";//完成的类型 basicproperty += "下部焊角面:" + weld.RootFaceBelow + "\r\n\r\n"; basicproperty += "下部有效喉高:" + weld.EffectiveThroatBelow + "\r\n\r\n"; basicproperty += "下部根部开孔:" + weld.RootOpeningBelow + "\r\n\r\n"; basicproperty += "下部增量编号:" + weld.IncrementAmountBelow + "\r\n\r\n"; basicproperty += "下部长度:" + weld.LengthBelow + "\r\n\r\n"; basicproperty += "下部斜度:" + weld.PitchBelow + "\r\n\r\n"; basicproperty += "NDT检验类型:" + weld.NDTInspection + "\r\n\r\n";//NDT检验类型 basicproperty += "焊条的分类:" + weld.ElectrodeClassification + "\r\n\r\n";//焊条的分类 basicproperty += "焊条的强度:" + weld.ElectrodeStrength + "\r\n\r\n";//焊条的强度 basicproperty += "焊条的系数:" + weld.ElectrodeCoefficient + "\r\n\r\n";//焊条的系数 basicproperty += "过程类型:" + weld.ProcessType + "\r\n\r\n";//过程类型 basicproperty += "评注:" + weld.ReferenceText + "\r\n\r\n"; textBox3.Text = basicproperty; //进阶类型 double ww1 = 0.0; string ww = ""; basicproperty = "进阶属性\r\n\r\n"; basicproperty += "焊缝编号:" + weld.GetReportProperty("WELD_NUMBER", ref ww) + ":" + ww + "\r\n\r\n"; basicproperty += "父编号:" + weld.GetReportProperty("WELD_FATHER_NUMBER", ref ww) + ":" + ww + "\r\n\r\n"; basicproperty += "长度:" + weld.GetReportProperty("LENGTH", ref ww1) + ":" + ww1 + "\r\n\r\n"; textBox4.Text = basicproperty; 构件 double num = 0.0; string number = ""; Assembly assembly = new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_OBJECT) as Assembly;//选择一根梁 string basicproperty = "基础属性\r\n\r\n"; basicproperty += "类型" + assembly.GetAssemblyType() + "\r\n\r\n"; basicproperty += "重量" + assembly.GetReportProperty("ASSEMBLY_WEIGHT", ref num) + ":" + num + "\r\n\r\n"; basicproperty += "体积" + assembly.GetReportProperty("ASSEMBLY_VOLUME", ref num) + ":" + num + "\r\n\r\n"; basicproperty += "长度" + assembly.GetReportProperty("LENGTH", ref num) + ":" + num + "\r\n\r\n"; basicproperty += "数量" + assembly.GetReportProperty("NUMBER", ref num) + ":" + num + "\r\n\r\n"; basicproperty += "顶标高" + assembly.GetReportProperty("ASSEMBLY_TOP_LEVEL", ref number) + ":" + number + "\r\n\r\n"; basicproperty += "底标高" + assembly.GetReportProperty("ASSEMBLY_BOTTOM_LEVEL", ref number) + ":" + number + "\r\n\r\n"; basicproperty += "构件位置" + assembly.GetReportProperty("ASSEMBLY_POSITION_CODE", ref number) + ":" + number + "\r\n\r\n"; textBox6.Text = basicproperty; basicproperty = "进阶属性\r\n\r\n"; basicproperty += "构件编号" + assembly.GetReportProperty("ASSEMBLY_POS", ref number) + ":" + number + "\r\n\r\n"; basicproperty += "主零件" + assembly.GetMainPart().GetReportProperty("PART_POS", ref number) + ":" + number + "\r\n\r\n"; var secondes = assembly.GetSecondaries(); int i = 1; foreach (Part part in secondes) { if (part.GetType() == typeof(Beam)) { basicproperty += string.Format("次零件{0}梁编号", i) + part.GetReportProperty("PART_POS", ref number) + ":" + number + "\r\n\r\n"; basicproperty += string.Format("次零件{0}梁截面", i) + part.Profile.ProfileString + "\r\n\r\n"; if (part.GetWelds().GetSize() > 0) { var welds = part.GetWelds(); while (welds.MoveNext()) { basicproperty += string.Format("次零件{0}焊缝编号", i) + (welds.Current as Weld).GetReportProperty("WELD_NUMBER", ref number) + ":" + number + "\r\n\r\n"; } } } if (part.GetType() == typeof(ContourPlate)) { basicproperty += string.Format("次零件{0}板编号", i) + part.GetReportProperty("PART_POS", ref number) + ":" + number + "\r\n\r\n"; basicproperty += string.Format("次零件{0}板截面", i) + part.Profile.ProfileString + "\r\n\r\n"; if (part.GetWelds().GetSize() > 0) { var welds = part.GetWelds(); while (welds.MoveNext()) { basicproperty += string.Format("次零件{0}焊缝编号", i) + (welds.Current as Weld).GetReportProperty("WELD_NUMBER", ref number) + ":" + number + "\r\n\r\n"; } } } i++; } textBox5.Text = basicproperty; 螺栓 BoltArray boltArray = new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_BOLTGROUP) as BoltArray;//选择螺栓 string basicproperty = "基础属性\r\n\r\n"; basicproperty += "螺栓的主零件: " + boltArray.PartToBeBolted.GetPartMark() + "\r\n\r\n" + "螺栓的次零件: " + boltArray.PartToBoltTo.GetPartMark() + "\r\n\r\n" + "螺栓的尺寸: " + boltArray.BoltSize + "\r\n\r\n" + "螺栓孔尺寸: " + (boltArray.BoltSize + boltArray.Tolerance) + "\r\n\r\n" + "螺栓类型: " + boltArray.BoltType + "\r\n\r\n" + "螺栓标准 : " + boltArray.BoltStandard + "\r\n\r\n" + "螺栓标准 : " + boltArray.BoltStandard + "\r\n\r\n" + "螺栓杆件长度 : " + boltArray.Length + "\r\n\r\n" + "螺栓附加长度 : " + boltArray.ExtraLength + "\r\n\r\n" + "螺栓切割长度 : " + boltArray.CutLength + "\r\n\r\n" + "剪切面是否有螺纹 : " + boltArray.ThreadInMaterial + "\r\n\r\n" + "在平面上 : " + boltArray.Position.Plane + "\r\n\r\n" + "在旋转上 : " + boltArray.Position.Rotation + "-" + boltArray.Position.RotationOffset + "\r\n\r\n" + "螺栓主杆件 : " + (boltArray.Bolt == true ? "有" : "无") + "\r\n\r\n" + "螺帽侧垫圈1有无:" + (boltArray.Washer1 == true ? "有" : "无") + "\r\n\r\n" + "螺母侧垫圈1有无:" + (boltArray.Washer2 == true ? "有" : "无") + "\r\n\r\n" + "螺母侧垫圈2有无:" + (boltArray.Washer3 == true ? "有" : "无") + "\r\n\r\n" + "螺母1有无:" + (boltArray.Nut1 == true ? "有" : "无") + "\r\n\r\n" + "螺母2有无:" + (boltArray.Nut2 == true ? "有" : "无") + "\r\n\r\n" + "扩大孔5个:" + (boltArray.Hole1 == true ? "有" : "无") + "\r\n\r\n" + "有无扩大孔:" + (boltArray.HoleType == BoltGroup.BoltHoleTypeEnum.HOLE_TYPE_OVERSIZED ? "有" : "无") + "\r\n\r\n" + "有扩大孔则孔直径为:" + (boltArray.BoltSize + boltArray.Tolerance + boltArray.SlottedHoleX) + "\r\n\r\n" + "旋转槽:" + boltArray.RotateSlots + "\r\n\r\n" + "x方向上的间距:" + boltArray.GetBoltDistX(0).ToString() + "\r\n\r\n" + "y方向上的间距:" + boltArray.GetBoltDistY(0).ToString() + "\r\n\r\n" + "起点Dx偏移:" + boltArray.StartPointOffset.Dx + "\r\n\r\n" + "终点Dx偏移:" + boltArray.EndPointOffset.Dx + "\r\n\r\n"; textBox8.Text = basicproperty; int t = 0; string str = ""; basicproperty = "进阶属性\r\n\r\n"; basicproperty += "本身构件编号:" + boltArray.GetReportProperty("SECONDARY_1.ASSEMBLY_POS", ref str) + "-" + str + "\r\n\r\n"; basicproperty += "连接构件:" + boltArray.GetReportProperty("CONNECTED_ASSEMBLIES", ref str) + "-" + str + "\r\n\r\n"; basicproperty += "连接零件:" + boltArray.GetReportProperty("CONNECTED_PARTS", ref str) + "-" + str + "\r\n\r\n"; basicproperty += "螺栓数量:" + boltArray.GetReportProperty("NUMBER", ref t) + "-" + t + "\r\n\r\n"; textBox7.Text = basicproperty; 插件或组件 string t1 = "", t2 = "", t3 = "", t4 = "", t5 = ""; CatalogHandler catalogHandler = new CatalogHandler();//组件管理器 if (catalogHandler.GetConnectionStatus())//有没有链接 { ComponentItemEnumerator componentItemEnumerator = catalogHandler.GetComponentItems();//获取管理器下的组件项 //t1 = componentItemEnumerator.GetSize().ToString() + "\r\n\r\n";//获取插件的个数 while (componentItemEnumerator.MoveNext())//遍历当前组件管理器下的每个插件项 { if (componentItemEnumerator.Current.Name == "DkBoltCommon") { t1 += "插件编号:" + (componentItemEnumerator.Current as ComponentItem).Name + "\r\n\r\n" + "插件名称:" + componentItemEnumerator.Current.Name + "\r\n\r\n" + "插件UI:" + componentItemEnumerator.Current.UIName + "\r\n\r\n" + "插件类型:" + componentItemEnumerator.Current.Type; } componentItemEnumerator.Current.Select(componentItemEnumerator.Current.Name, componentItemEnumerator.Current.Number); t2 += "插件编号:" + componentItemEnumerator.Current.Number + "\r\n\r\n";//插件编号 t3 += "UI名称:" + componentItemEnumerator.Current.UIName + "\r\n\r\n";//插件UI界面名称 switch (componentItemEnumerator.Current.Type.ToString()) //简单的switch(){case :beak;....default :break;}//获取到的组件的类型 { case "UNKNOWN": t4 += "未知类型" + "\r\n\r\n"; break; case "CONNECTION": t4 += "连接类型" + "\r\n\r\n"; break; case "COMPONENT": t4 += "自定义组件类型" + "\r\n\r\n"; break; case "SEAM": t4 += "接缝类型" + "\r\n\r\n"; break; case "DETAIL": t4 += "详细类型" + "\r\n\r\n"; break; case "CUSTOM_PART": t4 += "自定义零件对象" + "\r\n\r\n"; break; case "DRAWING_PLUGIN": t4 += "绘图插件" + "\r\n\r\n"; break; default: t4 += "那我就不知道了" + "\r\n\r\n"; break; } } } textBox9.Text = t1; textBox10.Text = t2; textBox15.Text = t3; textBox16.Text = t4; 浇筑体 string str = ""; int t = 0; Part castA = new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART) as Part;//选择零件对象 Assembly cast = castA.GetAssembly();//获取土建浇筑体,获取钢结构构件 string castproperty = "零件属性\r\n\r\n"; castproperty += "对象类型:" + castA.GetAssembly().GetType().Name + "\r\n\r\n"; castproperty += "零件ID:" + castA.Identifier.ToString() + "\r\n\r\n";//重点 castproperty += "零件编号:" + castA.GetReportProperty("PART_POS", ref str) + ":" + str + "\r\n\r\n"; castproperty += "零件数量:" + castA.GetReportProperty("NUMBER", ref t) + ":" + t + "\r\n\r\n"; castproperty += "零件状态:" + castA.GetReportProperty("PHASE.NAME", ref str) + ":" + str + "\r\n\r\n"; castproperty += "零件名称:" + castA.Name + "\r\n\r\n"; castproperty += "零件平面位置:" + castA.GetAssembly().GetReportProperty("POSITION_CODE", ref str) + ":" + str + "\r\n\r\n"; castproperty += "零件顶部标高:" + castA.GetReportProperty("TOP_LEVEL", ref str) + ":" + str + "\r\n\r\n"; castproperty += "零件底部标高:" + castA.GetReportProperty("BOTTOM_LEVEL", ref str) + ":" + str + "\r\n\r\n"; textBox12.Text = castproperty; castproperty = "浇筑体属性\r\n\r\n"; castproperty += "对象类型:" + cast.GetAssemblyType().ToString() + "\r\n\r\n"; castproperty += "浇筑体ID:" + cast.Identifier.ToString() + "\r\n\r\n";//重点 castproperty += "浇筑体编号:" + cast.GetReportProperty("CAST_UNIT_POS", ref str) + ":" + str + "\r\n\r\n"; castproperty += "浇筑体数量:" + cast.GetReportProperty("NUMBER", ref t) + ":" + t + "\r\n\r\n"; castproperty += "浇筑体状态:" + cast.GetReportProperty("PHASE.NAME", ref str) + ":" + str + "\r\n\r\n"; castproperty += "浇筑体名称:" + cast.GetReportProperty("MAINPART.NAME", ref str) + ":" + str + "\r\n\r\n"; castproperty += "浇筑体平面位置:" + cast.GetReportProperty("CAST_UNIT_POSITION_CODE", ref str) + ":" + str + "\r\n\r\n"; castproperty += "浇筑体顶部标高:" + cast.GetReportProperty("TOP_LEVEL", ref str) + ":" + str + "\r\n\r\n"; castproperty += "浇筑体底部标高:" + cast.GetReportProperty("BOTTOM_LEVEL", ref str) + ":" + str + "\r\n\r\n"; textBox11.Text = castproperty; 钢筋 ArrayList arrayList = new ArrayList();//集合 Part castA = new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART) as Part;//选择零件对象 int t = 0; double st = 0.0; string str = ""; string castproperty = "基本属性\r\n\r\n"; string castproperty2 = "特殊属性\r\n\r\n"; var rebars = castA.GetChildren();//获取浇筑体\土建的对象上的钢筋时候,用到的方法。 //while (rebars.MoveNext()) //{ // if (rebars.Current.GetType() == typeof(RebarGroup) // || rebars.Current.GetType() == typeof(SingleRebar) // || rebars.Current.GetType() == typeof(RebarSet))//只有当浇筑体的子集里面是钢筋、单根钢筋、钢筋设置才进行获取属性。 // { // arrayList.Add(rebars.Current); // castproperty += "对象类型:" + rebars.Current.GetType() + "\r\n\r\n"; // castproperty += "钢筋编号:" + rebars.Current.GetReportProperty("REBAR_POS", ref str) + ":" + str + "\r\n\r\n"; // castproperty += "钢筋数量:" + rebars.Current.GetReportProperty("NUMBER", ref t) + ":" + t + "\r\n\r\n"; // castproperty += "钢筋等级:" + rebars.Current.GetReportProperty("GRADE", ref str) + ":" + str + "\r\n\r\n"; // castproperty += "钢筋尺寸:" + rebars.Current.GetReportProperty("SIZE", ref str) + ":" + str + "\r\n\r\n"; // castproperty += "钢筋长度:" + rebars.Current.GetReportProperty("LENGTH", ref st) + ":" + st + "\r\n\r\n"; // castproperty += "钢筋单重:" + rebars.Current.GetReportProperty("WEIGHT", ref st) + ":" + st + "\r\n\r\n"; // castproperty += "钢筋总重:" + st * t + "\r\n\r\n"; // //重点,钢筋形状的大样图(示意图) // castproperty2 += "钢筋形状:" + rebars.Current.GetReportProperty("SHAPE", ref str) + ":" + str + "\r\n\r\n"; // } //} textBox14.Text = castproperty; textBox13.Text = castproperty2; 图纸管理器属性 string str = "基础属性\r\n\r\n"; DrawingHandler drawingHandler = new DrawingHandler();//图纸列表管理器 var drawings= drawingHandler.GetDrawings();//获取图纸列表 while (drawings.MoveNext()) { str += "图纸名称:" + drawings.Current.Name + "\r\n\r\n"; str += "图纸类型:" + drawings.Current.GetType() + "\r\n\r\n"; str += "图纸编号:" + drawings.Current.Mark + "\r\n\r\n"; str += "冻结状态:" + ((drawings.Current as Drawing).IsFrozen == true ? "冻结" : "没冻结") + "\r\n\r\n"; str += "锁定状态:" + ((drawings.Current as Drawing).IsLocked == true ? "锁定" : "没锁定") + "\r\n\r\n"; str += "标题 1:" + drawings.Current.Title1 + "\r\n\r\n"; } return str; 零件翼缘板等属性 double thickness = 0.0, length = 0.0, weight = 0.0, width = 0.0; Part part = new Picker().PickObject(Picker.PickObjectEnum.PICK_ONE_PART) as Part;//选择零件 string str = "基础属性\r\n\r\n";//定义字符串 str += "截面:" + part.Profile.ProfileString + "\r\n\r\n"; str += "材料:" + part.Material.MaterialString + "\r\n\r\n"; str += "长度:" + part.GetReportProperty("LENGTH", ref length) + "-" + length + "\r\n\r\n"; str += "重量:" + part.GetReportProperty("WEIGHT", ref weight) + "-" + weight + "\r\n\r\n"; textBox20.Text = str; double weights = 0.0; part.GetReportProperty("FLANGE_THICKNESS_U", ref thickness); part.GetReportProperty("FLANGE_WIDTH_U", ref width); part.GetReportProperty("FLANGE_LENGTH_U", ref length); str = "进阶属性\r\n\r\n";//定义字符串 str += "上翼缘板截面:" + "PL" + thickness + "*" + width + "\r\n\r\n"; str += "上翼缘板长度:" + length + "\r\n\r\n"; //weights += (7.85 * thickness * width * length / 1000000); //str += "上翼缘板重量:" +weights+ "\r\n\r\n"; //腹板 part.GetReportProperty("PROFILE.WEB_THICKNESS", ref thickness); part.GetReportProperty("WEB_WIDTH", ref width); part.GetReportProperty("WEB_LENGTH", ref length); str += "腹板截面:" + "PL" + thickness + "*" + width + "\r\n\r\n"; str += "腹板长度:" + length + "\r\n\r\n"; //weights += (7.85 * thickness * width * length / 1000000); //str += "腹板重量:" + (7.85 * thickness * width * length / 1000000) + "\r\n\r\n"; //下翼缘板 part.GetReportProperty("FLANGE_THICKNESS_B", ref thickness); part.GetReportProperty("FLANGE_WIDTH_B", ref width); part.GetReportProperty("FLANGE_LENGTH_B", ref length); str += "下翼缘板截面:" + "PL" + thickness + "*" + width + "\r\n\r\n"; str += "下翼缘板长度:" + length + "\r\n\r\n"; //weights += (7.85 * thickness * width * length / 1000000); //str += "下翼缘板重量:" + (7.85 * thickness * width * length / 1000000) + "\r\n\r\n"; //str += "总重"+weights; textBox19.Text = str; 打开插件列表选择并返回数据 Tekla.Structures.Dialog.UIControls.ComponentCatalog componentCatalog1; private void Component_Click(object sender, EventArgs e) { componentCatalog1.SelectedName = textBox9.Text; componentCatalog1.SelectedNumber = string.IsNullOrEmpty(textBox10.Text) ? Constants.XS_DEFAULT : int.Parse(textBox10.Text); } private void Component_selectionDone(object sender, EventArgs e) { SetAttributeValue(textBox9, componentCatalog1.SelectedName); SetAttributeValue(textBox10, componentCatalog1.SelectedNumber); } 获取对象的截面类型(是板) pickobjects.Current.GetReportProperty("PROFILE_TYPE", ref str);   模型篇 模型编号 //宏命令 namespace Tekla.Technology.Akit.UserScript { public class Script { public static void Run(Tekla.Technology.Akit.IScript akit) { // akit.Callback("acmd_partnumbers_all", "", "main_frame"); akit.Callback("acmd_partnumbers_selected", "", "main_frame"); } } } 焊接工艺笔记 焊接方法及焊透种类 代号 焊接方法 焊透种类 GC 气体保护电弧焊 完全焊透 GP 药芯焊丝自保护焊 部分焊透 SC 埋弧焊 完全焊透 SP 埋弧焊 部分焊透 SL 电渣焊 完全焊透 焊接接头 利用焊接方法连接而成的接头称为焊接接头,焊接接头在焊接件中起着连接和传递载荷的作用。 它由焊缝、热影响区及附近的母材组成,见图。 焊缝又叫熔化区,由熔化的母材金属和焊丝金属混合而成。 焊缝和热影响区之间的过渡区域称为熔合区,该区域为半熔化区。热影响区是受到电弧热量影响但没有发生熔化的区域,它分为两个部分: 过热热影响区和低温热影响区。 过热热影响区通常会出现严重的晶粒长大,又称粗晶热影响区。 焊接接头形式 焊接接头有10种类型,分别是常见的:对接接头、搭接接头、角接接头、T形接头,不常见的:端接接头、十字接头、套管接头、斜对接接头、卷边接头和锁底接头,其示意图如图所示。 焊接坡口 什么是坡口?开坡口的目的是什么? 焊接前,将工件的待焊端部加工成一定形状,组对后形成的沟槽称为坡口。 开坡口的主要目的是为了实现完全熔透。此外还可调整焊缝成分及性能、改善结晶条件,提高接头性能。 表征坡口几何形状及尺寸的参数有哪些? 表征坡口几何形状及尺寸参数有根部间隙、钝边、坡口角度、坡口面角度、U形根部半径等,如图所示。 对于卷边坡口,表征坡口几何形状及尺寸的参数还有卷边高度和卷边半径,如图所示。 对接接头常用坡口形式有哪些? 对接接头的坡口形式有单I形、单边V形、双单边V形(也称K形)、V形、双V形(也称X形)、J形、双」形、U形、双U型、喇叭单边V型、喇叭V型、卷边对接等,见图: 角接接头常用坡口形式有哪些? 角接接头的常用坡口形式有I形坡口、外角V形坡口、外角单边V形坡口、内角单边V形坡口、外角U形坡口、外角J形坡口、内角J形坡口、内角单边喇叭V形坡口、喇叭V形坡口、内角单边喇叭外角端接等几种形式,见图: T形型接头常用坡口形式有哪些? T形接头常见的坡口有I形坡口、单边V形坡口、双单边V形坡口、J形坡口和喇叭单边V形坡口等几种形式,见图: 端接接头常用坡口形式有哪些? 端接接头常见的坡口有I型坡口、单边V形坡口、V形坡口、J形坡口、U形坡口和喇叭V形坡口等几种形式,见图: 搭接接头常用坡口形式有哪些? 搭接接头常见的坡口有I形坡口、单边V形坡口、J形坡口等几种形式,见图: 焊缝形式及形状尺寸 焊接等级及检测 按照《建筑钢结构焊接技术规程》(JGJ81-2002)规定,钢结构焊缝质量等级分为3级,分别为一级焊缝、二级焊缝、三级焊缝。其中以一级焊缝的要求最高,二级焊缝次之,三级焊缝要求最低。焊缝检测一般包括外观检测和无损探伤检测,焊缝无损探伤检测主要包括超声检测、磁粉检测、液体渗透检测、射线检测其中以超声检测使用最为常见。 根据《建筑钢结构焊接技术规程》(JGJ81-2002)规定,各等级焊缝外观应符合下列要求: 一级焊缝:不得存在未焊满、根部收缩、咬边和接头不良等缺陷,不得存在表面气孔、夹渣、裂纹、电弧擦伤等缺陷; 二级焊缝:不得存在表面气孔、夹渣、裂纹、电弧擦伤等缺陷。未焊满、根部收缩、咬边和接头不良等缺陷应符合《建筑钢结构焊接技术规程》(JGJ81-2002)“表7.2.3 焊缝外观质量允许偏差”要求。 三级焊缝:外观应符合《建筑钢结构焊接技术规程》(JGJ81-2002)“表7.2.3 焊缝外观质量允许偏差”要求。 焊缝无损探伤检测频率:一级焊缝100%进行无损探伤检测,二级焊缝抽取20%进行无损探伤检测,三级焊缝可不进行无损探伤检测。 表 7.2.3 焊缝外观质量允许偏差 焊接等级的确定 在施工过程中,图纸中明确了焊缝等级应按照图纸明确的焊缝等级进行检测。但是很多图纸未明确焊缝等级,此时我们可以参考《钢结构设计规范》(GB500017-2003)第7节进行确定焊缝等级。具体可参考下表执行: 序号 焊缝描述 焊缝等级 1 需要进行疲劳计算的作用力垂直于焊缝长度方向的横向对接焊缝(受拉时) 一级 2 需要进行疲劳计算的作用力垂直于焊缝长度方向的横向T形对接与角接组合焊缝(受拉时) 一级 3 需要进行疲劳计算的作用力垂直于焊缝长度方向的横向对接焊缝(受压时) 二级 4 需要进行疲劳计算的作用力垂直于焊缝长度方向的横向T形对接与角接组合焊缝(受压时) 二级 5 作用力平行于焊缝长度方向的纵向对接焊缝 二级 6 不需要进行疲劳计算的对接焊缝(受拉) 不低于二级 7 不需要进行疲劳计算的对接焊缝(受压) 二级 8 重级工作制和起重量Q≥50t的中级工作制吊车梁的腹板与上翼缘之间、吊车桁架上弦杆与节点板之间的T形焊缝 不低于二级 9 直接承受动力荷载且需要验算疲劳的结构和吊车起重量≥50t的中级工作制吊车梁的要求焊透的T型接头的角焊缝、部分焊透的对接与角焊缝组合焊缝、搭接连接的角焊缝 二级 10 其它情况下焊缝 三级 注明:根据《钢结构设计规范》(GB500017-2003)“第6节 疲劳计算”规定:直接承受动力荷载重复作用的钢结构构件及其连接,当应力变化的循环次数≥5×104时,应进行疲劳计算。 常用焊缝标记识别 在钢结构施工中,焊缝种类有:角焊缝、I形焊缝、V形焊缝、单边V形焊缝、带钝边V形焊缝、带钝边单边V形焊缝、带钝边U形焊缝、带钝边J形焊缝、封底焊缝、塞焊缝、点焊缝、钎焊、缝焊缝、X焊缝、K焊缝、带钝边双面V形焊缝、带钝边双面单V形焊缝、带钝边双面U形焊缝,其中角焊缝、I形焊缝、V形焊缝缝最为常见。下面就常见焊缝的图例及标注给大家做个解释。 常见焊缝标注主要有图1-图7,各标注的含义如下: 图1:T型焊缝的双侧角焊缝,焊缝高度为8mm; 图2:T型焊缝的单侧角焊缝,焊缝高度为8mm; 图3:T型焊缝的单侧角焊缝,焊缝高度为8mm,标注在下方表示焊接侧为箭头对面侧; 图4:V形焊缝,焊缝坡口钝边厚度为8mm,焊缝坡口角度为60°,两构件之间焊接部位间隙为3mm; 图5:单边V形焊缝,焊缝坡口钝边厚度为8mm,焊缝坡口角度为60°,两构件之间焊接部位间隙为3mm; 图6:三面角焊缝,焊缝高度为8mm; 图7:四面角焊缝,焊缝高度为8mm; 坡口形式及代号 代号 坡口形式 I I型坡口 V V型坡口 X X型坡口 L 单边V型坡口 K K型坡口 机器视觉 点积:可以反应方向相似程度 a⋅b=|a|*|b|*cosθ 其中: |a| 是向量 a 的长度(模) |b| 是向量 b 的长度 θ 是它们之间的夹角(0° 到 180°) 所以: 如果 a ⊥ b(垂直)→ θ = 90° → cosθ = 0 → 点积 = 0 如果 a 与 b 同向 → θ = 0° → cosθ = 1 → 点积 = |a||b| 如果 a 与 b 反向 → θ = 180° → cosθ = -1 → 点积 = -|a||b| 点积值的解读(假设向量非零) 点积结果 数值范围 几何意义 说明 最大正值 = ∣ a ∣∣ b ∣ 完全同向 (θ = 0°) 向量指向完全相同方向,cosθ = 1 正数 > 0 夹角 < 90° (锐角) 方向“大致相同”,越接近同向,点积越大 零 = 0 垂直 (θ = 90°) 互相正交,无方向关联 负数 < 0 夹角 > 90° (钝角) 方向“相反倾向”,越接近反向,点积越小(越负) 最小负值 = − ∣ a ∣∣ b ∣ 完全反向 (θ = 180°) cosθ = -1   Tekla Structures二次开发入门指南:从建模员到BIM开发工程师的薪资跃迁之路 在钢结构深化设计行业,Tekla Structures凭借其强大的参数化建模能力和精准的节点处理能力,长期占据着市场主导地位。然而,随着建筑工业化与智能制造的推进,企业对BIM人才的需求正发生深刻变化。仅掌握软件操作已难以满足复杂项目交付与数据流转的要求,具备二次开发能力的BIM工程师成为市场上稀缺的高薪岗位。本文旨在为Tekla使用者提供一条清晰的职业转型路径,并解析系统化学习二次开发的必要性。 一、行业现状与职业瓶颈 当前,大量Tekla技术人员仍停留在“翻模”与“出图”的基础工作层面。这类工作重复性高、技术天花板低,且极易受到自动化插件与AI辅助工具的冲击。在实际工程中,设计师常面临以下痛点:批量修改构件属性耗时耗力、自定义报表格式无法满足企业标准、模型数据无法直接对接MES生产系统等。这些问题本质上都是软件原生功能与企业个性化需求之间的断层。 解决这一断层的唯一途径是二次开发。通过调用Tekla Open API,开发者可以将重复劳动转化为自动化脚本,将孤立模型转化为结构化数据资产。这种能力不仅提升了个人工作效率,更使其从单纯的“软件操作员”转变为“解决方案提供者”。在招聘市场上,精通C#与Tekla API的工程师薪资普遍比纯建模人员高出30%至50%,且职业生命周期更长。 二、二次开发的核心价值与技术门槛 Tekla二次开发并非简单的宏录制,而是基于.NET框架的深度编程。其核心价值体现在三个维度:一是效率革命,通过API实现数千个构件的批量创建、编号与属性赋值,将数天的工作量压缩至分钟级;二是数据贯通,打通Tekla与ERP、MES、BIMBase等平台的数据接口,支撑钢构智能工厂建设;三是工具沉淀,将个人经验封装为企业级插件,形成可复用的知识资产。 然而,自学二次开发存在显著障碍。官方文档虽详尽但缺乏工程场景串联,网络教程多碎片化且版本滞后,初学者常在环境配置、事务处理、对象获取等基础环节反复踩坑。更重要的是,缺乏系统化的项目实战训练,导致学完API函数仍无法独立交付可用工具。这正是许多技术人员“想转行却不敢转”的根本原因。 三、系统化学习的必要性与课程定位 针对上述痛点,灵燕空间推出了面向零基础及进阶用户的Tekla二次开发系列课程。课程体系严格遵循“基础语法—API核心—实战项目—插件发布”的逻辑闭环,摒弃零散知识点堆砌,强调工程思维培养。 《Tekla Open API基础入门》作为转型第一课,聚焦C#语言基础与Tekla对象模型认知。课程不讲空洞理论,而是以真实钢结构项目为载体,手把手演示如何获取Model Object、操作Phase Manager、读写用户属性等高频操作。学员在完成课程后,即可独立编写自动编号、批量导出清单等实用小工具,快速建立正向反馈。 该课程特别适合以下人群:希望摆脱重复劳动的资深建模员、计划转型BIM开发的应届毕业生、以及需要为企业定制内部工具的IT支持人员。课程内容紧贴2026年最新版Tekla Structures,确保所学即所用。 四、从入门到精通的职业发展路径 掌握基础API只是起点。真正的BIM开发工程师需进一步攻克复杂节点自动生成、跨平台数据交互、UI界面设计及性能优化等高阶课题。灵燕空间的进阶课程《Tekla Automation实战》与《插件开发与Warehouse发布》正是为此设计。前者深入讲解事务管理、几何计算与外部系统集成,后者则覆盖插件打包、版本控制、用户反馈收集及产品化运营全流程。 建议学习者按“基础入门—实战深化—产品思维”三阶段推进。每完成一个模块,都应在实际工作中验证效果,并将成果纳入个人作品集。当你能独立交付一套被团队广泛使用的插件时,薪资跃迁便水到渠成。 五、立即行动:开启你的技术转型之旅 职业转型没有捷径,但有正确的方法。与其在碎片化信息中摸索试错,不如通过系统化课程高效构建能力体系。灵燕空间《Tekla Open API基础入门》课程现已上线,内容经过数十名学员实战验证,兼顾深度与可操作性。 点击下方链接,查看课程大纲与试听章节,迈出从建模员到BIM开发工程师的关键一步: Tekla建模二次开发 - 灵燕空间 Tekla图纸二次开发 - 灵燕空间 Tekla报表二次开发 - 灵燕空间 访问官网了解更多课程体系与学员案例:  工作台 - 灵燕空间 在钢结构行业数字化转型的浪潮中,掌握二次开发能力不仅是提升收入的手段,更是把握未来职业主动权的战略选择。现在开始系统学习,就是对未来最好的投资。 拒绝重复劳动!用C#和Tekla Open API实现钢结构模型自动化处理 在钢结构深化设计项目中,工程师的时间往往被大量机械性操作吞噬。批量修改构件属性、重复创建标准节点、手动导出零件清单、逐一核对图纸编号……这些工作技术含量低,却占据了项目周期的60%以上。当项目规模扩大或工期压缩时,加班成为常态,而人为失误的风险也随之攀升。解决这一困境的根本出路,不是更快地点击鼠标,而是通过Tekla二次开发将重复劳动转化为自动化程序。本文将以C#与Tekla Open API为核心,解析自动化处理的技术路径,并推荐系统化的实战课程资源。 一、为什么原生功能无法满足工程需求 Tekla Structures本身提供了丰富的建模与出图工具,但其通用性决定了它无法覆盖每个企业的个性化流程。例如,某钢构厂要求所有主梁腹板加劲肋的间距必须根据跨度动态调整,且属性中需写入特定的生产批次号;又如,项目交付时需按车间、楼层、构件类型三级目录自动归档NC文件与PDF图纸。这些需求在软件菜单中找不到对应按钮,只能通过二次开发实现。 更深层的问题在于数据断层。模型中的几何信息与ERP系统的物料编码、MES系统的工序计划之间缺乏自动关联,导致BIM模型沦为“好看的3D图纸”,而非驱动生产的数字资产。只有通过API打通数据链路,才能真正释放BIM的价值。 二、C#与Tekla Open API:自动化处理的技术基石 Tekla Open API基于.NET框架,使用C#作为主要开发语言。其核心对象模型围绕ModelObject展开,涵盖Part、Assembly、Bolt、Weld等所有构件类型。开发者可通过Selection类获取用户选中的对象,通过PropertySet读写自定义属性,通过Transaction机制确保批量操作的原子性与可回滚性。 典型的自动化场景包括: 批量属性赋值 :遍历模型中所有Beam对象,根据截面尺寸自动填充材料等级与防火涂料厚度。 智能节点生成 :读取连接件参数,自动创建螺栓组、加劲肋及焊缝,并校验最小边距。 报表自动导出 :按预设模板生成Excel清单,同步上传至企业云盘并发送邮件通知。 模型合规检查 :扫描未编号构件、重复零件号、超限焊缝长度等问题,输出整改报告。 这些功能的实现不依赖宏录制,而是通过严谨的代码逻辑构建可复用、可维护的工具链。 三、从代码片段到工程级工具的进阶路径 许多工程师自学API时,能写出简单的循环脚本,却无法交付稳定可靠的插件。问题出在三个关键环节:一是事务管理不当,导致部分操作失败后模型状态不一致;二是异常处理缺失,遇到非法对象即崩溃;三是性能优化不足,万级构件遍历耗时过长。 系统化学习是跨越这一鸿沟的唯一途径。灵燕空间提供的三门Tekla二次开发课程,恰好覆盖了从基础到高阶的完整能力栈: 《Tekla Open API基础入门》聚焦C#语法与核心对象模型,帮助零基础学员快速掌握ModelObject获取、属性读写、选择集操作等基本功。课程以真实钢构项目为载体,避免空洞理论堆砌。 https://www.lingyanspace.com/course/15987039533007877 《Tekla Automation实战》深入讲解事务处理、几何计算、外部系统集成等高阶主题。学员将独立完成自动编号引擎、批量导出工具、模型健康检查器等实战项目,建立工程化思维。 https://www.lingyanspace.com/course/16280445360538629 《插件开发与Warehouse发布》则面向产品化需求,涵盖WinForm/WPF界面设计、安装包制作、版本控制、用户反馈收集及Tekla Warehouse上架全流程。适合希望将个人工具转化为企业标准组件或对外发布的开发者。 https://www.lingyanspace.com/course/56942836197622790 三门课程形成递进式学习闭环,既适合从零起步的新手,也满足已有基础者查漏补缺的需求。 四、自动化带来的真实收益 投入时间学习二次开发的回报是确定且可量化的。某学员在完成Automation实战课程后,为所在公司开发了自动套料预处理插件,将原本需要3人2天完成的构件分类与排版准备工作压缩至15分钟,年节省人工成本超20万元。另一学员开发的模型合规检查工具,在项目前期拦截了87处潜在加工错误,避免了现场返工损失。 更重要的是,自动化能力重塑了工程师的职业身份。你不再是被动执行指令的操作员,而是主动定义工作流的解决方案提供者。这种角色转变,正是薪资跃迁与职业安全感的核心来源。 五、立即行动:让代码替你加班 如果你仍在手动处理成百上千个构件,如果你厌倦了因人为疏忽导致的返工,如果你希望将经验沉淀为可复用的数字资产——那么现在就是开始系统学习的最佳时机。 点击下方链接,查看课程详情与试听章节,选择最适合你当前阶段的课程: 零基础入门: https://www.lingyanspace.com/course/15987039533007877 进阶实战: https://www.lingyanspace.com/course/16280445360538629 插件产品化: https://www.lingyanspace.com/course/56942836197622790 访问官网了解更多学员案例与企业应用实践: www.lingyanspace.com 在钢结构行业迈向智能制造的今天,掌握Tekla二次开发不是锦上添花的技能,而是生存与发展的必备能力。让代码替你完成重复劳动,把时间留给真正需要人类智慧的创造性工作。 如何开发自己的Tekla插件并上架Warehouse?从需求分析到发布的全流程解析 在钢结构深化设计领域,Tekla Structures的开放性与扩展性是其核心竞争力的重要组成部分。对于具备二次开发能力的工程师而言,将个人经验或企业定制化需求封装为独立插件,不仅是提升工作效率的手段,更是构建技术壁垒、实现知识资产化的关键路径。然而,许多开发者在完成代码编写后,往往卡在打包规范、UI交互设计、版本管理及Tekla Warehouse发布等环节,导致工具难以落地推广。本文将以工程实践为导向,系统梳理Tekla插件从需求定义到正式发布的全生命周期流程,并结合灵燕空间系列课程资源,为有志于打造专业级插件的开发者提供可执行的行动指南。 一、插件开发的起点:精准定义需求与边界 成功的插件始于清晰的需求界定。盲目追求功能全面是新手最常见的误区。有效的做法是从具体痛点出发,例如“自动识别未编号构件并高亮显示”、“按车间+楼层+构件类型三级目录批量导出NC文件”或“一键生成符合企业标准的零件清单报表”。这些需求应具备三个特征:高频发生、人工处理耗时、规则明确可编码。 在立项阶段,需同步评估技术可行性与维护成本。避免依赖非公开API或未文档化的内部接口,此类实现虽能短期奏效,但随Tekla版本升级极易失效。建议优先使用官方Open API稳定接口,并在设计时预留配置项以适配不同项目差异。需求确认书应包含输入条件、处理逻辑、输出结果及异常处理策略四要素,作为后续开发与测试的唯一依据。 二、技术实现的核心:架构设计与用户体验并重 插件的价值不仅在于功能正确,更在于使用流畅。WinForm或WPF界面的选择取决于复杂度:简单参数设置可用WinForm快速搭建;涉及模型预览、动态表格或自定义控件的场景则推荐WPF以获得更好的视觉表现力与响应性能。无论何种技术栈,都必须遵循以下原则: 事务安全 :所有对模型的修改操作必须包裹在Transaction中,确保失败时可回滚,防止模型状态损坏。 异步加载 :耗时操作(如遍历万级构件)不得阻塞UI线程,应采用Task或BackgroundWorker保持界面响应。 错误友好 :捕获异常后提供明确提示而非崩溃弹窗,日志记录便于远程排查问题。 配置持久化 :用户偏好(如默认路径、过滤条件)应保存至本地配置文件,避免每次重复设置。 此外,插件命名、图标、菜单位置等细节直接影响用户接受度。建议参考Tekla官方插件设计规范,保持与原生功能一致的视觉语言与交互习惯。 三、产品化关键环节:打包、测试与版本管理 代码完成仅是半成品。真正的产品化始于标准化打包。Tekla插件通常以DLL形式部署于 Plugins 目录,但分发时需配套安装脚本或MSI安装包,自动处理依赖项注册、文件夹创建及环境变量配置。务必在不同Tekla版本(如2024、2025、2026)及操作系统(Windows 10/11)上进行兼容性测试,尤其关注.NET Framework版本匹配问题。 版本管理不可依赖手动重命名。建议采用语义化版本号(Major.Minor.Patch),结合Git进行源码控制。每次发布应附带更新说明,明确列出新增功能、修复缺陷及已知限制。对于企业内部工具,可搭建私有NuGet源或共享文件夹实现自动更新;面向公众发布的插件则需通过Tekla Warehouse审核机制,其要求包括数字签名、隐私政策声明及多语言支持等。 四、Warehouse发布与生态运营:让插件真正被看见 Tekla Warehouse是全球钢构工程师获取插件的首选平台,但其审核标准严格且竞争激烈。成功上架的关键在于三点:一是完整性,安装包、文档、截图、演示视频缺一不可;二是专业性,描述需准确说明适用场景、前置条件及操作步骤,避免夸大宣传;三是持续性,积极响应用户反馈,定期发布更新维护活跃度。 发布后并非终点。建立用户沟通渠道(如邮件列表、论坛帖)收集真实使用数据,识别高频请求与潜在Bug。可将基础版免费开放,高级功能通过授权码解锁,形成可持续的运营模式。对于企业级客户,还可提供定制开发服务,将通用插件转化为专属解决方案。 五、系统化学习路径:三门课程覆盖插件全生命周期 针对上述各环节的能力缺口,灵燕空间提供了递进式课程体系,帮助开发者高效跨越从代码到产品的鸿沟: 《Tekla Open API基础入门》夯实对象模型认知与C#编程基础,确保你能正确获取ModelObject、读写属性、操作选择集,这是所有插件开发的根基。适合零基础或转行者起步。 https://www.lingyanspace.com/course/15987039533007877 《Tekla Automation实战》聚焦复杂业务逻辑实现,深入讲解事务管理、几何计算、外部系统集成及性能优化技巧。学员将通过多个真实项目掌握自动化引擎构建方法,为插件核心功能打下坚实基础。 https://www.lingyanspace.com/course/16280445360538629 《插件开发与Warehouse发布》专门解决产品化难题,涵盖WPF界面设计、安装包制作、数字签名、版本控制、用户反馈收集及Warehouse上架全流程。课程内容紧贴2026年最新审核规范,助你避开常见拒审陷阱。 https://www.lingyanspace.com/course/56942836197622790 三门课程形成完整能力闭环,既适合个人开发者打造代表作,也满足企业IT团队构建标准化工具链的需求。 六、立即行动:让你的代码产生行业价值 插件开发不是孤芳自赏的技术实验,而是连接个体智慧与行业需求的桥梁。当你编写的工具被数百名工程师日常使用,当你的经验通过代码得以传承放大,这种成就感远超单纯完成一个建模任务。 点击下方链接,根据你的当前阶段选择对应课程,开启插件产品化之旅: 打牢基础: https://www.lingyanspace.com/course/15987039533007877 攻克实战: https://www.lingyanspace.com/course/16280445360538629 产品发布: https://www.lingyanspace.com/course/56942836197622790 访问官网查看更多学员作品与企业应用案例: www.lingyanspace.com 在钢结构行业迈向智能化、标准化的今天,能够交付可靠插件的开发者,正在重新定义BIM技术的价值边界。现在投入时间打磨产品,就是对未来职业话语权最有力的投资。 Tekla二次开发常见踩坑实录:Model Object获取失败与事务处理的正确姿势 在Tekla Structures二次开发的实际工程应用中,开发者最常遭遇的并非复杂算法的实现难题,而是基础API调用时的隐性陷阱。这些陷阱往往不会在编译阶段报错,却在运行时导致模型数据损坏、操作无响应或结果不一致。其中,Model Object获取失败与事务处理不当是两类最高频、破坏性最强的问题。本文基于大量真实项目调试经验,系统梳理这两类问题的根因与解决方案,并推荐系统化学习路径,帮助开发者避开碎片化搜索带来的认知盲区。 一、Model Object获取失败的典型场景与根源 许多初学者在遍历模型或响应用户选择时,频繁遇到返回null、属性为空或类型转换异常的情况。这通常源于对Tekla对象模型生命周期的误解。 首要误区是忽视模型加载状态。Tekla Open API要求在执行任何查询前,必须确认模型已完全打开且处于可编辑状态。若在模型初始化过程中或只读模式下尝试获取Part、Assembly等对象,API将静默返回无效引用。正确做法是在调用Selection.GetSelectedObjects()或ModelObjectEnumerator.MoveNext()之前,显式检查Model.IsOpen && Model.IsModifiable,并在必要时添加重试机制或用户提示。 其次是对过滤器条件的误用。Select方法支持按类型、相位、用户属性等多维度筛选,但参数组合错误会导致结果为空。例如,同时指定Phase和UserDefinedAttribute时,若任一条件不匹配即被排除;而使用OR逻辑需通过FilterExpression构建复合表达式,而非简单叠加参数。建议始终先以单一条件测试,逐步增加过滤维度,并通过日志输出实际匹配数量进行验证。 第三是忽略对象有效性校验。即使成功获取ModelObject实例,其内部句柄可能因模型刷新、撤销操作或外部修改而失效。在访问Geometry、PropertySet等子对象前,应调用IsValid()方法进行防御性检查。对于批量操作,建议在循环内嵌入try-catch块,记录失败对象的ID与上下文信息,避免整个流程中断。 二、事务处理不当引发的数据一致性危机 Transaction是Tekla API中保障模型操作原子性的核心机制,但滥用或误用反而会成为数据灾难的源头。 最常见错误是嵌套事务未正确提交或回滚。Tekla允许事务嵌套,但只有最外层事务的Commit才会真正持久化变更。若内层事务抛出异常而未捕获,外层事务仍会继续执行,导致部分操作生效、部分丢失,模型陷入半更新状态。规范做法是将所有嵌套逻辑封装在独立方法中,由调用方统一控制事务边界,并在finally块中确保Rollback被执行。 另一高频问题是长事务阻塞UI线程。当遍历数万个构件并逐一修改属性时,若未启用异步模式,Tekla界面将完全冻结,用户无法取消操作,甚至触发超时保护。解决方案是使用Task.Run包裹耗时逻辑,并通过Progress 向UI反馈进度。更重要的是,应将大事务拆分为多个小批次,每批处理后主动调用Application.DoEvents()或Dispatcher.Yield()释放控制权,保持界面响应。 此外,事务内禁止执行非模型操作。文件读写、网络请求、数据库查询等I/O操作若置于Transaction块中,一旦失败将连带回滚所有几何变更。正确架构是将业务逻辑与模型操作分离:先在事务外完成数据准备与校验,再在极短的事务窗口内仅执行必要的模型写入,最后异步处理后续通知或导出任务。 三、碎片化知识的局限与系统化学习的价值 上述问题在网络论坛中虽有零星讨论,但往往缺乏上下文关联与预防性设计指导。开发者通过搜索引擎找到的答案,多针对特定版本或孤立场景,难以迁移至新项目。更严重的是,错误修复常以“打补丁”方式进行,未触及底层原理,导致同类问题反复出现。 灵燕空间提供的三门Tekla二次开发课程,正是为解决这一系统性能力缺口而设计: 《Tekla Open API基础入门》从对象模型本质出发,详解Model、Database、Selection等核心类的生命周期与交互契约,帮助学员建立正确的API使用心智模型,从根本上避免无效引用与状态误判。 https://www.lingyanspace.com/course/15987039533007877 《Tekla Automation实战》专设事务管理与性能优化章节,通过对比正反面代码案例,演示如何安全拆分事务、实现异步批处理、嵌入防御性校验。学员将在模拟故障环境中亲手修复数据不一致问题,形成肌肉记忆。 https://www.lingyanspace.com/course/16280445360538629 《插件开发与Warehouse发布》则强调健壮性设计在产品化中的重要性,涵盖异常策略配置、日志体系搭建、用户友好错误提示等工程实践,确保交付的工具在复杂现场环境中稳定可靠。 https://www.lingyanspace.com/course/56942836197622790 四、构建可持续的调试与预防机制 除掌握具体技术点外,成熟的开发者还需建立长效质量保障习惯。建议在项目中集成单元测试框架,对关键API调用编写自动化验证用例;利用Tekla内置的诊断工具监控事务执行时间与内存占用;定期复盘线上问题,将其转化为团队知识库中的反模式清单。这些实践虽初期投入较大,却能显著降低后期维护成本,提升工具可信度。 五、立即行动:用系统知识替代试错成本 如果你仍在为偶发的null引用困扰,如果你的插件曾因事务崩溃丢失用户半天工作成果,如果你希望交付的代码经得起生产环境考验——那么现在就是补齐底层认知的最佳时机。 点击下方链接,根据你的当前痛点选择对应课程,彻底摆脱碎片化学习的恶性循环: 夯实对象模型基础: https://www.lingyanspace.com/course/15987039533007877 攻克事务与性能难题: https://www.lingyanspace.com/course/16280445360538629 打造高可用产品级插件: https://www.lingyanspace.com/course/56942836197622790 访问官网查看更多技术白皮书与故障排查指南: www.lingyanspace.com 在Tekla二次开发领域,真正的专业不在于写出多少行代码,而在于能否预见并规避那些看不见的风险。系统化学习不是速成捷径,而是对工程尊严最基本的尊重。 后Tekla时代:二次开发如何对接MES与国产BIM引擎?构建钢构智能工厂数据链 在钢结构制造行业迈向智能制造的进程中,Tekla Structures作为深化设计的核心工具,其价值正从单一的三维建模向全链路数据枢纽演变。然而,许多企业在使用Tekla时仍面临显著的数据断层:设计模型无法直接驱动MES生产计划,构件信息难以与国产BIMBase等平台无缝对接,导致“数字孪生”停留在展示层面,未能真正赋能车间执行。解决这一问题的关键,在于通过二次开发打通Tekla与下游系统的数据接口,构建标准化、自动化的信息流转通道。本文将以工程实践为导向,解析跨平台数据交互的技术路径,并推荐系统化学习资源,助力企业技术负责人与高级开发者把握数字化转型主动权。 一、 智能工厂的核心瓶颈:数据孤岛与格式壁垒 当前钢构企业的典型痛点并非缺乏软件,而是软件间互不兼容。Tekla导出的IFC文件虽为开放标准,但在实际对接MES或BIMBase时,常出现属性丢失、编码不一致、几何精度偏差等问题。例如,MES系统要求的物料编码规则与Tekla默认零件号体系不同,需人工映射;BIMBase对IFC中自定义用户属性的解析支持有限,导致工艺参数无法传递。这些障碍使得设计数据在进入生产环节前必须经过大量清洗与转换,不仅效率低下,更易引入人为错误。 更深层的问题在于动态反馈缺失。生产现场的进度变更、质量异常、返工指令等信息无法实时回传至Tekla模型,设计师难以基于最新状态调整后续节点或出图。这种单向数据流严重制约了柔性制造能力的实现。唯有通过API建立双向数据通道,才能使BIM真正成为贯穿设计、加工、装配、运维的全生命周期载体。 二、 二次开发在数据集成中的不可替代性 通用中间件或ETL工具虽能处理结构化数据,却难以应对BIM模型的半结构化特性。Tekla Open API提供了直接访问模型对象、属性集、相位信息及用户自定义数据的底层能力,这是实现精准数据提取与写入的前提。例如,可通过ModelObjectEnumerator遍历所有Assembly,按企业编码规则生成唯一物料ID,并同步写入ERP主数据表;亦可监听PhaseManager事件,在生产报工完成后自动更新模型中对应构件的状态字段。 此外,针对国产BIMBase等新兴平台的适配,往往需要定制转换逻辑。由于各平台对IFC标准的扩展实现存在差异,直接使用第三方转换器易导致语义丢失。通过C#编写专用适配器,可在导出前对模型进行预处理:合并冗余几何体、补全缺失属性、重排层级结构,确保目标系统能正确识别关键业务信息。这种深度定制能力,是标准化产品无法满足的。 三、 高阶开发能力要求与课程体系支撑 实现可靠的数据集成,远超基础API调用范畴。开发者需掌握以下核心技能:一是事务一致性保障,在跨系统写入时采用补偿机制或消息队列,避免部分成功导致的脏数据;二是性能优化,万级构件的属性批量读写需结合分页加载与缓存策略,防止阻塞Tekla主线程;三是异常容错设计,对外部系统超时、网络中断、格式校验失败等场景预设降级方案,确保主流程不崩溃。 灵燕空间的高阶课程《插件开发与Warehouse发布》正是为此类复杂场景设计。该课程不仅涵盖UI开发与打包规范,更专设“系统集成实战”模块,演示如何安全对接RESTful API、数据库及文件服务,如何处理异步回调与重试逻辑,以及如何编写可配置的映射规则以适应多项目差异。学员将完成一个完整的Tekla-MES-BIMBase三联调案例,获得可直接复用于企业项目的代码框架与架构经验。 同时,《Tekla Open API基础入门》与《Tekla Automation实战》两门课程为高阶应用奠定根基。前者确保开发者准确理解对象模型与属性存储机制,避免数据提取源头错误;后者训练事务管理与批量操作的最佳实践,防止集成过程中引发模型损坏。三门课程形成从底层认知到产品化交付的完整能力栈。 夯实基础: https://www.lingyanspace.com/course/15987039533007877 攻克自动化与集成: https://www.lingyanspace.com/course/16280445360538629 掌握产品化与系统对接: https://www.lingyanspace.com/course/56942836197622790 四、 面向未来的技术布局建议 在推进数据集成时,应前瞻性地考虑以下方向:一是优先采用IFC4.3等新版标准,其对制造信息的原生支持优于旧版;二是预留Web API或gRPC接口,便于未来与云端BIM平台或AI分析模块对接;三是建立企业内部BIM数据字典,统一构件分类、属性命名与编码规则,降低长期维护成本。这些举措虽初期投入较大,却是构建可持续智能工厂体系的基石。 五、 立即行动:以数据驱动重构竞争力 在钢结构行业同质化竞争加剧的背景下,数据流转效率已成为新的护城河。能够自主打通Tekla与生产系统的团队,不仅能缩短交付周期、降低出错率,更能快速响应客户定制化需求,赢得高端市场订单。 点击下方链接,根据你的角色选择对应课程,开启数据集成能力建设: 打牢API基础: https://www.lingyanspace.com/course/15987039533007877 提升自动化与集成能力: https://www.lingyanspace.com/course/16280445360538629 掌握系统对接与产品化: https://www.lingyanspace.com/course/56942836197622790 访问官网查看更多智能制造集成案例与技术白皮书: www.lingyanspace.com 在后Tekla时代,真正的竞争优势不属于拥有最多软件的企业,而属于最能驾驭数据流动的团队。现在投入时间构建集成能力,就是为未来十年的生存与发展储备核心动能。 Tekla模型坐标定位插件:精准获取构件经纬度与地图选点,打通BIM与GIS数据壁垒 在钢结构深化设计与施工管理中,模型空间坐标与地理实际位置的对应关系至关重要。然而,Tekla Structures原生功能仅支持局部坐标系或项目基点转换,无法直接获取构件的绝对经纬度信息,更不支持可视化地图选点交互。这导致现场放样、物流追踪及进度汇报时,工程师需依赖外部工具手动换算,效率低下且易出错。灵燕空间推出的Tekla模型坐标定位插件,专为解决这一痛点而生,实现从三维模型到地理信息的无缝衔接。本文将详解该插件的核心能力与应用场景,并提供官方体验入口。 一、 为什么Tekla用户需要坐标定位插件? 在实际工程中,以下场景对坐标精度有刚性需求: 现场放样复核 :施工人员需将模型中的柱脚螺栓位置转换为GPS可识别的经纬度,用于全站仪或RTK设备放样。若转换参数错误或人为计算失误,可能导致构件安装偏差。 物流运输调度 :大型钢构件运输需规划路线并预估到达时间。缺乏精确起终点坐标,导航系统无法提供最优路径,延误风险显著增加。 进度可视化汇报 :向业主或管理层展示项目进展时,单纯三维模型缺乏地理上下文。将构件状态叠加至在线地图,可直观呈现各区域施工完成度,提升沟通效率。 多源数据融合 :当BIM模型需与无人机影像、地质勘察点或市政管网GIS数据对齐时,统一的地理坐标基准是前提条件。原生Tekla无法满足此类跨平台集成需求。 上述问题本质上是建筑信息模型与地理信息系统之间的数据断层。唯有通过专用插件建立自动化转换通道,才能释放BIM在空间维度的完整价值。 二、 插件核心功能:从模型点击到地图落点的秒级响应 灵燕空间Tekla坐标定位插件基于Open API深度开发,具备以下技术特性: 实时坐标提取 :选中任意Part或Assembly,插件自动读取其几何中心点在项目坐标系中的XYZ值,并根据预设转换参数(如七参数、四参数或平移旋转矩阵)实时计算WGS84或CGCS2000经纬度。结果精确至小数点后六位,满足厘米级工程要求。 双向地图交互 :内置轻量级地图组件,支持百度地图与高德地图双引擎切换。用户可在地图上直接点击选址,插件反向解析为项目坐标并在Tekla中高亮对应构件;亦可从模型选择构件,地图自动居中显示并标注位置。这种双向联动彻底替代了传统“查表-输入-验证”的繁琐流程。 批量导出与API对接 :支持将选中构件集的位置信息导出为CSV、KML或GeoJSON格式,便于导入GIS平台或生产管理系统。同时提供RESTful接口,允许MES、ERP等外部系统按需调用坐标数据,实现业务流程自动化。 转换参数安全管理 :所有坐标转换参数加密存储于本地配置文件,不上传云端。支持多项目独立配置,避免不同工地基准混淆。参数修改需二次确认,防止误操作导致全局偏移。 三、 典型应用场景实证 某沿海风电塔筒制造项目中,设计团队使用本插件完成以下工作流: 在Tekla中选中全部基础预埋件,一键导出含经纬度的清单至Excel; 将清单导入高德地图批量标记,生成专属分享链接供运输车队使用; 现场安装时,工人通过手机打开链接,结合RTK设备实时比对理论坐标与实际点位,偏差超5mm即触发预警; 每日收工前,监理在地图上勾选已验收构件,自动生成带地理标签的进度报告发送至项目管理群。 整个流程较传统方式节省60%以上协调时间,且全程无纸质图纸流转,数据可追溯、可审计。 四、 与通用坐标工具的差异化优势 市面上存在独立的经纬度查询工具或地图选点器,但其与Tekla割裂的使用体验难以满足专业需求: 数据一致性保障 :通用工具依赖人工复制粘贴坐标,极易输错位数或混淆坐标系。插件在软件内部完成转换,杜绝中间环节误差。 上下文感知能力 :插件能识别构件类型、相位、用户属性等业务语义,支持按条件过滤后批量处理。例如仅导出“当前阶段+主结构”的柱脚坐标,而非全模型 indiscriminate 输出。 性能优化 :针对万级构件场景,采用异步加载与增量更新机制,界面不卡顿。而网页版坐标拾取器在处理大批量数据时往往超时崩溃。 合规性适配 :内置国内常用坐标系转换算法库,符合测绘行业规范。部分开源工具未考虑国内加密坐标体系,直接使用可能导致法律风险。 五、 立即体验:让每个构件都有地理身份 坐标定位不是锦上添花的功能,而是BIM走向实景融合的必备基础设施。无论您是深化设计师、施工技术员还是项目管理者,都应掌握这一高效工具。 点击下方链接,查看插件详细功能演示、转换参数配置指南及真实项目应用案例: https://www.lingyanspace.com/source/56038072184210437 访问官网了解更多BIM-GIS集成解决方案: www.lingyanspace.com 在数字生时代,脱离地理坐标的BIM只是精致的玩具。赋予模型真实的空间锚点,才能让数据真正服务于建造本身。现在部署坐标定位插件,就是为项目装上精准的时空罗盘。