STAR CCM+二次开发|02 Macro录制

本文以一个简单的案例描述STAR CCM+中Macro的录制过程。

1 案例描述

本案例演示以下过程:

  1. 利用STAR CCM+录制一段创建几何模型的脚本
  2. 开发一个GUI界面,实现几何模型参数化建模

2 建立模型

本案例模型在STAR CCM+中创建。

  • 启动STAR CCM+,新建一个simulation
  • 选择菜单 File → Macro → Start Recording ,或点击工具栏 Start Recording按钮,在打开的文件保存对话框中指定保存的宏文件为 createGeometry.java
STAR CCM+二次开发|02 Macro录制的图1
  • 右键选择树形节点 Geometry > 3D-CAD Model,选择 New打开几何创建界面,如下图所示
STAR CCM+二次开发|02 Macro录制的图2
  • 在几何操作模块中,右键选择节点 Features > XY,选择菜单 Create Sketch在XY平面上创建草图
STAR CCM+二次开发|02 Macro录制的图3
  • 在草图中创建一个半径0.01m的圆,如下图所示
STAR CCM+二次开发|02 Macro录制的图4
  • 关闭草图面板返回至模型操作,鼠标右键选择树形节点 Sketch 1,选择弹出菜单 Extrude进行草图拉伸
STAR CCM+二次开发|02 Macro录制的图5
  • 在弹出的参数设置界面中,设置拉伸长度 Distant1m,,如下图所示
STAR CCM+二次开发|02 Macro录制的图6
  • 点击按钮 Close 3D-CAD关闭建模面板
  • 右键选择模型树节点 Geometry > 3D-CAD Models > 3D-CAD Model 1,选择菜单 New Geometry Part,在弹出对话框中采用默认参数,点击 OK按钮关闭对话框。
STAR CCM+二次开发|02 Macro录制的图7
  • 右键选择树节点 Geometry > Parts > Body 1> Surfaces > Default,选择菜单 Split By Part Curves...
STAR CCM+二次开发|02 Macro录制的图8
  • 在弹出的对话框中,选择 Part CurvesDefault,如下图所示,点击 OK按钮确认操作
STAR CCM+二次开发|02 Macro录制的图9
  • 更改模型树节点名称Default为wall,default 2为inlet,default 3为outlet
  • 右键选择模型树节点 Geometry >Part > Body 1,选择菜单 Assign Parts to Regions...
STAR CCM+二次开发|02 Macro录制的图10
  • 在弹出的菜单中,进行如下图所示选择,点击 ApplyClose按钮确认并关闭对话框
STAR CCM+二次开发|02 Macro录制的图11
  • 结束宏的录制,至此几何创建完毕。

此时可以用文本编辑器打开之前创建的createGeometry.java文件,查看里面所记录的内容。删掉其中一些没有用的语句,并对程序进行重构整理,该整理成函数的整理成函数,该参数化的参数化。这里要参数化的变量很少,只有半径和长度两个物理量。

注意:由于每一步操作均会生成java语句,因此为避免生成过多没用的语句,建议在正式录制之前多练习几遍,务求尽可能少一些无用操作,尤其是一些视图操作。

操作录制完毕后,可以打开录制生成的Java代码,删除其中的一些无效操作(如重复操作、视图操作等),并进行测试。

经过删减后的Java代码如下:

// Simcenter STAR-CCM+ macro: createGeometry.java
// Written by Simcenter STAR-CCM+ 18.02.008
package macro;

import java.util.*;

import star.common.*;
import star.base.neo.*;
import star.vis.*;
import star.cadmodeler.*;

public class createGeometry extends StarMacro {
   public void execute() {
       execute0();
   }
   private void execute0() {

       Simulation simulation_0 = getActiveSimulation();
       Scene scene_0 = simulation_0.getSceneManager().createScene("3D-CAD View");
       scene_0.initializeAndWait();

       CadModel cadModel_0 = simulation_0.get(SolidModelManager.class).createSolidModel(scene_0);
       cadModel_0.resetSystemOptions();
       scene_0.openInteractive();
       scene_0.setAdvancedRenderingEnabled(false);

       // draw sketch
       CanonicalSketchPlane canonicalSketchPlane_0 = ((CanonicalSketchPlane) cadModel_0.getFeature("XY"));
       Sketch sketch_0 = cadModel_0.getFeatureManager().createSketch(canonicalSketchPlane_0);
       cadModel_0.allowMakingPartDirty(false);
       cadModel_0.getFeatureManager().startSketchEdit(sketch_0);
       Units units_0 = simulation_0.getUnitsManager().getPreferredUnits(Dimensions.Builder().length(1).build());
       // radius = 0.01
       CircleSketchPrimitive circleSketchPrimitive_0 = sketch_0.createCircle(new DoubleVector(new double[]{0.0, 0.0}), 0.130384048104053);
       RadiusDimension radiusDimension_0 = sketch_0.createRadiusDimension(circleSketchPrimitive_0, 0.01, units_0);

       //extrude sketch_0
       ExtrusionMerge extrusionMerge_0 = cadModel_0.getFeatureManager().createExtrusionMerge(sketch_0);
       extrusionMerge_0.getDistance().setValueAndUnits(1.0, units_0);
       cadModel_0.getFeatureManager().execute(extrusionMerge_0);
       star.cadmodeler.Body cadmodelerBody_0 = ((star.cadmodeler.Body) extrusionMerge_0.getBody(circleSketchPrimitive_0));
       cadModel_0.createParts(new NeoObjectVector(new Object[]{cadmodelerBody_0}), new NeoObjectVector(new Object[]{}), true, false, 1, false, false, 3, "SharpEdges", 30.0, 2, true, 1.0E-5, false);

       // split Default wall
       SolidModelPart solidModelPart_0 = ((SolidModelPart) simulation_0.get(SimulationPartManager.class).getPart("Body 1"));
       PartSurface partSurface_0 = ((PartSurface) solidModelPart_0.getPartSurfaceManager().getPartSurface("Default"));
       PartCurve partCurve_0 = ((PartCurve) solidModelPart_0.getPartCurveManager().getPartCurve("Default"));
       solidModelPart_0.getPartSurfaceManager().splitPartSurfacesByPartCurves(new NeoObjectVector(new Object[]{partSurface_0}), new NeoObjectVector(new Object[]{partCurve_0}));
       partSurface_0.setPresentationName("wall");
       PartSurface partSurface_1 = ((PartSurface) solidModelPart_0.getPartSurfaceManager().getPartSurface("Default 2"));
       partSurface_1.setPresentationName("inlet");
       PartSurface partSurface_2 = ((PartSurface) solidModelPart_0.getPartSurfaceManager().getPartSurface("Default 3"));
       partSurface_2.setPresentationName("outlet");

       // assign region
       simulation_0.getRegionManager().newRegionsFromParts(new NeoObjectVector(new Object[]{solidModelPart_0}), "OneRegionPerPart", null, "OneBoundaryPerPartSurface", null, RegionManager.CreateInterfaceMode.BOUNDARY, "OneEdgeBoundaryPerPart", null);
   }
}

Macro清理时注意:

  1. 通常情况下与Scene及view相关的行都可以直接删掉,这些都是用于显示的语句
  2. 源代码中不能出现任何中文字符,因为在STAR CCM+中运行时会识别不出来而报错,注释中也不允许有中文字符
  3. 在清理Macro时,可以采用注释的方式测试删除后的效果,避免误删

可看下面的演示视频。


(完)

文章来源:CFD之道

(1条)
默认 最新
感谢分享
评论 点赞
点赞 4 评论 1 收藏 8
关注