【C#】【SAP2000】读取SAP2000中单元截面信息和几何信息到Grasshopper中

csharp 复制代码
    if (build == true)
    {
      // 声明变量
      int ret;
      int Numit = 0;
      int[] ObjType = new int[0];
      string[] ObjName = new string[0];
      string sauto = "";
      string propname = "";
      string point1 = "";
      string point2 = "";
      double x1 = 0;
      double y1 = 0;
      double z1 = 0;
      double x2 = 0;
      double y2 = 0;
      double z2 = 0;
      List<Point3d> _pnt1 = new List<Point3d>();
      List<Point3d> _pnt2 = new List<Point3d>();
      List<string> _prof = new List<string>();

      // 连接到正在运行的 SAP2000
      cOAPI mySapObject = null;
      mySapObject = (cOAPI) System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject");
      cSapModel mySapModel;
      mySapModel = mySapObject.SapModel;

      // 获取选中的对象
      ret = mySapModel.SelectObj.GetSelected(ref Numit, ref ObjType, ref ObjName);

      // 遍历选中的对象
      for (int i = 0; i < ObjName.Length; i++)
      {
        // 获取框架对象的起点和终点
        ret = mySapModel.FrameObj.GetPoints(ObjName[i], ref point1, ref point2);

        // 获取起点的坐标
        ret = mySapModel.PointObj.GetCoordCartesian(point1, ref x1, ref y1, ref z1);

        // 获取终点的坐标
        ret = mySapModel.PointObj.GetCoordCartesian(point2, ref x2, ref y2, ref z2);

        // 创建起点和终点的 Point3d 对象
        Point3d pt1 = new Point3d(x1, y1, z1);
        Point3d pt2 = new Point3d(x2, y2, z2);

        // 添加起点和终点到相应的列表
        _pnt1.Add(pt1);
        _pnt2.Add(pt2);

        // 将起点、终点和截面名称列表赋值给输出参数
        p1 = _pnt1;
        p2 = _pnt2;

        // 获取框架对象的截面名称
        ret = mySapModel.FrameObj.GetSection(ObjName[i], ref propname, ref sauto);

        // 添加截面名称到列表
        _prof.Add(propname);
        Profile = _prof;
      }
    }

调整代码编写,让变量在定义参数的时候才声明,并在附近编写。更容易理解。

csharp 复制代码
if (build == true)
{
    // 连接到正在运行的 SAP2000
    cOAPI mySapObject = (cOAPI)System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject");
    cSapModel mySapModel = mySapObject.SapModel;

    // 获取选中的对象
    int Numit = 0;
    int[] ObjType = new int[0];
    string[] ObjName = new string[0];
    int ret = mySapModel.SelectObj.GetSelected(ref Numit, ref ObjType, ref ObjName);

    // 声明点和截面名称列表
    List<Point3d> _pnt1 = new List<Point3d>();
    List<Point3d> _pnt2 = new List<Point3d>();
    List<string> _prof = new List<string>();

    // 遍历选中的对象
    for (int i = 0; i < ObjName.Length; i++)
    {
        // 获取框架对象的起点和终点
        string point1 = "";
        string point2 = "";
        ret = mySapModel.FrameObj.GetPoints(ObjName[i], ref point1, ref point2);

        // 获取起点的坐标
        double x1 = 0;
        double y1 = 0;
        double z1 = 0;
        ret = mySapModel.PointObj.GetCoordCartesian(point1, ref x1, ref y1, ref z1);

        // 获取终点的坐标
        double x2 = 0;
        double y2 = 0;
        double z2 = 0;
        ret = mySapModel.PointObj.GetCoordCartesian(point2, ref x2, ref y2, ref z2);

        // 创建起点和终点的 Point3d 对象
        Point3d pt1 = new Point3d(x1, y1, z1);
        Point3d pt2 = new Point3d(x2, y2, z2);

        // 添加起点和终点到相应的列表
        _pnt1.Add(pt1);
        _pnt2.Add(pt2);

        // 获取框架对象的截面名称
        string propname = "";
        string sauto = "";
        ret = mySapModel.FrameObj.GetSection(ObjName[i], ref propname, ref sauto);

        // 添加截面名称到列表
        _prof.Add(propname);
    }

    // 将起点、终点和截面名称列表赋值给输出参数
    p1 = _pnt1;
    p2 = _pnt2;
    Profile = _prof;
}

做了以下改变:

  1. 将变量声明移动到了它们第一次被使用的位置附近,使代码更加紧凑和易于理解。

  2. 将点和截面名称列表的声明移动到了循环之前,使它们的作用域更加清晰。

  3. 将输出参数的赋值移动到了循环之后,使代码的逻辑更加清晰。

这样调整后的代码结构更加清晰,变量的声明和使用更加紧密,提高了代码的可读性和可维护性。

相关推荐
我不会写代码njdjnssj26 分钟前
网络编程 TCP UDP
java·开发语言·jvm
李少兄9 天前
解决OSS存储桶未创建导致的XML错误
xml·开发语言·python
阿蒙Amon9 天前
《C#图解教程 第5版》深度推荐
开发语言·c#
学Linux的语莫9 天前
python基础语法
开发语言·python
暖馒9 天前
C#委托与事件的区别
开发语言·c#
嘉琪0019 天前
2025——js 面试题
开发语言·javascript·ecmascript
JosieBook9 天前
【C#】C#异步编程:异步延时 vs 阻塞延时深度对比
c#·多线程·异步·阻塞
Jinxiansen02119 天前
Vue3 中 ref 与 reactive 使用场景总结(含对比与示例)
开发语言·javascript·ecmascript
时空自由民.9 天前
C++ 不同线程之间传值
开发语言·c++·算法
止观止9 天前
Rust智能指针演进:从堆分配到零复制的内存管理艺术
开发语言·后端·rust