本篇为基于YJK Control的工程测试。YJK Control是基于线程从外部调用YJK 5.1,模拟手动输入命令行调用YJK进行计算和数据后处理的模块,这种并不是纯正的API,但好歹是YJK的一个尝试,然后本码在向YJK技术支持百般询问下也尝试了下了一二。

电脑系统:win11 64位
CPU: AMD 5950X 16核心32线程 内存:32G , GPU: RTX3070 , YJK主要是基于CPU运行,GPU主要是SSG和Abaqus可能用到。 最近新配的电脑性能还不错,但到底如何,心里还没个数。 编译环境:visual studio 2019

测试任务:通过自编程序,通过YJK Control打开.yjk模型的功能(380米框筒)并计算完成,所花的时间显示在窗口栏。

1 编程环境配置

配置起来倒不是太难,但YJK 的手册实在不敢恭维,还好技术支持服务态度还不错。

【step 1】通过git获取YJK官方YJK Control代码。没有git的话,自己到百度git下载一个。

git clone https://gitee.com/yjk-opensource/csharp-yjks.git

【step 2】将C:\ProgramData\yjkSoft\YJKS5.1\YJKS\Config.ini添加如下语句

[YJKSControl]
Flag = True

添加完后,然后为如下:

图1 修改Config.ini
图1 修改Config.ini

【step 3】利用step1下载下来的文件替换,YJK5.1安装路径下文件。

图2 替换YJK主程序文件
图2 替换YJK主程序文件

到此,环境配置完毕。

2 案例学习

先学习下YJK技术支持给的案例1(上面step1中下载下来的代码),代码如下:

using System;
using System.Runtime.InteropServices;

/*该例演示通过脚本控制YJK,在如下代码中修改yjk的路径及模型文件及ydb的路径后即可运行,
运行的说明及命令的说明可参考相关文件*/
namespace test01
{
    class Program
    {
        static ConsoleEventDelegate handler;
        private delegate bool ConsoleEventDelegate(int eventType);
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);

        static bool ConsoleEventCallback(int eventType)
        {
            if (eventType == 2)
                YJKSControl.exit();
            return false;
        }


        static void Main(string[] args)
        {
            /*对单独命令进行调用可取消下面四句,但需要手动修改
            C:\ProgramData\yjkSoft\YJKS5.1\YJKS\Config.ini中YJKSControl下的Flag为True,
            启动YJK后即可运行脚本,不需要YJKSControl后再将Flag改成False*/

            //handler = new ConsoleEventDelegate(ConsoleEventCallback);//这个地方我注释掉了,因为我的Flag已经改为了True
            //SetConsoleCtrlHandler(handler, true);//此处主要是改Flag
            string str = YJKSControl.init(@"C:\YJKS\YJKS_5_1\yjks.exe""5.1");//YJK安装路径
            Console.WriteLine(str);//差不多是启动YJK程序的意思
            YJKSControl.RunCmd("yjk_opennew", @"D:\T1\1.yjk");//新建一个模型
            YJKSControl.RunCmd("yjk_importydb", @"D:\T1\pymodel.ydb");//导入模型ydb
            YJKSControl.RunCmd("yjk_repairex""");//工程修复
            YJKSControl.RunCmd("yjk_save""");//模型保存
            YJKSControl.RunCmd("yjk_formnode""");
            YJKSControl.RunCmd("yjk_setlayersupport""");
            YJKSControl.RunCmd("yjkspre_genmodrel""");//生成分析模型
            YJKSControl.RunCmd("yjktransload_tlplan""");//平面荷载导荷
            YJKSControl.RunCmd("yjktransload_tlvert""");//竖向荷载导荷
            YJKSControl.RunCmd("SetCurrentLabel""IDSPRE_ROOT");//切换到计算参数界面
            YJKSControl.RunCmd("yjkdesign_dsncalculating_all""");//计算
            YJKSControl.RunCmd("SetCurrentLabel""IDDSN_DSP");//切换到设计结果界面
            Console.WriteLine("运行完成!");//计算完成。
            Console.ReadLine(); 
        }
    }
}

以上是模拟手动打开yjk,然后输入命令调用YJK的各个模块完成工作。

3 工程测试

【step 1】先创建一个窗体,选择Windows窗体应用,然后点击下一步。

图3 打开visual studio 2019
图3 打开visual studio 2019
图4 命名为textYJKControl
图4 命名为textYJKControl

用winform画一个界面,如下:

图5 YJKControl测试1.0界面
图5 YJKControl测试1.0界面

【step 2】实现选择路径和运行YJK程序。

按下面代码实现功能,另外需要添加YJKControl.dll的引用。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace testYJKControl
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != null)
            {
                DateTime begintime = DateTime.Now;//获取开始时间
                string str = YJKSControl.init(@"C:\YJKS\YJKS_5_1\yjks.exe""5.1");
                YJKSControl.RunCmd("yjk_opennew", textBox1.Text);
                YJKSControl.RunCmd("yjk_repairex""");
                YJKSControl.RunCmd("yjk_save""");
                YJKSControl.RunCmd("yjk_formnode""");
                YJKSControl.RunCmd("yjk_setlayersupport""");
                YJKSControl.RunCmd("yjkspre_genmodrel""");
                YJKSControl.RunCmd("yjktransload_tlplan""");
                YJKSControl.RunCmd("yjktransload_tlvert""");
                YJKSControl.RunCmd("SetCurrentLabel""IDSPRE_ROOT");
                YJKSControl.RunCmd("yjkdesign_dsncalculating_all""");
                YJKSControl.RunCmd("SetCurrentLabel""IDDSN_DSP");
                DateTime endtime = DateTime.Now;//获取开始时间
                TimeSpan otime = endtime.Subtract(begintime);
                MessageBox.Show("运行耗时:" + otime.TotalMinutes + "分钟");
            }
            else
            {

                MessageBox.Show("请选择YJK模型路径!");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Title= "请选择YJK模型路径";
            dialog.Filter = "yjk模型数据(*.yjk)|*.yjk";
            if(dialog.ShowDialog()==DialogResult.OK)
            {
                textBox1.Text = dialog.FileName.ToString();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}

4 运行效果

用管理员方式运行该程序,单元数和自由度信息和testYJKcontrol运行视频如下所示:

0:00:03.41 [INFO] ====== 开始处理模型 [ 基本模型 ] =====

0:00:03.41 [INFO]

0:00:03.41 [STAG] 数据预处理

0:00:03.41 [INFO] 开始准备计算数据.

0:00:03.41 [STAG] 形成自由度以及节点质量.

0:00:03.91 [INFO] 工况: 15 振型:0

0:00:03.95 [INFO] 节点数: 97062

0:00:03.95 [INFO] 单元数: 49389

0:00:03.95 [INFO] 自由度: 444384(主) + 89623(从) + 0(强制位移)

PS:80层,380米框筒,新电脑,YJK5.1计算大概25分钟。或许借助YJKControl操作YJK没有CSI OAPI那样方便,但是却可以从外部调用YJK,然后通过命令行传送命令给YJK线程程序,而不需要手动点击鼠标,省去一些操作,也算一种“曲道救国”的思维吧。代码已经上传到gittee上了,大家gitee一起来哈。

git clone https://gitee.com/ming91915/test-yjkcontrol.git

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

You cannot copy content of this page