之前文章对比了inspire与spaceclaim几何功能,发现inspire中面很弱,稍微带点倒角的片体,inspire就无法抽取。
自带中面工具无法抽取
但是inspire 提供了完善的Python API,果断通过二次开发完善inspire的中面功能,最终效果如下:
本工具不仅实现了通过面-面抽取中面,还实现了通过面-线、面-点抽取中面:
面-点抽取中面
面-线抽取中面
面-面抽取中面
面-面抽取中面(圆柱)
从演示可以看出,首先选择要偏移的面,最后选择的点、线、面用来计算厚度值,最后选择的点、线、面与要偏移面的最小距离即为厚度值,中面抽完后,自动隐藏之前的片体,并自动给抽完的中面赋上厚度。不过抽完的中面还是得手动沿伸。
inspire不仅是几何直接建模工具,还支持结构、多体、流体、优化计算,自带simsolid、optistruct求解器,进行一些小规模计算非常方便,中面功能的加强使得inspire适用范围更广。
最后附上源代码:
.PY文件
def createRibbon():
from hwx import inspire
math = inspire.math
# So midsurf.png is found
from pathlib import Path
gui.addResourcePath(Path(__file__).parent)
################################################################################
def getSpriteActionGroup ():
"""Return the SpriteActionGroup to drive this context."""
return gui.SpriteActionGroup(
text = "midsurf",
children = [
gui.SpriteAction (
tooltip = "midsurf",
icon = "ribbonSurfaceOffsetStrip-80@2x.png",
context = midsurfContext,
)
]
)
################################################################################
class midsurfContext(gui.Context):
def onActivate(self, firstTime):
if firstTime:
self.guideBar = GuideBar(self)
self.guideBar.show()
self.setPickable(inspire.Feature,style = "toggle")
def onPickListChanged(self):
picks = self.getPickedObjects()
if picks:
self.showHelpMessage("Picked "+str(len(picks))+" ATTENTION:The last pick for caculating thickness!!!!!!")
else:
self.showHelpMessage("Surf unpicked. Pick surfs to extract midsurface.")
def createMidsurf(self):
picksurfs=self.getPickedObjects()
s1=picksurfs[0]
s1.part.visible=False
s2=picksurfs[-1]
del picksurfs[-1]
tk=[]
for i in picksurfs:
tk.append(i.findClosestPoint(s2.pickPoint).distanceTo(s2.pickPoint))
tkmin=round(min(tk),4)
self.showHelpMessage("thickness="+str(tkmin))
print(tkmin)
midpart = inspire.core.geometry.offset(picksurfs, value=round(-tkmin/2,4) , newPart=True)
midpart.visible=True
midpart.sheetThickness=tkmin
self.clearAllLists()
class GuideBar(gui.GuideBar):
def createContents(self):
#Clicking this clears pick and select lists
self.resetButton()
self.executePlayButton(
command = self.context.createMidsurf,
tooltip = "Create the joints",
)
self.exitButton()
###############################################################################
with gui.getProfile("Inspire"):
global spriteGroup
spriteGroup = getSpriteActionGroup()
gui.Ribbon.add("midsurfs", spriteGroup)
################################################################################
## Entry Point #################################################################
################################################################################
from hwx.inspire import gui
createRibbon()
def onExtensionUnload():
# Remove SpriteActionGroup from the Inspire profile
with gui.getProfile("Inspire"):
gui.RibbonPage.get("midsurfs").remove(spriteGroup)
extMgr = gui.getExtensionManager()
extMgr.onUnload(onExtensionUnload)
.xml文件
<section name="Extension">
<entry name="name" value="midsurf"/>
<entry name="script" value="plugin.py"/>
<entry name="author" value="Xia Jiang"/>
<entry name="description" value="midsurf Extension."/>
<entry name="minProductVersion" value="2023"/>
<entry name="supportedClient" value="Inspire"/>
</section>