如何在曲线上以直线距离阵列

jeatoan
Collaborator
Collaborator

如何在曲线上以直线距离阵列

jeatoan
Collaborator
Collaborator

如何在已知曲线上以直线距离“阵列”(如图例首尾相接)实现“填满曲线”效果?

jeatoan_2-1635342497141.png

 

0 个赞
回复
已接受的解答 (1)
11,544 次查看
48 条回复
回复 (48)

jeatoan
Collaborator
Collaborator
Inventor+Dynamo的方式我在微信群也看到这种解决方案了
0 个赞

smilinger
Advisor
Advisor

我试了一下,应该可以用VBA或者iLogic做出,请问是固定直线长度还是固定阵列数量?

0 个赞

599142655
Advocate
Advocate
搞笑,铅笔橡皮能画出所有的图。
0 个赞

599142655
Advocate
Advocate
是固定直线长度。
0 个赞

jeatoan
Collaborator
Collaborator
站在你的角度看待这个事没毛病
0 个赞

smilinger
Advisor
Advisor

勉强可以用一用,线段长度不能太短,否则容易触发曲线精度问题。

 

 

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

 

 

jeatoan
Collaborator
Collaborator

👍

用VBA做的话,可以考虑在曲线一端选个端点作为第一段直线的起点,然后画圆弧(为避免跟曲线产生2个交点可能要加东西来避免),得出(曲线一个方向上)的交点,这样循环下来所有的直线段起、终点就创建出来了,然后再跑个循环画直线,这种思路可能比您现在这个加约束更好点(鄙人还不会敲这样的码😂)。

这种思路如果想要线段按比例加长也可以调整(控制圆弧循环实例的半径规则)

smilinger
Advisor
Advisor
0 个赞

bimengfei
Advocate
Advocate

如果对象是直线+曲线+圆弧线段的组合呢?

0 个赞

smilinger
Advisor
Advisor

应该也没问题,但是写起来就会复杂一些,而且由于样条曲线的精度问题,会造成一些错误。

0 个赞

bimengfei
Advocate
Advocate

不知道具体会有哪些错误 但是已经比我想的结果要好很多 说明Inventor实际能力没那么糟 只是。。。

0 个赞

smilinger
Advisor
Advisor

比如说,对一个圆和样条曲线取交点的时候,明明应该有两个交点,但是只能获取到一个交点,甚至极端的时候一个交点都获取不到;对于两个点作比较判断是否同一点的时候,由于精度问题也可能发生错误。

后一个问题可以通过调整方法中的精度偏差参数解决,但是前一个问题比较奇怪,我怀疑样条曲线上的某些点的Z方向坐标可能不是精确地等于0,导致得不到交点,并且调整参数也不能很好的解决。

这些问题应该问一下他们,@lynn.zhang, @Yijiang.Cai 

0 个赞

599142655
Advocate
Advocate

不会VBA的可怎么办啊。😂😂

0 个赞

jeatoan
Collaborator
Collaborator
我目前想到的是:
1、Inventor+Dynamo
2、inventor里手工1个1个画
3、到其他软件做

bimengfei
Advocate
Advocate

鉴于Inventor的关于曲线方面的表现 我估摸着还有其他莫名其妙的问题

0 个赞

599142655
Advocate
Advocate
Inventor的内核是自己开发的吗?跟proE很像唉。
0 个赞

bimengfei
Advocate
Advocate

忘记是第几个版本买的ACIS后跟某个大学研发的 等于是自己独立的内核

PRO/E好像也是ACIS 这些东西不懂 道听途说的

0 个赞

bimengfei
Advocate
Advocate

这位同学 楼主要求里首先就排除了你说的类似“硬画”的方法 否则画个圈 做个重合、相等约束 只是例图哪里要2分钟那么久

 

然而稍微想想 实际的模型可能是成百上千段连接 你觉得画起来很开心吗

 

楼主这是一个正常的需求 类似链传动的链条 延伸一点 这个直线段应该是“块”更合适 不存在“荒唐”的说法

 

最后 你这聊天的方式真的是很差劲 两次都是“踩众捧自己”的同时又不指名道姓的说 一得罪就是一大群的人 咋想的?

 

 

 

 

599142655
Advocate
Advocate
嗯,自己的内核还是挺厉害的。不过有些细节方面还需要做更好。 比如:alt+V 是切换可见性的。组件里点零件很好用。零件里点特征就不一致了,要右键-V 。 还有一些命令当前是不可用的,正常应是灰色,这样用户就很清楚,不会去点击。但是它不是这么处理的。点一下跳出来对话框“当前命令不能用”。---新建零件的时候应该只有建立草图是可用的按钮。
0 个赞

bimengfei
Advocate
Advocate

这些都是基础设置和逻辑关系的问题 Inventor有些地方确实有点乱

0 个赞