首页 > 编程语言 >C# TEKLA STRUCTURES 2022 二次开发 开发环境搭建

C# TEKLA STRUCTURES 2022 二次开发 开发环境搭建

时间:2024-01-21 14:35:04浏览次数:29  
标签:TEKLA return Point C# var static 二次开发 new public

初步接触二次TEKLA,以下仅为个人观点

使用的exe方式开发的

引用的nuget包

程序入口点稍作处理,开启了TEKLA 软件才能启动本程序,TEKLA软件关闭,本程序退出

    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                if (TeklaStructures.Connect())
                {
                    TeklaStructures.Closed += (s, e) =>
                    {
                        Interaction.MsgBox("Tekla Structures程序已经退出!", MsgBoxStyle.OkOnly | MsgBoxStyle.Critical);
                        Application.Exit();
                    };
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new MainForm());
                }
                else
                {
                    Interaction.MsgBox("请先保证Tekla软件已经被启动!", MsgBoxStyle.OkOnly | MsgBoxStyle.Critical);
                    Application.Exit();
                }
            }
            catch (Exception ex)
            {
                Interaction.MsgBox(ex.StackTrace, MsgBoxStyle.OkOnly | MsgBoxStyle.Critical);
            }
        }
    }

主窗口采用反射搭建一个 固定的界面

效果如下

 

 

 

反射的特性标签自己定义的如下

 public class MyTeklaCmdAtt : Attribute
 {
     public string ImageName { get; set; }
     public string ButtonName { get; set; }
     public string CategoryName { get; set; }
     public string HelpString { get; set; }
     public MyTeklaCmdAtt(string _category, string _cmdName, string helpStr = "", string _img = "")
     {
         this.ImageName = _img;
         this.ButtonName = _cmdName;
         this.CategoryName = _category;
         this.HelpString = helpStr;
     }
 }

主界面代码如下

