You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CATIA中如何获取AddNewHybridSplit生成的分割线起止点坐标?

我在CATIA中使用AddNewHybridSplit功能对Pad与Line执行分割操作(如下图所示),需要获取屏幕上绿色分割线的起止点坐标,以通过AddNewLinePtPt功能创建新直线。此前尝试求交操作,但未得到有效交点,请求协助解决。
CATIA分割操作示意图
附当前代码:

Sub ArchiliIntCoords()
    ' Define the document and part
    Dim documents1 As Documents
    Set documents1 = CATIA.Documents
    Dim partDocument1 As PartDocument
    Set partDocument1 = documents1.Item("X0 Line.CATPart")
    Dim part1 As Part
    Set part1 = partDocument1.Part
    
    ' Define the bodies and sketches
    Dim bodies1 As Bodies
    Set bodies1 = part1.Bodies
    Dim body1 As Body
    Set body1 = bodies1.Item("X0-Line")
    Dim sketches1 As Sketches
    Set sketches1 = body1.Sketches
    Dim sketch1 As Sketch
    Set sketch1 = sketches1.Item("Sketch.1")
    
    ' Create a new geometrical set for the intersection
    Dim hybridBodies1 As HybridBodies
    Set hybridBodies1 = part1.HybridBodies
    Dim hybridBody1 As HybridBody
    Set hybridBody1 = hybridBodies1.Add()
  

' Create a new intersection object
    Dim hshf As HybridShapeFactory
    Set hshf = part1.HybridShapeFactory
    Dim pad1 As Sketch
    Set pad1 = body1.Sketches.Item(1)
    Dim ref11 As Reference
    Set ref11 = part1.CreateReferenceFromObject(pad1)

    Dim myObj2 As AnyObject
    Set myObj2 = part1.FindObjectByName("Epox")
    Set ref2 = part1.CreateReferenceFromObject(myObj2)
    Dim myIntersect As HybridShapeIntersection
    Set myIntersect = hshf.AddNewIntersection(ref11, ref2)


 ' Add the intersection object to the geometrical set
    hybridBody1.AppendHybridShape myIntersect
    part1.Update
   
    
  Dim myHybridBody As HybridBody
    Set myHybridBody = part1.HybridBodies.Item(1) 'geometrical setshi iwereba wertili

Dim hybridShapeFactory1 As HybridShapeFactory
Set hybridShapeFactory1 = part1.HybridShapeFactory
            Dim bodies11
            Set bodies11 = part1.Bodies
            Dim body11 As Body
            Set body11 = bodies1.Item(1) 'ak migebulia partpody
            Dim line11
            Set line11 = body1.Sketches.Item(1) 'curved igebs sketch 1-is lines romelzec unda daematos wertili
       
  
 Dim mysplit As HybridShapeSplit
 Set mysplit = hybridShapeFactory1.AddNewHybridSplit(ref11, ref2, -1)
 
 
  myHybridBody.AppendHybridShape mysplit
  part1.Update
  
Dim oSelection As Selection
Set oSelection = partDocument1.Selection
oSelection.Clear
oSelection.Add mysplit
oSelection.VisProperties.SetRealColor 0, 255, 0, 0 'mwvane pers nishnavs


part1.Update
End Sub

解决方案

问题根源

  1. 求交对象错误:原代码使用Pad的草图(Sketch)参与求交,草图是2D平面元素,无法与3D直线计算出正确的实体交线,应使用Pad实体特征作为求交对象。
  2. 变量未显式声明:ref2等变量未明确类型,易导致类型匹配错误。
  3. 未直接提取交线端点:分割操作后未从交线几何元素中读取端点坐标,而是依赖分割对象的无效属性。

修正后的代码

