加载中…
个人资料
沙痕
沙痕
  • 博客等级:
  • 博客积分:0
  • 博客访问:167,777
  • 关注人气:282
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
公告

此博文纯为个人学习之记录,虽力求精细、准确,以与志同道合者分享交流,如文中涉及版权、错误、误导之处,希来信告知,即可改正,无需在此留下不愉快,对此深表歉意。

Email:80941918@qq.com

QQ: 80941918

搜博主文章
新浪微博
我去过的地方
国内 (0篇)
国外 (0篇)
博文
置顶: (2015-03-13 14:44)

【2017-9-14更新】

 SYP为基于云架构的【免费共享】水利环境科学计算客户端软件,致力于整合水利环境领域科学计算程序,以服务于水利环境计算相关从业人员及政府管理决策技术支持。现以部署的应用有,MIKE模型相关数据处理,后续将持续部署相关模型的数据处理应用,以及部署免费的数学模型,有关SYP的开发进程可详见Blog:http://blog.sina.com.cn/hydrojip SYP软件下载:http://appcenter.shywater.com/

朋友们持续的关注是推动SYP发展的动力,同时任何需求都可以在这里提,具有共性的功能需求,我们会考虑直接开发部署上去,另外朋友们自己手里有好的应用,如果可以,也可以联系我们,我们会很容易就集成这个平台里面为大家服务。SYP是开放的平台,免费的,她是为大家服务的,同时她是需要大家往里面塞东西的,所以未来的发展是为具有一定开发能力的人员开源的。

 

平台软件非常小,目前仅有4M,绿色安装,可以先当做小软件使用。

软件下载:http://appcenter.shywater.com/

运行环境:

互联网

WIN7.Net Framework 4.5,下载地址:官网:http://www.microsoft.com/zh-cn/download/details.aspx?id=30653 

任何问题,可在QQ群15978908进行讨论。

 

发展模式:应很多朋友因SYP提供的APP功能爽了一点但不够彻底的疑问,再加昨晚看锤子科技发布会视频有感,在这里解释一下,做SYP可以说是我个人的一点情怀,多年一直想做而直到2015.2.14这个特殊的日子才形成这么一个雏形。目前大多数APP是多年积累的MIKE模型相关工具(声明一下,完全基于开放接口),但SYP这个平台是包络万象的,我们的野心是将日常工作中的数据处理自动化或半机器人化(也即十步解决的问题,我们尽量一两步完成),以及形成一个大数据系统平台。不管怎样,还是得说下SYP的运营模式,澄清一些顾虑,SYP所有针对第三方的APP都是基于开放接口来实现,SYP提供在线免费、在线定制收费、离线定制收费的APP和业务系统两类三种模式。

 




开发日志:

+++2017/9/14+++ 完善了包络面计算app,支持了dfsu结果在没有定义投影情况下,通过后期data manager打开配置了投影信息并保存后的dfsu文件。

+++2016/11/18+++ 采用ClickOnce发布部署,方便了版本更新,以后统一地址为:http://appcenter.shywater.com/publish.htm

+++2016/3/15+++ 发布了v0.1.16,更新【一步云端计算】APP,实现了将MIKE模型云端计算实时推送到客户端。

+++2015/11/11+++发布了v0.1.15,添加了【MIKE11模型数据转换】应用,实现将MIKE11模型的水位、流量、流速结果转换shp数据。

+++2015/11/4+++ 修复了【修复MIKE11模型Warning65】的bug。

+++2015/9/18+++ 优化了SYP的WPF桌面客户端启动,消除了因为网络带宽或服务响应慢等原因导致启动缓慢或半天没有反应等现象。

+++2015/9/8+++ SYP的Web版雏形搭建完成,访问域名:http://cloud.shywater.com/