public partial class MainForm : ApplicationFormBase
 {
     public static Model MyModel { get; set; }
     public static ModelInfo ModelInfo => MyModel?.GetInfo();
     public MainForm()
     {
         this.InitializeComponent();
         if (MyModel == null) MyModel = new Model();
         base.AutoSize = true;
         base.InitializeForm();
         base.Size = this.Size;
         base.Text = Application.ProductName + $"({ModelInfo.ModelName})";
         Dialogs.SetSettings(string.Empty);
         TeklaStructures.MainWindow.AttachChildForm(this);
         //AllocConsole();
     }
     private void Form1_Load(object sender, EventArgs e)
     {
         var cls = System.Reflection.Assembly.GetExecutingAssembly().GetTypes().Where(c => c.IsClass && c.IsPublic);
         var Cmdmis = new List<MethodInfo>();
         foreach (var item in cls)
         {
             var mis = item.GetMethods().Where(m => m.IsPublic && m.IsStatic && m.GetCustomAttribute(typeof(MyTeklaCmdAtt)) != null);
             if (!mis.Any()) continue;
             Cmdmis.AddRange(mis.ToArray());
         }

         Dictionary<string, List<MethodInfo>> dicts = Cmdmis.GroupBy(m => m.DeclaringType.Name).ToDictionary(c => c.Key, c => c.ToList());
         foreach (var item in dicts)
         {
             var tabPage = new TabPage()
             {
                 //Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right,
                 Text = item.Key,
                 Name = $"tbPage_{item.Key}",
                 BorderStyle = BorderStyle.Fixed3D,
                 BackColor = Color.AliceBlue,     
                 //AutoSizeMode = AutoSizeMode.GrowOnly,
                 //AutoSize = true
             };
             var clsFlowLayoutPanel = new FlowLayoutPanel
             {
                 Name = $"flwPan_{item.Key}",
                 FlowDirection = FlowDirection.TopDown,
                 Padding = new Padding(3),
                 BorderStyle = BorderStyle.FixedSingle,
                 AutoSize = true,
                 Parent = tabPage,
                 Dock = DockStyle.Fill,
                 AutoScroll = true,
                 WrapContents = true
             };
             tabPage.Controls.Add(clsFlowLayoutPanel);
             foreach (var mi in item.Value)
             {
                 var att = mi.GetCustomAttribute<MyTeklaCmdAtt>();
                 var btn = new Button()
                 {
                     Name = $"btn_{att.ButtonName}",
                     Text = att.ButtonName,
                     FlatStyle = FlatStyle.Popup,
                     AutoSize = true
                 };
                 var tt1 = new System.Windows.Forms.ToolTip
                 {
                     IsBalloon = true,
                     BackColor = Color.LightYellow,
                     UseAnimation = true,
                 };
                 tt1.SetToolTip(btn, att.HelpString);
                 btn.Click += (s1, e1) =>
                 {
                     try
                     {
                         var frm = mi.GetParameters().FirstOrDefault();
                         mi.Invoke(null, (frm==null?null:new object[] { this }));
                     }
                     catch (Exception ex)
                     {
                         Interaction.MsgBox(ex.StackTrace, MsgBoxStyle.OkOnly | MsgBoxStyle.Exclamation);
                     }

                 };
                 clsFlowLayoutPanel.Controls.Add(btn);
             }
             this.tabControl1.TabPages.Add(tabPage);
         }
     }

 }

 开始码代码,今天分享一个在图纸界面画出折断线的代码

 

 public class 图纸工具

 {
     [MyTeklaCmdAtt(nameof(图纸工具), nameof(折断线), nameof(图纸工具) + "." + nameof(折断线))]
     public static void 折断线()
     {
         DrawingHandler dwgHd = new DrawingHandler();
         var doc = dwgHd.GetActiveDrawing();
         if (doc == null)
         {
             return;
         }
         var p = dwgHd.GetPicker();
         p.PickTwoPoints("", "", out Point p1, out Point p2, out ViewBase viewb);
         if (p1 == null || p2 == null || viewb == null) return;
         if (p1 == p2) return;
         var pts = new PointList();
         var v = (p2 - p1).GetAsVector().GetNormal();
         var dis = p1.DistanceTo(p2);
         var p11 = p1.PolarPoint2d(0.05 * dis,v.DegtoXAixs()+180);
         pts.Add(p11);
         Point p3 = p1.Add(v.MultipleBy(0.4 * dis));
         Point p4 = p3.PolarPoint2d(0.08 * dis,v.DegtoXAixs()+50);
         Point p6 = p1.Add(v.MultipleBy(0.6 * dis));
         Point p5 = p6.PolarPoint2d(0.08 * dis,  v.DegtoXAixs()+230);
         pts.Add(p3);
         pts.Add(p4);
         pts.Add(p5);
         pts.Add(p6);
         var p22 = p2.PolarPoint2d(0.05 * dis, v.DegtoXAixs());
         pts.Add(p22);
         var pline = new Polyline(viewb, pts);
         pline.Insert();
         doc.CommitChanges();
     }
 }


 public static class PointEx
 {
     public static Point GetMidPoint(this Point sp, Point ep)
     {
         return new Point(0.5 * (ep.X + sp.X),
             0.5 * (ep.Y + sp.Y),
             0.5 * (ep.Z + sp.Z));
     }

     public static Point Add(this Point sp, Vector v)
     {
         return new Point(sp.X + v.X, sp.Y + v.Y + sp.Z + v.Z);
     }
     public static double DistanceTo(this Point sp, Point ep)
     {
         return sp.GetVectorTo(ep).GetLength();
     }
     //public static double Length(this Vector v)
     //{
     //    return v.GetLength();
     //}
     public static Vector GetAsVector(this Point p)
     {
         return new Vector(p);
     }

     public static double DegtoXAixs(this Vector v)
     {
         if (v.X == 0.0)
         {
             return v.Y > 0 ? 90 : 270;
         }
         else if (v.Y == 0.0)
         {
             return v.X > 0 ? 0 : 180;
         }
         return Math.Atan(v.Y / v.X) * 180 / Math.PI;
     }

     public static Vector MultipleBy(this Vector v, double d)
     {
         return new Vector(v.X * d, v.Y * d, v.Z * d);
     }

     public static Vector DivideBy(this Vector v, double d)
     {
         return new Vector(v.X / d, v.Y / d, v.Z / d);
     }

     public static Vector GetVectorTo(this Point sp, Point ep)
     {
         return new Vector(ep - sp);
     }


     public static Point PolarPoint2d(this Point p, double dis, double deg)
     {
         return new Point(p.X + dis * Math.Cos(deg * Math.PI / 180), p.Y + dis * Math.Sin(deg * Math.PI / 180));
     }
 }

 

