勉强可以用一用,线段长度不能太短,否则容易触发曲线精度问题。
Sub LinesAlongCurve()
Dim oTG As TransientGeometry
Set oTG = ThisApplication.TransientGeometry
Dim doc As PartDocument
Set doc = ThisApplication.ActiveDocument
'当前正在编辑的草图
Dim sktch As PlanarSketch
Set sktch = ThisApplication.ActiveEditObject
Dim curve As SketchEntity
Set curve = ThisApplication.CommandManager.Pick(kSketchCurveFilter, "选择要铺满的曲线")
Dim length As Double
length = CDbl(InputBox("输入需要的直线长度"))
'直线的起点
Dim startPoint As SketchPoint
Set startPoint = curve.StartSketchPoint
'上一条直线的起点
Dim previousStartPoint As SketchPoint
Set previousStartPoint = startPoint
Dim trx As Transaction
Set trx = ThisApplication.TransactionManager.StartTransaction(doc, "直线阵列")
'上一条直线
Dim previousLine As SketchLine
Dim i As Integer: i = 1
Do
Debug.Print i
i = i + 1
'基于当前起点作圆
Dim c As Inventor.Circle
Set c = oTG.CreateCircle(startPoint.Geometry3d, sktch.PlanarEntityGeometry.Normal, length / 10)
' Set c = oTG.CreateCircle2d(startPoint.Geometry, length / 10)
'取圆与曲线交点
Dim points As ObjectsEnumerator
Set points = oTG.CurveCurveIntersection(c, curve.Geometry3d, 0.01)
'如果交点数量过多则曲线过于曲折,放弃
If points Is Nothing Then
MsgBox "出现问题,请调整精度再试!", vbCritical
trx.End
Exit Sub
ElseIf points.Count > 2 Then
MsgBox "曲线有问题!", vbCritical
trx.Abort
Exit Sub
End If
Dim p As Point
Dim endPoint As Point
For Each p In points
'判断如果是上一条直线的起点则跳过
If Not p.IsEqualTo(previousStartPoint.Geometry3d, 0.1) Then
Set endPoint = p
Exit For
End If
Next
'是否已经到了曲线末端
If endPoint Is Nothing Then
trx.End
Exit Sub
End If
Dim sktchLine As SketchLine
Set sktchLine = sktch.SketchLines.AddByTwoPoints(startPoint, sktch.ModelToSketchSpace(endPoint))
'添加重合约束
Dim cnstrt As GeometricConstraint
Set cnstrt = sktch.GeometricConstraints.AddCoincident(sktchLine.EndSketchPoint, curve)
'添加相等约束
If Not previousLine Is Nothing Then
Set cnstrt = sktch.GeometricConstraints.AddEqualLength(previousLine, sktchLine)
End If
Set previousLine = sktchLine
Set previousStartPoint = startPoint
Set startPoint = sktchLine.EndSketchPoint
Set endPoint = Nothing
Loop While True
trx.End
End Sub
👍
用VBA做的话,可以考虑在曲线一端选个端点作为第一段直线的起点,然后画圆弧(为避免跟曲线产生2个交点可能要加东西来避免),得出(曲线一个方向上)的交点,这样循环下来所有的直线段起、终点就创建出来了,然后再跑个循环画直线,这种思路可能比您现在这个加约束更好点(鄙人还不会敲这样的码😂)。
这种思路如果想要线段按比例加长也可以调整(控制圆弧循环实例的半径规则)
比如说,对一个圆和样条曲线取交点的时候,明明应该有两个交点,但是只能获取到一个交点,甚至极端的时候一个交点都获取不到;对于两个点作比较判断是否同一点的时候,由于精度问题也可能发生错误。
后一个问题可以通过调整方法中的精度偏差参数解决,但是前一个问题比较奇怪,我怀疑样条曲线上的某些点的Z方向坐标可能不是精确地等于0,导致得不到交点,并且调整参数也不能很好的解决。
这些问题应该问一下他们,@lynn.zhang, @Yijiang.Cai
这位同学 楼主要求里首先就排除了你说的类似“硬画”的方法 否则画个圈 做个重合、相等约束 只是例图哪里要2分钟那么久
然而稍微想想 实际的模型可能是成百上千段连接 你觉得画起来很开心吗
楼主这是一个正常的需求 类似链传动的链条 延伸一点 这个直线段应该是“块”更合适 不存在“荒唐”的说法
最后 你这聊天的方式真的是很差劲 两次都是“踩众捧自己”的同时又不指名道姓的说 一得罪就是一大群的人 咋想的?