+++2015/4/28 +++发布了v0.1.14,修复了【dfs转换】、【dfs2shp】存在的bug,感谢蓝色幽默的bug报告,新增了【修复MIKE11模型Warning65】应用,主要用在大型河网模型构建中存在的河段两端自动插值或移动断面,自动修复河段相连处的河床深泓线落差,从而整体提高模型稳定性。
+++2015/4/20+++ 发布了v0.1.13,修复了【xyuv2shp】应用处理重复点的bug,更新一组新的图标,增加了任务栏显示功能,增加了类似QQ右下角小窗消息功能,新增了【堤防自动标识】应用,实现自动标识MIKE模型大断面的左右岸堤防,也即自动设置Mark1(左岸堤防点,非左岸第1个点)、2(河床最低点)、3(右岸堤防点,非右岸第1个点),新增了【excel2dfs0】应用,实现将以示例格式存储的大时间序列数据批量(多个excel文件)生产出一个dfs0文件。
+++2015/4/14 +++发布了v0.1.12,针对上线以来运行出现的一系列问题,进行了比较大的优化完善,特别是并发处理的完善,修复了【sms2mike】、【xyuv2shp】应用的bug,感谢网友提供发现bug,新增了【Excel2Xns11】应用,部署了一种excel格式的数据支持功能,实现将以示例格式存储的大断面数据批量(多个excel文件)生产出一个断面文件,并自动标识出堤防mark。

+++2015/4/9+++ 发布v0.1.11,修复了【xyuv2shp】的bug,更新了【包络面提取】以支持4步骤完成包络面的提取及到地图绘制,新增了【D3Grid2Mike】,实现将Delft3D的网格和地形文件转换为MIKE非结构网格模型的网格地形文件,新增了【MIKE2GEO】实现将MIKE非结构网格模型的网格转换为SMS软件Rma2模型网格地形文件,主要用来利用SMS软件一些功能来方便调整网格地形。

+++2015/4/7+++ 发布v0.1.10,添加了【xyuv2shp】应用,实现基于水动力学模型计算出的网格点流速数据u、v,及网格点坐标数据x、y,绘制流速箭头矢量数据,一步生成shp文件。

+++2015/4/1+++ 发布v0.1.9,添加了【shp2xyz】应用,实现将esri的线或面数据的轮廓直接转换为MIKE模型识别的xyz陆地边界文件。

+++2015/3/26+++ 发布v0.1.8,更新了【包络面提取】应用中的“智能填表”功能,支持自定义模型标识来提取相应的统计面积。

+++2015/3/18+++ 发布v0.1.7,添加了【包络面提取】应用,可统计MIKE21FM模型的淹没水深面积,主要应用于洪水风险图编制项目,并内嵌了洪水水深分级标准。http://blog.sina.com.cn/s/blog_5e778a9d0102vhet.html

+++2015/3/11+++ 发布v0.1.6,添加了【洪水风险图编制】应用,主要应用于洪水风险图编制项目中,提取MIKE模型计算结果的前锋到达时间及洪水淹没历时。http://blog.sina.com.cn/s/blog_5e778a9d0102vgsq.html

+++2015/3/09+++ 发布v0.1.5,添加了【MIKE11水库】应用,实现了根据设定的取水口位置提取MIKE11水库模型取水口的水温过程。http://blog.sina.com.cn/s/blog_5e778a9d0102vgng.html

+++2015/3/08+++ 发布v0.1.4,添加了【Xns11转换】应用,实现了将MIKE11大断面文件(含有坐标信息)提取为散点数据,主要实现了在只录入大断面左右岸坐标的情况下,自动算出所有大断面测点的坐标,提取为散点数据,方便将一维模型转换为二维模型。http://blog.sina.com.cn/s/blog_5e778a9d0102vgmf.html

+++2015/3/06+++ 发布v0.1.3,添加了【Dfs转换】应用,实现将MIKE21FM模型计算结果dfsu文件转为Esri的shp文件以及Tecplot的dat文件。http://blog.sina.com.cn/s/blog_5e778a9d0102vggl.html