标签:TEKLA,return,Point,C#,var,static,二次开发,new,public
From: https://www.cnblogs.com/NanShengBlogs/p/17977824

相关文章

  • 《the psychology of money》金钱心理学-英文原版书籍-读书笔记
    ————————————————————introduction————————————————————2024.01.20尽管我们周围的世界充满了明显的事物和现象,但人们往往忽视它们“softskills”financialsuccessisnotahardscience.Itisasoftskill,wherehowyoube......
  • hey_left 11 Codeforces Round 859 (Div. 4)
    题目链接A.直接判断输出#include<bits/stdc++.h>usingnamespacestd;voidsolve(){inta,b,c;cin>>a>>b>>c;if(a+b==c)cout<<'+'<<'\n';elseif(a-b==c)cout<<"-"<<'\n&#......
  • 万字长文,一篇吃透WebSocket:概念、原理、易错常识、动手实践
     万字长文,一篇吃透WebSocket:概念、原理、易错常识、动手实践转载自:https://cloud.tencent.com/developer/article/1887095原作者原文:http://www.52im.net/thread-3713-1-1.html 文章被收录于专栏:即时通讯技术即时通讯技术本文由作者“阿宝哥”......
  • Verdi信号平移+研发管理体系+malloc和calloc函数区别+使用__FILE__只打印文件名+使用i
    Verdi信号平移信号左移是将光标移动在双引号以内的信号名左边,然后先输入数字,可以带上单位,如[ns|n]、[ps|p],然后按<<-按键。https://blog.csdn.net/qq_40268672/article/details/132915499信号右移信号右移是数字在右边,信号在左边,用右移符号,其它不变。研发管理体系https://......
  • Proxmox VE 8 试装Oracle 23c
    作者:田逸(formyz)Oracle当前的最新版本是23c,虽然官方网站下载不了它的正式版本,但是却提供了一个性能受限的免费版本“OracleDatabase23.3Free”(存储容量受限、内存使用受限)。这里就只好用这个免费的版本来做测试,免费的版本能正常部署,那么将来的正式版本的部署也不在话下。Oracle......
  • PSoc62™开发板之rtc时间获取
    实验目的1.使用PSoc62™芯片读取内部rtc时间2.OLED屏幕显示当前时间戳实验准备PSoc62™开发板SSD1306OLED模块公母头杜邦线芯片资源PSoC6系列MCU时钟系统由以下几部分组成,PSoc62™开发板没有接外部时钟源,所以只能从IMO、ILO、PILO里边配置三个内部的时钟源8-MHzi......
  • Docker 学习笔记 - 4
    容器数据卷1.容器数据卷(1)是什么容器删除后数据自然也就没有了,所以用卷来保存数据。容器数据卷功能是持久化和数据共享。卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFileSyste提供一些用于持续存储或共享数据的特性。......
  • Socket接收粘包处理
    什么是粘包?比如:通过Socket发2条不一样长度的数据,"abc"和"defg"。因为Socket的数据不是你请求发就立即发送的,有时候为了减少网络交互次数,会把几小的个数据凑一凑一起发送。如果前面的被凑到一起发送了"abcdefg",就出现了粘包。 如何解决粘包问题?发送数据的时候,在数据里带上这......
  • 【Dynamics365-Finance&Operations学习】Chain of Command Feature使用方法与使用场景
    前提微软在PlatformUpdate9之后引入了ChainofCommand(CoC),通过支持像Public和Protected类型的拓展,来为技术顾问和编程人员减少过度分层(overlayering)。在PU15(Dynamic365的某一版本)中,在Form、Table和Class的CoC已经被实现,但在表单数据源(FormDataSource)和表单数据字段(Formdat......
  • STM32CubeMX教程20 SPI - W25Q128驱动
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手逻辑分析仪nanoDLA2、实验目标使用STM32CubeMX软件配置STM32F407开发板的SPI1与W25Q128芯片通信,以轮询方式读......