1 *createmark 应用案例

1.1 需求描述

  一个面被划分过网格了,需要在某一个指定位置,扩个孔出来,但现在面的几何信息已经被删除了。如图1所示

图1 功能描述

1.2 问题分析

  这类问题暂且线定义为网格编辑。没有几何信息,只能直接操作和编辑单元与节点。使用界面操作的思路:

  1. 在指定位置创建临时节点:Geom>>nodes
  2. 据此为圆心做圆(创建几何元素:线):Geom>>lines
  3. 删除完全在圆内的单元,可能会留下锯齿状单元。
  4. 使用project功能把上一步生成的锯齿状单元的节点投影到圆周上:Tool>>Project>>to line

  上述是操作步骤,过程效果如图2。

图2 过程效果示意图   是的,此过程GUI操作过程繁琐,而且容易出错。最好的办法就是不要遇到这样的需求,如果不可以的话,退而求次按照上述步骤细心操作,实在没办法就学习下hypermesh的二次开发吧,至少能做出如图3的效果,只要源码跑起来,指哪里就可以扩哪里,想扩多大就扩多大。

图3 TCL批量操作效果图

1.3代码剖析

  指定圆心位置和半径的功能块。

*clearmark elem 1
*clearmark node 1
#x0 y0 z0 为圆心坐标,rad为孔半径
set y0 0.0
set z0 0.0
set rad 20.0
set h 50
set elemSize 0
set r1 [expr $rad+$elemSize]
*nodemodify 1 0 0 0

  选出半径范围内的所有节点,然后同节点选出单元,并获取单元编号。

*createmark node 1 "by cylinder" $x0 $y0 $z0 0 0 1 [expr $rad+$elemSize] $h "inside" 1 1 0
*isolateentitybymark 1
*findmark nodes 1 257 1 elements 0 1
set elemList [hm_getvalue elems mark=1 dataname=id]

  然后是一顿猛如虎的操作:删除单元,投影节点。代码如下:

foreach elemId $elemList {set count 0set ndId [hm_getvalue elems id=$elemId dataname=nodes]foreach i $ndId {foreach { dis x y z } [hm_getdistance nodes 1 $i 0] {}if {[expr $dis-$rad] <= 0.000001} {incr count } }    if {$count ==4} {*createmark elements 1 $elemId*deletemark elements 1} elseif {$count ==3}  {foreach i $ndId {foreach { dis x y z } [hm_getdistance nodes 1 $i 0] {}if {[expr $dis-$rad] >= 0.000001} {*nodemodify $i [expr $rad/$dis*($x)+$x0] [expr $rad/$dis*($y)+$y0] [expr $rad/$dis*($z)+$z0] } }*createmark elements 1 $elemId*deletemark elements 1} elseif {$count ==1} {foreach i $ndId {foreach { dis x y z } [hm_getdistance nodes 1 $i 0] {}if {[expr $dis-$rad] <= 0.000001} {*nodemodify $i [expr $rad/$dis*($x)+$x0] [expr $rad/$dis*($y)+$y0] [expr $rad/$dis*($z)+$z0] }}} else {        set distList []foreach i $ndId {foreach { dis x y z } [hm_getdistance nodes 1 $i 0] {}set t1 [expr abs($dis-$rad)]lappend distList [list $i $t1]}set distListSorted [lsort -real -index 1 $distList]set nd1 [lindex $distListSorted 0 0] set nd2 [lindex $distListSorted 1 0] foreach { dis x y z } [hm_getdistance nodes 1 $nd1 0] {}*nodemodify $nd1 [expr $rad/$dis*($x)+$x0] [expr $rad/$dis*($y)+$y0] [expr $rad/$dis*($z)+$z0] foreach { dis x y z } [hm_getdistance nodes 1 $nd2 0] {}*nodemodify $nd2 [expr $rad/$dis*($x)+$x0] [expr $rad/$dis*($y)+$y0] [expr $rad/$dis*($z)+$z0]}
}

一波操作后效果如图4,然鹅并不是很满意。

图4 一波操作后图 再简单粗暴的继续上一轮操作,效果如图3所示,其中精髓只有自己亲自码一遍才会拍着大腿想明白。