Sub GetSplitLineEndPoints()
    ' 声明所有变量
    Dim partDoc As PartDocument
    Dim part As Part
    Dim padFeature As Pad
    Dim refPad As Reference
    Dim lineObj As AnyObject
    Dim refLine As Reference
    Dim hybridBody As HybridBody
    Dim hsFactory As HybridShapeFactory
    Dim intersection As HybridShapeIntersection
    Dim intersectCurve As HybridShapeCurve
    Dim ptStart As HybridShapePointOnCurve
    Dim ptEnd As HybridShapePointOnCurve
    Dim startCoords(2) As Double
    Dim endCoords(2) As Double
    Dim newLine As HybridShapeLinePtPt
    Dim selection As Selection
    
    ' 获取当前激活文档与部件
    Set partDoc = CATIA.ActiveDocument
    Set part = partDoc.Part
    
    ' 获取Pad实体特征(替换为你的Pad实际名称)
    Set padFeature = part.Bodies.Item("X0-Line").Pads.Item("Pad.1")
    Set refPad = part.CreateReferenceFromObject(padFeature)
    
    ' 获取分割用的Line对象(替换为你的Line实际名称)
    Set lineObj = part.FindObjectByName("Epox")
    Set refLine = part.CreateReferenceFromObject(lineObj)
    
    ' 创建新几何集存放计算结果
    Set hybridBody = part.HybridBodies.Add()
    hybridBody.Name = "Split_Line_Results"
    
    ' 创建Pad与Line的交线
    Set hsFactory = part.HybridShapeFactory
    ' 第三个参数设为True,保留所有交线元素
    Set intersection = hsFactory.AddNewIntersection(refPad, refLine, True)
    hybridBody.AppendHybridShape intersection
    part.Update
    
    ' 提取交线的起止点
    Set intersectCurve = intersection
    Set ptStart = hsFactory.AddNewPointOnCurve(intersectCurve, 0#, 0) ' 曲线起点(参数0)
    Set ptEnd = hsFactory.AddNewPointOnCurve(intersectCurve, 1#, 0) ' 曲线终点(参数1)
    hybridBody.AppendHybridShape ptStart
    hybridBody.AppendHybridShape ptEnd
    part.Update
    
    ' 读取端点三维坐标
    ptStart.GetCoordinates startCoords
    ptEnd.GetCoordinates endCoords
    
    ' 输出坐标(可根据需求修改显示逻辑)
    MsgBox "起点坐标:X=" & Round(startCoords(0), 3) & ", Y=" & Round(startCoords(1), 3) & ", Z=" & Round(startCoords(2), 3) & vbCrLf & _
           "终点坐标:X=" & Round(endCoords(0), 3) & ", Y=" & Round(endCoords(1), 3) & ", Z=" & Round(endCoords(2), 3)
    
    ' 使用AddNewLinePtPt创建新直线
    Set newLine = hsFactory.AddNewLinePtPt(ptStart, ptEnd)
    hybridBody.AppendHybridShape newLine
    part.Update
    
    ' 设置新直线为绿色(匹配原需求的视觉效果)
    Set selection = partDoc.Selection
    selection.Clear
    selection.Add newLine
    selection.VisProperties.SetRealColor 0, 255, 0, 0
End Sub

关键修正说明

  • 替换求交对象:将原代码中Pad的草图改为Pad实体特征,确保3D空间内的正确求交计算。
  • 显式变量声明:所有变量均明确类型,避免类型不匹配导致的运行错误。
  • 直接提取端点:通过HybridShapePointOnCurve获取交线的起止点,再用GetCoordinates读取三维坐标值。
  • 简化流程:直接通过求交操作获取分割对应的线段,无需先执行分割再提取,减少冗余操作。

注意事项

  • 代码中Pad.1和Epox需替换为文档中实际的Pad特征名称和Line对象名称。
  • 执行代码前确保CATIA文档处于激活状态,且相关几何元素未被隐藏。
  • 若交线为多个线段,需遍历HybridShapeIntersection的子元素获取所有端点。

内容的提问来源于stack exchange,提问作者Salome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 10:57:04