+++2015/2/14+++ 正式推出SYP,描述了SYP的构想及框架。http://blog.sina.com.cn/s/blog_5e778a9d0102vfcg.html

 

SYP平台源代码架构说明图,欢迎有一定技术实力和时间且感兴趣的朋友参与共同开发。


采用Clickonce发布部署,下载、自动更新。

 




阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
参考:
https://geonet.esri.com/thread/185176-convert-raster-dem-to-stl-for-3d-printing
http://gis.ess.washington.edu/data/vrml/vrml2stl.py

修改后,支持arcgis10.2,代码如下:

#! /usr/bin/env python
# Translates simple vrml to stl
# There is no support for textures.
# This has been tested on a large vrml file (representing topography) created
# by the tinvrml command in ARC/INFO 8.1, and running with 
# python 2.2.1 under solaris8 unix.
# The one argument is the root name of a .wrl file.
# The output is root.stl
# Version 1.1 does not stop at the first separator.
# Copyleft Harvey Greenberg, University of Washington, hgreen@u.washington.edu
import string
import sys

root = sys.argv[1]
print 'Converting ',root+'.wrl to ',root+'.stl'
f=open(root+'.wrl')
while 1:      # skip through initial stuff
  linney=string.split(f.readline())
# print linney
  if len(linney) == 4:
    if linney[0] == 'translation':
      transx = float(linney[1])
      transy = float(linney[2])
      transz = float(linney[3])
#     print 'xyz',transx,transy,transz # I don't use these values.
  #print linney
  #raw_input()
  if linney == ['point']:
    break
#print 'Reading vertex coordinates.'
skipline=f.readline()
verts = [] # The first triplet is index zero in the wrl file.
while 1:
  xyz = f.readline()
  linney=string.split(xyz)
  i = string.find(xyz,' ')
  if linney==[']']:    # end of vertex coordinates
    break
  else:
    verts.append(linney) # building a list of xyz strings
print 'We have',len(verts)-1,'vertices.'
while 1:     # skip to triplets of vertex numbers
  linney=string.split(f.readline())  # linney was a list, now it's a string
  if linney[0] == '[':
    break 
g=open(root+'.stl','w') # open stl file for writing.
g.write('solid %s\n' % root)
print 'Reading triangles.'
linney=f.readline()
#print linney
linney=linney.split('-1')
for row in linney:
  abc=string.split(row)
  if len(abc)<3:
  break
  else:
    #print abc[0]
    #print int(abc[0])
    xyz = verts[int(abc[0])] # look up a vertex in the list
    #print xyz
    #raw_input()
    x1 = float(xyz[0]) 
    y1 = float(xyz[1])
    z1 = float(xyz[2])
    xyz = verts[int(abc[1])]
    x2 = float(xyz[0])
    y2 = float(xyz[1])
    z2 = float(xyz[2])
    xyz = verts[int(abc[2])]
    x3 = float(xyz[0])
    y3 = float(xyz[1])
    z3 = float(xyz[2])

    dx1 = x1-x3
    dy1 = y1-y3
    dz1 = z1-z3
    dx2 = x2-x3
    dy2 = y2-y3
    dz2 = z2-z3
# print 'dx1=',dx1,'\ndy1=',dy1,'\ndz1=',dz1,'\ndx2=',dx2,'\ndy2=',dy2,'\ndz2=',dz2,'\n'
    vx = dy1*dz2 - dz1*dy2  # take the cross product of two edges
    vy = dz1*dx2 - dx1*dz2
    vz = dx1*dy2 - dy1*dx2
    templength = (vx*vx + vy*vy + vz*vz)**.5
    xn = vx/templength     # normalize the normal vector
    yn = vy/templength
    zn = vz/templength