1.4结论

  两波操作组合起来看似完美,但是不能满足工程需要。原因有三:

  1. 这里仅仅是“挖”了个孔,但是没有扩一层单元孔出来。(干过白车身的都知道
  2. 有pillow单元的存在,单元质量不符合要求。
  3. 以上代码没进行异常处理、用户交互输入等,且代码有冗余(其实是没认真写)。

  关于第二点pillow单元处理,有专门的处理和优化算法和数据结构,二维、三维情况都适应。
以上代码仅用来交流和学习,不能代表博主撸码实力。

Hypermesh二次开发系列003相关推荐

  1. Scratch3 二次开发系列

       Scratch3.0来啦!!! Scratch做为图像化编程的首选语言,拖过积木块搭建实现动画游戏的制作.Scratch3添加了音乐.画笔.视频侦测.文字朗读.翻译等选择性下载扩展积木,可实现积 ...

  2. Excel 二次开发系列(3): 创建Excel二次开发环境

    Excel 二次开发系列 前面我们讲到了 Excel编程模型及Excel 常用操作方法,在这一节,我说一下基础的怎么创建一个Excel应用级的二次开发程序. 在微软的这个基础网站里面可以找到很多的有用 ...

  3. HyperMesh二次开发教程 - 前言

    HyperMesh二次开发教程 前言   笔者从事HyperMesh开发有近5年时间,最初由于兴趣和工作需要自学HyperMesh二次开发,也完成了从仿真工程师到商业CAE仿真软件二次开发工程师的职位 ...

  4. SolidEdge C#.NET 二次开发系列教程(一) 安装部署插件

    SE二次开发国内的教程简直太少了,为了学习这块,废了不少功夫,走了不少弯路. 特此开贴写教程以示后人. se插件开发完成后就是如何部署,安装和部署和其他的.net插件类似. 1.走到这步你基本离成功很 ...

  5. Solidworks二次开发系列入门1

    Solidworks二次开发系列入门1 基本介绍 基本介绍 SolidWorks二次开发其实就是使用API函数对SolidWorks设计中一些重复繁琐的工作让计算机代替完成,起到辅助设计的作用. So ...

  6. TFS二次开发系列:七、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)

    在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一:连接TFS服务器,并且得到之后需要使用到的类方法. /// < ...

  7. SolidEdge C#.NET 二次开发系列教程(二) AdvancedInstaller打包安装SolidEdge addin插件

    建议看本教程前先看下 SolidEdge二次开发(一)安装部署插件 这里主要介绍添加注册表的部分,不介绍AdvancedInstaller的具体使用 下保存下面注册表的信息为xxx.reg格式到桌面. ...

  8. TFS二次开发系列:八、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(二)

    上一篇文章我们编写了此例的DTO层,本文将数据访问层封装为逻辑层,提供给界面使用. 1.获取TFS Dto实例,并且可以获取项目集合,以及单独获取某个项目实体 public static TFSSer ...

  9. 涂鸦 Wi-Fi SDK开发系列教程——5.对模组二次开发

    上期精彩回顾:Wi-Fi模组二次开发课程--4.烧录授权 本章节旨在通过一个简单Demo,使开发者能够了解涂鸦SDK的启动流程,带领开发者基于涂鸦提供的SDK对模组进行二次开发. Demo功能介绍:硬 ...

  10. VSTO Office二次开发对PPT自定义任务窗格测试

    上篇文章对VSTO Office二次开发操作PPT功能做了简单测试,主要是如何创建一个外接程序并在新建PPT幻灯片时添加自定义文本信息.如何简单自定义任务窗格.如何添加可视化功能区的简单介绍,应该对于 ...

最新文章

  1. HiveSQL中复杂数据类型操作
  2. idea左右切换页面 返回上一次鼠标位置
  3. 一次性清退125名硕博研究生!又一高校发公告
  4. jQuery如何在线导入js包
  5. python实现二叉树的镜像
  6. Kafka的架构设计
  7. 双屏鼠标经常跑到副屏_这个电脑的双屏幕,让我重新找回了修图的乐趣
  8. nginx源码分析:打开监听套接字的流程
  9. 药品研发的项目化管理
  10. 手势解锁java后端设计_Android进阶 - 手势解锁
  11. 系统设计之路:如何设计一个URL短链服务
  12. NOI 1818:红与黑(C++)
  13. c语言 乘法运算符,C 乘法运算符
  14. qq邮箱隐藏代码html,QQ邮箱原来这么好用,4个隐藏设置格调满满
  15. matlab常用的设置,坐标系、线条颜色、线型,字体、属性
  16. fat32位的U盘单个文件最大只能传输4G,应该怎么办呢?可以使用cmd转换成NTFS格式
  17. python操作networkx
  18. 【UEFI基础】UEFI变量基础
  19. 平面设计中的网格系统pdf_中文排版网格系统的五大迷思
  20. 计算机及应用考试重点,计算机工程应用考试重点

热门文章

  1. 流程驱动管理vs 数据驱动管理
  2. rust写操作系统 rCore tutorial 学习笔记:实验指导零 创建项目与启动
  3. PyTorch搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
  4. 霍纳法则c语言算法代码,霍纳法则(Horner Rule)介绍及C语言实现
  5. DLT - Diagnostic Log and Trace简介
  6. 从零开始创建自己的博客
  7. 具有改善视力作用的食物
  8. UVA12304-2D Geometry 110 in 1!
  9. Ceph 分布式存储架构解析与工作原理
  10. WebMagic爬取小说网站所有小说