# print 'Normal  %f,%f,%f\n' % (xn,yn,zn)

    g.write(' facet normal %f %f %f\n  outer loop\n' % (xn,yn,zn))
    g.write('   vertex %d %d %.2f\n' % (x1,y1,z1))
    g.write('   vertex %d %d %.2f\n' % (x2,y2,z2))
    g.write('   vertex %d %d %.2f\n' % (x3,y3,z3))
    g.write('  endloop\n endfacet\n')
g.write('endsolid %s\n' % root)
print 'Thank you.'



阅读  ┆ 评论  ┆ 转载 ┆ 收藏 

【2016-7-13更新】

大多数水利环境业务系统集成专业模型时,用户的需求是这样表达的:某真实案例,客户说,我们要开发一个B/S系统,里面想嵌入已经构建好的模型(比如说MIKE模型,但不限于MIKE模型),希望通过前台可以改变一些输入或者参数(比如说改变方案计算时间、边界条件时间序列、实时加一个溃口等),然后前台有个类似于开始运行的按钮,按了之后模型就开始运算了,不用让用户跳出模型本身的界面再进行操作。基于这样一种需求,SYP平台其实已经在架构设计里包含了这种需求,完全SOA的架构,业务模型逻辑层->WCF服务层->客户端调用服务的API层(C#C++JAVA->客户端界面层(WebWPFWinformQt等)。我们特别写了两个demo工程,示例说明了这种模式。实现线下模型模版的一键管理,修改计算参数、边界条件、实时动态加载溃口,启动计算,实时获取结果,整个流程。

 

示例工程前端是以控制台作为输出载体,后面我们会逐步改到直接在osg三维gis上做实时渲染。以下给出了示例工程代码的下载地址,demo工程代码下载地址: svnhttps://shywater.com/svn/SYAPP/branches/4Guest_Mike21RealtimeSimulation 用户名:guest;密码:guest

 

已编译好的可执行程序下载地址: https://shywater.com/svn/SYAPP/branches/4Guest_Mike21RealtimeSimulation/实时计算MikeFlood模型.zip 

以下为在我们三维osg平台上的运行效果:





 以下是C#C++调用的示例代码: 

 

C#

Code Snippet

  1. private static void InterfaceTest1()
  2. {
  3. //1.指定本地模型包
  4. modelConfigfile = @"../../bin/Data/FloodplainDemonstration.zip";
  5.  
  6. if (File.Exists(modelConfigfile))
  7. {
  8. //2.上传模型包(指定本地模版模型)
  9. var handle = new FlowModelBaseHandle();
  10. handle.OutputMsgCallback += handle_OutputMsgCallback;
  11. modelId = handle.GenerateMikeFloodModel(modelConfigfile);
  12.  
  13. //3.设置计算参数
  14. SY.Models.Scenario.ScenarionTime st = new SY.Models.Scenario.ScenarionTime();
  15. SY.Models.ModelBase.ModelTime mt = new SY.Models.ModelBase.ModelTime();
  16. mt.StartTime = DateTime.Parse("2002/05/23 0:00:00");
  17. mt.EndTime = DateTime.Parse("2002/05/24 10:30:00");
  18. mt.OutputStep = 60;
  19. st.ModelTimePara = mt;
  20. handle.CalculateParaSet(modelId, SY.Models.Scenario.enumModelDomainType.一二维耦合,
  21. SY.Models.Scenario.enumModelName.MIKEFLOOD, SY.Models.Scenario.enumScenarioFeild.防洪,
  22. st);
  23.  
  24. //4.设置边界条件
  25. //SY.Models.Scenario.ScenarioInput si = new SY.Models.Scenario.ScenarioInput();
  26. //SY.Models.ModelBase.Boundary bd = new SY.Models.ModelBase.Boundary();
  27. //bd.BDIndex = 0;
  28. //bd.HDType = SY.Models.ModelBase.enumHDBoundaryType.水位;
  29. //bd.Value = new List() { };
  30. //si.ModelBoundary.Add(bd);
  31.  
  32. //handle.GeneralSectionBoundaryConditionSet(modelId, SY.Models.Scenario.enumModelDomainType.一二维耦合,
  33. //SY.Models.Scenario.enumModelName.MIKEFLOOD, SY.Models.Scenario.enumScenarioFeild.防洪,
  34. //si.ModelBoundary);
  35.  
  36. //5.设置溃口条件
  37. SY.Models.ModelBase.DykeBreakStructure db = new SY.Models.ModelBase.DykeBreakStructure();
  38. //5.1基本信息
  39. db.GeneralInfo.breakLevel = 0.5f;
  40. db.GeneralInfo.breakTime = DateTime.Parse("2002/5/23 4:30:00");
  41. db.GeneralInfo.elevation = 0.5f;
  42. db.GeneralInfo.name = "kuikou_1";
  43. db.GeneralInfo.width = 50;
  44. db.GeneralInfo.x = 372810; //地图点选的溃口发生的位置x坐标
  45. db.GeneralInfo.y = 8127330;//地图点选的溃口发生的位置y坐标
  46. db.GeneralInfo.XLink = new List<</SPAN>double> { 372780, 372764 };
  47. db.GeneralInfo.YLink = new List<</SPAN>double> { 8127313, 8127350 };
  48. //5.2溃口信息
  49. db.BreakPara = new ListDykeBreakingGeometryStruct>()
  50. {
  51. new SY.Models.ModelBase.DykeBreakingGeometryStruct(){
  52. level=0.5f, time=0,width=0,slope=1
  53. },
  54. new SY.Models.ModelBase.DykeBreakingGeometryStruct(){
  55. level=0.4f, time=300,width=10,slope=0.6f
  56. },
  57. new SY.Models.ModelBase.DykeBreakingGeometryStruct(){
  58. level=0.3f, time=600,width=40,slope=0.6f
  59. },
  60. new SY.Models.ModelBase.DykeBreakingGeometryStruct(){
  61. level=0.2f, time=900,width=80,slope=0.6f
  62. },
  63. new SY.Models.ModelBase.DykeBreakingGeometryStruct(){
  64. level=0.1f, time=6000000,width=150,slope=0.6f
  65. }
  66. };
  67.  
  68. handle.DykeSet(modelId, SY.Models.Scenario.enumModelDomainType.一二维耦合,
  69. SY.Models.Scenario.enumModelName.MIKEFLOOD, SY.Models.Scenario.enumScenarioFeild.防洪,
  70. db);
  71.  
  72. //6.启动计算
  73. handle.RealTimeSimulateModel(modelId, SY.Models.Scenario.enumModelName.MIKEFLOOD);
  74. }
  75. }

 

C++

Code Snippet

  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. //1.指定本地模型包
  4. std::string modelZipfile = "../bin/Data/FloodplainDemonstration.zip";
  5.  
  6. //2.上传模型包(指定本地模版模型)
  7. modelId = GenerateMikeFloodModel(modelZipfile, &RecievedMsg);
  8.  
  9. //3.设置计算参数
  10. CalculateParaStruct para;
  11. para.calModelType = CalculateModelType::MODEL_12D;
  12. para.calModelName = CalculateModelName::MIKEFLOOD;
  13. para.calProjectType = CalculateProjectType::FLOODPROTECTION;
  14. para.modelId = modelId;
  15. para.startTime = "2002/05/23 0:00:00";
  16. para.endTime = "2002/05/24 10:30:00";
  17. para.outputStep = 600;
  18. para.timeValueStep = 34;
  19. CalculateParaSet(para, &RecievedMsg);
  20.  
  21. //4.设置边界条件
  22. //std::vector sectionBoundary;
  23.  
  24. //GeneralSectionStruct spara;
  25. //spara.boundaryType = BoundaryType::WaterLevel;
  26. //spara.boundaryID = 0;
  27.  
  28. //std::vector listTime;
  29. //listTime.push_back("2002/05/23 0:00:00");
  30. //listTime.push_back("2002/05/24 10:30:00");
  31.  
  32. //std::vector listData;
  33. //listData.push_back(0.1f);
  34. //listData.push_back(0.2f);
  35.  
  36. //spara.time = listTime;
  37. //spara.value = listData;
  38.  
  39. //sectionBoundary.push_back(spara);
  40.  
  41. ////2
  42. //spara.boundaryType = BoundaryType::WaterLevel;
  43. //spara.boundaryID = 1;
  44.  
  45. //listTime.clear();
  46. //listData.clear();
  47.  
  48. //listTime.push_back("2002/05/23 0:00:00");
  49. //listTime.push_back("2002/05/24 10:30:00");
  50.  
  51. //listData.push_back(0.1f);
  52. //listData.push_back(0.2f);
  53.  
  54. //spara.time = listTime;
  55. //spara.value = listData;
  56.  
  57. //sectionBoundary.push_back(spara);
  58.  
  59. //GeneralSectionBoundaryConditionSet(modelId,sectionBoundary, &RecievedMsg);
  60.  
  61. //5.设置溃口条件
  62. DykeGeneralInfoStruct para1;
  63. std::vector<</SPAN>DykeBreakingGeometryStruct> para2;
  64. para1.breakLevel = 0.5f;
  65. para1.breakTime = "2002/5/23 4:30:00";
  66. para1.elevation = 0.5f;
  67. para1.name = "kuikou01";
  68. para1.width = 50;
  69. para1.x = 372810;
  70. para1.y = 8127330;
  71. para1.Xlink.push_back(372780);
  72. para1.Xlink.push_back(372764);
  73. para1.Ylink.push_back(8127313);
  74. para1.Ylink.push_back(8127350);
  75.  
  76. DykeBreakingGeometryStruct para3;
  77. para3.relativeTime = 0;
  78. para3.level = 0.5f;
  79. para3.width = 0;
  80. para3.slope = 1;
  81. para2.push_back(para3);
  82. para3.relativeTime = 300;
  83. para3.level = 0.4f;
  84. para3.width = 10;
  85. para3.slope = 0.6f;
  86. para2.push_back(para3);
  87. para3.relativeTime = 600;
  88. para3.level = 0.3f;
  89. para3.width = 40;
  90. para3.slope = 0.6f;
  91. para2.push_back(para3);
  92. para3.relativeTime = 900;
  93. para3.level = 0.2f;
  94. para3.width = 80;
  95. para3.slope = 0.6f;
  96. para2.push_back(para3);
  97. para3.relativeTime = 6000000;
  98. para3.level = 0.1f;
  99. para3.width = 150;
  100. para3.slope = 0.6f;
  101. para2.push_back(para3);
  102.  
  103. DykeSet(modelId, BreakMode::Time, para1, para2, &RecievedMsg);
  104.  
  105. //6.启动模型计算
  106. RealTimeSimulateMikeFloodModel(modelId, &RecievedMsg);
  107.  
  108. getchar();
  109. return 0;
  110. }

 

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
去年针对洪水风险图项目,就如何在Arcgis中快速成图MIKE21模型的计算结果,写过一篇blog(http://blog.sina.com.cn/s/blog_5e778a9d0102v8tm.html),本次针对城市水系规划项目,如何在Arcgis中快速出图MIKE11模型的计算结果(水位、流量、流速、流向),提出一种解决方案。

问题由来:水系设计规划项目中,往往涉及很多方案的计算,而且方案不断变更,如何应对这种任务而不至于过于疲惫,又能保证标准化出图?那么我这里想到的就是在Arcgis里做一个数据模型,配置好出图样式,那么不同方案情况下,我们只需要替换掉图层的数据源就可以了,具体步骤如下。

解决方案:

1.准备好河网文件和结果文件,注意,在河网文件里生成计算点(View ->Tabular view ->Grid points ->Generate Grid Points)&#8203;与结果文件存储的计算点个数一致。

2.打开SYP,选择【MIKE11模型结果转换】&#8203;APP,按界面要求将计算结果转换为流量、水位、流速的矢量文件。

3.Arcgis中图层加载,水位、流速图层的加载及标准化出图比较简单,按正常样式配置。&#8203;这里特别说明的是基于流量图层生成流向图层。这里就需要构建一系列的GIS数据模型,主要思路就是获取河段矢量走向,再根据流量的正负来获得流向的角度,这里涉及一些了字段添加、计算等操作,可以根据自身出图需要定义相应的模型过程。如下我自己的数据模型即为一次性出具日流量及流向的数据模型。

&#8203;Arcgis数据模型



Arcmap标准化出图模版


阅读  ┆ 评论  ┆ 转载 ┆ 收藏 

基于模型来做工程现状、设计方案优选的咨询项目中,往往会遇到大量方案的计算,这种情况下使用商业软件模型,如MIKE21FM等,在模型构建、批处理计算、结果处理等方面确实会提高很大的效率,但任何一款商业模型软件,因具体项目案例,都存在很大的空间来进一步提高工作效率。好久没发模型应用方面的博文了,本次,我就MIKE21FM的批量出图,给出一种解决方案(我相信不同的人都有自己可能更高效的解决方案),仅供参考。

问题由来:比如针对一个研究对象,构建了不同空间拓扑的5个方案,时间上又分为现状、规划2个方案,每个方案根据水文情势分为丰平枯3类,那么这样就存在30个方案的结果。然后每个结果,如果是动态模拟,假设全年时段,需要出全年中某些天也即步数,假设要提取10步的结果来了解研究对象的物理运移变化过程。那么这个工作如果仅靠软件自身功能来完成,可以想象工作量有多大,因为除了数据提取外,还需要保持同类型数据处理的成果图标准一致(比如颜色配置、图例位置等等)。

解决方案:考虑到Tecplot软件可以通过录制宏来实现批量出图,那么可以考虑将mike的结果转换为Tecplot来实现批量、标准化一致性出图。具体步骤如下:

1. 数据转换:转换工具,可自行开发,或可参考SYP上的数据转换工具(应时间、网络环境等原因,目前部署的只转第一步,所以还不能高效的解决,如需定制工具可以联系定制开发);

2. Tecplot录制宏:具体操作方法,请阅读Tecplot的相关帮助手册,这里仅提供思路。首先一定要清楚你有种类型的标准化出图要求,然后针对每一种,加载相应的数据文件,以浓度场为例,我们要出30个方案的某一污染物的浓度场,也即出30张图,图的图例、颜色配置需一致,那么我们首先加载一个数据文件开始录制宏,设定画布大小、等值线级别、颜色配置等等信息,停止宏录制,记事本打开宏文件,删除无关的操作记录(需要简单了解一点或者看懂一点Tecplot的宏语言)。这样一个标准化出图的宏文件就产生了。

3. 批量出图:给这个宏加一个循环,来实现不同文件的加载和出图。后面会给出一个示例宏代码。

4. 如果输出的图,还需要修剪或者自定义宽度和高度,那么这里再给大家给出在word批量修改的vba代码,只需Alt+F11,在代码编辑页面粘贴进去,点击运行即可。

5. 同样的道理可以对流场、流线等进行批量化出图。







图片裁剪批处理


Sub CropDemo()


    Dim oILS As InlineShape


    For n = 1 To ActiveDocument.InlineShapes.Count 'InlineShapes 类型图片


        Set oILS = ActiveDocument.InlineShapes(n)


        With oILS


            .PictureFormat.CropLeft = -36 !根据实际调整


            .PictureFormat.CropTop = -36 !根据实际调整


            .PictureFormat.CropRight = -36 !根据实际调整


            .PictureFormat.CropBottom = -36 !根据实际调整


        End With


    Next n


    Exit Sub


End Sub


图片宽高批处理


Dim n '图片个数


Dim picwidth


Dim picheight


On Error Resume Next '忽略错误


For n = 1 To ActiveDocument.InlineShapes.Count 'InlineShapes 类型图片


picheight = ActiveDocument.InlineShapes(n).Height


picwidth = ActiveDocument.InlineShapes(n).Width


ActiveDocument.InlineShapes(n).Height = CentimetersToPoints(6) 'cm


ActiveDocument.InlineShapes(n).Width =CentimetersToPoints(9.5) 'cm


Next n


End Sub


Tecplot示例宏:

#!MC 1200
# Created by Tecplot 360 build 12.2.0.9077
$!LOOP 15
$!VarSet |MFBD| = 'F:\方案1\'
$!EXPORTSETUP EXPORTFNAME = '|LOOP|.bmp'
$!READDATASET  '"|LOOP|.dat" '
  READDATAOPTION = NEW
  RESETSTYLE = YES
  INCLUDETEXT = NO
  INCLUDEGEOM = NO
  INCLUDECUSTOMLABELS = NO
  VARLOADMODE = BYNAME
  ASSIGNSTRANDIDS = YES
  INITIALPLOTTYPE = CARTESIAN2D
  VARNAMELIST = '"X" "Y" "Elv" "Concentration - component 1" "U-velocity" "V-velocity"'
$!TWODAXIS XDETAIL{SHOWAXIS = NO}
$!TWODAXIS YDETAIL{SHOWAXIS = NO}
$!GLOBALCONTOUR 1  VAR = 3
$!CONTOURLEVELS RESETTONICE
  CONTOURGROUP = 1
  APPROXNUMVALUES = 15
$!FIELDLAYERS SHOWCONTOUR = YES
$!GLOBALCONTOUR 1  VAR = 4
$!CONTOURLEVELS RESETTONICE
  CONTOURGROUP = 1
  APPROXNUMVALUES = 15
$!CONTOURLEVELS NEW
  CONTOURGROUP = 1
  RAWDATA
2
0.0001
1
$!GLOBALCOLORMAP  1
  CONTOURCOLORMAP = USERDEF
$!COLORMAPCONTROL 1 RESETTOFACTORY
$!GLOBALCOLORMAP  1
  USERDEFINED
    {
    NUMCONTROLPOINTS = 2
    CONTROLPOINT 1
      {
      COLORMAPFRACTION = 0
      LEADRGB
        {
        R = 176
        G = 226
        B = 255
        }
      TRAILRGB
        {
        R = 176
        G = 226
        B = 255
        }
      }
    CONTROLPOINT 2
      {
      COLORMAPFRACTION = 0.25
      LEADRGB
        {
        R = 50
        G = 50
        B = 180
        }
      TRAILRGB
        {
         R = 50
        G = 50
        B = 180
        }
      }
    }
$!EXPORTSETUP EXPORTFORMAT = BMP
$!EXPORTSETUP IMAGEWIDTH = 1200
$!EXPORT
  EXPORTREGION = CURRENTFRAME
  $!ENDLOOP
$!RemoveVar |MFBD|

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2015-08-27 15:21)
应很多朋友因SYP提供的APP功能爽了一点但不够彻底的疑问,再加昨晚看锤子科技发布会视频有感,在这里解释一下,做SYP可以说是我个人的一点情怀,多年一直想做而直到2015.2.14这个特殊的日子才形成这么一个雏形。目前大多数APP是多年积累的MIKE模型相关工具(声明一下,完全基于开放接口),但SYP这个平台是包络万象的,我们的野心是将日常工作中的数据处理自动化或半机器人化(也即十步解决的问题,我们尽量一两步完成),以及形成一个大数据系统平台。不管怎样,还是得说下SYP的运营模式,澄清一些顾虑,SYP所有针对第三方的APP都是基于开放接口来实现,SYP提供在线免费、在线定制收费、离线定制收费的APP和业务系统两类三种模式。
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有